X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglstate_shaders.cpp;h=aeead3bb5d889afe4483c1b680127b56039224f5;hb=1e40126d7a03c43538a07e37e2e63d8882c07e7c;hp=392dc2b5d0a1fc28c8c38a3c8c930d0a803017b5;hpb=0f0e6daf84ef2da21a94ff2b9b0185eb2b4500a1;p=apitrace diff --git a/retrace/glstate_shaders.cpp b/retrace/glstate_shaders.cpp index 392dc2b..aeead3b 100644 --- a/retrace/glstate_shaders.cpp +++ b/retrace/glstate_shaders.cpp @@ -24,6 +24,7 @@ **************************************************************************/ +#include #include #include @@ -128,7 +129,7 @@ dumpProgram(JSONWriter &json, GLint program) glGetAttachedShaders(program, attached_shaders, &count, shaders); std::sort(shaders, shaders + count); for (GLsizei i = 0; i < count; ++ i) { - getShaderSource(shaderMap, shaders[i]); + getShaderSource(shaderMap, shaders[i]); } delete [] shaders; @@ -245,16 +246,16 @@ dumpUniformValues(JSONWriter &json, GLenum type, const void *values, GLint matri switch (elemType) { case GL_FLOAT: - json.writeNumber(*u.fvalue); + json.writeFloat(*u.fvalue); break; case GL_DOUBLE: - json.writeNumber(*u.dvalue); + json.writeFloat(*u.dvalue); break; case GL_INT: - json.writeNumber(*u.ivalue); + json.writeInt(*u.ivalue); break; case GL_UNSIGNED_INT: - json.writeNumber(*u.uivalue); + json.writeInt(*u.uivalue); break; case GL_BOOL: json.writeBool(*u.uivalue); @@ -350,7 +351,7 @@ dumpUniformBlock(JSONWriter &json, GLint program, GLint size, GLenum type, const json.endMember(); } - glUnmapBuffer(GL_UNIFORM_BUFFER_BINDING); + glUnmapBuffer(GL_UNIFORM_BUFFER); } glBindBuffer(GL_UNIFORM_BUFFER, previous_ubo); @@ -625,10 +626,10 @@ dumpArbProgramUniforms(JSONWriter &json, GLenum target, const char *prefix) json.beginMember(name); json.beginArray(); - json.writeNumber(params[0]); - json.writeNumber(params[1]); - json.writeNumber(params[2]); - json.writeNumber(params[3]); + json.writeFloat(params[0]); + json.writeFloat(params[1]); + json.writeFloat(params[2]); + json.writeFloat(params[3]); json.endArray(); json.endMember(); } @@ -648,30 +649,66 @@ dumpArbProgramUniforms(JSONWriter &json, GLenum target, const char *prefix) json.beginMember(name); json.beginArray(); - json.writeNumber(params[0]); - json.writeNumber(params[1]); - json.writeNumber(params[2]); - json.writeNumber(params[3]); + json.writeFloat(params[0]); + json.writeFloat(params[1]); + json.writeFloat(params[2]); + json.writeFloat(params[3]); json.endArray(); json.endMember(); } } +static void +dumpProgramUniformsStage(JSONWriter &json, GLint program, const char *stage) +{ + if (program) { + json.beginMember(stage); + json.beginObject(); + dumpProgramUniforms(json, program); + json.endObject(); + json.endMember(); + } +} void dumpShadersUniforms(JSONWriter &json, Context &context) { - GLint program = 0; - glGetIntegerv(GL_CURRENT_PROGRAM, &program); + GLint pipeline = 0; + GLint vertex_program = 0; + GLint fragment_program = 0; + GLint geometry_program = 0; + GLint tess_control_program = 0; + GLint tess_evaluation_program = 0; + + if (!context.ES) { + glGetIntegerv(GL_PROGRAM_PIPELINE_BINDING, &pipeline); + if (pipeline) { + glGetProgramPipelineiv(pipeline, GL_VERTEX_SHADER, &vertex_program); + glGetProgramPipelineiv(pipeline, GL_FRAGMENT_SHADER, &fragment_program); + glGetProgramPipelineiv(pipeline, GL_GEOMETRY_SHADER, &geometry_program); + glGetProgramPipelineiv(pipeline, GL_TESS_CONTROL_SHADER, &tess_control_program); + glGetProgramPipelineiv(pipeline, GL_TESS_EVALUATION_SHADER, &tess_evaluation_program); + } + } + GLint program = 0; GLhandleARB programObj = 0; - if (!context.ES && !program) { - programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB); + if (!pipeline) { + glGetIntegerv(GL_CURRENT_PROGRAM, &program); + if (!context.ES && !program) { + programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB); + } } json.beginMember("shaders"); json.beginObject(); - if (program) { + if (pipeline) { + dumpProgram(json, vertex_program); + dumpProgram(json, fragment_program); + dumpProgram(json, geometry_program); + dumpProgram(json, tess_control_program); + dumpProgram(json, tess_evaluation_program); + } else if (program) { dumpProgram(json, program); } else if (programObj) { dumpProgramObj(json, programObj); @@ -684,7 +721,13 @@ dumpShadersUniforms(JSONWriter &json, Context &context) json.beginMember("uniforms"); json.beginObject(); - if (program) { + if (pipeline) { + dumpProgramUniformsStage(json, vertex_program, "GL_VERTEX_SHADER"); + dumpProgramUniformsStage(json, fragment_program, "GL_FRAGMENT_SHADER"); + dumpProgramUniformsStage(json, geometry_program, "GL_GEOMETRY_SHADER"); + dumpProgramUniformsStage(json, tess_control_program, "GL_TESS_CONTROL_SHADER"); + dumpProgramUniformsStage(json, tess_evaluation_program, "GL_TESS_EVALUATION_SHADER"); + } else if (program) { dumpProgramUniforms(json, program); } else if (programObj) { dumpProgramObjUniforms(json, programObj);