]> git.tdb.fi Git - gldbg.git/blob - flavors/gl/source/glstate.h
ab5ab050a87e51f30e55fc8e577e6cb6b6c3ca72
[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 XXX Should determine the number of texture units the target implementation
34 actually supports.
35 */
36 class GlState
37 {
38 public:
39         typedef std::map<unsigned, TextureState> TextureMap;
40         typedef std::map<unsigned, BufferState> BufferMap;
41         typedef std::map<unsigned, ShaderState> ShaderMap;
42         typedef std::map<unsigned, ProgramState> ProgramMap;
43
44 private:
45         GlDecoder *decoder;
46         Vector4 color;
47         Vector4 texcoord[8];
48         Vector3 normal;
49         unsigned active_tex;
50         unsigned client_active_tex;
51         TextureMap textures;
52         TexUnitState texunits[8];
53         BufferMap buffers;
54         BufferState *array_buffer;
55         BufferState *element_buffer;
56         BufferState *uniform_buffer;
57         std::vector<BufferBindingState> uniform_bind_points;
58         ArrayState vertex_array;
59         ArrayState normal_array;
60         ArrayState color_array;
61         ArrayState texcoord_arrays[8];
62         std::map<unsigned, ArrayState> attrib_arrays;
63         ShaderMap shaders;
64         ProgramMap programs;
65
66 public:
67         GlState();
68         ~GlState();
69
70         int decode(const char *, unsigned);
71
72 private:
73         bool &get_boolean_state(GLenum);
74         static void glEnableClientState(void *, GLenum);
75         static void glDisableClientState(void *, GLenum);
76
77         static void glColor3f(void *, float, float, float);
78         static void glColor4f(void *, float, float, float, float);
79         static void glNormal3f(void *, float, float, float);
80         static void glTexCoord1f(void *, float);
81         static void glTexCoord2f(void *, float, float);
82         static void glTexCoord3f(void *, float, float, float);
83         static void glTexCoord4f(void *, float, float, float, float);
84         static void glMultiTexCoord4f(void *, unsigned, float, float, float, float);
85
86 public:
87         const Vector4 &get_color() const { return color; }
88         const Vector4 &get_texcoord(unsigned i) const { return texcoord[i]; }
89         const Vector3 &get_normal() const { return normal; }
90
91 private:
92         ArrayState &get_attrib_array(unsigned);
93
94         static void glVertexPointer(void *, int, GLenum, int, const void *);
95         static void glNormalPointer(void *, GLenum, int, const void *);
96         static void glColorPointer(void *, int, GLenum, int, const void *);
97         static void glClientActiveTexture(void *, unsigned);
98         static void glTexCoordPointer(void *, int, GLenum, int, const void *);
99         static void glEnableVertexAttribArray(void *, unsigned);
100         static void glDisableVertexAttribArray(void *, unsigned);
101         static void glVertexAttribPointer(void *, unsigned, int, GLenum, unsigned char, int, const void *);
102
103 public:
104         const ArrayState &get_array(GLenum) const;
105         const ArrayState &get_texture_coord_array(unsigned) const;
106         const ArrayState &get_attrib_array(unsigned) const;
107
108 private:
109         static void glDrawElements(void *, GLenum, int, GLenum, const void *);
110         static void glDrawRangeElements(void *, GLenum, unsigned, unsigned, int, GLenum, const void *);
111
112         void set_current_buffer(GLenum, unsigned);
113         BufferState *get_buffer_object(unsigned);
114         BufferState *get_current_buffer(GLenum);
115         BufferBindingState *get_buffer_binding(GLenum, unsigned);
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 public:
125         const BufferMap &get_buffers() const { return buffers; }
126         const BufferState &get_buffer(unsigned) const;
127         const BufferState *get_current_buffer(GLenum) const;
128         const BufferBindingState &get_buffer_binding(GLenum, unsigned) const;
129
130 private:
131         void set_current_texture(GLenum, unsigned);
132         TextureState *get_current_texture(GLenum);
133
134         static void glActiveTexture(void *, unsigned);
135         static void glBindTexture(void *, GLenum, unsigned);
136         static void glTexImage2D(void *, GLenum, int, int, int, int, int, GLenum, GLenum, const void *);
137         static void glTexParameteri(void *, GLenum, GLenum, int);
138         static void glTexParameteriv(void *, GLenum, GLenum, const int *);
139         static void glDeleteTextures(void *, int, const unsigned *);
140
141 public:
142         const TextureMap &get_textures() const { return textures; }
143         const TextureState &get_texture(unsigned) const;
144         const TexUnitState &get_texture_unit(unsigned i) const { return texunits[i]; }
145
146 private:
147         ShaderState *get_shader(unsigned, bool);
148         void delete_shader(unsigned);
149         ProgramState *get_program(unsigned, bool);
150         void delete_program(unsigned);
151
152         static void glCreateShader(void *, unsigned, GLenum);
153         static void glShaderSource(void *, unsigned, int, const char **, const int *);
154         static void glCompileShader(void *, unsigned);
155         static void glGetShaderiv(void *, unsigned, GLenum, int *);
156         static void glGetShaderInfoLog(void *, unsigned, int, int *, char *);
157         static void glDeleteShader(void *, unsigned);
158         static void glCreateProgram(void *, unsigned);
159         static void glAttachShader(void *, unsigned, unsigned);
160         static void glLinkProgram(void *, unsigned);
161         static void glGetProgramiv(void *, unsigned, GLenum, int *);
162         static void glGetProgramInfoLog(void *, unsigned, int, int *, char *);
163         static void glDeleteProgram(void *, unsigned);
164         static void glDeleteObjectARB(void *, unsigned);
165         static void glGetObjectParameterivARB(void *, unsigned, GLenum, int *);
166         static void glGetInfoLogARB(void *, unsigned, int, int *, char *);
167
168 public:
169         const ShaderMap &get_shaders() const { return shaders; }
170         const ShaderState &get_shader(unsigned) const;
171         const ProgramMap &get_programs() const { return programs; }
172         const ProgramState &get_program(unsigned) const;
173 };
174
175 #endif