("glGet", E, 1, "GL_STENCIL_BACK_FAIL"), # 0x8801
("glGet", E, 1, "GL_STENCIL_BACK_PASS_DEPTH_FAIL"), # 0x8802
("glGet", E, 1, "GL_STENCIL_BACK_PASS_DEPTH_PASS"), # 0x8803
- ("glGet", X, 1, "GL_FRAGMENT_PROGRAM_ARB"), # 0x8804
+ ("glGet", B, 1, "GL_FRAGMENT_PROGRAM_ARB"), # 0x8804
("glGet", X, 1, "GL_PROGRAM_ALU_INSTRUCTIONS_ARB"), # 0x8805
("glGet", X, 1, "GL_PROGRAM_TEX_INSTRUCTIONS_ARB"), # 0x8806
("glGet", X, 1, "GL_PROGRAM_TEX_INDIRECTIONS_ARB"), # 0x8807
print '#include "glretrace.hpp"'
print
- print 'static void'
- print 'writeEnum(JSONWriter &json, GLenum pname)'
+ print 'static const char *'
+ print '_enum_string(GLenum pname)'
print '{'
print ' switch(pname) {'
for name in GLenum.values:
print ' case %s:' % name
- print ' json.writeString("%s");' % name
- print ' break;'
+ print ' return "%s";' % name
print ' default:'
- print ' json.writeNumber(pname);'
+ print ' return NULL;'
print ' }'
print '}'
print
- # shaders
- print 'static void'
- print 'writeShader(JSONWriter &json, GLuint shader)'
+ print 'static const char *'
+ print 'enum_string(GLenum pname)'
print '{'
- print ' if (!shader) {'
- print ' json.writeNull();'
- print ' return;'
- print ' }'
- print
- print ' json.beginObject();'
- print ' GLint source_length = 0;'
- print ' glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length);'
- print ' json.beginMember("source");'
- print ' if (source_length) {'
- print ' GLchar *source = new GLchar[source_length];'
- print ' GLsizei length = 0;'
- print ' source[0] = 0;'
- print ' glGetShaderSource(shader, source_length, &length, source);'
- print ' json.writeString(source);'
- print ' delete [] source;'
+ print ' const char *s = _enum_string(pname);'
+ print ' if (s) {'
+ print ' return s;'
print ' } else {'
- print ' json.writeNull();'
+ print ' static char buf[16];'
+ print ' snprintf(buf, sizeof buf, "0x%04x", pname);'
+ print ' return buf;'
print ' }'
- print ' json.endMember(); // source'
- print ' json.endObject();'
print '}'
print
- # programs
print 'static inline void'
- print 'writeProgram(JSONWriter &json, GLuint program)'
+ print 'writeEnum(JSONWriter &json, GLenum pname)'
print '{'
- print ' if (!program) {'
- print ' json.writeNull();'
- print ' return;'
- print ' }'
- print
- print ' json.beginObject();'
- print ' json.beginMember("attached_shaders");'
- print ' GLint attached_shaders = 0;'
- print ' glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);'
- print ' json.beginArray();'
- print ' if (attached_shaders) {'
- print ' GLuint *shaders = new GLuint[attached_shaders];'
- print ' GLsizei count = 0;'
- print ' glGetAttachedShaders(program, attached_shaders, &count, shaders);'
- print ' for (GLsizei i = 0; i < count; ++ i) {'
- print ' writeShader(json, shaders[i]);'
- print ' }'
- print ' delete [] shaders;'
+ print ' const char *s = _enum_string(pname);'
+ print ' if (s) {'
+ print ' json.writeString(s);'
+ print ' } else {'
+ print ' json.writeNumber(pname);'
print ' }'
- print ' json.endArray();'
- print ' json.endMember();'
- print ' json.endObject();'
print '}'
print
+ # shaders
+ print '''
+static void
+writeShader(JSONWriter &json, GLuint shader)
+{
+ if (!shader) {
+ return;
+ }
+
+ GLint shader_type = 0;
+ glGetShaderiv(shader, GL_SHADER_TYPE, &shader_type);
+ if (!shader_type) {
+ return;
+ }
+
+ GLint source_length = 0;
+ glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &source_length);
+ if (!source_length) {
+ return;
+ }
+
+ GLchar *source = new GLchar[source_length];
+ GLsizei length = 0;
+ source[0] = 0;
+ glGetShaderSource(shader, source_length, &length, source);
+
+ json.beginMember(enum_string(shader_type));
+ json.writeString(source);
+ json.endMember();
+
+ delete [] source;
+}
+
+static inline void
+writeCurrentProgram(JSONWriter &json)
+{
+ GLint program = 0;
+ glGetIntegerv(GL_CURRENT_PROGRAM, &program);
+ if (!program) {
+ return;
+ }
+
+ GLint attached_shaders = 0;
+ glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);
+ if (!attached_shaders) {
+ return;
+ }
+
+ GLuint *shaders = new GLuint[attached_shaders];
+ GLsizei count = 0;
+ glGetAttachedShaders(program, attached_shaders, &count, shaders);
+ for (GLsizei i = 0; i < count; ++ i) {
+ writeShader(json, shaders[i]);
+ }
+ delete [] shaders;
+}
+
+static inline void
+writeArbProgram(JSONWriter &json, GLenum target)
+{
+ if (!glIsEnabled(target)) {
+ return;
+ }
+
+ GLint program_length = 0;
+ glGetProgramivARB(target, GL_PROGRAM_LENGTH_ARB, &program_length);
+ if (!program_length) {
+ return;
+ }
+
+ GLchar *source = new GLchar[program_length + 1];
+ source[0] = 0;
+ glGetProgramStringARB(target, GL_PROGRAM_STRING_ARB, source);
+ source[program_length] = 0;
+
+ json.beginMember(enum_string(target));
+ json.writeString(source);
+ json.endMember();
+
+ delete [] source;
+}
+'''
+
# texture image
print '''
static inline void
print
def dump_current_program(self):
- print ' GLint current_program = 0;'
- print ' glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program);'
- print ' json.beginMember("current_program");'
- print ' writeProgram(json, current_program);'
- print ' json.endMember();'
+ print ' json.beginMember("shaders");'
+ print ' json.beginObject();'
+ print ' writeCurrentProgram(json);'
+ print ' writeArbProgram(json, GL_FRAGMENT_PROGRAM_ARB);'
+ print ' writeArbProgram(json, GL_VERTEX_PROGRAM_ARB);'
+ print ' json.endObject();'
+ print ' json.endMember(); //shaders'
print
def dump_textures(self):