1 #include "graphicsbuffer.h"
2 #define GL_GLEXT_PROTOTYPES
3 #include <SDL_opengl.h>
8 GraphicsBuffer::GraphicsBuffer()
10 SetUsage(BufferUsageStaticDraw);
13 GraphicsBuffer::~GraphicsBuffer()
19 glDeleteBuffers(1, &m_buffer_handle);
22 void GraphicsBuffer::SetType(GraphicsBuffer::BufferType bufType)
24 glGenBuffers(1, &m_buffer_handle);
25 m_buffer_type = bufType;
28 void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage)
30 m_buffer_usage = bufUsage;
33 void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
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;
40 return glMapBufferRange(target, 0, m_buffer_size, access);
43 //return glMapNamedBufferEXT(m_bufferHandle, access);
46 void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bool invalidate)
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;
53 return glMapBufferRange(target, offset, length, access);
56 //return glMapNamedBufferRangeEXT(m_bufferHandle, offset, length, access);
59 void GraphicsBuffer::UnMap()
61 GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
64 glUnmapBuffer(target);
65 //glUnmapNamedBufferEXT(m_bufferHandle);
68 void GraphicsBuffer::Upload(size_t length, const void* data)
70 GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
73 switch (m_buffer_usage)
75 case BufferUsageStaticDraw:
76 usage = GL_STATIC_DRAW;
78 case BufferUsageStaticRead:
79 usage = GL_STATIC_READ;
81 case BufferUsageStaticCopy:
82 usage = GL_STATIC_COPY;
84 case BufferUsageDynamicDraw:
85 usage = GL_DYNAMIC_DRAW;
87 case BufferUsageDynamicRead:
88 usage = GL_DYNAMIC_READ;
90 case BufferUsageDynamicCopy:
91 usage = GL_DYNAMIC_COPY;
93 case BufferUsageStreamDraw:
94 usage = GL_STREAM_DRAW;
96 case BufferUsageStreamRead:
97 usage = GL_STREAM_READ;
99 case BufferUsageStreamCopy:
100 usage = GL_STREAM_COPY;
103 SDL_assert(false && "Unknown buffer usage type.");
104 usage = GL_DYNAMIC_DRAW;
108 glBufferData(target, length, data, usage);
109 m_buffer_size = length;
110 //glNamedBufferDataEXT(m_bufferHandle, length, data, usage);
113 void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
115 GLenum target = (m_buffer_type == GraphicsBuffer::BufferTypeVertex)?GL_ARRAY_BUFFER:GL_ELEMENT_ARRAY_BUFFER;
118 glBufferSubData(target, offset, length, data);
119 //glNamedBufferSubDataEXT(m_bufferHandle, offset, length, data);
122 void GraphicsBuffer::Bind()
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);