15aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com/* 25aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * Copyright 2013 Google Inc. 35aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * 45aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 55aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * found in the LICENSE file. 65aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com */ 75aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 85aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com#ifndef GrGLBufferImpl_DEFINED 95aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com#define GrGLBufferImpl_DEFINED 105aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 115aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com#include "GrNoncopyable.h" 125aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com#include "gl/GrGLFunctions.h" 135aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 145aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.comclass GrGpuGL; 155aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 165aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com/** 175aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * This class serves as the implementation of GrGL*Buffer classes. It was written to avoid code 185aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com * duplication in those classes. 195aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com */ 205aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.comclass GrGLBufferImpl : public GrNoncopyable { 215aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.compublic: 225aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com struct Desc { 235aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com bool fIsWrapped; 24407c7876a1c8fba9e582a3e48e12ca63e13d99febsalomon@google.com GrGLuint fID; // set to 0 to indicate buffer is CPU-backed and not a VBO. 255aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com size_t fSizeInBytes; 265aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com bool fDynamic; 275aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com }; 285aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 295aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com GrGLBufferImpl(GrGpuGL*, const Desc&, GrGLenum bufferType); 305aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com ~GrGLBufferImpl() { 315aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com // either release or abandon should have been called by the owner of this object. 325aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com GrAssert(0 == fDesc.fID); 335aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com } 345aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 355aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void abandon(); 365aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void release(GrGpuGL* gpu); 375aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 385aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com GrGLuint bufferID() const { return fDesc.fID; } 39407c7876a1c8fba9e582a3e48e12ca63e13d99febsalomon@google.com size_t baseOffset() const { return reinterpret_cast<size_t>(fCPUData); } 405aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 415aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void bind(GrGpuGL* gpu) const; 425aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 435aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void* lock(GrGpuGL* gpu); 445aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void* lockPtr() const { return fLockPtr; } 455aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void unlock(GrGpuGL* gpu); 465aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com bool isLocked() const; 475aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com bool updateData(GrGpuGL* gpu, const void* src, size_t srcSizeInBytes); 485aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 495aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.comprivate: 50407c7876a1c8fba9e582a3e48e12ca63e13d99febsalomon@google.com void validate() const; 51407c7876a1c8fba9e582a3e48e12ca63e13d99febsalomon@google.com 525aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com Desc fDesc; 535aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com GrGLenum fBufferType; // GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER 54407c7876a1c8fba9e582a3e48e12ca63e13d99febsalomon@google.com void* fCPUData; 555aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com void* fLockPtr; 565aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 575aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com typedef GrNoncopyable INHERITED; 585aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com}; 595aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com 605aaabde652847be84826ce2c3b28be876d4fe4e6bsalomon@google.com#endif 61