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