]> git.tdb.fi Git - gldbg.git/blobdiff - flavors/gl/source/glstate.h
Query implementation limits on process startup
[gldbg.git] / flavors / gl / source / glstate.h
index 7f15b0157489986f87f0b1213c642d5096b713d9..11191955e93383839fc837cc7ac7597f06b64128 100644 (file)
@@ -6,6 +6,7 @@
 #include "arraystate.h"
 #include "bufferstate.h"
 #include "gldecoder.h"
+#include "programstate.h"
 #include "texturestate.h"
 
 struct Vector3
@@ -28,63 +29,55 @@ struct Vector4
 /**
 Tracks OpenGL state based on the command stream.  This class is essentially a
 (partial) OpenGL implementation in itself.
-
-XXX Should determine the number of texture units the target implementation
-actually supports.
 */
 class GlState
 {
 public:
        typedef std::map<unsigned, TextureState> TextureMap;
        typedef std::map<unsigned, BufferState> BufferMap;
+       typedef std::map<unsigned, ShaderState> ShaderMap;
+       typedef std::map<unsigned, ProgramState> ProgramMap;
 
 private:
        GlDecoder *decoder;
        Vector4 color;
-       Vector4 texcoord[8];
+       std::vector<Vector4> texcoord;
        Vector3 normal;
        unsigned active_tex;
        unsigned client_active_tex;
        TextureMap textures;
-       TexUnitState texunits[8];
+       std::vector<TexUnitState> texunits;
        BufferMap buffers;
        BufferState *array_buffer;
        BufferState *element_buffer;
+       BufferState *uniform_buffer;
+       std::vector<BufferBindingState> uniform_bind_points;
        ArrayState vertex_array;
        ArrayState normal_array;
        ArrayState color_array;
-       ArrayState texcoord_arrays[8];
-       std::map<unsigned, ArrayState> attrib_arrays;
+       std::vector<ArrayState> texcoord_arrays;
+       std::vector<ArrayState> attrib_arrays;
+       ShaderMap shaders;
+       ProgramMap programs;
 
 public:
        GlState();
        ~GlState();
 
        int decode(const char *, unsigned);
-       const Vector4 &get_color() const { return color; }
-       const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
-       const Vector3 &get_normal() const { return normal; }
-       const TextureMap &get_textures() const { return textures; }
-       const TextureState &get_texture(unsigned) const;
-       const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
-       const BufferMap &get_buffers() const { return buffers; }
-       const BufferState &get_buffer(unsigned) const;
-       const BufferState *get_current_buffer(GLenum) const;
-       const ArrayState &get_array(GLenum) const;
-       const ArrayState &get_texture_coord_array(unsigned) const;
-       const ArrayState &get_attrib_array(unsigned) const;
+
 private:
-       bool &get_boolean_state(GLenum);
-       TextureState *get_current_texture(GLenum);
-       BufferState *get_current_buffer(GLenum);
-       void set_current_texture(GLenum, unsigned);
-       void set_current_buffer(GLenum, unsigned);
-       ArrayState &get_attrib_array(unsigned);
+       static void glGetIntegerv(void *, GLenum, int *);
 
+public:
+       unsigned get_max_texture_units() const { return texunits.size(); }
+       unsigned get_max_vertex_attribs() const { return attrib_arrays.size(); }
+       unsigned get_max_uniform_buffer_bindings() const { return uniform_bind_points.size(); }
+
+private:
+       bool &get_boolean_state(GLenum);
        static void glEnableClientState(void *, GLenum);
        static void glDisableClientState(void *, GLenum);
-       static void glEnableVertexAttribArray(void *, unsigned);
-       static void glDisableVertexAttribArray(void *, unsigned);
 
        static void glColor3f(void *, float, float, float);
        static void glColor4f(void *, float, float, float, float);
@@ -95,27 +88,91 @@ private:
        static void glTexCoord4f(void *, float, float, float, float);
        static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
 
-       static void glActiveTexture(void *, unsigned);
-       static void glBindTexture(void *, GLenum, unsigned);
-       static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
-       static void glTexParameteri(void *, GLenum, GLenum, int);
-       static void glTexParameteriv(void *, GLenum, GLenum, const int *);
-       static void glDeleteTextures(void *, int, const unsigned *);
+public:
+       const Vector4 &get_color() const { return color; }
+       const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
+       const Vector3 &get_normal() const { return normal; }
 
+private:
        static void glVertexPointer(void *, int, GLenum, int, const void *);
        static void glNormalPointer(void *, GLenum, int, const void *);
        static void glColorPointer(void *, int, GLenum, int, const void *);
        static void glClientActiveTexture(void *, unsigned);
        static void glTexCoordPointer(void *, int, GLenum, int, const void *);
+       static void glEnableVertexAttribArray(void *, unsigned);
+       static void glDisableVertexAttribArray(void *, unsigned);
        static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *);
 
