1 | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | // Buffer.h: Defines the Buffer class, representing storage of vertex and/or |
16 | // index data. Implements GL buffer objects and related functionality. |
17 | // [OpenGL ES 2.0.24] section 2.9 page 21. |
18 | |
19 | #ifndef LIBGLESV2_BUFFER_H_ |
20 | #define LIBGLESV2_BUFFER_H_ |
21 | |
22 | #include "common/Object.hpp" |
23 | #include "Common/Resource.hpp" |
24 | |
25 | #include <GLES2/gl2.h> |
26 | |
27 | #include <cstddef> |
28 | #include <vector> |
29 | |
30 | namespace es2 |
31 | { |
32 | class Buffer : public gl::NamedObject |
33 | { |
34 | public: |
35 | explicit Buffer(GLuint name); |
36 | |
37 | virtual ~Buffer(); |
38 | |
39 | void bufferData(const void *data, GLsizeiptr size, GLenum usage); |
40 | void bufferSubData(const void *data, GLsizeiptr size, GLintptr offset); |
41 | |
42 | const void *data() const { return mContents ? mContents->data() : 0; } |
43 | size_t size() const { return mSize; } |
44 | GLenum usage() const { return mUsage; } |
45 | bool isMapped() const { return mIsMapped; } |
46 | GLintptr offset() const { return mOffset; } |
47 | GLsizeiptr length() const { return mLength; } |
48 | GLbitfield access() const { return mAccess; } |
49 | |
50 | void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access); |
51 | bool unmap(); |
52 | void flushMappedRange(GLintptr offset, GLsizeiptr length) {} |
53 | |
54 | sw::Resource *getResource(); |
55 | |
56 | private: |
57 | sw::Resource *mContents; |
58 | size_t mSize; |
59 | GLenum mUsage; |
60 | bool mIsMapped; |
61 | GLintptr mOffset; |
62 | GLsizeiptr mLength; |
63 | GLbitfield mAccess; |
64 | }; |
65 | |
66 | class BufferBinding |
67 | { |
68 | public: |
69 | BufferBinding() : offset(0), size(0) { } |
70 | |
71 | void set(Buffer *newBuffer, int newOffset = 0, int newSize = 0) |
72 | { |
73 | buffer = newBuffer; |
74 | offset = newOffset; |
75 | size = newSize; |
76 | } |
77 | |
78 | int getOffset() const { return offset; } |
79 | int getSize() const { return size; } |
80 | const gl::BindingPointer<Buffer>& get() const { return buffer; } |
81 | |
82 | private: |
83 | gl::BindingPointer<Buffer> buffer; |
84 | int offset; |
85 | int size; |
86 | }; |
87 | |
88 | } |
89 | |
90 | #endif // LIBGLESV2_BUFFER_H_ |
91 | |