/* * 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(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