aboutsummaryrefslogtreecommitdiffhomepage
path: root/gpu/include/GrGeometryBuffer.h
blob: 1447e731856f18bfef234690c67e53399ceb0165 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 Copyright 2011 Google Inc.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

#ifndef GrGeometryBuffer_DEFINED
#define GrGeometryBuffer_DEFINED

#include "GrRefCnt.h"

/**
 * Parent class for vertex and index buffers
 */
class GrGeometryBuffer : public GrRefCnt {
public:
    virtual ~GrGeometryBuffer() {}
    
    /**
     * Retrieves the size of the buffer
     *
     * @return the size of the buffer in bytes
     */
    size_t size() const { return fSizeInBytes; }
    
    /**
     *Retrieves whether the buffer was created with the dynamic flag
     *
     * @return true if the buffer was created with the dynamic flag
     */
    bool dynamic() const { return fDynamic; }
    
    /**
     * Indicates that GPU context in which this veretx buffer was created is 
     * destroyed and that Ganesh should not attempt to free the buffer in the
     * underlying API.
     */
    virtual void abandon() = 0;
    
    /**
     * Locks the buffer to be written by the CPU.
     * 
     * The previous content of the buffer is invalidated. It is an error
     * to draw from the buffer while it is locked. It is an error to call lock
     * on an already locked buffer.
     * 
     * @return a pointer to the data or NULL if the lock fails.
     */
    virtual void* lock() = 0;
    
    /**
     * Returns the same ptr that lock() returned at time of lock or NULL if the
     * is not locked.
     *
     * @return ptr to locked buffer data or undefined if buffer is not locked.
     */
    virtual void* lockPtr() const = 0;
    
    /** 
     * Unlocks the buffer. 
     * 
     * The pointer returned by the previous lock call will no longer be valid.
     */
    virtual void unlock() = 0;
    
    /** 
     Queries whether the buffer has been locked.
     
     @return true if the buffer is locked, false otherwise.
     */
    virtual bool isLocked() const = 0;
    
    /**
     * Updates the buffer data. 
     *  
     * The size of the buffer will be preserved. The src data will be 
     * placed at the begining of the buffer and any remaining contents will
     * be undefined.
     * 
     * @return returns true if the update succeeds, false otherwise.
     */
    virtual bool updateData(const void* src, size_t srcSizeInBytes) = 0;
    
    /**
     * Updates a portion of the buffer data. 
     * 
     * The contents of the buffer outside the update region are preserved.
     * 
     * @return returns true if the update succeeds, false otherwise.
     */
    virtual bool updateSubData(const void* src, 
                               size_t srcSizeInBytes, 
                               size_t offset) = 0;
protected:
    GrGeometryBuffer(size_t sizeInBytes, bool dynamic) : 
        fSizeInBytes(sizeInBytes),
        fDynamic(dynamic) {}

private:
    size_t   fSizeInBytes;
    bool     fDynamic;

    typedef GrRefCnt INHERITED;
};

#endif