]> git.tdb.fi Git - gldbg.git/blobdiff - flavors/gl/source/glstate.cpp
Fix things for 64-bit systems
[gldbg.git] / flavors / gl / source / glstate.cpp
index 7f67596f099aa6581f2ef58c353d5cc40fb276ae..9bfe7b5a525c898076a4f0d24624fd53bcefd44f 100644 (file)
@@ -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<GlState *>(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; i<self->texcoord_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; i<self->attrib_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<GlState *>(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<GlState *>(user_data)->get_boolean_state(state) = false;
 }
 
+void GlState::glEnableClientState(void *user_data, GLenum state)
+{
+       reinterpret_cast<GlState *>(user_data)->get_boolean_client_state(state) = true;
+}
+
+void GlState::glDisableClientState(void *user_data, GLenum state)
+{
+       reinterpret_cast<GlState *>(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<unsigned, ArrayState>::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<GlState *>(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<GlState *>(user_data);
-       self->get_attrib_array(index).set(size, type, norm, stride, self->array_buffer, reinterpret_cast<long>(data));
+       self->attrib_arrays[index].set(size, type, norm, stride, self->array_buffer, reinterpret_cast<long>(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<unsigned, ArrayState>::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<GlState *>(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<GlState *>(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<GlState *>(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<GlState *>(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<GlState *>(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<GlState *>(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<GlState *>(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)