1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 15264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// Buffer.cpp: Implements the Buffer class, representing storage of vertex and/or 16264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// index data. Implements GL buffer objects and related functionality. 17264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 18264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "Buffer.h" 19264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 20264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "main.h" 21264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "VertexDataManager.h" 22264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "IndexDataManager.h" 23264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 24f4486fdf81c434bd06f06489901b6f825814fc17Nicolas Capensnamespace gl 25264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 26264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 27e826ef020ff7d64878b98cf24e8acbc0e1bc99aaNicolas CapensBuffer::Buffer(GLuint name) : NamedObject(name) 28264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens mContents = 0; 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens mSize = 0; 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens mUsage = GL_DYNAMIC_DRAW; 32264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 33264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 34264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas CapensBuffer::~Buffer() 35264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if(mContents) 37264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 38264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mContents->destruct(); 39264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 40264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 41264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 42264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capensvoid Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) 43264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 44264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(mContents) 45264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 46264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mContents->destruct(); 47264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mContents = 0; 48264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 49264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 50264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mSize = size; 51264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mUsage = usage; 52264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 53264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(size > 0) 54264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 55264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens const int padding = 1024; // For SIMD processing of vertices 56264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mContents = new sw::Resource(size + padding); 57264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 58264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(!mContents) 59264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 60264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return error(GL_OUT_OF_MEMORY); 61264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 62264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 63264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(data) 64264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 65264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy((void*)mContents->data(), data, size); 66264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 67264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 68264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 69264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 70264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capensvoid Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) 71264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 72264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens if(mContents) 73264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens { 74264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens char *buffer = (char*)mContents->lock(sw::PUBLIC); 75264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens memcpy(buffer + offset, data, size); 76264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens mContents->unlock(); 77264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens } 78264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 79264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 80264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capenssw::Resource *Buffer::getResource() 81264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{ 82264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens return mContents; 83264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 84264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens 85264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens} 86