From 50d78d8151787d394a363a5416b042c6c669bc8c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Tue, 23 Nov 2010 22:13:14 +0000 Subject: [PATCH] Basic texture name handling. --- base.py | 18 ++++++++++++++++ glapi.py | 22 ++++++++++--------- glretrace.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ trace.py | 9 ++++++++ 4 files changed, 100 insertions(+), 10 deletions(-) diff --git a/base.py b/base.py index 77409bb..6b49009 100644 --- a/base.py +++ b/base.py @@ -67,6 +67,9 @@ class Visitor: def visit_pointer(self, pointer, *args, **kwargs): raise NotImplementedError + def visit_handle(self, handle, *args, **kwargs): + raise NotImplementedError + def visit_alias(self, alias, *args, **kwargs): raise NotImplementedError @@ -126,6 +129,10 @@ class Rebuilder(Visitor): type = self.visit(pointer.type) return Pointer(type) + def visit_handle(self, handle): + type = self.visit(handle.type) + return Handle(handle.name, type) + def visit_alias(self, alias): type = self.visit(alias.type) return Alias(alias.expr, type) @@ -229,6 +236,17 @@ class Pointer(Type): return visitor.visit_pointer(self, *args, **kwargs) +class Handle(Type): + + def __init__(self, name, type): + Type.__init__(self, type.expr, 'P' + type.id) + self.name = name + self.type = type + + def visit(self, visitor, *args, **kwargs): + return visitor.visit_handle(self, *args, **kwargs) + + def ConstPointer(type): return Pointer(Const(type)) diff --git a/glapi.py b/glapi.py index 837cca6..dd7368c 100644 --- a/glapi.py +++ b/glapi.py @@ -2518,6 +2518,8 @@ GLbitfield_client_attrib = Flags(GLbitfield, [ "GL_CLIENT_VERTEX_ARRAY_BIT", # 0x00000002 ]) +texture = Handle("texture", GLuint) + def GlFunction(*args, **kwargs): kwargs.setdefault('call', 'GLAPIENTRY') @@ -2835,7 +2837,7 @@ def basic_functions(Function): F(Void, "glTranslatef", [(GLfloat, "x"), (GLfloat, "y"), (GLfloat, "z")]), F(Void, "glViewport", [(GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLsizei, "height")]), F(Void, "glArrayElement", [(GLint, "i")]), - F(Void, "glBindTexture", [(GLenum, "target"), (GLuint, "texture")]), + F(Void, "glBindTexture", [(GLenum, "target"), (texture, "texture")]), F(Void, "glColorPointer", [(GLint, "size"), (GLenum, "type"), (GLsizei, "stride"), (OpaquePointer(Const(GLvoid)), "pointer")]), F(Void, "glDisableClientState", [(GLenum, "array")]), F(Void, "glDrawArrays", [(GLenum_mode, "mode"), (GLint, "first"), (GLsizei, "count")]), @@ -2850,16 +2852,16 @@ def basic_functions(Function): F(Void, "glPolygonOffset", [(GLfloat, "factor"), (GLfloat, "units")]), F(Void, "glTexCoordPointer", [(GLint, "size"), (GLenum, "type"), (GLsizei, "stride"), (OpaquePointer(Const(GLvoid)), "pointer")]), F(Void, "glVertexPointer", [(GLint, "size"), (GLenum, "type"), (GLsizei, "stride"), (OpaquePointer(Const(GLvoid)), "pointer")]), - F(GLboolean, "glAreTexturesResident", [(GLsizei, "n"), (Array(Const(GLuint), "n"), "textures"), Out(Array(GLboolean, "n"), "residences")]), + F(GLboolean, "glAreTexturesResident", [(GLsizei, "n"), (Array(Const(texture), "n"), "textures"), Out(Array(GLboolean, "n"), "residences")]), F(Void, "glCopyTexImage1D", [(GLenum, "target"), (GLint, "level"), (GLenum, "internalformat"), (GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLint, "border")]), F(Void, "glCopyTexImage2D", [(GLenum, "target"), (GLint, "level"), (GLenum, "internalformat"), (GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLsizei, "height"), (GLint, "border")]), F(Void, "glCopyTexSubImage1D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLint, "x"), (GLint, "y"), (GLsizei, "width")]), F(Void, "glCopyTexSubImage2D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLint, "yoffset"), (GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLsizei, "height")]), - F(Void, "glDeleteTextures", [(GLsizei, "n"), (Array(Const(GLuint), "n"), "textures")]), - F(Void, "glGenTextures", [(GLsizei, "n"), Out(Array(GLuint, "n"), "textures")]), + F(Void, "glDeleteTextures", [(GLsizei, "n"), (Array(Const(texture), "n"), "textures")]), + F(Void, "glGenTextures", [(GLsizei, "n"), Out(Array(texture, "n"), "textures")]), F(Void, "glGetPointerv", [(GLenum, "pname"), Out(Pointer(OpaquePointer(GLvoid)), "params")], sideeffects=False), - F(GLboolean, "glIsTexture", [(GLuint, "texture")]), - F(Void, "glPrioritizeTextures", [(GLsizei, "n"), (Array(Const(GLuint), "n"), "textures"), (Array(Const(GLclampf), "n"), "priorities")]), + F(GLboolean, "glIsTexture", [(texture, "texture")]), + F(Void, "glPrioritizeTextures", [(GLsizei, "n"), (Array(Const(texture), "n"), "textures"), (Array(Const(GLclampf), "n"), "priorities")]), F(Void, "glTexSubImage1D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLsizei, "width"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(GLvoid), "__gl_image_size(format, type, width, 1, 1, 0)"), "pixels")]), F(Void, "glTexSubImage2D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLint, "yoffset"), (GLsizei, "width"), (GLsizei, "height"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(GLvoid), "__gl_image_size(format, type, width, height, 1, 0)"), "pixels")]), F(Void, "glPopClientAttrib", []), @@ -3296,9 +3298,9 @@ def extended_functions(Function): F(Void, "glDeleteFramebuffersEXT", [(GLsizei, "n"), (Array(Const(GLuint), "n"), "framebuffers")]), F(Void, "glDeleteRenderbuffersEXT", [(GLsizei, "n"), (Array(Const(GLuint), "n"), "renderbuffers")]), F(Void, "glFramebufferRenderbufferEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "renderbuffertarget"), (GLuint, "renderbuffer")]), - F(Void, "glFramebufferTexture1DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (GLuint, "texture"), (GLint, "level")]), - F(Void, "glFramebufferTexture2DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (GLuint, "texture"), (GLint, "level")]), - F(Void, "glFramebufferTexture3DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (GLuint, "texture"), (GLint, "level"), (GLint, "zoffset")]), + F(Void, "glFramebufferTexture1DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (texture, "texture"), (GLint, "level")]), + F(Void, "glFramebufferTexture2DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (texture, "texture"), (GLint, "level")]), + F(Void, "glFramebufferTexture3DEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLenum, "textarget"), (texture, "texture"), (GLint, "level"), (GLint, "zoffset")]), F(Void, "glGenFramebuffersEXT", [(GLsizei, "n"), Out(Array(GLuint, "n"), "framebuffers")]), F(Void, "glGenRenderbuffersEXT", [(GLsizei, "n"), Out(Array(GLuint, "n"), "renderbuffers")]), F(Void, "glGenerateMipmapEXT", [(GLenum, "target")]), @@ -3308,7 +3310,7 @@ def extended_functions(Function): F(GLboolean, "glIsRenderbufferEXT", [(GLuint, "renderbuffer")]), F(Void, "glRenderbufferStorageEXT", [(GLenum, "target"), (GLenum, "internalformat"), (GLsizei, "width"), (GLsizei, "height")]), F(Void, "glBlitFramebufferEXT", [(GLint, "srcX0"), (GLint, "srcY0"), (GLint, "srcX1"), (GLint, "srcY1"), (GLint, "dstX0"), (GLint, "dstY0"), (GLint, "dstX1"), (GLint, "dstY1"), (GLbitfield_attrib, "mask"), (GLenum, "filter")]), - F(Void, "glFramebufferTextureLayerEXT", [(GLenum, "target"), (GLenum, "attachment"), (GLuint, "texture"), (GLint, "level"), (GLint, "layer")]), + F(Void, "glFramebufferTextureLayerEXT", [(GLenum, "target"), (GLenum, "attachment"), (texture, "texture"), (GLint, "level"), (GLint, "layer")]), F(Void, "glStencilFuncSeparateATI", [(GLenum, "frontfunc"), (GLenum, "backfunc"), (GLint, "ref"), (GLuint, "mask")]), F(Void, "glProgramEnvParameters4fvEXT", [(GLenum, "target"), (GLuint, "index"), (GLsizei, "count"), (OpaquePointer(Const(GLfloat)), "params")]), F(Void, "glProgramLocalParameters4fvEXT", [(GLenum, "target"), (GLuint, "index"), (GLsizei, "count"), (OpaquePointer(Const(GLfloat)), "params")]), diff --git a/glretrace.py b/glretrace.py index 8ab6b75..705f953 100644 --- a/glretrace.py +++ b/glretrace.py @@ -69,7 +69,15 @@ class ValueExtractor(base.Visitor): print ' } else {' print ' %s = NULL;' % lvalue print ' }' + + def visit_pointer(self, pointer, lvalue, rvalue): + # FIXME + raise NotImplementedError + def visit_handle(self, handle, lvalue, rvalue): + self.visit(handle.type, lvalue, "__%s_map[%s]" %(handle.name, rvalue)); + print ' std::cout << "%s " << static_cast<%s>(%s) << " <- " << %s << "\\n";' % (handle.name, handle.type, rvalue, lvalue) + def visit_blob(self, blob, lvalue, rvalue): print ' %s = static_cast<%s>((%s).blob());' % (lvalue, blob, rvalue) @@ -78,6 +86,48 @@ class ValueExtractor(base.Visitor): +class ValueWrapper(base.Visitor): + + def visit_literal(self, literal, lvalue, rvalue): + pass + + def visit_alias(self, alias, lvalue, rvalue): + self.visit(alias.type, lvalue, rvalue) + + def visit_enum(self, enum, lvalue, rvalue): + pass + + def visit_bitmask(self, bitmask, lvalue, rvalue): + pass + + def visit_array(self, array, lvalue, rvalue): + print ' const Trace::Array *__a%s = dynamic_cast(&%s);' % (array.id, rvalue) + print ' if (__a%s) {' % (array.id) + length = '__a%s->values.size()' % array.id + index = '__i' + array.id + print ' for(size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length) + try: + self.visit(array.type, '%s[%s]' % (lvalue, index), '*__a%s->values[%s]' % (array.id, index)) + finally: + print ' }' + print ' }' + + def visit_pointer(self, pointer, lvalue, rvalue): + # FIXME + raise NotImplementedError + + def visit_handle(self, handle, lvalue, rvalue): + print " __%s_map[static_cast<%s>(%s)] = %s;" % (handle.name, handle.type, rvalue, lvalue) + print ' std::cout << "%s " << static_cast<%s>(%s) << " -> " << %s << "\\n";' % (handle.name, handle.type, rvalue, lvalue) + + def visit_blob(self, blob, lvalue, rvalue): + pass + + def visit_string(self, string, lvalue, rvalue): + pass + + + def retrace_function(function): print 'static void retrace_%s(Trace::Call &call) {' % function.name success = True @@ -96,6 +146,15 @@ def retrace_function(function): print ' return;' arg_names = ", ".join([arg.name for arg in function.args]) print ' %s(%s);' % (function.name, arg_names) + for arg in function.args: + if arg.output: + arg.type = ConstRemover().visit(arg.type) + rvalue = 'call.arg("%s")' % (arg.name,) + lvalue = arg.name + try: + ValueWrapper().visit(arg.type, lvalue, rvalue) + except NotImplementedError: + print ' // FIXME: %s' % arg.name print '}' print @@ -136,6 +195,8 @@ if __name__ == '__main__': print print '#include "trace_parser.hpp"' print + print 'static std::map __texture_map;' + print retrace_functions(glapi.glapi.functions) diff --git a/trace.py b/trace.py index 9b5c6b6..a866f2a 100644 --- a/trace.py +++ b/trace.py @@ -98,6 +98,9 @@ class DumpDeclarator(base.OnceVisitor): def visit_pointer(self, pointer): self.visit(pointer.type) + def visit_handle(self, handle): + self.visit(handle.type) + def visit_alias(self, alias): self.visit(alias.type) @@ -155,6 +158,9 @@ class DumpImplementer(base.Visitor): print ' else' print ' Log::LiteralNull();' + def visit_handle(self, handle, instance): + self.visit(handle.type, instance) + def visit_alias(self, alias, instance): self.visit(alias.type, instance) @@ -204,6 +210,9 @@ class Wrapper(base.Visitor): def visit_pointer(self, pointer, instance): self.visit(pointer.type, "*" + instance) + def visit_handle(self, handle, instance): + self.visit(handle.type, instance) + def visit_alias(self, alias, instance): self.visit(alias.type, instance) -- 2.45.2