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 25 namespace es2 26 { 27 28 Buffer::Buffer(GLuint name) : NamedObject(name) 29 { 30 mContents = 0; 31 mSize = 0; 32 mUsage = GL_STATIC_DRAW; 33 mIsMapped = false; 34 mOffset = 0; 35 mLength = 0; 36 mAccess = 0; 37 } 38 39 Buffer::~Buffer() 40 { 41 if(mContents) 42 { 43 mContents->destruct(); 44 } 45 } 46 47 void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) 48 { 49 if(mContents) 50 { 51 mContents->destruct(); 52 mContents = 0; 53 } 54 55 mSize = size; 56 mUsage = usage; 57 58 if(size > 0) 59 { 60 const int padding = 1024; // For SIMD processing of vertices 61 mContents = new sw::Resource(size + padding); 62 63 if(!mContents) 64 { 65 return error(GL_OUT_OF_MEMORY); 66 } 67 68 if(data) 69 { 70 char *buffer = (char*)mContents->data(); 71 memcpy(buffer + mOffset, data, size); 72 } 73 } 74 } 75 76 void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) 77 { 78 if(mContents && data) 79 { 80 char *buffer = (char*)mContents->lock(sw::PUBLIC); 81 memcpy(buffer + offset, data, size); 82 mContents->unlock(); 83 } 84 } 85 86 void* Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) 87 { 88 if(mContents) 89 { 90 char* buffer = (char*)mContents->lock(sw::PUBLIC); 91 mIsMapped = true; 92 mOffset = offset; 93 mLength = length; 94 mAccess = access; 95 return buffer + offset; 96 } 97 return nullptr; 98 } 99 100 bool Buffer::unmap() 101 { 102 if(mContents) 103 { 104 mContents->unlock(); 105 } 106 mIsMapped = false; 107 mOffset = 0; 108 mLength = 0; 109 mAccess = 0; 110 return true; 111 } 112 113 sw::Resource *Buffer::getResource() 114 { 115 return mContents; 116 } 117 118 } 119