summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Fonseca <jfonseca@vmware.com>2017-01-25 09:16:30 +0000
committerJose Fonseca <jfonseca@vmware.com>2017-01-25 09:16:30 +0000
commit33c3e614af94131bea76761b4ec6c7b82dab23d2 (patch)
treed616c1328ec3eb572b24ab3bbb5065d0a1a2b1f4
parentda0d8e2de8cc5dc44b274015e900d2620d16c1a8 (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.cpp25
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) {