1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas 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 6dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas 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. 14dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 15dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// Buffer.cpp: Implements the Buffer class, representing storage of vertex and/or 16dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// index data. Implements GL buffer objects and related functionality. 17dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// [OpenGL ES 2.0.24] section 2.9 page 21. 18dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 19dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "Buffer.h" 20dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 21dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "main.h" 22dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "VertexDataManager.h" 23dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "IndexDataManager.h" 24dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 2514ee7622c090d91e637a336f1680eaa16a3b6c9dNicolas Capensnamespace es1 26dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 27dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 28e826ef020ff7d64878b98cf24e8acbc0e1bc99aaNicolas CapensBuffer::Buffer(GLuint name) : NamedObject(name) 29dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 30dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents = 0; 31dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mSize = 0; 32dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mUsage = GL_DYNAMIC_DRAW; 33dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 34dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 35dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas CapensBuffer::~Buffer() 36dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 37dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(mContents) 38dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 39dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents->destruct(); 40dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 41dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 42dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 43dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capensvoid Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) 44dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 45dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(mContents) 46dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 47dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents->destruct(); 48dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents = 0; 49dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 50dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 51dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mSize = size; 52dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mUsage = usage; 53dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 54dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(size > 0) 55dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 56dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens const int padding = 1024; // For SIMD processing of vertices 57dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents = new sw::Resource(size + padding); 58dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 59dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(!mContents) 60dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 61dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens return error(GL_OUT_OF_MEMORY); 62dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 63dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 64dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(data) 65dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 6653fae3e9065ab9beae3f1712d75b1638ded9206eNicolas Capens memcpy((void*)mContents->data(), data, size); 67dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 68dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 69dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 70dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 71dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capensvoid Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) 72dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 73dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens if(mContents) 74dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens { 75dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens char *buffer = (char*)mContents->lock(sw::PUBLIC); 76dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens memcpy(buffer + offset, data, size); 77dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens mContents->unlock(); 78dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens } 79dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 80dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 81dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capenssw::Resource *Buffer::getResource() 82dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{ 83dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens return mContents; 84dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 85dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens 86dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens} 87