/* * 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/GrGLFunctions.h" class GrGpuGL; /** * This class serves as the implementation of GrGL*Buffer classes. It was written to avoid code * duplication in those classes. */ class GrGLBufferImpl : SkNoncopyable { public: struct Desc { bool fIsWrapped; GrGLuint fID; // set to 0 to indicate buffer is CPU-backed and not a VBO. size_t fSizeInBytes; bool fDynamic; }; GrGLBufferImpl(GrGpuGL*, 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(GrGpuGL* gpu); GrGLuint bufferID() const { return fDesc.fID; } size_t baseOffset() const { return reinterpret_cast<size_t>(fCPUData); } void bind(GrGpuGL* gpu) const; void* map(GrGpuGL* gpu); void unmap(GrGpuGL* gpu); bool isMapped() const; bool updateData(GrGpuGL* gpu, const void* src, size_t srcSizeInBytes); private: void validate() const; Desc fDesc; GrGLenum fBufferType; // GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER 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