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