diff options
author | Jose Fonseca <jfonseca@vmware.com> | 2017-01-25 09:16:30 +0000 |
---|---|---|
committer | Jose Fonseca <jfonseca@vmware.com> | 2017-01-25 09:16:30 +0000 |
commit | 33c3e614af94131bea76761b4ec6c7b82dab23d2 (patch) | |
tree | d616c1328ec3eb572b24ab3bbb5065d0a1a2b1f4 | |
parent | da0d8e2de8cc5dc44b274015e900d2620d16c1a8 (diff) |
glstate: Avoid calling glGetProgramiv(GL_PROGRAM_BINARY_LENGTH).
This should avoid unwanted side effects as described by emeakyl in
https://github.com/apitrace/apitrace/issues/365#issuecomment-275029429
-rw-r--r-- | retrace/glstate_shaders.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/retrace/glstate_shaders.cpp b/retrace/glstate_shaders.cpp index c2fc03b8..b04a0db2 100644 --- a/retrace/glstate_shaders.cpp +++ b/retrace/glstate_shaders.cpp @@ -111,13 +111,34 @@ dumpProgram(StateWriter &writer, Context &context, GLint program) // Dump NVIDIA GPU programs via GL_ARB_get_program_binary if (context.ARB_get_program_binary) { + // Undocumented format. + const GLint GL_PROGRAM_BINARY_NVX = 0x8e21; + + bool hasNvidiaFormat = false; + GLint numBinaryFormats = 0; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &numBinaryFormats); + if (numBinaryFormats) { + std::vector<GLint> binaryFormats(numBinaryFormats); + glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, &binaryFormats[0]); + if (std::find(binaryFormats.begin(), binaryFormats.end(), + GL_PROGRAM_BINARY_NVX) != binaryFormats.end()) { + hasNvidiaFormat = true; + } + } + + // Avoid calling glGetProgramiv(GL_PROGRAM_BINARY_LENGTH) as it might + // trigger unnecessary side effects, per + // https://github.com/apitrace/apitrace/issues/365#issuecomment-275029429 GLint binaryLength = 0; - glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &binaryLength); + if (hasNvidiaFormat) { + glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &binaryLength); + } + if (binaryLength > 0) { std::vector<char> binary(binaryLength); GLenum format = GL_NONE; glGetProgramBinary(program, binaryLength, NULL, &format, &binary[0]); - if (format == 0x8e21) { + if (format == GL_PROGRAM_BINARY_NVX) { if (0) { FILE *fp = fopen("program.bin", "wb"); if (fp) { |