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