+public:
+       const ArrayState &get_array(GLenum) const;
+       const ArrayState &get_texture_coord_array(unsigned) const;
+       const ArrayState &get_attrib_array(unsigned) const;
+
+private:
+       static void glDrawElements(void *, GLenum, int, GLenum, const void *);
+       static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
+
+       void set_current_buffer(GLenum, unsigned);
+       BufferState *get_buffer_object(unsigned);
+       BufferState *get_current_buffer(GLenum);
+       BufferBindingState *get_buffer_binding(GLenum, unsigned);
+
        static void glBindBuffer(void *, GLenum, unsigned);
+       static void glBindBufferBase(void *, GLenum, unsigned, unsigned);
+       static void glBindBufferRange(void *, GLenum, unsigned, unsigned, int, int);
        static void glBufferData(void *, GLenum, int, const void *, GLenum);
        static void glBufferSubData(void *, GLenum, int, int, const void *);
        static void glDeleteBuffers(void *, int, const unsigned *);
 
-       static void glDrawElements(void *, GLenum, int, GLenum, const void *);
-       static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
+public:
+       const BufferMap &get_buffers() const { return buffers; }
+       const BufferState &get_buffer(unsigned) const;
+       const BufferState *get_current_buffer(GLenum) const;
+       const BufferBindingState &get_buffer_binding(GLenum, unsigned) const;
+
+private:
+       void set_current_texture(GLenum, unsigned);
+       TextureState *get_current_texture(GLenum);
+
+       static void glActiveTexture(void *, unsigned);
+       static void glBindTexture(void *, GLenum, unsigned);
+       static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
+       static void glTexParameteri(void *, GLenum, GLenum, int);
+       static void glTexParameteriv(void *, GLenum, GLenum, const int *);
+       static void glDeleteTextures(void *, int, const unsigned *);
+
+public:
+       const TextureMap &get_textures() const { return textures; }
+       const TextureState &get_texture(unsigned) const;
+       const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
+
+private:
+       ShaderState *get_shader(unsigned, bool);
+       void delete_shader(unsigned);
+       ProgramState *get_program(unsigned, bool);
+       void delete_program(unsigned);
+
+       static void glCreateShader(void *, unsigned, GLenum);
+       static void glShaderSource(void *, unsigned, int, const char **, const int *);
+       static void glCompileShader(void *, unsigned);
+       static void glGetShaderiv(void *, unsigned, GLenum, int *);
+       static void glGetShaderInfoLog(void *, unsigned, int, int *, char *);
+       static void glDeleteShader(void *, unsigned);
+       static void glCreateProgram(void *, unsigned);
+       static void glAttachShader(void *, unsigned, unsigned);
+       static void glLinkProgram(void *, unsigned);
+       static void glGetProgramiv(void *, unsigned, GLenum, int *);
+       static void glGetProgramInfoLog(void *, unsigned, int, int *, char *);
+       static void glDeleteProgram(void *, unsigned);
+       static void glDeleteObjectARB(void *, unsigned);
+       static void glGetObjectParameterivARB(void *, unsigned, GLenum, int *);
+       static void glGetInfoLogARB(void *, unsigned, int, int *, char *);
+
+public:
+       const ShaderMap &get_shaders() const { return shaders; }
+       const ShaderState &get_shader(unsigned) const;
+       const ProgramMap &get_programs() const { return programs; }
+       const ProgramState &get_program(unsigned) const;
 };
 
 #endif