From 1e087c7e8518f0f1a99d9a7abc941019ee65af74 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= 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 --- 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.43.0