From 1e087c7e8518f0f1a99d9a7abc941019ee65af74 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Jos=C3=A9=20Fonseca?= <jfonseca@vmware.com>
Date: Mon, 19 Aug 2013 16:42:07 +0100
Subject: [PATCH] Check for ARB_sampler_objects before dumping its state.

Tested-by: Min-Yu Huang <min-yuhuang@vmware.com>
---
 retrace/glstate.cpp          | 29 ++++++++++++++++++++++++++++-
 retrace/glstate_internal.hpp |  1 +
 retrace/glstate_params.py    | 27 ++++++---------------------
 3 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/retrace/glstate.cpp b/retrace/glstate.cpp
index 0c2d23f..a07b7f6 100644
--- a/retrace/glstate.cpp
+++ b/retrace/glstate.cpp
@@ -32,6 +32,7 @@
 #include "image.hpp"
 #include "json.hpp"
 #include "glproc.hpp"
+#include "glws.hpp"
 #include "glsize.hpp"
 #include "glstate.hpp"
 #include "glstate_internal.hpp"
@@ -44,6 +45,9 @@ Context::Context(void) {
     memset(this, 0, sizeof *this);
 
     const char *version = (const char *)glGetString(GL_VERSION);
+    unsigned version_major = 0;
+    unsigned version_minor = 0;
+    unsigned version_release = 0;
     if (version) {
         if (version[0] == 'O' &&
             version[1] == 'p' &&
@@ -57,11 +61,34 @@ Context::Context(void) {
             (version[9] == ' ' || version[9] == '-')) {
             ES = true;
         }
+        if (version[0] >= '0' && version[0] <= '9') {
+            sscanf(version, "%u.%u.%u", &version_major, &version_minor, &version_release);
+        }
     }
 
     ARB_draw_buffers = !ES;
 
-    // TODO: Check extensions we use below
+    // Check extensions we use.
+
+    if (!ES) {
+        if (version_major > 3 ||
+            (version_major == 3 && version_minor >= 2)) {
+            GLint num_extensions = 0;
+            glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
+            for (GLint i = 0; i < num_extensions; ++i) {
+               const char *extension = (const char *)glGetStringi(GL_EXTENSIONS, i);
+               if (extension &&
+                   strcmp(extension, "ARB_sampler_objects")) {
+                   ARB_sampler_objects = true;
+               }
+            }
+        } else {
+            const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
+            if (glws::checkExtension("ARB_sampler_objects", extensions)) {
+                ARB_sampler_objects = true;
+            }
+        }
+    }
 }
 
 void
diff --git a/retrace/glstate_internal.hpp b/retrace/glstate_internal.hpp
index 6b74b1d..942c3a6 100644
--- a/retrace/glstate_internal.hpp
+++ b/retrace/glstate_internal.hpp
@@ -41,6 +41,7 @@ struct Context
     bool ES;
 
     bool ARB_draw_buffers;
+    bool ARB_sampler_objects;
 
     Context(void);
 
diff --git a/retrace/glstate_params.py b/retrace/glstate_params.py
index 07ad6ad..64ac02d 100644
--- a/retrace/glstate_params.py
+++ b/retrace/glstate_params.py
@@ -422,19 +422,10 @@ class StateDumper:
         print
 
     def dump_sampler_params(self):
-        # Avoid crash on MacOSX
-        # XXX: The right fix would be to look at the support extensions..
-        import platform
-        if platform.system() == 'Darwin':
-            return
-
         print '    // GL_SAMPLER_BINDING'
-        print '    flushErrors();'
-        print '    GLint sampler_binding = 0;'
-        print '    glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);'
-        print '    if (glGetError() != GL_NO_ERROR) {'
-        print '        flushErrors();'
-        print '    } else {'
+        print '    if (context.ARB_sampler_objects) {'
+        print '        GLint sampler_binding = 0;'
+        print '        glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);'
         print '        json.beginMember("GL_SAMPLER_BINDING");'
         print '        json.writeInt(sampler_binding);'
         print '        json.endMember();'
@@ -443,9 +434,9 @@ class StateDumper:
         print '            json.beginObject();'
         for _, _, name in glGetSamplerParameter.iter():
             self.dump_atom(glGetSamplerParameter, 'sampler_binding', name)
-        print '            json.endObject();'
-        print '            json.endMember(); // GL_SAMPLER'
-        print '        }'
+        print '           json.endObject();'
+        print '           json.endMember(); // GL_SAMPLER'
+        print '       }'
         print '    }'
 
     def texenv_param_target(self, name):
@@ -569,12 +560,6 @@ class StateDumper:
     def dump_atom(self, getter, *args):
         name = args[-1]
 
-        # Avoid crash on MacOSX
-        # XXX: The right fix would be to look at the support extensions..
-        import platform
-        if name == 'GL_SAMPLER_BINDING' and platform.system() == 'Darwin':
-            return
-
         print '        // %s' % name
         print '        {'
         print '            flushErrors();'
-- 
2.45.2