Store everything in a VBO, making things faster.
[ipdf/code.git] / src / graphicsbuffer.cpp
1 #include "graphicsbuffer.h"
2 #define GL_GLEXT_PROTOTYPES
3 #include <SDL_opengl.h>
4 #include <GL/glext.h>
5
6 using namespace IPDF;
7
8 GraphicsBuffer::GraphicsBuffer()
9 {
10         SetUsage(BufferUsageStaticDraw);
11 }
12
13 GraphicsBuffer::~GraphicsBuffer()
14 {
15         if (m_map_pointer)
16         {
17                 UnMap();
18         }
19         glDeleteBuffers(1, &m_buffer_handle);
20 }
21
22 void GraphicsBuffer::SetType(GraphicsBuffer::BufferType bufType)
23 {
24         glGenBuffers(1, &m_buffer_handle);
25         m_buffer_type = bufType;
26 }
27
28 void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage)
29 {
30         m_buffer_usage = bufUsage;
31 }
32
33 void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
34 {
35         GLbitfield access = ((read)?GL_MAP_READ_BIT:0) | ((write)?GL_MAP_WRITE_BIT:0) | ((invalidate)?GL_MAP_INVALIDATE_BUFFER_BIT:0);
36         GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
37         
38         Bind();
39         
40         return glMapBufferRange(target, 0, m_buffer_size, access);
41         
42         //TODO: Emulate DSA
43         //return glMapNamedBufferEXT(m_bufferHandle, access);
44 }
45
46 void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bool invalidate)
47 {
48         GLbitfield access = ((read)?GL_MAP_READ_BIT:0) | ((write)?GL_MAP_WRITE_BIT:0) | ((invalidate)?GL_MAP_INVALIDATE_RANGE_BIT:0);
49         GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
50         
51         Bind();
52         
53         return glMapBufferRange(target, offset, length, access);
54
55         //TODO: Emulate DSA
56         //return glMapNamedBufferRangeEXT(m_bufferHandle, offset, length, access);
57 }
58
59 void GraphicsBuffer::UnMap()
60 {
61         GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
62         
63         Bind();
64         glUnmapBuffer(target);
65         //glUnmapNamedBufferEXT(m_bufferHandle);
66 }
67
68 void GraphicsBuffer::Upload(size_t length, const void* data)
69 {
70         GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
71         
72         GLenum usage;
73         switch (m_buffer_usage)
74         {
75         case BufferUsageStaticDraw:
76                 usage = GL_STATIC_DRAW;
77                 break;
78         case BufferUsageStaticRead:
79                 usage = GL_STATIC_READ;
80                 break;
81         case BufferUsageStaticCopy:
82                 usage = GL_STATIC_COPY;
83                 break;
84         case BufferUsageDynamicDraw:
85                 usage = GL_DYNAMIC_DRAW;
86                 break;
87         case BufferUsageDynamicRead:
88                 usage = GL_DYNAMIC_READ;
89                 break;
90         case BufferUsageDynamicCopy:
91                 usage = GL_DYNAMIC_COPY;
92                 break;
93         case BufferUsageStreamDraw:
94                 usage = GL_STREAM_DRAW;
95                 break;
96         case BufferUsageStreamRead:
97                 usage = GL_STREAM_READ;
98                 break;
99         case BufferUsageStreamCopy:
100                 usage = GL_STREAM_COPY;
101                 break;
102         default:
103                 SDL_assert(false && "Unknown buffer usage type.");
104                 usage = GL_DYNAMIC_DRAW;
105         }
106         
107         Bind();
108         glBufferData(target, length, data, usage);
109         m_buffer_size = length;
110         //glNamedBufferDataEXT(m_bufferHandle, length, data, usage);
111 }
112
113 void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
114 {
115         GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
116         
117         Bind();
118         glBufferSubData(target, offset, length, data);
119         //glNamedBufferSubDataEXT(m_bufferHandle, offset, length, data);
120 }
121
122 void GraphicsBuffer::Bind()
123 {
124         if (m_buffer_type == BufferTypeVertex)
125                 glBindBuffer(GL_ARRAY_BUFFER, m_buffer_handle);
126         else if (m_buffer_type == BufferTypeIndex)
127                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffer_handle);
128         else if (m_buffer_type == BufferTypePixelPack)
129                 glBindBuffer(GL_PIXEL_PACK_BUFFER, m_buffer_handle);
130         else if (m_buffer_type == BufferTypePixelUnpack)
131                 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_buffer_handle);
132         else if (m_buffer_type == BufferTypeUniform)
133                 glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_buffer_handle);
134         else if (m_buffer_type == BufferTypeDrawIndirect)
135                 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_buffer_handle);
136 }
137

UCC git Repository :: git.ucc.asn.au