| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef GrGLBufferImpl_DEFINED | |
| #define GrGLBufferImpl_DEFINED | |
| #include "SkTypes.h" | |
| #include "gl/GrGLTypes.h" | |
| class GrGLGpu; | |
| /** | |
| * This class serves as the implementation of GrGL*Buffer classes. It was written to avoid code | |
| * duplication in those classes. | |
| */ | |
| class GrGLBufferImpl : SkNoncopyable { | |
| public: | |
| enum Usage { | |
| kStaticDraw_Usage = 0, | |
| kDynamicDraw_Usage, | |
| kStreamDraw_Usage, | |
| kStreamRead_Usage, | |
| kLast_Usage = kStreamRead_Usage | |
| }; | |
| static const int kUsageCount = kLast_Usage + 1; | |
| struct Desc { | |
| GrGLuint fID; // set to 0 to indicate buffer is CPU-backed and not a VBO. | |
| size_t fSizeInBytes; | |
| Usage fUsage; | |
| }; | |
| GrGLBufferImpl(GrGLGpu*, const Desc&, GrGLenum bufferType); | |
| ~GrGLBufferImpl() { | |
| // either release or abandon should have been called by the owner of this object. | |
| SkASSERT(0 == fDesc.fID); | |
| } | |
| void abandon(); | |
| void release(GrGLGpu* gpu); | |
| GrGLuint bufferID() const { return fDesc.fID; } | |
| size_t baseOffset() const { return reinterpret_cast<size_t>(fCPUData); } | |
| GrGLenum bufferType() const { return fBufferType; } | |
| void* map(GrGLGpu* gpu); | |
| void unmap(GrGLGpu* gpu); | |
| bool isMapped() const; | |
| bool updateData(GrGLGpu* gpu, const void* src, size_t srcSizeInBytes); | |
| private: | |
| void validate() const; | |
| Desc fDesc; | |
| GrGLenum fBufferType; // GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER, e.g. | |
| void* fCPUData; | |
| void* fMapPtr; | |
| size_t fGLSizeInBytes; // In certain cases we make the size of the GL buffer object | |
| // smaller or larger than the size in fDesc. | |
| typedef SkNoncopyable INHERITED; | |
| }; | |
| #endif |