]> git.tdb.fi Git - gldbg.git/blob - flavors/gl/source/glstate.h
Fix things for 64-bit systems
[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 "programstate.h"
10 #include "texturestate.h"
11
12 struct Vector3
13 {
14         float x, y, z;
15
16         Vector3();
17 };
18
19 struct Vector4
20 {
21         union { float x, r, s; };
22         union { float y, g, t; };
23         union { float z, b, p; };
24         union { float w, a, q; };
25
26         Vector4();
27 };
28
29 /**
30 Tracks OpenGL state based on the command stream.  This class is essentially a
31 (partial) OpenGL implementation in itself.
32 */
33 class GlState
34 {
35 public:
36         typedef std::map<unsigned, TextureState> TextureMap;
37         typedef std::map<unsigned, BufferState> BufferMap;
38         typedef std::map<unsigned, ShaderState> ShaderMap;
39         typedef std::map<unsigned, ProgramState> ProgramMap;
40
41 private:
42         GlDecoder *decoder;
43         Vector4 color;
44         std::vector<Vector4> texcoord;
45         Vector3 normal;
46         unsigned active_tex;
47         unsigned client_active_tex;
48         TextureMap textures;
49         std::vector<TexUnitState> texunits;
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         std::vector<ArrayState> texcoord_arrays;
59         std::vector<ArrayState> attrib_arrays;
60         ShaderMap shaders;
61         ProgramMap programs;
62
63 public:
64         GlState();
65         ~GlState();
66
67         int decode(const char *, unsigned);
68
69 private:
70         static void glGetIntegerv(void *, GLenum, int *);
71
72 public:
73         unsigned get_max_texture_units() const { return texunits.size(); }
74         unsigned get_max_vertex_attribs() const { return attrib_arrays.size(); }
75         unsigned get_max_uniform_buffer_bindings() const { return uniform_bind_points.size(); }
76
77 private:
78         bool &get_boolean_state(GLenum);
79         bool &get_boolean_client_state(GLenum);
80
81         static void glEnable(void *, GLenum);
82         static void glDisable(void *, GLenum);
83         static void glEnableClientState(void *, GLenum);
84         static void glDisableClientState(void *, GLenum);
85
86         static void glColor3f(void *, float, float, float);
87         static void glColor4f(void *, float, float, float, float);
88         static void glNormal3f(void *, float, float, float);
89         static void glTexCoord1f(void *, float);
90         static void glTexCoord2f(void *, float, float);
91         static void glTexCoord3f(void *, float, float, float);
92         static void glTexCoord4f(void *, float, float, float, float);
93         static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
94
95 public:
96         const Vector4 &get_color() const { return color; }
97         const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
98         const Vector3 &get_normal() const { return normal; }
99
100 private:
101         static void glVertexPointer(void *, int, GLenum, int, const void *);
102         static void glNormalPointer(void *, GLenum, int, const void *);
103         static void glColorPointer(void *, int, GLenum, int, const void *);
104         static void glClientActiveTexture(void *, unsigned);
105         static void glTexCoordPointer(void *, int, GLenum, int, const void *);
106         static void glEnableVertexAttribArray(void *, unsigned);
107         static void glDisableVertexAttribArray(void *, unsigned);
108         static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *);
109
110 public:
111         const ArrayState &get_array(GLenum) const;
112         const ArrayState &get_texture_coord_array(unsigned) const;
113         const ArrayState &get_attrib_array(unsigned) const;
114
115 private:
116         static void glDrawElements(void *, GLenum, int, GLenum, const void *);
117         static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
118
119         void set_current_buffer(GLenum, unsigned);
120         BufferState *get_buffer_object(unsigned);
121         BufferState *get_current_buffer(GLenum);
122         BufferBindingState *get_buffer_binding(GLenum, unsigned);
123
124         static void glBindBuffer(void *, GLenum, unsigned);
125         static void glBindBufferBase(void *, GLenum, unsigned, unsigned);
126         static void glBindBufferRange(void *, GLenum, unsigned, unsigned, ptrdiff_t, ptrdiff_t);
127         static void glBufferData(void *, GLenum, ptrdiff_t, const void *, GLenum);
128         static void glBufferSubData(void *, GLenum, ptrdiff_t, ptrdiff_t, const void *);
129         static void glDeleteBuffers(void *, int, const unsigned *);
130
131 public:
132         const BufferMap &get_buffers() const { return buffers; }
133         const BufferState &get_buffer(unsigned) const;
134         const BufferState *get_current_buffer(GLenum) const;
135         const BufferBindingState &get_buffer_binding(GLenum, unsigned) const;
136
137 private:
138         void set_current_texture(GLenum, unsigned);
139         TextureState *get_current_texture(GLenum);
140
141         static void glActiveTexture(void *, unsigned);
142         static void glBindTexture(void *, GLenum, unsigned);
143         static void glTexImage1D(void *, GLenum, int, int, int, int, GLenum, GLenum, const void *);
144         static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
145         static void glTexImage3D(void *, GLenum, int, int, int, int, int, int, GLenum, GLenum, const void *);
146         static void glTexParameteri(void *, GLenum, GLenum, int);
147         static void glTexParameteriv(void *, GLenum, GLenum, const int *);
148         static void glDeleteTextures(void *, int, const unsigned *);
149
150 public:
151         const TextureMap &get_textures() const { return textures; }
152         const TextureState &get_texture(unsigned) const;
153         const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
154
155 private:
156         ShaderState *get_shader(unsigned, bool);
157         void delete_shader(unsigned);
158         ProgramState *get_program(unsigned, bool);
159         void delete_program(unsigned);
160
161         static void glCreateShader(void *, unsigned, GLenum);
162         static void glShaderSource(void *, unsigned, int, const char **, const int *);
163         static void glCompileShader(void *, unsigned);
164         static void glGetShaderiv(void *, unsigned, GLenum, int *);
165         static void glGetShaderInfoLog(void *, unsigned, int, int *, char *);
166         static void glDeleteShader(void *, unsigned);
167         static void glCreateProgram(void *, unsigned);
168         static void glAttachShader(void *, unsigned, unsigned);
169         static void glLinkProgram(void *, unsigned);
170         static void glGetProgramiv(void *, unsigned, GLenum, int *);
171         static void glGetProgramInfoLog(void *, unsigned, int, int *, char *);
172         static void glDeleteProgram(void *, unsigned);
173         static void glDeleteObjectARB(void *, unsigned);
174         static void glGetObjectParameterivARB(void *, unsigned, GLenum, int *);
175         static void glGetInfoLogARB(void *, unsigned, int, int *, char *);
176
177 public:
178         const ShaderMap &get_shaders() const { return shaders; }
179         const ShaderState &get_shader(unsigned) const;
180         const ProgramMap &get_programs() const { return programs; }
181         const ProgramState &get_program(unsigned) const;
182 };
183
184 #endif