X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=flavors%2Fgl%2Fsource%2Fglstate.cpp;h=0163c2f884605603170f60303ad9d856e611ea28;hb=73d29911044cfffdc7edad50aeb2a8d1175ecd11;hp=e3c9871c34c5ca5772a229f55c6c6107e288325d;hpb=fffbad8853e5849c64227635db70e5ce980d2f26;p=gldbg.git diff --git a/flavors/gl/source/glstate.cpp b/flavors/gl/source/glstate.cpp index e3c9871..0163c2f 100644 --- a/flavors/gl/source/glstate.cpp +++ b/flavors/gl/source/glstate.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of gldbg -Copyright © 2009-2011 Mikko Rasa, Mikkosoft Productions -Distributed under the GPL -*/ - #include #include "glstate.h" @@ -73,7 +66,9 @@ GlState::GlState(): active_tex(0), client_active_tex(0), array_buffer(0), - element_buffer(0) + element_buffer(0), + uniform_buffer(0), + uniform_bind_points(64) { vertex_array.kind = GL_VERTEX_ARRAY; normal_array.kind = GL_NORMAL_ARRAY; @@ -129,6 +124,8 @@ GlState::GlState(): decoder->glBindBuffer = glBindBuffer; decoder->glBindBufferARB = glBindBuffer; + decoder->glBindBufferBase = glBindBufferBase; + decoder->glBindBufferRange = glBindBufferRange; decoder->glBufferData = glBufferData; decoder->glBufferDataARB = glBufferData; decoder->glBufferSubData = glBufferSubData; @@ -167,6 +164,13 @@ const BufferState &GlState::get_buffer(unsigned id) const return i->second; } +const BufferBindingState &GlState::get_buffer_binding(GLenum target, unsigned index) const +{ + if(target==GL_UNIFORM_BUFFER) + return uniform_bind_points[index]; + throw runtime_error("This buffer target does not have indexed binding points"); +} + const ArrayState &GlState::get_array(GLenum array) const { if(array==GL_VERTEX_ARRAY) @@ -221,12 +225,27 @@ TextureState *GlState::get_current_texture(GLenum target) return texunits[active_tex].get_current_texture(target); } +BufferState *GlState::get_buffer_object(unsigned id) +{ + BufferMap::iterator i = buffers.find(id); + return (i==buffers.end() ? 0 : &i->second); +} + BufferState *GlState::get_current_buffer(GLenum target) { if(target==GL_ARRAY_BUFFER) return array_buffer; else if(target==GL_ELEMENT_ARRAY_BUFFER) return element_buffer; + else if(target==GL_UNIFORM_BUFFER) + return uniform_buffer; + return 0; +} + +BufferBindingState *GlState::get_buffer_binding(GLenum target, unsigned index) +{ + if(target==GL_UNIFORM_BUFFER) + return &uniform_bind_points[index]; return 0; } @@ -262,6 +281,8 @@ void GlState::set_current_buffer(GLenum target, unsigned id) array_buffer = buf; else if(target==GL_ELEMENT_ARRAY_BUFFER) element_buffer = buf; + else if(target==GL_UNIFORM_BUFFER) + uniform_buffer = buf; } ArrayState &GlState::get_attrib_array(unsigned index) @@ -419,6 +440,23 @@ void GlState::glVertexAttribPointer(void *user_data, unsigned index, int size, G void GlState::glBindBuffer(void *user_data, GLenum target, unsigned id) { reinterpret_cast(user_data)->set_current_buffer(target, id); } +void GlState::glBindBufferBase(void *user_data, GLenum target, unsigned index, unsigned id) +{ + if(BufferState *buffer = reinterpret_cast(user_data)->get_buffer_object(id)) + glBindBufferRange(user_data, target, index, id, 0, buffer->size); +} + +void GlState::glBindBufferRange(void *user_data, GLenum target, unsigned index, unsigned id, int offset, int size) +{ + GlState *self = reinterpret_cast(user_data); + if(BufferBindingState *binding = self->get_buffer_binding(target, index)) + { + binding->buffer = self->get_buffer_object(id); + binding->offset = offset; + binding->size = size; + } +} + void GlState::glBufferData(void *user_data, GLenum target, int size, const void *data, GLenum usage) { if(BufferState *buf = reinterpret_cast(user_data)->get_current_buffer(target))