X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=flavors%2Fgl%2Fsource%2Fglstate.cpp;h=9bfe7b5a525c898076a4f0d24624fd53bcefd44f;hb=3fce21d3193c09840cfbaa96fe05b00b7444fd66;hp=7f67596f099aa6581f2ef58c353d5cc40fb276ae;hpb=cbf00fed7d2ab4d3a6593a1f230d17f21bc61818;p=gldbg.git diff --git a/flavors/gl/source/glstate.cpp b/flavors/gl/source/glstate.cpp index 7f67596..9bfe7b5 100644 --- a/flavors/gl/source/glstate.cpp +++ b/flavors/gl/source/glstate.cpp @@ -63,22 +63,25 @@ Vector4::Vector4(): GlState::GlState(): decoder(gldecoder_new(this, NULL)), + texcoord(1), active_tex(0), client_active_tex(0), + texunits(1), array_buffer(0), element_buffer(0), uniform_buffer(0), - uniform_bind_points(64) + texcoord_arrays(1) { vertex_array.kind = GL_VERTEX_ARRAY; normal_array.kind = GL_NORMAL_ARRAY; color_array.kind = GL_COLOR_ARRAY; - for(unsigned i=0; i<8; ++i) - { - texcoord_arrays[i].kind = GL_TEXTURE_COORD_ARRAY; - texcoord_arrays[i].index = i; - } + texcoord_arrays[0].kind = GL_TEXTURE_COORD_ARRAY; + texcoord_arrays[0].index = 0; + + decoder->glGetIntegerv = glGetIntegerv; + decoder->glEnable = glEnable; + decoder->glDisable = glDisable; decoder->glEnableClientState = glEnableClientState; decoder->glDisableClientState = glDisableClientState; @@ -169,9 +172,48 @@ int GlState::decode(const char *data, unsigned len) return gldecoder_decode(decoder, data, len); } +void GlState::glGetIntegerv(void *user_data, GLenum pname, int *param) +{ + GlState *self = reinterpret_cast(user_data); + if(pname==GL_MAX_TEXTURE_UNITS) + { + self->texcoord.resize(*param); + self->texunits.resize(*param); + self->texcoord_arrays.resize(*param); + for(unsigned i=0; itexcoord_arrays.size(); ++i) + { + self->texcoord_arrays[i].kind = GL_TEXTURE_COORD_ARRAY; + self->texcoord_arrays[i].index = i; + } + } + else if(pname==GL_MAX_VERTEX_ATTRIBS) + { + self->attrib_arrays.resize(*param); + for(unsigned i=0; iattrib_arrays.size(); ++i) + self->attrib_arrays[i].index = i; + } + else if(pname==GL_MAX_UNIFORM_BUFFER_BINDINGS) + self->uniform_bind_points.resize(*param); +} + // Boolean state bool &GlState::get_boolean_state(GLenum state) +{ + if(state==GL_TEXTURE_1D) + return texunits[active_tex].binding_1d.enabled; + else if(state==GL_TEXTURE_2D) + return texunits[active_tex].binding_2d.enabled; + else if(state==GL_TEXTURE_3D) + return texunits[active_tex].binding_3d.enabled; + else if(state==GL_TEXTURE_CUBE_MAP) + return texunits[active_tex].binding_cube.enabled; + + static bool dummy; + return dummy; +} + +bool &GlState::get_boolean_client_state(GLenum state) { if(state==GL_VERTEX_ARRAY) return vertex_array.enabled; @@ -186,16 +228,26 @@ bool &GlState::get_boolean_state(GLenum state) return dummy; } -void GlState::glEnableClientState(void *user_data, GLenum state) +void GlState::glEnable(void *user_data, GLenum state) { reinterpret_cast(user_data)->get_boolean_state(state) = true; } -void GlState::glDisableClientState(void *user_data, GLenum state) +void GlState::glDisable(void *user_data, GLenum state) { reinterpret_cast(user_data)->get_boolean_state(state) = false; } +void GlState::glEnableClientState(void *user_data, GLenum state) +{ + reinterpret_cast(user_data)->get_boolean_client_state(state) = true; +} + +void GlState::glDisableClientState(void *user_data, GLenum state) +{ + reinterpret_cast(user_data)->get_boolean_client_state(state) = false; +} + // Vertex attributes void GlState::glColor3f(void *user_data, float r, float g, float b) @@ -252,18 +304,6 @@ void GlState::glMultiTexCoord4f(void *user_data, unsigned index, float s, float // Vertex arrays -ArrayState &GlState::get_attrib_array(unsigned index) -{ - map::iterator i = attrib_arrays.find(index); - if(i!=attrib_arrays.end()) - return i->second; - - ArrayState &array = attrib_arrays[index]; - array.index = index; - - return array; -} - void GlState::glVertexPointer(void *user_data, int size, GLenum type, int stride, const void *data) { GlState *self = reinterpret_cast(user_data); @@ -306,7 +346,7 @@ void GlState::glDisableVertexAttribArray(void *user_data, unsigned index) void GlState::glVertexAttribPointer(void *user_data, unsigned index, int size, GLenum type, unsigned char norm, int stride, const void *data) { GlState *self = reinterpret_cast(user_data); - self->get_attrib_array(index).set(size, type, norm, stride, self->array_buffer, reinterpret_cast(data)); + self->attrib_arrays[index].set(size, type, norm, stride, self->array_buffer, reinterpret_cast(data)); } const ArrayState &GlState::get_array(GLenum array) const @@ -330,12 +370,7 @@ const ArrayState &GlState::get_texture_coord_array(unsigned index) const const ArrayState &GlState::get_attrib_array(unsigned index) const { - map::const_iterator i = attrib_arrays.find(index); - if(i!=attrib_arrays.end()) - return i->second; - - // XXX Return a dummy? - throw runtime_error("Unknown attribute array"); + return attrib_arrays[index]; } // Array draw commands @@ -407,7 +442,7 @@ void GlState::glBindBufferBase(void *user_data, GLenum target, unsigned index, u 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) +void GlState::glBindBufferRange(void *user_data, GLenum target, unsigned index, unsigned id, ptrdiff_t offset, ptrdiff_t size) { GlState *self = reinterpret_cast(user_data); if(BufferBindingState *binding = self->get_buffer_binding(target, index)) @@ -418,13 +453,13 @@ void GlState::glBindBufferRange(void *user_data, GLenum target, unsigned index, } } -void GlState::glBufferData(void *user_data, GLenum target, int size, const void *data, GLenum usage) +void GlState::glBufferData(void *user_data, GLenum target, ptrdiff_t size, const void *data, GLenum usage) { if(BufferState *buf = reinterpret_cast(user_data)->get_current_buffer(target)) buf->set_data(size, data, usage); } -void GlState::glBufferSubData(void *user_data, GLenum target, int offset, int size, const void *data) +void GlState::glBufferSubData(void *user_data, GLenum target, ptrdiff_t offset, ptrdiff_t size, const void *data) { if(BufferState *buf = reinterpret_cast(user_data)->get_current_buffer(target)) buf->set_sub_data(offset, size, data); @@ -491,10 +526,36 @@ void GlState::glBindTexture(void *user_data, GLenum target, unsigned id) reinterpret_cast(user_data)->set_current_texture(target, id); } +void GlState::glTexImage1D(void *user_data, GLenum target, int level, int ifmt, int width, int, GLenum, GLenum, const void *) +{ + if(TextureState *tex = reinterpret_cast(user_data)->get_current_texture(target)) + tex->set_image_1d(level, ifmt, width); +} + void GlState::glTexImage2D(void *user_data, GLenum target, int level, int ifmt, int width, int height, int, GLenum, GLenum, const void *) +{ + GLenum face = 0; + for(unsigned i=0; i<6; ++i) + if(texture_cube_faces[i]==target) + { + face = target; + target = GL_TEXTURE_CUBE_MAP; + break; + } + + if(TextureState *tex = reinterpret_cast(user_data)->get_current_texture(target)) + { + if(face) + tex->set_face_image_2d(face, level, ifmt, width, height); + else + tex->set_image_2d(level, ifmt, width, height); + } +} + +void GlState::glTexImage3D(void *user_data, GLenum target, int level, int ifmt, int width, int height, int depth, int, GLenum, GLenum, const void *) { if(TextureState *tex = reinterpret_cast(user_data)->get_current_texture(target)) - tex->set_image_2d(level, ifmt, width, height); + tex->set_image_3d(level, ifmt, width, height, depth); } void GlState::glTexParameteri(void *user_data, GLenum target, GLenum param, int value)