1 #include "graphicsbuffer.h"
3 #define GL_GLEXT_PROTOTYPES
4 #include <SDL_opengl.h>
9 static GLenum BufferUsageToGLUsage(GraphicsBuffer::BufferUsage buffer_usage)
14 case GraphicsBuffer::BufferUsageStaticDraw:
15 usage = GL_STATIC_DRAW;
17 case GraphicsBuffer::BufferUsageStaticRead:
18 usage = GL_STATIC_READ;
20 case GraphicsBuffer::BufferUsageStaticCopy:
21 usage = GL_STATIC_COPY;
23 case GraphicsBuffer::BufferUsageDynamicDraw:
24 usage = GL_DYNAMIC_DRAW;
26 case GraphicsBuffer::BufferUsageDynamicRead:
27 usage = GL_DYNAMIC_READ;
29 case GraphicsBuffer::BufferUsageDynamicCopy:
30 usage = GL_DYNAMIC_COPY;
32 case GraphicsBuffer::BufferUsageStreamDraw:
33 usage = GL_STREAM_DRAW;
35 case GraphicsBuffer::BufferUsageStreamRead:
36 usage = GL_STREAM_READ;
38 case GraphicsBuffer::BufferUsageStreamCopy:
39 usage = GL_STREAM_COPY;
42 SDL_assert(false && "Unknown buffer usage type.");
43 usage = GL_DYNAMIC_DRAW;
48 static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type)
52 case GraphicsBuffer::BufferTypeVertex:
53 return GL_ARRAY_BUFFER;
54 case GraphicsBuffer::BufferTypeIndex:
55 return GL_ELEMENT_ARRAY_BUFFER;
56 case GraphicsBuffer::BufferTypePixelPack:
57 return GL_PIXEL_PACK_BUFFER;
58 case GraphicsBuffer::BufferTypePixelUnpack:
59 return GL_PIXEL_UNPACK_BUFFER;
60 case GraphicsBuffer::BufferTypeUniform:
61 return GL_UNIFORM_BUFFER;
62 case GraphicsBuffer::BufferTypeDrawIndirect:
63 return GL_DRAW_INDIRECT_BUFFER;
65 return GL_COPY_READ_BUFFER;
69 GraphicsBuffer::GraphicsBuffer()
73 SetUsage(BufferUsageStaticDraw);
76 GraphicsBuffer::~GraphicsBuffer()
82 glDeleteBuffers(1, &m_buffer_handle);
85 void GraphicsBuffer::SetType(GraphicsBuffer::BufferType bufType)
87 glGenBuffers(1, &m_buffer_handle);
88 m_buffer_type = bufType;
91 void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage)
93 m_buffer_usage = bufUsage;
96 void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
98 GLbitfield access = ((read)?GL_MAP_READ_BIT:0) | ((write)?GL_MAP_WRITE_BIT:0) | ((invalidate)?GL_MAP_INVALIDATE_BUFFER_BIT:0);
99 GLenum target = BufferTypeToGLType(m_buffer_type);
103 return glMapBufferRange(target, 0, m_buffer_size, access);
106 //return glMapNamedBufferEXT(m_bufferHandle, access);
109 void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bool invalidate)
111 GLbitfield access = ((read)?GL_MAP_READ_BIT:0) | ((write)?GL_MAP_WRITE_BIT:0) | ((invalidate)?GL_MAP_INVALIDATE_RANGE_BIT:0);
112 GLenum target = BufferTypeToGLType(m_buffer_type);
116 return glMapBufferRange(target, offset, length, access);
119 //return glMapNamedBufferRangeEXT(m_bufferHandle, offset, length, access);
122 void GraphicsBuffer::UnMap()
124 GLenum target = BufferTypeToGLType(m_buffer_type);
127 glUnmapBuffer(target);
128 //glUnmapNamedBufferEXT(m_bufferHandle);
131 void GraphicsBuffer::Upload(size_t length, const void* data)
133 GLenum target = BufferTypeToGLType(m_buffer_type);
135 GLenum usage = BufferUsageToGLUsage(m_buffer_usage);
138 glBufferData(target, length, data, usage);
139 m_buffer_size = length;
140 //glNamedBufferDataEXT(m_bufferHandle, length, data, usage);
143 void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
145 GLenum target = BufferTypeToGLType(m_buffer_type);
148 glBufferSubData(target, offset, length, data);
149 //glNamedBufferSubDataEXT(m_bufferHandle, offset, length, data);
152 void GraphicsBuffer::Resize(size_t length)
156 Upload(length, nullptr);
160 // Create a new buffer and copy the old data into it.
162 GLuint old_buffer = m_buffer_handle;
163 glGenBuffers(1, &m_buffer_handle);
164 Upload(length, nullptr);
165 glBindBuffer(GL_COPY_READ_BUFFER, old_buffer);
166 glBindBuffer(GL_COPY_WRITE_BUFFER, m_buffer_handle);
167 glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, m_buffer_size);
168 glDeleteBuffers(1, &old_buffer);
170 m_buffer_size = length;
174 void GraphicsBuffer::Bind()
176 if (m_buffer_type == BufferTypeUniform)
177 glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_buffer_handle);
179 glBindBuffer(BufferTypeToGLType(m_buffer_type), m_buffer_handle);