]> git.cworth.org Git - apitrace/blobdiff - retrace/glstate_params.py
glstate: Pick a face when dumping cube map level parameters.
[apitrace] / retrace / glstate_params.py
index 6db4b80750f1ce000069d184bcaf9f1330d4bae2..d0e611ec63bf834738522aa86e85cc5c169eeead 100644 (file)
@@ -156,12 +156,21 @@ class StateGetter(Visitor):
         elem_type = self.inflector.reduced_type(array.type)
         inflection = self.inflector.inflect(array.type)
         assert inflection.endswith('v')
-        print '    %s %s[%s + 1];' % (elem_type, temp_name, array.length)
-        print '    memset(%s, 0, %s * sizeof *%s);' % (temp_name, array.length, temp_name)
-        print '    %s[%s] = (%s)0xdeadc0de;' % (temp_name, array.length, elem_type)
+        array_length = array.length
+        if array_length.isdigit():
+            # Static integer length
+            print '    %s %s[%s + 1];' % (elem_type, temp_name, array_length)
+        else:
+            # Put the length in a variable to avoid recomputing it every time
+            print '    size_t _%s_length = %s;' % (temp_name, array_length)
+            array_length = '_%s_length' % temp_name
+            # Allocate a dynamic sized array
+            print '    %s *%s = _allocator.alloc<%s>(%s + 1);' % (elem_type, temp_name, elem_type, array_length)
+        print '    memset(%s, 0, %s * sizeof *%s);' % (temp_name, array_length, temp_name)
+        print '    %s[%s] = (%s)0xdeadc0de;' % (temp_name, array_length, elem_type)
         print '    %s(%s, %s);' % (inflection + self.suffix, ', '.join(args), temp_name)
         # Simple buffer overflow detection
-        print '    assert(%s[%s] == (%s)0xdeadc0de);' % (temp_name, array.length, elem_type)
+        print '    assert(%s[%s] == (%s)0xdeadc0de);' % (temp_name, array_length, elem_type)
         return temp_name
 
     def visitOpaque(self, pointer, args):
@@ -257,6 +266,7 @@ class StateDumper:
         print '#include <string.h>'
         print
         print '#include "json.hpp"'
+        print '#include "scoped_allocator.hpp"'
         print '#include "glproc.hpp"'
         print '#include "glsize.hpp"'
         print '#include "glstate.hpp"'
@@ -316,6 +326,9 @@ class StateDumper:
 
         print 'void dumpParameters(JSONWriter &json, Context &context)'
         print '{'
+        print '    ScopedAllocator _allocator;'
+        print '    (void)_allocator;'
+        print
         print '    json.beginMember("parameters");'
         print '    json.beginObject();'
         
@@ -442,8 +455,13 @@ class StateDumper:
             print '                json.beginObject();'
             self.dump_atoms(glGetTexParameter, target)
             print '                if (!context.ES) {'
+            if target.startswith('GL_TEXTURE_CUBE_MAP'):
+                # Must pick a face
+                levelTarget = 'GL_TEXTURE_CUBE_MAP_POSITIVE_X'
+            else:
+                levelTarget = target
             # We only dump the first level parameters
-            self.dump_atoms(glGetTexLevelParameter, target, "0")
+            self.dump_atoms(glGetTexLevelParameter, levelTarget, "0")
             print '                }'
             print '                json.endObject();'
             print '                json.endMember(); // %s' % target
@@ -512,7 +530,7 @@ class StateDumper:
 
         print '        // %s' % name
         print '        {'
-        #print '            assert(glGetError() == GL_NO_ERROR);'
+        print '            while (glGetError() != GL_NO_ERROR) {}'
         type, value = getter(*args)
         print '            if (glGetError() != GL_NO_ERROR) {'
         #print '                std::cerr << "warning: %s(%s) failed\\n";' % (inflection, name)