1// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Buffer.cpp: Implements the Buffer class, representing storage of vertex and/or 16// index data. Implements GL buffer objects and related functionality. 17// [OpenGL ES 2.0.24] section 2.9 page 21. 18 19#include "Buffer.h" 20 21#include "main.h" 22#include "VertexDataManager.h" 23#include "IndexDataManager.h" 24 25namespace es1 26{ 27 28Buffer::Buffer(GLuint name) : NamedObject(name) 29{ 30 mContents = 0; 31 mSize = 0; 32 mUsage = GL_DYNAMIC_DRAW; 33} 34 35Buffer::~Buffer() 36{ 37 if(mContents) 38 { 39 mContents->destruct(); 40 } 41} 42 43void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) 44{ 45 if(mContents) 46 { 47 mContents->destruct(); 48 mContents = 0; 49 } 50 51 mSize = size; 52 mUsage = usage; 53 54 if(size > 0) 55 { 56 const int padding = 1024; // For SIMD processing of vertices 57 mContents = new sw::Resource(size + padding); 58 59 if(!mContents) 60 { 61 return error(GL_OUT_OF_MEMORY); 62 } 63 64 if(data) 65 { 66 memcpy((void*)mContents->data(), data, size); 67 } 68 } 69} 70 71void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) 72{ 73 if(mContents) 74 { 75 char *buffer = (char*)mContents->lock(sw::PUBLIC); 76 memcpy(buffer + offset, data, size); 77 mContents->unlock(); 78 } 79} 80 81sw::Resource *Buffer::getResource() 82{ 83 return mContents; 84} 85 86} 87