1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrGLBufferImpl_DEFINED 9 #define GrGLBufferImpl_DEFINED 10 11 #include "SkTypes.h" 12 #include "gl/GrGLFunctions.h" 13 14 class GrGpuGL; 15 16 /** 17 * This class serves as the implementation of GrGL*Buffer classes. It was written to avoid code 18 * duplication in those classes. 19 */ 20 class GrGLBufferImpl : SkNoncopyable { 21 public: 22 struct Desc { 23 bool fIsWrapped; 24 GrGLuint fID; // set to 0 to indicate buffer is CPU-backed and not a VBO. 25 size_t fSizeInBytes; 26 bool fDynamic; 27 }; 28 29 GrGLBufferImpl(GrGpuGL*, const Desc&, GrGLenum bufferType); 30 ~GrGLBufferImpl() { 31 // either release or abandon should have been called by the owner of this object. 32 SkASSERT(0 == fDesc.fID); 33 } 34 35 void abandon(); 36 void release(GrGpuGL* gpu); 37 38 GrGLuint bufferID() const { return fDesc.fID; } 39 size_t baseOffset() const { return reinterpret_cast<size_t>(fCPUData); } 40 41 void bind(GrGpuGL* gpu) const; 42 43 void* map(GrGpuGL* gpu); 44 void unmap(GrGpuGL* gpu); 45 bool isMapped() const; 46 bool updateData(GrGpuGL* gpu, const void* src, size_t srcSizeInBytes); 47 48 private: 49 void validate() const; 50 51 Desc fDesc; 52 GrGLenum fBufferType; // GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER 53 void* fCPUData; 54 void* fMapPtr; 55 size_t fGLSizeInBytes; // In certain cases we make the size of the GL buffer object 56 // smaller or larger than the size in fDesc. 57 58 typedef SkNoncopyable INHERITED; 59 }; 60 61 #endif 62