]> git.tdb.fi Git - gldbg.git/blob - flavors/gl/source/glstate.h
Track uniform buffer bindings
[gldbg.git] / flavors / gl / source / glstate.h
1 #ifndef GLSTATE_H_
2 #define GLSTATE_H_
3
4 #include <map>
5 #include <vector>
6 #include "arraystate.h"
7 #include "bufferstate.h"
8 #include "gldecoder.h"
9 #include "texturestate.h"
10
11 struct Vector3
12 {
13         float x, y, z;
14
15         Vector3();
16 };
17
18 struct Vector4
19 {
20         union { float x, r, s; };
21         union { float y, g, t; };
22         union { float z, b, p; };
23         union { float w, a, q; };
24
25         Vector4();
26 };
27
28 /**
29 Tracks OpenGL state based on the command stream.  This class is essentially a
30 (partial) OpenGL implementation in itself.
31
32 XXX Should determine the number of texture units the target implementation
33 actually supports.
34 */
35 class GlState
36 {
37 public:
38         typedef std::map<unsigned, TextureState> TextureMap;
39         typedef std::map<unsigned, BufferState> BufferMap;
40
41 private:
42         GlDecoder *decoder;
43         Vector4 color;
44         Vector4 texcoord[8];
45         Vector3 normal;
46         unsigned active_tex;
47         unsigned client_active_tex;
48         TextureMap textures;
49         TexUnitState texunits[8];
50         BufferMap buffers;
51         BufferState *array_buffer;
52         BufferState *element_buffer;
53         BufferState *uniform_buffer;
54         std::vector<BufferBindingState> uniform_bind_points;
55         ArrayState vertex_array;
56         ArrayState normal_array;
57         ArrayState color_array;
58         ArrayState texcoord_arrays[8];
59         std::map<unsigned, ArrayState> attrib_arrays;
60
61 public:
62         GlState();
63         ~GlState();
64
65         int decode(const char *, unsigned);
66         const Vector4 &get_color() const { return color; }
67         const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
68         const Vector3 &get_normal() const { return normal; }
69         const TextureMap &get_textures() const { return textures; }
70         const TextureState &get_texture(unsigned) const;
71         const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
72         const BufferMap &get_buffers() const { return buffers; }
73         const BufferState &get_buffer(unsigned) const;
74         const BufferState *get_current_buffer(GLenum) const;
75         const BufferBindingState &get_buffer_binding(GLenum, unsigned) const;
76         const ArrayState &get_array(GLenum) const;
77         const ArrayState &get_texture_coord_array(unsigned) const;
78         const ArrayState &get_attrib_array(unsigned) const;
79 private:
80         bool &get_boolean_state(GLenum);
81         TextureState *get_current_texture(GLenum);
82         BufferState *get_buffer_object(unsigned);
83         BufferState *get_current_buffer(GLenum);
84         BufferBindingState *get_buffer_binding(GLenum, unsigned);
85         void set_current_texture(GLenum, unsigned);
86         void set_current_buffer(GLenum, unsigned);
87         ArrayState &get_attrib_array(unsigned);
88
89         static void glEnableClientState(void *, GLenum);
90         static void glDisableClientState(void *, GLenum);
91         static void glEnableVertexAttribArray(void *, unsigned);
92         static void glDisableVertexAttribArray(void *, unsigned);
93
94         static void glColor3f(void *, float, float, float);
95         static void glColor4f(void *, float, float, float, float);
96         static void glNormal3f(void *, float, float, float);
97         static void glTexCoord1f(void *, float);
98         static void glTexCoord2f(void *, float, float);
99         static void glTexCoord3f(void *, float, float, float);
100         static void glTexCoord4f(void *, float, float, float, float);
101         static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
102
103         static void glActiveTexture(void *, unsigned);
104         static void glBindTexture(void *, GLenum, unsigned);
105         static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
106         static void glTexParameteri(void *, GLenum, GLenum, int);
107         static void glTexParameteriv(void *, GLenum, GLenum, const int *);
108         static void glDeleteTextures(void *, int, const unsigned *);
109
110         static void glVertexPointer(void *, int, GLenum, int, const void *);
111         static void glNormalPointer(void *, GLenum, int, const void *);
112         static void glColorPointer(void *, int, GLenum, int, const void *);
113         static void glClientActiveTexture(void *, unsigned);
114         static void glTexCoordPointer(void *, int, GLenum, int, const void *);
115         static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *);
116
117         static void glBindBuffer(void *, GLenum, unsigned);
118         static void glBindBufferBase(void *, GLenum, unsigned, unsigned);
119         static void glBindBufferRange(void *, GLenum, unsigned, unsigned, int, int);
120         static void glBufferData(void *, GLenum, int, const void *, GLenum);
121         static void glBufferSubData(void *, GLenum, int, int, const void *);
122         static void glDeleteBuffers(void *, int, const unsigned *);
123
124         static void glDrawElements(void *, GLenum, int, GLenum, const void *);
125         static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
126 };
127
128 #endif