From 1c7d6584a7811b7785ae5c1e378f14b5ba0971cf Mon Sep 17 00:00:00 2001 From: takeshi_hoshina Date: Mon, 2 Nov 2020 11:07:33 +0900 Subject: basesystem-jj recipes --- .../0001-switch-from-python2-to-python3.patch | 10004 +++++++++++++++++++ 1 file changed, 10004 insertions(+) create mode 100644 bsp/meta-freescale/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch (limited to 'bsp/meta-freescale/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch') diff --git a/bsp/meta-freescale/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch b/bsp/meta-freescale/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch new file mode 100644 index 00000000..27382c34 --- /dev/null +++ b/bsp/meta-freescale/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch @@ -0,0 +1,10004 @@ +From bfa1b7c7e675f198f4573325f1252e91f80f0b4d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Piotr=20Podsiad=C5=82y?= +Date: Thu, 3 Jan 2019 20:39:55 +0100 +Subject: [PATCH 1/4] switch from python2 to python3 + +Upstream-Status: Backport [https://github.com/apitrace/apitrace/commit/0b8b019952f2668a5e8786cc2d331062b958f02e] + +(cherry picked from commit 0b8b019952f2668a5e8786cc2d331062b958f02e) +Signed-off-by: Andrey Zhizhikin +--- + CMakeLists.txt | 7 +- + cli/CMakeLists.txt | 2 +- + dispatch/CMakeLists.txt | 2 +- + dispatch/__init__.py | 2 +- + dispatch/dispatch.py | 56 +- + dispatch/glproc.py | 204 +++---- + retrace/CMakeLists.txt | 14 +- + retrace/d3d9retrace.py | 248 ++++---- + retrace/ddrawretrace.py | 102 ++-- + retrace/dllretrace.py | 46 +- + retrace/dxgiretrace.py | 370 +++++------ + retrace/dxgistate_so.py | 98 +-- + retrace/glretrace.py | 660 ++++++++++---------- + retrace/glstate_params.py | 556 ++++++++--------- + retrace/retrace.py | 300 ++++----- + scripts/convert.py | 4 +- + scripts/jsondiff.py | 16 +- + scripts/jsonextractimages.py | 2 +- + scripts/leaks.py | 163 +++++ + scripts/profileshader.py | 18 +- + scripts/retracediff.py | 6 +- + scripts/snapdiff.py | 7 +- + scripts/tracediff.py | 16 +- + scripts/unpickle.py | 16 +- + specs/cglapi.py | 6 +- + specs/d2d1.py | 6 +- + specs/d3d.py | 8 +- + specs/d3d10.py | 4 +- + specs/d3d10sdklayers.py | 2 +- + specs/d3d11.py | 4 +- + specs/d3d11sdklayers.py | 2 +- + specs/d3d8.py | 6 +- + specs/d3d8caps.py | 4 +- + specs/d3d8types.py | 2 +- + specs/d3d9.py | 6 +- + specs/d3d9caps.py | 4 +- + specs/d3d9types.py | 2 +- + specs/d3dcaps.py | 4 +- + specs/d3dtypes.py | 2 +- + specs/dcommon.py | 2 +- + specs/dcomp.py | 303 +++++++++ + specs/ddraw.py | 2 +- + specs/debug.py | 2 +- + specs/dwrite.py | 4 +- + specs/dxgi.py | 2 +- + specs/dxva2.py | 2 +- + specs/eglapi.py | 6 +- + specs/eglenum.py | 2 +- + specs/glapi.py | 6 +- + specs/glparams.py | 4 +- + specs/gltypes.py | 2 +- + specs/glxapi.py | 4 +- + specs/scripts/c2api.py | 40 +- + specs/scripts/cxx2api.py | 488 +++++++++++++++ + specs/scripts/spec2api.py | 6 +- + specs/scripts/txt2api.py | 8 +- + specs/scripts/xml2api.py | 6 +- + specs/scripts/xml2enum.py | 4 +- + specs/scripts/xml2glparams.py | 4 +- + specs/stdapi.py | 43 +- + specs/wglapi.py | 6 +- + specs/wglenum.py | 2 +- + specs/winapi.py | 2 +- + wrappers/CMakeLists.txt | 18 +- + wrappers/cgltrace.py | 74 +-- + wrappers/d2d1trace.py | 18 +- + wrappers/d3d8trace.py | 36 +- + wrappers/d3d9trace.py | 62 +- + wrappers/ddrawtrace.py | 12 +- + wrappers/dlltrace.py | 36 +- + wrappers/dxgitrace.py | 98 +-- + wrappers/egltrace.py | 420 ++++++------- + wrappers/gltrace.py | 1080 ++++++++++++++++----------------- + wrappers/glxtrace.py | 54 +- + wrappers/trace.py | 707 ++++++++++----------- + wrappers/wgltrace.py | 86 +-- + 76 files changed, 3803 insertions(+), 2825 deletions(-) + create mode 100755 scripts/leaks.py + create mode 100644 specs/dcomp.py + create mode 100755 specs/scripts/cxx2api.py + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 900028c6..03ffd07c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -104,10 +104,7 @@ else () + endmacro() + endif () + +-find_host_package (PythonInterp 2.7 REQUIRED) +-if (NOT PYTHON_VERSION_MAJOR EQUAL 2) +- message (FATAL_ERROR "Python 2.x required and requested, but Python ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} found.") +-endif () ++find_host_package(Python3 COMPONENTS Interpreter REQUIRED) + + find_package (Threads) + +@@ -591,7 +588,7 @@ set (CPACK_PACKAGE_VERSION_MINOR "0") + + # Use current date in YYYYMMDD format as patch number + execute_process ( +- COMMAND ${PYTHON_EXECUTABLE} -c "import time, sys; sys.stdout.write(time.strftime('%Y%m%d'))" ++ COMMAND ${Python3_EXECUTABLE} -c "import time, sys; sys.stdout.write(time.strftime('%Y%m%d'))" + OUTPUT_VARIABLE CPACK_PACKAGE_VERSION_PATCH + ) + +diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt +index 9b621bb1..eb5d485d 100644 +--- a/cli/CMakeLists.txt ++++ b/cli/CMakeLists.txt +@@ -13,7 +13,7 @@ add_definitions( + if (WIN32) + add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="python") + else () +- add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}") ++ add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="${Python3_EXECUTABLE}") + endif () + + add_executable (apitrace +diff --git a/dispatch/CMakeLists.txt b/dispatch/CMakeLists.txt +index d023e6e9..e51eec48 100644 +--- a/dispatch/CMakeLists.txt ++++ b/dispatch/CMakeLists.txt +@@ -7,7 +7,7 @@ add_custom_command ( + OUTPUT + ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp + ${CMAKE_CURRENT_BINARY_DIR}/glproc.cpp +- COMMAND ${PYTHON_EXECUTABLE} ++ COMMAND ${Python3_EXECUTABLE} + ${CMAKE_CURRENT_SOURCE_DIR}/glproc.py + ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp + ${CMAKE_CURRENT_BINARY_DIR}/glproc.cpp +diff --git a/dispatch/__init__.py b/dispatch/__init__.py +index b872135e..d8e8596e 100644 +--- a/dispatch/__init__.py ++++ b/dispatch/__init__.py +@@ -1 +1 @@ +-from dispatch import * ++from .dispatch import * +diff --git a/dispatch/dispatch.py b/dispatch/dispatch.py +index 9e778561..e1dd8bc9 100644 +--- a/dispatch/dispatch.py ++++ b/dispatch/dispatch.py +@@ -58,18 +58,18 @@ class Dispatcher: + # define standard name aliases for convenience, but only when not + # tracing, as that would cause symbol clashing with the tracing + # functions +- print '#ifdef RETRACE' ++ print('#ifdef RETRACE') + for function in module.functions: +- print '#define %s _%s' % (function.name, function.name) +- print '#endif /* RETRACE */' +- print ++ print('#define %s _%s' % (function.name, function.name)) ++ print('#endif /* RETRACE */') ++ print() + + def dispatchFunctionDecl(self, module, function): + ptype = function_pointer_type(function) + pvalue = function_pointer_value(function) +- print 'typedef ' + function.prototype('* %s' % ptype) + ';' +- print 'extern %s %s;' % (ptype, pvalue) +- print ++ print('typedef ' + function.prototype('* %s' % ptype) + ';') ++ print('extern %s %s;' % (ptype, pvalue)) ++ print() + + def dispatchModuleImpl(self, module): + for function in module.functions: +@@ -84,19 +84,19 @@ class Dispatcher: + else: + ret = 'return ' + +- print 'static ' + function.prototype('_fail_' + function.name) + ' {' ++ print('static ' + function.prototype('_fail_' + function.name) + ' {') + self.failFunction(function) +- print '}' +- print ++ print('}') ++ print() + +- print 'static ' + function.prototype('_get_' + function.name) + ' {' ++ print('static ' + function.prototype('_get_' + function.name) + ' {') + self.invokeGetProcAddress(module, function) +- print ' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args])) +- print '}' +- print ++ print(' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args]))) ++ print('}') ++ print() + +- print '%s %s = &%s;' % (ptype, pvalue, '_get_' + function.name) +- print ++ print('%s %s = &%s;' % (ptype, pvalue, '_get_' + function.name)) ++ print() + + def getProcAddressName(self, module, function): + raise NotImplementedError +@@ -105,25 +105,25 @@ class Dispatcher: + ptype = function_pointer_type(function) + pvalue = function_pointer_value(function) + getProcAddressName = self.getProcAddressName(module, function) +- print ' %s _ptr;' % (ptype,) +- print ' _ptr = (%s)%s("%s");' % (ptype, getProcAddressName, function.name) +- print ' if (!_ptr) {' +- print ' _ptr = &%s;' % ('_fail_' + function.name) +- print ' }' +- print ' %s = _ptr;' % (pvalue,) ++ print(' %s _ptr;' % (ptype,)) ++ print(' _ptr = (%s)%s("%s");' % (ptype, getProcAddressName, function.name)) ++ print(' if (!_ptr) {') ++ print(' _ptr = &%s;' % ('_fail_' + function.name)) ++ print(' }') ++ print(' %s = _ptr;' % (pvalue,)) + + def failFunction(self, function): +- print r' const char *_name = "%s";' % function.name ++ print(r' const char *_name = "%s";' % function.name) + if function.type is stdapi.Void or function.fail is not None: +- print r' os::log("warning: ignoring call to unavailable function %s\n", _name);' ++ print(r' os::log("warning: ignoring call to unavailable function %s\n", _name);') + if function.type is stdapi.Void: + assert function.fail is None +- print ' return;' ++ print(' return;') + else: + assert function.fail is not None +- print ' return %s;' % function.fail ++ print(' return %s;' % function.fail) + else: +- print r' os::log("error: unavailable function %s\n", _name);' +- print r' os::abort();' ++ print(r' os::log("error: unavailable function %s\n", _name);') ++ print(r' os::abort();') + + +diff --git a/dispatch/glproc.py b/dispatch/glproc.py +index f26a4f7d..93bba232 100644 +--- a/dispatch/glproc.py ++++ b/dispatch/glproc.py +@@ -506,15 +506,15 @@ class GlDispatcher(Dispatcher): + if sys.platform == 'darwin': + # Fallback to EXT_debug_label on MacOSX, some enums need to be translated. + if function.name in ('glObjectLabel', 'glObjectLabelKHR'): +- print r' if (translateDebugLabelIdentifier(identifier)) {' +- print r' _glLabelObjectEXT(identifier, name, length < 0 ? 0 : length, length == 0 ? "" : label);' +- print r' return;' +- print r' }' ++ print(r' if (translateDebugLabelIdentifier(identifier)) {') ++ print(r' _glLabelObjectEXT(identifier, name, length < 0 ? 0 : length, length == 0 ? "" : label);') ++ print(r' return;') ++ print(r' }') + if function.name in ('glGetObjectLabel', 'glGetObjectLabelKHR'): +- print r' if (translateDebugLabelIdentifier(identifier)) {' +- print r' _glGetObjectLabelEXT(identifier, name, bufSize, length, label);' +- print r' return;' +- print r' }' ++ print(r' if (translateDebugLabelIdentifier(identifier)) {') ++ print(r' _glGetObjectLabelEXT(identifier, name, bufSize, length, label);') ++ print(r' return;') ++ print(r' }') + if function.name in ( + # GL_KHR_debug + 'glDebugMessageControl', +@@ -549,25 +549,25 @@ class GlDispatcher(Dispatcher): + ): + return + if function.name.startswith('glGetObjectLabel'): +- print r' if (length != 0) *length = 0;' +- print r' if (label != 0 && bufSize > 0) *label = 0;' ++ print(r' if (length != 0) *length = 0;') ++ print(r' if (label != 0 && bufSize > 0) *label = 0;') + return + if function.name == 'glGetDebugMessageLogAMD': +- print r' if (categories != 0) *categories = 0;' +- print r' if (ids != 0) *ids = 0;' +- print r' if (severities != 0) *severities = 0;' +- print r' if (lengths != 0) *lengths = 0;' +- print r' if (message != 0 && bufsize > 0) *message = 0;' +- print r' return 0;' ++ print(r' if (categories != 0) *categories = 0;') ++ print(r' if (ids != 0) *ids = 0;') ++ print(r' if (severities != 0) *severities = 0;') ++ print(r' if (lengths != 0) *lengths = 0;') ++ print(r' if (message != 0 && bufsize > 0) *message = 0;') ++ print(r' return 0;') + return + if function.name.startswith('glGetDebugMessageLog'): +- print r' if (sources != 0) *sources = 0;' +- print r' if (types != 0) *types = 0;' +- print r' if (ids != 0) *ids = 0;' +- print r' if (severities != 0) *severities = 0;' +- print r' if (lengths != 0) *lengths = 0;' +- print r' if (messageLog != 0 && bufsize > 0) *messageLog = 0;' +- print r' return 0;' ++ print(r' if (sources != 0) *sources = 0;') ++ print(r' if (types != 0) *types = 0;') ++ print(r' if (ids != 0) *ids = 0;') ++ print(r' if (severities != 0) *severities = 0;') ++ print(r' if (lengths != 0) *lengths = 0;') ++ print(r' if (messageLog != 0 && bufsize > 0) *messageLog = 0;') ++ print(r' return 0;') + return + + Dispatcher.failFunction(self, function) +@@ -577,96 +577,96 @@ if __name__ == '__main__': + decl, impl = sys.argv[1:] + + sys.stdout = open(decl, 'wt') +- print +- print '#pragma once' +- print +- print '#include "glimports.hpp"' +- print +- print '#if defined(_WIN32)' +- print 'extern HMODULE _libGlHandle;' +- print '#else' +- print 'extern void * _libGlHandle;' +- print '#endif' +- print +- print 'void * _getPublicProcAddress(const char *procName);' +- print 'void * _getPrivateProcAddress(const char *procName);' +- print ++ print() ++ print('#pragma once') ++ print() ++ print('#include "glimports.hpp"') ++ print() ++ print('#if defined(_WIN32)') ++ print('extern HMODULE _libGlHandle;') ++ print('#else') ++ print('extern void * _libGlHandle;') ++ print('#endif') ++ print() ++ print('void * _getPublicProcAddress(const char *procName);') ++ print('void * _getPrivateProcAddress(const char *procName);') ++ print() + dispatcher = GlDispatcher() +- print ++ print() + dispatcher.dispatchModuleDecl(eglapi) +- print +- print '#if defined(_WIN32)' +- print ++ print() ++ print('#if defined(_WIN32)') ++ print() + dispatcher.dispatchModuleDecl(wglapi) +- print +- print '#elif defined(__APPLE__)' +- print ++ print() ++ print('#elif defined(__APPLE__)') ++ print() + dispatcher.dispatchModuleDecl(cglapi) +- print +- print '#elif defined(HAVE_X11)' +- print ++ print() ++ print('#elif defined(HAVE_X11)') ++ print() + dispatcher.dispatchModuleDecl(glxapi) +- print +- print '#endif' +- print ++ print() ++ print('#endif') ++ print() + dispatcher.dispatchModuleDecl(glapi) +- print ++ print() + + sys.stdout = open(impl, 'wt') +- print +- print '#include "glproc.hpp"' +- print '#include "os.hpp"' +- print ++ print() ++ print('#include "glproc.hpp"') ++ print('#include "os.hpp"') ++ print() + dispatcher = GlDispatcher() +- print ++ print() + dispatcher.dispatchModuleImpl(eglapi) +- print +- print '#if defined(_WIN32)' +- print ++ print() ++ print('#if defined(_WIN32)') ++ print() + dispatcher.dispatchModuleImpl(wglapi) +- print +- print '#elif defined(__APPLE__)' +- print +- print 'static inline bool' +- print 'translateDebugLabelIdentifier(GLenum & identifier)' +- print '{' +- print ' switch (identifier) {' +- print ' case GL_TEXTURE:' +- print ' case GL_FRAMEBUFFER:' +- print ' case GL_RENDERBUFFER:' +- print ' case GL_SAMPLER:' +- print ' case GL_TRANSFORM_FEEDBACK:' +- print ' return true;' +- print ' case GL_BUFFER:' +- print ' identifier = GL_BUFFER_OBJECT_EXT;' +- print ' return true;' +- print ' case GL_SHADER:' +- print ' identifier = GL_SHADER_OBJECT_EXT;' +- print ' return true;' +- print ' case GL_PROGRAM:' +- print ' identifier = GL_PROGRAM_OBJECT_EXT;' +- print ' return true;' +- print ' case GL_VERTEX_ARRAY:' +- print ' identifier = GL_VERTEX_ARRAY_OBJECT_EXT;' +- print ' return true;' +- print ' case GL_QUERY:' +- print ' identifier = GL_QUERY_OBJECT_EXT;' +- print ' return true;' +- print ' case GL_PROGRAM_PIPELINE:' +- print ' identifier = GL_PROGRAM_PIPELINE_OBJECT_EXT;' +- print ' return true;' +- print ' default:' +- print ' return false;' +- print ' }' +- print '}' +- print ++ print() ++ print('#elif defined(__APPLE__)') ++ print() ++ print('static inline bool') ++ print('translateDebugLabelIdentifier(GLenum & identifier)') ++ print('{') ++ print(' switch (identifier) {') ++ print(' case GL_TEXTURE:') ++ print(' case GL_FRAMEBUFFER:') ++ print(' case GL_RENDERBUFFER:') ++ print(' case GL_SAMPLER:') ++ print(' case GL_TRANSFORM_FEEDBACK:') ++ print(' return true;') ++ print(' case GL_BUFFER:') ++ print(' identifier = GL_BUFFER_OBJECT_EXT;') ++ print(' return true;') ++ print(' case GL_SHADER:') ++ print(' identifier = GL_SHADER_OBJECT_EXT;') ++ print(' return true;') ++ print(' case GL_PROGRAM:') ++ print(' identifier = GL_PROGRAM_OBJECT_EXT;') ++ print(' return true;') ++ print(' case GL_VERTEX_ARRAY:') ++ print(' identifier = GL_VERTEX_ARRAY_OBJECT_EXT;') ++ print(' return true;') ++ print(' case GL_QUERY:') ++ print(' identifier = GL_QUERY_OBJECT_EXT;') ++ print(' return true;') ++ print(' case GL_PROGRAM_PIPELINE:') ++ print(' identifier = GL_PROGRAM_PIPELINE_OBJECT_EXT;') ++ print(' return true;') ++ print(' default:') ++ print(' return false;') ++ print(' }') ++ print('}') ++ print() + dispatcher.dispatchModuleImpl(cglapi) +- print +- print '#elif defined(HAVE_X11)' +- print ++ print() ++ print('#elif defined(HAVE_X11)') ++ print() + dispatcher.dispatchModuleImpl(glxapi) +- print +- print '#endif' +- print ++ print() ++ print('#endif') ++ print() + dispatcher.dispatchModuleImpl(glapi) +- print ++ print() +diff --git a/retrace/CMakeLists.txt b/retrace/CMakeLists.txt +index c0c4f316..2475abb8 100644 +--- a/retrace/CMakeLists.txt ++++ b/retrace/CMakeLists.txt +@@ -14,7 +14,7 @@ add_definitions (-DRETRACE) + + add_custom_command ( + OUTPUT glretrace_gl.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_gl.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_gl.cpp + DEPENDS + glretrace.py + retrace.py +@@ -25,7 +25,7 @@ add_custom_command ( + + add_custom_command ( + OUTPUT glstate_params.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate_params.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate_params.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate_params.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate_params.cpp + DEPENDS + glstate_params.py + ${CMAKE_SOURCE_DIR}/specs/glparams.py +@@ -273,7 +273,7 @@ if (WIN32) + include_directories (BEFORE SYSTEM ${DirectX_D3D_INCLUDE_DIR}) + add_custom_command ( + OUTPUT d3dretrace_ddraw.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_ddraw.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_ddraw.cpp + DEPENDS + ddrawretrace.py + dllretrace.py +@@ -306,7 +306,7 @@ if (WIN32) + endif () + add_custom_command ( + OUTPUT d3dretrace_d3d8.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d8 ${HAVE_D3D8} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d8.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d8 ${HAVE_D3D8} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d8.cpp + DEPENDS + d3d9retrace.py + dllretrace.py +@@ -327,7 +327,7 @@ if (WIN32) + endif () + add_custom_command ( + OUTPUT d3dretrace_d3d9.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d9 ${HAVE_D3D9} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d9 ${HAVE_D3D9} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp + DEPENDS + d3d9retrace.py + dllretrace.py +@@ -359,7 +359,7 @@ if (WIN32) + ) + add_custom_command ( + OUTPUT dxgistate_so.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgistate_so.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgistate_so.cpp + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py + ${CMAKE_SOURCE_DIR}/specs/d3d11.py +@@ -372,7 +372,7 @@ if (WIN32) + ) + add_custom_command ( + OUTPUT d3dretrace_dxgi.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgiretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_dxgi.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgiretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_dxgi.cpp + DEPENDS + dxgiretrace.py + dllretrace.py +diff --git a/retrace/d3d9retrace.py b/retrace/d3d9retrace.py +index 7313acc9..22364476 100644 +--- a/retrace/d3d9retrace.py ++++ b/retrace/d3d9retrace.py +@@ -35,32 +35,32 @@ from specs.stdapi import API + class D3DRetracer(Retracer): + + def retraceApi(self, api): +- print '// Swizzling mapping for lock addresses' +- print 'typedef std::pair MappingKey;' +- print 'static std::map _maps;' +- print ++ print('// Swizzling mapping for lock addresses') ++ print('typedef std::pair MappingKey;') ++ print('static std::map _maps;') ++ print() + + Retracer.retraceApi(self, api) + + def invokeFunction(self, function): + if function.name in ('Direct3DCreate9', 'Direct3DCreate9Ex'): +- print 'if (retrace::debug >= 2 && !g_szD3D9DllName && LoadLibraryA("d3d9d.dll")) {' +- print ' /*' +- print ' * D3D9D only works for simple applications, it will often report bogus errors' +- print ' * on complex traces, or traces which use unofficial D3D9 features.' +- print ' */' +- print ' g_szD3D9DllName = "d3d9d.dll";' +- print ' SDKVersion |= 0x80000000;' +- print '} else {' +- print ' SDKVersion &= ~0x80000000;' +- print '}' ++ print('if (retrace::debug >= 2 && !g_szD3D9DllName && LoadLibraryA("d3d9d.dll")) {') ++ print(' /*') ++ print(' * D3D9D only works for simple applications, it will often report bogus errors') ++ print(' * on complex traces, or traces which use unofficial D3D9 features.') ++ print(' */') ++ print(' g_szD3D9DllName = "d3d9d.dll";') ++ print(' SDKVersion |= 0x80000000;') ++ print('} else {') ++ print(' SDKVersion &= ~0x80000000;') ++ print('}') + + # d3d8d.dll can be found in the Aug 2007 DXSDK. It works on XP, but + # not on Windows 7. + if function.name in ('Direct3DCreate8'): +- print 'if (retrace::debug >= 2 && !g_szD3D8DllName && LoadLibraryA("d3d8d.dll")) {' +- print ' g_szD3D8DllName = "d3d8d.dll";' +- print '}' ++ print('if (retrace::debug >= 2 && !g_szD3D8DllName && LoadLibraryA("d3d8d.dll")) {') ++ print(' g_szD3D8DllName = "d3d8d.dll";') ++ print('}') + + Retracer.invokeFunction(self, function) + +@@ -73,37 +73,37 @@ class D3DRetracer(Retracer): + # keep track of the last used device for state dumping + if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'): + if method.name == 'Release': +- print r' if (call.ret->toUInt() == 0) {' +- print r' d3d9Dumper.unbindDevice(_this);' +- print r' }' ++ print(r' if (call.ret->toUInt() == 0) {') ++ print(r' d3d9Dumper.unbindDevice(_this);') ++ print(r' }') + else: +- print r' d3d9Dumper.bindDevice(_this);' ++ print(r' d3d9Dumper.bindDevice(_this);') + if interface.name in ('IDirect3DDevice8', 'IDirect3DDevice8Ex'): + if method.name == 'Release': +- print r' if (call.ret->toUInt() == 0) {' +- print r' d3d8Dumper.unbindDevice(_this);' +- print r' }' ++ print(r' if (call.ret->toUInt() == 0) {') ++ print(r' d3d8Dumper.unbindDevice(_this);') ++ print(r' }') + else: +- print r' d3d8Dumper.bindDevice(_this);' ++ print(r' d3d8Dumper.bindDevice(_this);') + + # create windows as neccessary + if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'): +- print r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' +- print r' pPresentationParameters->hDeviceWindow = hWnd;' ++ print(r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);') ++ print(r' pPresentationParameters->hDeviceWindow = hWnd;') + if 'hFocusWindow' in method.argNames(): +- print r' hFocusWindow = hWnd;' ++ print(r' hFocusWindow = hWnd;') + + # force windowed mode +- print r' if (retrace::forceWindowed) {' +- print r' pPresentationParameters->Windowed = TRUE;' +- print r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;' ++ print(r' if (retrace::forceWindowed) {') ++ print(r' pPresentationParameters->Windowed = TRUE;') ++ print(r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;') + if interface.name.startswith('IDirect3D8'): +- print r' pPresentationParameters->FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;' +- print r' }' ++ print(r' pPresentationParameters->FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;') ++ print(r' }') + if 'BehaviorFlags' in method.argNames(): +- print r' if (retrace::dumpingState) {' +- print r' BehaviorFlags &= ~D3DCREATE_PUREDEVICE;' +- print r' }' ++ print(r' if (retrace::dumpingState) {') ++ print(r' BehaviorFlags &= ~D3DCREATE_PUREDEVICE;') ++ print(r' }') + + # On D3D8, ensure we use BackBufferFormat compatible with the + # current DisplayFormat. +@@ -113,76 +113,76 @@ class D3DRetracer(Retracer): + # valid values for BackBufferFormat include D3DFMT_X1R5G5B5 and + # D3DFMT_A1R5G5B5, but exclude D3DFMT_R5G6B5. + if interface.name.startswith('IDirect3D8'): +- print r' if (pPresentationParameters->Windowed) {' +- print r' D3DDISPLAYMODE Mode;' +- print r' HRESULT hr;' +- print r' hr = _this->GetAdapterDisplayMode(Adapter, &Mode);' +- print r' assert(SUCCEEDED(hr));' +- print r' hr = _this->CheckDeviceType(Adapter, DeviceType, Mode.Format, pPresentationParameters->BackBufferFormat, pPresentationParameters->Windowed);' +- print r' if (hr == D3DERR_NOTAVAILABLE) {' +- print r' retrace::warning(call) << "forcing back buffer format to match display mode format\n";' +- print r' pPresentationParameters->BackBufferFormat = Mode.Format;' +- print r' }' +- print r' }' ++ print(r' if (pPresentationParameters->Windowed) {') ++ print(r' D3DDISPLAYMODE Mode;') ++ print(r' HRESULT hr;') ++ print(r' hr = _this->GetAdapterDisplayMode(Adapter, &Mode);') ++ print(r' assert(SUCCEEDED(hr));') ++ print(r' hr = _this->CheckDeviceType(Adapter, DeviceType, Mode.Format, pPresentationParameters->BackBufferFormat, pPresentationParameters->Windowed);') ++ print(r' if (hr == D3DERR_NOTAVAILABLE) {') ++ print(r' retrace::warning(call) << "forcing back buffer format to match display mode format\n";') ++ print(r' pPresentationParameters->BackBufferFormat = Mode.Format;') ++ print(r' }') ++ print(r' }') + + if method.name in self.createDeviceMethodNames: + # override the device type +- print r' switch (retrace::driver) {' +- print r' case retrace::DRIVER_HARDWARE:' +- print r' DeviceType = D3DDEVTYPE_HAL;' +- print r' break;' +- print r' case retrace::DRIVER_SOFTWARE:' +- print r' case retrace::DRIVER_REFERENCE:' +- print r' DeviceType = D3DDEVTYPE_REF;' +- print r' break;' +- print r' case retrace::DRIVER_NULL:' ++ print(r' switch (retrace::driver) {') ++ print(r' case retrace::DRIVER_HARDWARE:') ++ print(r' DeviceType = D3DDEVTYPE_HAL;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_SOFTWARE:') ++ print(r' case retrace::DRIVER_REFERENCE:') ++ print(r' DeviceType = D3DDEVTYPE_REF;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_NULL:') + if interface.name.startswith('IDirect3D9'): +- print r' DeviceType = D3DDEVTYPE_NULLREF;' ++ print(r' DeviceType = D3DDEVTYPE_NULLREF;') + else: +- print r' retrace::warning(call) << "null driver not supported\n";' +- print r' break;' +- print r' case retrace::DRIVER_MODULE:' +- print r' retrace::warning(call) << "driver module not supported\n";' +- print r' break;' +- print r' default:' +- print r' assert(0);' +- print r' /* fall-through */' +- print r' case retrace::DRIVER_DEFAULT:' +- print r' break;' +- print r' }' ++ print(r' retrace::warning(call) << "null driver not supported\n";') ++ print(r' break;') ++ print(r' case retrace::DRIVER_MODULE:') ++ print(r' retrace::warning(call) << "driver module not supported\n";') ++ print(r' break;') ++ print(r' default:') ++ print(r' assert(0);') ++ print(r' /* fall-through */') ++ print(r' case retrace::DRIVER_DEFAULT:') ++ print(r' break;') ++ print(r' }') + + if method.name in ('Reset', 'ResetEx'): + # force windowed mode +- print r' if (retrace::forceWindowed) {' +- print r' pPresentationParameters->Windowed = TRUE;' +- print r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;' +- print r' }' ++ print(r' if (retrace::forceWindowed) {') ++ print(r' pPresentationParameters->Windowed = TRUE;') ++ print(r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;') ++ print(r' }') + # resize window +- print r' if (pPresentationParameters->Windowed) {' +- print r' d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' +- print r' }' ++ print(r' if (pPresentationParameters->Windowed) {') ++ print(r' d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);') ++ print(r' }') + + # notify frame has been completed + if method.name in ('Present', 'PresentEx'): + if interface.name.startswith('IDirect3DSwapChain9'): +- print r' d3d9scDumper.bindDevice(_this);' +- print r' retrace::frameComplete(call);' +- print r' hDestWindowOverride = NULL;' ++ print(r' d3d9scDumper.bindDevice(_this);') ++ print(r' retrace::frameComplete(call);') ++ print(r' hDestWindowOverride = NULL;') + + # Ensure textures can be locked when dumping + # TODO: Pre-check with CheckDeviceFormat + if method.name in ('CreateTexture', 'CreateCubeTexture', 'CreateVolumeTexture'): +- print r' if (retrace::dumpingState &&' +- print r' Pool == D3DPOOL_DEFAULT &&' +- print r' !(Usage & (D3DUSAGE_RENDERTARGET|D3DUSAGE_DEPTHSTENCIL))) {' +- print r' Usage |= D3DUSAGE_DYNAMIC;' +- print r' }' ++ print(r' if (retrace::dumpingState &&') ++ print(r' Pool == D3DPOOL_DEFAULT &&') ++ print(r' !(Usage & (D3DUSAGE_RENDERTARGET|D3DUSAGE_DEPTHSTENCIL))) {') ++ print(r' Usage |= D3DUSAGE_DYNAMIC;') ++ print(r' }') + + if 'pSharedHandle' in method.argNames(): +- print r' if (pSharedHandle) {' +- print r' retrace::warning(call) << "shared surfaces unsupported\n";' +- print r' pSharedHandle = NULL;' +- print r' }' ++ print(r' if (pSharedHandle) {') ++ print(r' retrace::warning(call) << "shared surfaces unsupported\n";') ++ print(r' pSharedHandle = NULL;') ++ print(r' }') + + if method.name in ('Lock', 'LockRect', 'LockBox'): + # Reset _DONOTWAIT flags. Otherwise they may fail, and we have no +@@ -190,7 +190,7 @@ class D3DRetracer(Retracer): + mapFlagsArg = method.getArgByName('Flags') + for flag in mapFlagsArg.type.values: + if flag.endswith('_DONOTWAIT'): +- print r' Flags &= ~%s;' % flag ++ print(r' Flags &= ~%s;' % flag) + + Retracer.invokeInterfaceMethod(self, interface, method) + +@@ -201,7 +201,7 @@ class D3DRetracer(Retracer): + + # process events after presents + if method.name == 'Present': +- print r' d3dretrace::processEvents();' ++ print(r' d3dretrace::processEvents();') + + def mapping_subkey(): + if 'Level' in method.argNames(): +@@ -210,35 +210,35 @@ class D3DRetracer(Retracer): + return ('0',) + + if method.name in ('Lock', 'LockRect', 'LockBox'): +- print ' VOID *_pbData = NULL;' +- print ' size_t _MappedSize = 0;' +- print ' if (!(Flags & D3DLOCK_READONLY)) {' +- print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) +- print ' }' +- print ' if (_MappedSize) {' +- print ' _maps[MappingKey(_this, %s)] = _pbData;' % mapping_subkey() ++ print(' VOID *_pbData = NULL;') ++ print(' size_t _MappedSize = 0;') ++ print(' if (!(Flags & D3DLOCK_READONLY)) {') ++ print(' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])) ++ print(' }') ++ print(' if (_MappedSize) {') ++ print(' _maps[MappingKey(_this, %s)] = _pbData;' % mapping_subkey()) + self.checkPitchMismatch(method) +- print ' } else {' +- print ' return;' +- print ' }' ++ print(' } else {') ++ print(' return;') ++ print(' }') + + if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): +- print ' VOID *_pbData = 0;' +- print ' MappingKey _mappingKey(_this, %s);' % mapping_subkey() +- print ' _pbData = _maps[_mappingKey];' +- print ' if (_pbData) {' +- print ' retrace::delRegionByPointer(_pbData);' +- print ' _maps[_mappingKey] = 0;' +- print ' }' ++ print(' VOID *_pbData = 0;') ++ print(' MappingKey _mappingKey(_this, %s);' % mapping_subkey()) ++ print(' _pbData = _maps[_mappingKey];') ++ print(' if (_pbData) {') ++ print(' retrace::delRegionByPointer(_pbData);') ++ print(' _maps[_mappingKey] = 0;') ++ print(' }') + + + def main(): +- print r'#include ' +- print +- print r'#include ' +- print +- print r'#include "d3dretrace.hpp"' +- print ++ print(r'#include ') ++ print() ++ print(r'#include ') ++ print() ++ print(r'#include "d3dretrace.hpp"') ++ print() + + moduleName = sys.argv[1] + support = int(sys.argv[2]) +@@ -249,24 +249,24 @@ def main(): + if moduleName == 'd3d9': + from specs.d3d9 import d3d9, d3dperf + from specs.dxva2 import dxva2 +- print r'#include "d3d9imports.hpp"' +- print r'#include "d3d9size.hpp"' +- print r'#include "dxva2imports.hpp"' ++ print(r'#include "d3d9imports.hpp"') ++ print(r'#include "d3d9size.hpp"') ++ print(r'#include "dxva2imports.hpp"') + d3d9.mergeModule(d3dperf) + api.addModule(d3d9) + api.addModule(dxva2) +- print +- print '''static d3dretrace::D3DDumper d3d9Dumper;''' +- print '''static d3dretrace::D3DDumper d3d9scDumper;''' +- print ++ print() ++ print('''static d3dretrace::D3DDumper d3d9Dumper;''') ++ print('''static d3dretrace::D3DDumper d3d9scDumper;''') ++ print() + elif moduleName == 'd3d8': + from specs.d3d8 import d3d8 +- print r'#include "d3d8imports.hpp"' +- print r'#include "d3d8size.hpp"' ++ print(r'#include "d3d8imports.hpp"') ++ print(r'#include "d3d8size.hpp"') + api.addModule(d3d8) +- print +- print '''static d3dretrace::D3DDumper d3d8Dumper;''' +- print ++ print() ++ print('''static d3dretrace::D3DDumper d3d8Dumper;''') ++ print() + else: + assert False + +diff --git a/retrace/ddrawretrace.py b/retrace/ddrawretrace.py +index 4f2ff944..863283fd 100644 +--- a/retrace/ddrawretrace.py ++++ b/retrace/ddrawretrace.py +@@ -37,12 +37,12 @@ from specs.ddraw import DDCREATE_LPGUID + class D3DRetracer(Retracer): + + def retraceApi(self, api): +- print '// Swizzling mapping for lock addresses' +- print 'static std::map _maps;' +- print ++ print('// Swizzling mapping for lock addresses') ++ print('static std::map _maps;') ++ print() + # TODO: Keep a table of windows +- print 'static HWND g_hWnd;' +- print ++ print('static HWND g_hWnd;') ++ print() + + Retracer.retraceApi(self, api) + +@@ -50,20 +50,20 @@ class D3DRetracer(Retracer): + # keep track of the last used device for state dumping + if interface.name in ('IDirect3DDevice7',): + if method.name == 'Release': +- print r' if (call.ret->toUInt() == 0) {' +- print r' d3d7Dumper.unbindDevice(_this);' +- print r' }' ++ print(r' if (call.ret->toUInt() == 0) {') ++ print(r' d3d7Dumper.unbindDevice(_this);') ++ print(r' }') + else: +- print r' d3d7Dumper.bindDevice(_this);' ++ print(r' d3d7Dumper.bindDevice(_this);') + + # create windows as neccessary + hWndArg = method.getArgByType(HWND) + if hWndArg is not None: + # FIXME: Try to guess the window size (e.g., from IDirectDrawSurface7::Blt) +- print r' if (!g_hWnd) {' +- print r' g_hWnd = d3dretrace::createWindow(512, 512);' +- print r' }' +- print r' %s = g_hWnd;' % hWndArg.name ++ print(r' if (!g_hWnd) {') ++ print(r' g_hWnd = d3dretrace::createWindow(512, 512);') ++ print(r' }') ++ print(r' %s = g_hWnd;' % hWndArg.name) + + + if method.name == 'Lock': +@@ -71,74 +71,74 @@ class D3DRetracer(Retracer): + # way to cope with it (other than retry). + mapFlagsArg = method.getArgByName('dwFlags') + if mapFlagsArg is not None: +- print r' dwFlags &= DDLOCK_DONOTWAIT;' +- print r' dwFlags |= DDLOCK_WAIT;' ++ print(r' dwFlags &= DDLOCK_DONOTWAIT;') ++ print(r' dwFlags |= DDLOCK_WAIT;') + + Retracer.invokeInterfaceMethod(self, interface, method) + + if method.name == 'CreateDevice': +- print r' if (FAILED(_result)) {' +- print r' exit(1);' +- print r' }' ++ print(r' if (FAILED(_result)) {') ++ print(r' exit(1);') ++ print(r' }') + + # notify frame has been completed + # process events after presents + if interface.name == 'IDirectDrawSurface7' and method.name == 'Blt': +- print r' DDSCAPS2 ddsCaps;' +- print r' if (SUCCEEDED(_this->GetCaps(&ddsCaps)) &&' +- print r' (ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) {' +- print r' retrace::frameComplete(call);' +- print r' d3dretrace::processEvents();' +- print r' }' ++ print(r' DDSCAPS2 ddsCaps;') ++ print(r' if (SUCCEEDED(_this->GetCaps(&ddsCaps)) &&') ++ print(r' (ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) {') ++ print(r' retrace::frameComplete(call);') ++ print(r' d3dretrace::processEvents();') ++ print(r' }') + + if method.name == 'Lock': +- print ' VOID *_pbData = NULL;' +- print ' size_t _MappedSize = 0;' ++ print(' VOID *_pbData = NULL;') ++ print(' size_t _MappedSize = 0;') + # FIXME: determine the mapping size + #print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) +- print ' if (_MappedSize) {' +- print ' _maps[_this] = _pbData;' ++ print(' if (_MappedSize) {') ++ print(' _maps[_this] = _pbData;') + # TODO: check pitches match +- print ' } else {' +- print ' return;' +- print ' }' ++ print(' } else {') ++ print(' return;') ++ print(' }') + + if method.name == 'Unlock': +- print ' VOID *_pbData = 0;' +- print ' _pbData = _maps[_this];' +- print ' if (_pbData) {' +- print ' retrace::delRegionByPointer(_pbData);' +- print ' _maps[_this] = 0;' +- print ' }' ++ print(' VOID *_pbData = 0;') ++ print(' _pbData = _maps[_this];') ++ print(' if (_pbData) {') ++ print(' retrace::delRegionByPointer(_pbData);') ++ print(' _maps[_this] = 0;') ++ print(' }') + + def extractArg(self, function, arg, arg_type, lvalue, rvalue): + # Handle DDCREATE_* flags + if arg.type is DDCREATE_LPGUID: +- print ' if (%s.toArray()) {' % rvalue ++ print(' if (%s.toArray()) {' % rvalue) + Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue) +- print ' } else {' +- print ' %s = static_cast<%s>(%s.toPointer());' % (lvalue, arg_type, rvalue) +- print ' }' ++ print(' } else {') ++ print(' %s = static_cast<%s>(%s.toPointer());' % (lvalue, arg_type, rvalue)) ++ print(' }') + return + + Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue) + + + def main(): +- print r'#include ' +- print +- print r'#include ' +- print +- print r'#include "d3dretrace.hpp"' +- print ++ print(r'#include ') ++ print() ++ print(r'#include ') ++ print() ++ print(r'#include "d3dretrace.hpp"') ++ print() + + api = API() + +- print r'#include "d3dimports.hpp"' ++ print(r'#include "d3dimports.hpp"') + api.addModule(ddraw) +- print +- print '''static d3dretrace::D3DDumper d3d7Dumper;''' +- print ++ print() ++ print('''static d3dretrace::D3DDumper d3d7Dumper;''') ++ print() + + retracer = D3DRetracer() + retracer.table_name = 'd3dretrace::ddraw_callbacks' +diff --git a/retrace/dllretrace.py b/retrace/dllretrace.py +index c818b0a9..ad9db9a4 100644 +--- a/retrace/dllretrace.py ++++ b/retrace/dllretrace.py +@@ -33,29 +33,29 @@ class DllDispatcher(Dispatcher): + + def dispatchModule(self, module): + tag = module.name.upper() +- print r'const char *g_sz%sDllName = NULL;' % (tag,) +- print r'HMODULE g_h%sModule = NULL;' % (tag,) +- print r'' +- print r'static PROC' +- print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag +- print r' if (!g_h%sModule) {' % tag +- print r' if (g_sz%sDllName) {' % tag +- print r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag) +- print r' if (!g_h%sModule) {' % tag +- print r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag +- print r' }' +- print r' }' +- print r' if (!g_h%sModule) {' % tag +- print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name) +- print r' }' +- print r' if (!g_h%sModule) {' % tag +- print r' os::log("error: failed to load %s.dll\n");' % module.name +- print r' exit(1);' +- print r' }' +- print r' }' +- print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag +- print r'}' +- print r'' ++ print(r'const char *g_sz%sDllName = NULL;' % (tag,)) ++ print(r'HMODULE g_h%sModule = NULL;' % (tag,)) ++ print(r'') ++ print(r'static PROC') ++ print(r'_get%sProcAddress(LPCSTR lpProcName) {' % tag) ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' if (g_sz%sDllName) {' % tag) ++ print(r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)) ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag) ++ print(r' }') ++ print(r' }') ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name)) ++ print(r' }') ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' os::log("error: failed to load %s.dll\n");' % module.name) ++ print(r' exit(1);') ++ print(r' }') ++ print(r' }') ++ print(r' return GetProcAddress(g_h%sModule, lpProcName);' % tag) ++ print(r'}') ++ print(r'') + + Dispatcher.dispatchModule(self, module) + +diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py +index 799e3df9..8986a767 100755 +--- a/retrace/dxgiretrace.py ++++ b/retrace/dxgiretrace.py +@@ -40,10 +40,10 @@ from specs.d3d11 import d3d11 + class D3DRetracer(Retracer): + + def retraceApi(self, api): +- print '// Swizzling mapping for lock addresses, mapping a (pDeviceContext, pResource, Subresource) -> void *' +- print 'typedef std::pair< IUnknown *, UINT > SubresourceKey;' +- print 'static std::map< IUnknown *, std::map< SubresourceKey, void * > > g_Maps;' +- print ++ print('// Swizzling mapping for lock addresses, mapping a (pDeviceContext, pResource, Subresource) -> void *') ++ print('typedef std::pair< IUnknown *, UINT > SubresourceKey;') ++ print('static std::map< IUnknown *, std::map< SubresourceKey, void * > > g_Maps;') ++ print() + self.table_name = 'd3dretrace::dxgi_callbacks' + + Retracer.retraceApi(self, api) +@@ -61,41 +61,41 @@ class D3DRetracer(Retracer): + if function.name in self.createDeviceFunctionNames: + # create windows as neccessary + if 'pSwapChainDesc' in function.argNames(): +- print r' d3dretrace::createWindowForSwapChain(pSwapChainDesc);' ++ print(r' d3dretrace::createWindowForSwapChain(pSwapChainDesc);') + + # Compensate for the fact we don't trace DXGI object creation + if function.name.startswith('D3D11CreateDevice'): +- print r' if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {' +- print r' DriverType = D3D_DRIVER_TYPE_HARDWARE;' +- print r' }' ++ print(r' if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {') ++ print(r' DriverType = D3D_DRIVER_TYPE_HARDWARE;') ++ print(r' }') + + if function.name.startswith('D3D10CreateDevice'): + # Toggle debugging +- print r' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;' +- print r' if (retrace::debug) {' +- print r' HMODULE hD3d10SdkLayers = LoadLibraryA("d3d10sdklayers");' +- print r' if (hD3d10SdkLayers) {' +- print r' FreeLibrary(hD3d10SdkLayers);' +- print r' Flags |= D3D10_CREATE_DEVICE_DEBUG;' +- print r' } else {' +- print r' retrace::warning(call) << "Direct3D 10.x SDK Debug Layer (d3d10sdklayers.dll) not available, continuing without debug output\n";' +- print r' }' +- print r' }' ++ print(r' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;') ++ print(r' if (retrace::debug) {') ++ print(r' HMODULE hD3d10SdkLayers = LoadLibraryA("d3d10sdklayers");') ++ print(r' if (hD3d10SdkLayers) {') ++ print(r' FreeLibrary(hD3d10SdkLayers);') ++ print(r' Flags |= D3D10_CREATE_DEVICE_DEBUG;') ++ print(r' } else {') ++ print(r' retrace::warning(call) << "Direct3D 10.x SDK Debug Layer (d3d10sdklayers.dll) not available, continuing without debug output\n";') ++ print(r' }') ++ print(r' }') + + # Force driver + self.forceDriver('D3D10_DRIVER_TYPE') + + if function.name.startswith('D3D11CreateDevice'): + # Toggle debugging +- print r' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;' +- print r' if (retrace::debug) {' +- print r' HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, NULL, NULL, NULL);' +- print r' if (SUCCEEDED(hr)) {' +- print r' Flags |= D3D11_CREATE_DEVICE_DEBUG;' +- print r' } else {' +- print r' retrace::warning(call) << "Direct3D 11.x SDK Debug Layer (d3d11*sdklayers.dll) not available, continuing without debug output\n";' +- print r' }' +- print r' }' ++ print(r' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;') ++ print(r' if (retrace::debug) {') ++ print(r' HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, NULL, NULL, NULL);') ++ print(r' if (SUCCEEDED(hr)) {') ++ print(r' Flags |= D3D11_CREATE_DEVICE_DEBUG;') ++ print(r' } else {') ++ print(r' retrace::warning(call) << "Direct3D 11.x SDK Debug Layer (d3d11*sdklayers.dll) not available, continuing without debug output\n";') ++ print(r' }') ++ print(r' }') + + # Force driver + self.forceDriver('D3D_DRIVER_TYPE') +@@ -108,15 +108,15 @@ class D3DRetracer(Retracer): + if interface is not None: + getDeviceRemovedReasonMethod = interface.getMethodByName("GetDeviceRemovedReason") + if getDeviceRemovedReasonMethod is not None: +- print r' if (FAILED(_result)) {' +- print r' retrace::failed(call, _result);' +- print r' if (_result == DXGI_ERROR_DEVICE_REMOVED) {' +- print r' HRESULT _reason = _this->GetDeviceRemovedReason();' +- print r' retrace::failed(call, _reason);' +- print r' exit(1);' +- print r' }' +- print r' return;' +- print r' }' ++ print(r' if (FAILED(_result)) {') ++ print(r' retrace::failed(call, _result);') ++ print(r' if (_result == DXGI_ERROR_DEVICE_REMOVED) {') ++ print(r' HRESULT _reason = _this->GetDeviceRemovedReason();') ++ print(r' retrace::failed(call, _reason);') ++ print(r' exit(1);') ++ print(r' }') ++ print(r' return;') ++ print(r' }') + return + + Retracer.checkResult(self, interface, methodOrFunction) +@@ -124,112 +124,112 @@ class D3DRetracer(Retracer): + def forceDriver(self, enum): + # This can only work when pAdapter is NULL. For non-NULL pAdapter we + # need to override inside the EnumAdapters call below +- print r' if (pAdapter == NULL) {' +- print r' switch (retrace::driver) {' +- print r' case retrace::DRIVER_HARDWARE:' +- print r' DriverType = %s_HARDWARE;' % enum +- print r' Software = NULL;' +- print r' break;' +- print r' case retrace::DRIVER_SOFTWARE:' +- print r' DriverType = %s_WARP;' % enum +- print r' Software = NULL;' +- print r' break;' +- print r' case retrace::DRIVER_REFERENCE:' +- print r' DriverType = %s_REFERENCE;' % enum +- print r' Software = NULL;' +- print r' break;' +- print r' case retrace::DRIVER_NULL:' +- print r' DriverType = %s_NULL;' % enum +- print r' Software = NULL;' +- print r' break;' +- print r' case retrace::DRIVER_MODULE:' +- print r' DriverType = %s_SOFTWARE;' % enum +- print r' Software = LoadLibraryA(retrace::driverModule);' +- print r' if (!Software) {' +- print r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";' +- print r' }' +- print r' break;' +- print r' default:' +- print r' assert(0);' +- print r' /* fall-through */' +- print r' case retrace::DRIVER_DEFAULT:' +- print r' if (DriverType == %s_SOFTWARE) {' % enum +- print r' Software = LoadLibraryA("d3d10warp");' +- print r' if (!Software) {' +- print r' retrace::warning(call) << "failed to load d3d10warp.dll\n";' +- print r' }' +- print r' }' +- print r' break;' +- print r' }' +- print r' } else {' +- print r' Software = NULL;' +- print r' }' ++ print(r' if (pAdapter == NULL) {') ++ print(r' switch (retrace::driver) {') ++ print(r' case retrace::DRIVER_HARDWARE:') ++ print(r' DriverType = %s_HARDWARE;' % enum) ++ print(r' Software = NULL;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_SOFTWARE:') ++ print(r' DriverType = %s_WARP;' % enum) ++ print(r' Software = NULL;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_REFERENCE:') ++ print(r' DriverType = %s_REFERENCE;' % enum) ++ print(r' Software = NULL;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_NULL:') ++ print(r' DriverType = %s_NULL;' % enum) ++ print(r' Software = NULL;') ++ print(r' break;') ++ print(r' case retrace::DRIVER_MODULE:') ++ print(r' DriverType = %s_SOFTWARE;' % enum) ++ print(r' Software = LoadLibraryA(retrace::driverModule);') ++ print(r' if (!Software) {') ++ print(r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";') ++ print(r' }') ++ print(r' break;') ++ print(r' default:') ++ print(r' assert(0);') ++ print(r' /* fall-through */') ++ print(r' case retrace::DRIVER_DEFAULT:') ++ print(r' if (DriverType == %s_SOFTWARE) {' % enum) ++ print(r' Software = LoadLibraryA("d3d10warp");') ++ print(r' if (!Software) {') ++ print(r' retrace::warning(call) << "failed to load d3d10warp.dll\n";') ++ print(r' }') ++ print(r' }') ++ print(r' break;') ++ print(r' }') ++ print(r' } else {') ++ print(r' Software = NULL;') ++ print(r' }') + + def invokeInterfaceMethod(self, interface, method): + # keep track of the last used device for state dumping + if interface.name in ('ID3D10Device', 'ID3D10Device1'): + if method.name == 'Release': +- print r' if (call.ret->toUInt() == 0) {' +- print r' d3d10Dumper.unbindDevice(_this);' +- print r' }' ++ print(r' if (call.ret->toUInt() == 0) {') ++ print(r' d3d10Dumper.unbindDevice(_this);') ++ print(r' }') + else: +- print r' d3d10Dumper.bindDevice(_this);' ++ print(r' d3d10Dumper.bindDevice(_this);') + if interface.name.startswith('ID3D11DeviceContext'): + if method.name == 'Release': +- print r' if (call.ret->toUInt() == 0) {' +- print r' d3d11Dumper.unbindDevice(_this);' +- print r' }' ++ print(r' if (call.ret->toUInt() == 0) {') ++ print(r' d3d11Dumper.unbindDevice(_this);') ++ print(r' }') + else: +- print r' if (_this->GetType() == D3D11_DEVICE_CONTEXT_IMMEDIATE) {' +- print r' d3d11Dumper.bindDevice(_this);' +- print r' }' ++ print(r' if (_this->GetType() == D3D11_DEVICE_CONTEXT_IMMEDIATE) {') ++ print(r' d3d11Dumper.bindDevice(_this);') ++ print(r' }') + + # intercept private interfaces + if method.name == 'QueryInterface': +- print r' if (!d3dretrace::overrideQueryInterface(_this, riid, ppvObj, &_result)) {' ++ print(r' if (!d3dretrace::overrideQueryInterface(_this, riid, ppvObj, &_result)) {') + Retracer.invokeInterfaceMethod(self, interface, method) +- print r' }' ++ print(r' }') + return + + # create windows as neccessary + if method.name == 'CreateSwapChain': +- print r' d3dretrace::createWindowForSwapChain(pDesc);' ++ print(r' d3dretrace::createWindowForSwapChain(pDesc);') + if method.name == 'CreateSwapChainForHwnd': +- print r' WindowHandle = d3dretrace::createWindow(pDesc->Width, pDesc->Height);' +- print r' // DXGI_SCALING_NONE is only supported on Win8 and beyond' +- print r' if (pDesc->Scaling == DXGI_SCALING_NONE && !IsWindows8OrGreater()) {' +- print r' pDesc->Scaling = DXGI_SCALING_STRETCH;' +- print r' }' ++ print(r' WindowHandle = d3dretrace::createWindow(pDesc->Width, pDesc->Height);') ++ print(r' // DXGI_SCALING_NONE is only supported on Win8 and beyond') ++ print(r' if (pDesc->Scaling == DXGI_SCALING_NONE && !IsWindows8OrGreater()) {') ++ print(r' pDesc->Scaling = DXGI_SCALING_STRETCH;') ++ print(r' }') + if method.name == 'CreateSwapChainForComposition': +- print r' HWND hWnd = d3dretrace::createWindow(pDesc->Width, pDesc->Height);' +- print r' _result = _this->CreateSwapChainForHwnd(pDevice, hWnd, pDesc, NULL, pRestrictToOutput, ppSwapChain);' ++ print(r' HWND hWnd = d3dretrace::createWindow(pDesc->Width, pDesc->Height);') ++ print(r' _result = _this->CreateSwapChainForHwnd(pDevice, hWnd, pDesc, NULL, pRestrictToOutput, ppSwapChain);') + self.checkResult(interface, method) + return + + if method.name == 'SetFullscreenState': +- print r' if (retrace::forceWindowed) {' +- print r' Fullscreen = FALSE;' +- print r' pTarget = NULL;' +- print r' }' ++ print(r' if (retrace::forceWindowed) {') ++ print(r' Fullscreen = FALSE;') ++ print(r' pTarget = NULL;') ++ print(r' }') + + # notify frame has been completed + if interface.name.startswith('IDXGISwapChain') and method.name.startswith('Present'): + if interface.name.startswith('IDXGISwapChainDWM'): +- print r' com_ptr pSwapChain;' +- print r' if (SUCCEEDED(_this->QueryInterface(IID_IDXGISwapChain, (void **) &pSwapChain))) {' +- print r' dxgiDumper.bindDevice(pSwapChain);' +- print r' } else {' +- print r' assert(0);' +- print r' }' ++ print(r' com_ptr pSwapChain;') ++ print(r' if (SUCCEEDED(_this->QueryInterface(IID_IDXGISwapChain, (void **) &pSwapChain))) {') ++ print(r' dxgiDumper.bindDevice(pSwapChain);') ++ print(r' } else {') ++ print(r' assert(0);') ++ print(r' }') + else: +- print r' dxgiDumper.bindDevice(_this);' +- print r' retrace::frameComplete(call);' ++ print(r' dxgiDumper.bindDevice(_this);') ++ print(r' retrace::frameComplete(call);') + + if 'pSharedResource' in method.argNames(): +- print r' if (pSharedResource) {' +- print r' retrace::warning(call) << "shared surfaces unsupported\n";' +- print r' pSharedResource = NULL;' +- print r' }' ++ print(r' if (pSharedResource) {') ++ print(r' retrace::warning(call) << "shared surfaces unsupported\n";') ++ print(r' pSharedResource = NULL;') ++ print(r' }') + + # Force driver + if interface.name.startswith('IDXGIFactory') and method.name.startswith('EnumAdapters'): +@@ -260,31 +260,31 @@ class D3DRetracer(Retracer): + return + + if interface.name.startswith('ID3D10Device') and method.name.startswith('OpenSharedResource'): +- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";' +- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);' ++ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";') ++ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);') + self.checkResult(interface, method) + return + if interface.name.startswith('ID3D11Device') and method.name == 'OpenSharedResource': + # Some applications (e.g., video playing in IE11) create shared resources within the same process. + # TODO: Generalize to other OpenSharedResource variants +- print r' retrace::map::const_iterator it = _shared_handle_map.find(hResource);' +- print r' if (it == _shared_handle_map.end()) {' +- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";' +- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);' ++ print(r' retrace::map::const_iterator it = _shared_handle_map.find(hResource);') ++ print(r' if (it == _shared_handle_map.end()) {') ++ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";') ++ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);') + self.checkResult(interface, method) +- print r' } else {' +- print r' hResource = it->second;' ++ print(r' } else {') ++ print(r' hResource = it->second;') + Retracer.invokeInterfaceMethod(self, interface, method) +- print r' }' ++ print(r' }') + return + if interface.name.startswith('ID3D11Device') and method.name.startswith('OpenSharedResource'): +- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";' +- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);' ++ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";') ++ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);') + if method.name == 'OpenSharedResourceByName': +- print r' (void)lpName;' +- print r' (void)dwDesiredAccess;' ++ print(r' (void)lpName;') ++ print(r' (void)dwDesiredAccess;') + else: +- print r' (void)hResource;' ++ print(r' (void)hResource;') + self.checkResult(interface, method) + return + +@@ -294,7 +294,7 @@ class D3DRetracer(Retracer): + mapFlagsArg = method.getArgByName('MapFlags') + for flag in mapFlagsArg.type.values: + if flag.endswith('_MAP_FLAG_DO_NOT_WAIT'): +- print r' MapFlags &= ~%s;' % flag ++ print(r' MapFlags &= ~%s;' % flag) + + if method.name.startswith('UpdateSubresource'): + # The D3D10 debug layer is buggy (or at least inconsistent with the +@@ -303,108 +303,108 @@ class D3DRetracer(Retracer): + # SrcDepthPitch is garbagge for non 3D textures. + # XXX: It also seems to expect padding bytes at the end of the last + # row, but we never record (or allocate) those... +- print r' if (retrace::debug && pDstBox && pDstBox->front == 0 && pDstBox->back == 1) {' +- print r' SrcDepthPitch = 0;' +- print r' }' ++ print(r' if (retrace::debug && pDstBox && pDstBox->front == 0 && pDstBox->back == 1) {') ++ print(r' SrcDepthPitch = 0;') ++ print(r' }') + + if method.name == 'SetGammaControl': + # This method is only supported while in full-screen mode +- print r' if (retrace::forceWindowed) {' +- print r' return;' +- print r' }' ++ print(r' if (retrace::forceWindowed) {') ++ print(r' return;') ++ print(r' }') + + Retracer.invokeInterfaceMethod(self, interface, method) + + if method.name in ('AcquireSync', 'ReleaseSync'): +- print r' if (SUCCEEDED(_result) && _result != S_OK) {' +- print r' retrace::warning(call) << " returned " << _result << "\n";' +- print r' }' ++ print(r' if (SUCCEEDED(_result) && _result != S_OK) {') ++ print(r' retrace::warning(call) << " returned " << _result << "\n";') ++ print(r' }') + + # process events after presents + if interface.name.startswith('IDXGISwapChain') and method.name.startswith('Present'): +- print r' d3dretrace::processEvents();' ++ print(r' d3dretrace::processEvents();') + + if method.name in ('Map', 'Unmap'): + if interface.name.startswith('ID3D11DeviceContext'): +- print ' void * & _pbData = g_Maps[_this][SubresourceKey(pResource, Subresource)];' ++ print(' void * & _pbData = g_Maps[_this][SubresourceKey(pResource, Subresource)];') + else: + subresourceArg = method.getArgByName('Subresource') + if subresourceArg is None: +- print ' UINT Subresource = 0;' +- print ' void * & _pbData = g_Maps[0][SubresourceKey(_this, Subresource)];' ++ print(' UINT Subresource = 0;') ++ print(' void * & _pbData = g_Maps[0][SubresourceKey(_this, Subresource)];') + + if method.name == 'Map': +- print ' _MAP_DESC _MapDesc;' +- print ' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames()) +- print ' size_t _MappedSize = _MapDesc.Size;' +- print ' if (_MapDesc.Size) {' +- print ' _pbData = _MapDesc.pData;' ++ print(' _MAP_DESC _MapDesc;') ++ print(' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames())) ++ print(' size_t _MappedSize = _MapDesc.Size;') ++ print(' if (_MapDesc.Size) {') ++ print(' _pbData = _MapDesc.pData;') + if interface.name.startswith('ID3D11DeviceContext'): + # Prevent false warnings on 1D and 2D resources, since the + # pitches are often junk there... +- print ' _normalizeMap(pResource, pMappedResource);' ++ print(' _normalizeMap(pResource, pMappedResource);') + self.checkPitchMismatch(method) + else: +- print ' _pbData = _MapDesc.pData;' ++ print(' _pbData = _MapDesc.pData;') + self.checkPitchMismatch(method) +- print ' } else {' +- print ' return;' +- print ' }' ++ print(' } else {') ++ print(' return;') ++ print(' }') + + if method.name == 'Unmap': +- print ' if (_pbData) {' +- print ' retrace::delRegionByPointer(_pbData);' +- print ' _pbData = 0;' +- print ' }' ++ print(' if (_pbData) {') ++ print(' retrace::delRegionByPointer(_pbData);') ++ print(' _pbData = 0;') ++ print(' }') + + # Attach shader byte code for lookup + if 'pShaderBytecode' in method.argNames(): + ppShader = method.args[-1] + assert ppShader.output +- print r' if (retrace::dumpingState && SUCCEEDED(_result)) {' +- print r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name +- print r' }' ++ print(r' if (retrace::dumpingState && SUCCEEDED(_result)) {') ++ print(r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name) ++ print(r' }') + + def extractArg(self, function, arg, arg_type, lvalue, rvalue): + # Set object names + if function.name == 'SetPrivateData' and arg.name == 'pData': + iid = function.args[0].name +- print r' if (%s != WKPDID_D3DDebugObjectName) {' % iid +- print r' return;' +- print r' }' ++ print(r' if (%s != WKPDID_D3DDebugObjectName) {' % iid) ++ print(r' return;') ++ print(r' }') + # Interpret argument as string + Retracer.extractArg(self, function, arg, LPCSTR, lvalue, rvalue) +- print r' assert(pData);' +- print r' assert(DataSize >= strlen((const char *)pData));' +- print r' // Some applications include the trailing zero terminator in the data' +- print r' DataSize = strlen((const char *)pData);' ++ print(r' assert(pData);') ++ print(r' assert(DataSize >= strlen((const char *)pData));') ++ print(r' // Some applications include the trailing zero terminator in the data') ++ print(r' DataSize = strlen((const char *)pData);') + return + + Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue) + + + def main(): +- print r'#define INITGUID' +- print +- print r'#include ' +- print +- print r'#include ' +- print +- print r'#include "d3dretrace.hpp"' +- print r'#include "os_version.hpp"' +- print +- print r'#include "d3dretrace_dxgi.hpp"' +- print r'#include "d3d10imports.hpp"' +- print r'#include "d3d10size.hpp"' +- print r'#include "d3d10state.hpp"' +- print r'#include "d3d11imports.hpp"' +- print r'#include "d3d11size.hpp"' +- print r'#include "d3dstate.hpp"' +- print +- print '''static d3dretrace::D3DDumper dxgiDumper;''' +- print '''static d3dretrace::D3DDumper d3d10Dumper;''' +- print '''static d3dretrace::D3DDumper d3d11Dumper;''' +- print ++ print(r'#define INITGUID') ++ print() ++ print(r'#include ') ++ print() ++ print(r'#include ') ++ print() ++ print(r'#include "d3dretrace.hpp"') ++ print(r'#include "os_version.hpp"') ++ print() ++ print(r'#include "d3dretrace_dxgi.hpp"') ++ print(r'#include "d3d10imports.hpp"') ++ print(r'#include "d3d10size.hpp"') ++ print(r'#include "d3d10state.hpp"') ++ print(r'#include "d3d11imports.hpp"') ++ print(r'#include "d3d11size.hpp"') ++ print(r'#include "d3dstate.hpp"') ++ print() ++ print('''static d3dretrace::D3DDumper dxgiDumper;''') ++ print('''static d3dretrace::D3DDumper d3d10Dumper;''') ++ print('''static d3dretrace::D3DDumper d3d11Dumper;''') ++ print() + + api = API() + api.addModule(dxgi) +diff --git a/retrace/dxgistate_so.py b/retrace/dxgistate_so.py +index 86f6db57..33745c8f 100644 +--- a/retrace/dxgistate_so.py ++++ b/retrace/dxgistate_so.py +@@ -48,9 +48,9 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin): + + def visitLiteral(self, literal, instance): + if literal.kind in ('SInt', 'UInt'): +- print ' writer.writeInt(%s);' % (instance) ++ print(' writer.writeInt(%s);' % (instance)) + elif literal.kind in ('Float',): +- print ' writer.writeFloat(%s);' % (instance) ++ print(' writer.writeFloat(%s);' % (instance)) + else: + raise NotImplementedError + +@@ -66,36 +66,36 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin): + # reinterpret_cast is necessary for GLubyte * <=> char * + instance = 'reinterpret_cast<%s>(%s)' % (cast, instance) + assert string.length is None +- print ' writer.write%s(%s);' % (suffix, instance) ++ print(' writer.write%s(%s);' % (suffix, instance)) + + def visitConst(self, const, instance): + self.visit(const.type, instance) + + def visitStruct(self, struct, instance): +- print ' writer.beginObject();' ++ print(' writer.beginObject();') + for member in struct.members: + memberType, memberName = member + if memberName is not None: +- print ' writer.beginMember("%s");' % memberName ++ print(' writer.beginMember("%s");' % memberName) + self.visitMember(member, instance) + if memberName is not None: +- print ' writer.endMember(); // %s' % memberName +- print ' writer.endObject();' ++ print(' writer.endMember(); // %s' % memberName) ++ print(' writer.endObject();') + + def visitArray(self, array, instance): + length = '_c' + array.type.tag + index = '_i' + array.type.tag + array_length = self.expand(array.length) +- print ' if (%s) {' % instance +- print ' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length) +- print ' writer.beginArray();' +- print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index) ++ print(' if (%s) {' % instance) ++ print(' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length)) ++ print(' writer.beginArray();') ++ print(' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index)) + self.visitElement(index, array.type, '(%s)[%s]' % (instance, index)) +- print ' }' +- print ' writer.endArray();' +- print ' } else {' +- print ' writer.writeNull();' +- print ' }' ++ print(' }') ++ print(' writer.endArray();') ++ print(' } else {') ++ print(' writer.writeNull();') ++ print(' }') + + def visitAttribArray(self, array, instance): + raise NotImplementedError +@@ -104,37 +104,37 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin): + raise NotImplementedError + + def visitEnum(self, enum, instance): +- print ' switch (%s) {' % instance ++ print(' switch (%s) {' % instance) + for value in enum.values: +- print ' case %s:' % value +- print ' writer.writeString("%s");' % value +- print ' break;' +- print ' default:' +- print ' writer.writeInt(%s);' % instance +- print ' break;' +- print ' }' ++ print(' case %s:' % value) ++ print(' writer.writeString("%s");' % value) ++ print(' break;') ++ print(' default:') ++ print(' writer.writeInt(%s);' % instance) ++ print(' break;') ++ print(' }') + + def visitBitmask(self, bitmask, instance): + # TODO + self.visit(bitmask.type, instance) + + def visitPointer(self, pointer, instance): +- print ' if (%s) {' % instance +- print ' writer.beginArray();' ++ print(' if (%s) {' % instance) ++ print(' writer.beginArray();') + self.visit(pointer.type, "*" + instance) +- print ' writer.endArray();' +- print ' } else {' +- print ' writer.writeNull();' +- print ' }' ++ print(' writer.endArray();') ++ print(' } else {') ++ print(' writer.writeNull();') ++ print(' }') + + def visitIntPointer(self, pointer, instance): +- print ' writer.writeInt((uintptr_t)%s);' % instance ++ print(' writer.writeInt((uintptr_t)%s);' % instance) + + def visitObjPointer(self, pointer, instance): +- print ' writer.writeInt((uintptr_t)%s);' % instance ++ print(' writer.writeInt((uintptr_t)%s);' % instance) + + def visitLinearPointer(self, pointer, instance): +- print ' writer.writeInt((uintptr_t)%s);' % instance ++ print(' writer.writeInt((uintptr_t)%s);' % instance) + + def visitReference(self, reference, instance): + self.visit(reference.type, instance) +@@ -146,23 +146,23 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin): + self.visit(alias.type, instance) + + def visitOpaque(self, opaque, instance): +- print ' writer.writeInt((uintptr_t)%s);' % instance ++ print(' writer.writeInt((uintptr_t)%s);' % instance) + + def visitInterface(self, interface, instance): + assert False + + def visitPolymorphic(self, polymorphic, instance): + switchExpr = self.expand(polymorphic.switchExpr) +- print ' switch (static_cast(%s)) {' % switchExpr ++ print(' switch (static_cast(%s)) {' % switchExpr) + for cases, type in polymorphic.iterSwitch(): + for case in cases: +- print ' %s:' % case ++ print(' %s:' % case) + caseInstance = instance + if type.expr is not None: + caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance) + self.visit(type, caseInstance) +- print ' break;' +- print ' }' ++ print(' break;') ++ print(' }') + + + class Dumper: +@@ -187,8 +187,8 @@ class Dumper: + # Includes + for module in api.modules: + for header in module.headers: +- print header +- print ++ print(header) ++ print() + + # Generate the dumper functions + types = api.getAllTypes() +@@ -196,13 +196,13 @@ class Dumper: + self.dumpType(type) + + def dumpType(self, type): +- print r'void' +- print r'dumpStateObject(StateWriter &writer, const %s & so)' % type +- print r'{' ++ print(r'void') ++ print(r'dumpStateObject(StateWriter &writer, const %s & so)' % type) ++ print(r'{') + visitor = self.dumperFactory() + visitor.visit(type, 'so') +- print r'}' +- print ++ print(r'}') ++ print() + + def header(self): + pass +@@ -212,10 +212,10 @@ class Dumper: + + + if __name__ == '__main__': +- print r'#include "dxgistate_so.hpp"' +- print +- print r'#include "state_writer.hpp"' +- print ++ print(r'#include "dxgistate_so.hpp"') ++ print() ++ print(r'#include "state_writer.hpp"') ++ print() + + api = stdapi.API() + api.addModule(dxgi.dxgi) +diff --git a/retrace/glretrace.py b/retrace/glretrace.py +index 2ead195d..0dfe5c5b 100644 +--- a/retrace/glretrace.py ++++ b/retrace/glretrace.py +@@ -127,190 +127,190 @@ class GlRetracer(Retracer): + + # For backwards compatibility with old traces where non VBO drawing was supported + if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect: +- print ' if (retrace::parser->getVersion() < 1) {' ++ print(' if (retrace::parser->getVersion() < 1) {') + + if is_array_pointer or is_draw_arrays: +- print ' GLint _array_buffer = 0;' +- print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);' +- print ' if (!_array_buffer) {' ++ print(' GLint _array_buffer = 0;') ++ print(' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);') ++ print(' if (!_array_buffer) {') + self.failFunction(function) +- print ' }' ++ print(' }') + + if is_draw_elements: +- print ' GLint _element_array_buffer = 0;' +- print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' +- print ' if (!_element_array_buffer) {' ++ print(' GLint _element_array_buffer = 0;') ++ print(' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);') ++ print(' if (!_element_array_buffer) {') + self.failFunction(function) +- print ' }' ++ print(' }') + +- print ' }' ++ print(' }') + + # When no pack buffer object is bound, the pack functions are no-ops. + if self.pack_function_regex.match(function.name): +- print ' GLint _pack_buffer = 0;' +- print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);' +- print ' if (!_pack_buffer) {' +- print ' return;' +- print ' }' ++ print(' GLint _pack_buffer = 0;') ++ print(' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);') ++ print(' if (!_pack_buffer) {') ++ print(' return;') ++ print(' }') + + # Pre-snapshots + if self.bind_framebuffer_function_regex.match(function.name): +- print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);' ++ print(' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);') + if function.name == 'glStringMarkerGREMEDY': + return + if function.name == 'glFrameTerminatorGREMEDY': +- print ' glretrace::frame_complete(call);' ++ print(' glretrace::frame_complete(call);') + return + + Retracer.retraceFunctionBody(self, function) + + # Post-snapshots + if function.name in ('glFlush', 'glFinish'): +- print ' if (!retrace::doubleBuffer) {' +- print ' glretrace::frame_complete(call);' +- print ' }' ++ print(' if (!retrace::doubleBuffer) {') ++ print(' glretrace::frame_complete(call);') ++ print(' }') + if is_draw_arrays or is_draw_elements or is_misc_draw: +- print ' assert(call.flags & trace::CALL_FLAG_RENDER);' ++ print(' assert(call.flags & trace::CALL_FLAG_RENDER);') + + + def invokeFunction(self, function): + if function.name == "glTexDirectVIVMap" or function.name == "glTexDirectMapVIV" or function.name == "glTexDirectTiledMapVIV": +- print '#if defined(HAVE_VIVANTE_G2D)' +- print ' GLint tex;' +- print ' glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);' +- print ' int32_t size = 0;' +- print ' switch(format){' +- print ' case GL_VIV_YV12:' +- print ' case GL_VIV_I420:' +- print ' case GL_VIV_NV12:' +- print ' case GL_VIV_NV21:' +- print ' size=width * height * 3 / 2;' +- print ' break;' +- print ' case GL_RGBA:' +- print ' case GL_BGRA_EXT:' +- print ' size=width * height * 4;' +- print ' break;' +- print ' case GL_RGB:' +- print ' size=width * height *3;' +- print ' break;' +- print ' case GL_VIV_YUY2:' +- print ' case GL_VIV_UYVY:' +- print ' case GL_RGB565_OES:' +- print ' case GL_LUMINANCE8_ALPHA8_EXT:' +- print ' size=width * height *2;' +- print ' break;' +- print ' case GL_ALPHA:' +- print ' size=width * height;' +- print ' break;' +- print ' default:' +- print ' break;' +- print ' }' +- print ' if(tex != 0)' +- print ' {' +- print ' GLuint pindex = *(GLuint*)Logical;' +- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];' +- print ' if(data.privateData == 0) // new entry' +- print ' {' +- print ' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);' +- print ' data.index = pindex;' +- print ' data.size = size;' +- print ' retrace::addRegion(call,data.index,data.logical,size);' +- print ' }' +- print ' else // already have one; check size and index' +- print ' {' +- print ' if((size!=data.size)||(pindex!=data.index))' +- print ' {' +- print ' retrace::delRegionByPointer(data.logical);' +- print ' free_dma_buffer(data.privateData);' +- print ' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);' +- print ' data.index = pindex;' +- print ' data.size = size;' +- print ' retrace::addRegion(call,data.index,data.logical,size);' +- print ' }' +- print ' }' +- print ' *Logical = data.logical;' +- print ' *Physical = data.physical;' +- print ' }' +- print '#endif /* HAVE_VIVANTE_G2D */' ++ print('#if defined(HAVE_VIVANTE_G2D)') ++ print(' GLint tex;') ++ print(' glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);') ++ print(' int32_t size = 0;') ++ print(' switch(format){') ++ print(' case GL_VIV_YV12:') ++ print(' case GL_VIV_I420:') ++ print(' case GL_VIV_NV12:') ++ print(' case GL_VIV_NV21:') ++ print(' size=width * height * 3 / 2;') ++ print(' break;') ++ print(' case GL_RGBA:') ++ print(' case GL_BGRA_EXT:') ++ print(' size=width * height * 4;') ++ print(' break;') ++ print(' case GL_RGB:') ++ print(' size=width * height *3;') ++ print(' break;') ++ print(' case GL_VIV_YUY2:') ++ print(' case GL_VIV_UYVY:') ++ print(' case GL_RGB565_OES:') ++ print(' case GL_LUMINANCE8_ALPHA8_EXT:') ++ print(' size=width * height *2;') ++ print(' break;') ++ print(' case GL_ALPHA:') ++ print(' size=width * height;') ++ print(' break;') ++ print(' default:') ++ print(' break;') ++ print(' }') ++ print(' if(tex != 0)') ++ print(' {') ++ print(' GLuint pindex = *(GLuint*)Logical;') ++ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];') ++ print(' if(data.privateData == 0) // new entry') ++ print(' {') ++ print(' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);') ++ print(' data.index = pindex;') ++ print(' data.size = size;') ++ print(' retrace::addRegion(call,data.index,data.logical,size);') ++ print(' }') ++ print(' else // already have one; check size and index') ++ print(' {') ++ print(' if((size!=data.size)||(pindex!=data.index))') ++ print(' {') ++ print(' retrace::delRegionByPointer(data.logical);') ++ print(' free_dma_buffer(data.privateData);') ++ print(' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);') ++ print(' data.index = pindex;') ++ print(' data.size = size;') ++ print(' retrace::addRegion(call,data.index,data.logical,size);') ++ print(' }') ++ print(' }') ++ print(' *Logical = data.logical;') ++ print(' *Physical = data.physical;') ++ print(' }') ++ print('#endif /* HAVE_VIVANTE_G2D */') + # Infer the drawable size from GL calls + if function.name == "glViewport": +- print ' glretrace::updateDrawable(x + width, y + height);' ++ print(' glretrace::updateDrawable(x + width, y + height);') + if function.name == "glViewportArray": + # We are concerned about drawables so only care for the first viewport +- print ' if (first == 0 && count > 0) {' +- print ' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];' +- print ' glretrace::updateDrawable(x + w, y + h);' +- print ' }' ++ print(' if (first == 0 && count > 0) {') ++ print(' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];') ++ print(' glretrace::updateDrawable(x + w, y + h);') ++ print(' }') + if function.name == "glViewportIndexedf": +- print ' if (index == 0) {' +- print ' glretrace::updateDrawable(x + w, y + h);' +- print ' }' ++ print(' if (index == 0) {') ++ print(' glretrace::updateDrawable(x + w, y + h);') ++ print(' }') + if function.name == "glViewportIndexedfv": +- print ' if (index == 0) {' +- print ' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];' +- print ' glretrace::updateDrawable(x + w, y + h);' +- print ' }' ++ print(' if (index == 0) {') ++ print(' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];') ++ print(' glretrace::updateDrawable(x + w, y + h);') ++ print(' }') + if function.name in ('glBlitFramebuffer', 'glBlitFramebufferEXT'): + # Some applications do all their rendering in a framebuffer, and + # then just blit to the drawable without ever calling glViewport. +- print ' glretrace::updateDrawable(std::max(dstX0, dstX1), std::max(dstY0, dstY1));' ++ print(' glretrace::updateDrawable(std::max(dstX0, dstX1), std::max(dstY0, dstY1));') + + if function.name.startswith('gl') and not function.name.startswith('glX'): + # The Windows OpenGL runtime will skip calls when there's no + # context bound to the current context, but this might cause + # crashes on other systems, particularly with NVIDIA Linux drivers. +- print r' glretrace::Context *currentContext = glretrace::getCurrentContext();' +- print r' if (!currentContext) {' +- print r' if (retrace::debug) {' +- print r' retrace::warning(call) << "no current context\n";' +- print r' }' +- print r'#ifndef _WIN32' +- print r' return;' +- print r'#endif' +- print r' }' ++ print(r' glretrace::Context *currentContext = glretrace::getCurrentContext();') ++ print(r' if (!currentContext) {') ++ print(r' if (retrace::debug) {') ++ print(r' retrace::warning(call) << "no current context\n";') ++ print(r' }') ++ print(r'#ifndef _WIN32') ++ print(r' return;') ++ print(r'#endif') ++ print(r' }') + + if function.name == "glEnd": +- print r' if (currentContext) {' +- print r' currentContext->insideBeginEnd = false;' +- print r' }' ++ print(r' if (currentContext) {') ++ print(r' currentContext->insideBeginEnd = false;') ++ print(r' }') + + if function.name == 'memcpy': +- print ' if (!dest || !src || !n) return;' ++ print(' if (!dest || !src || !n) return;') + + # Skip glEnable/Disable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) as we don't + # faithfully set the CONTEXT_DEBUG_BIT_ARB flags on context creation. + if function.name in ('glEnable', 'glDisable'): +- print ' if (cap == GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) return;' ++ print(' if (cap == GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) return;') + + # Destroy the buffer mapping + if self.unmap_function_regex.match(function.name): +- print r' GLvoid *ptr = NULL;' ++ print(r' GLvoid *ptr = NULL;') + if function.name == 'glUnmapBuffer': +- print r' glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &ptr);' ++ print(r' glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &ptr);') + elif function.name == 'glUnmapBufferARB': +- print r' glGetBufferPointervARB(target, GL_BUFFER_MAP_POINTER_ARB, &ptr);' ++ print(r' glGetBufferPointervARB(target, GL_BUFFER_MAP_POINTER_ARB, &ptr);') + elif function.name == 'glUnmapBufferOES': +- print r' glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &ptr);' ++ print(r' glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &ptr);') + elif function.name == 'glUnmapNamedBuffer': +- print r' glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &ptr);' ++ print(r' glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &ptr);') + elif function.name == 'glUnmapNamedBufferEXT': +- print r' glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &ptr);' ++ print(r' glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &ptr);') + elif function.name == 'glUnmapObjectBufferATI': + # TODO + pass + else: + assert False +- print r' if (ptr) {' +- print r' retrace::delRegionByPointer(ptr);' +- print r' } else {' +- print r' retrace::warning(call) << "failed to get mapped pointer\n";' +- print r' }' ++ print(r' if (ptr) {') ++ print(r' retrace::delRegionByPointer(ptr);') ++ print(r' } else {') ++ print(r' retrace::warning(call) << "failed to get mapped pointer\n";') ++ print(r' }') + + if function.name in ('glBindProgramPipeline', 'glBindProgramPipelineEXT'): + # Note if glBindProgramPipeline has ever been called +- print r' if (pipeline) {' +- print r' _pipelineHasBeenBound = true;' +- print r' }' ++ print(r' if (pipeline) {') ++ print(r' _pipelineHasBeenBound = true;') ++ print(r' }') + + is_draw_arrays = self.draw_arrays_function_regex.match(function.name) is not None + is_draw_elements = self.draw_elements_function_regex.match(function.name) is not None +@@ -325,240 +325,240 @@ class GlRetracer(Retracer): + + # Keep track of active program for call lists + if function.name in ('glUseProgram', 'glUseProgramObjectARB'): +- print r' if (currentContext) {' +- print r' currentContext->activeProgram = call.arg(0).toUInt();' +- print r' }' ++ print(r' if (currentContext) {') ++ print(r' currentContext->activeProgram = call.arg(0).toUInt();') ++ print(r' }') + + # Only profile if not inside a list as the queries get inserted into list + if function.name == 'glNewList': +- print r' if (currentContext) {' +- print r' currentContext->insideList = true;' +- print r' }' ++ print(r' if (currentContext) {') ++ print(r' currentContext->insideList = true;') ++ print(r' }') + + if function.name == 'glEndList': +- print r' if (currentContext) {' +- print r' currentContext->insideList = false;' +- print r' }' ++ print(r' if (currentContext) {') ++ print(r' currentContext->insideList = false;') ++ print(r' }') + + if function.name == 'glBegin' or \ + is_draw_arrays or \ + is_draw_elements or \ + function.name.startswith('glBeginTransformFeedback'): +- print r' if (retrace::debug) {' +- print r' _validateActiveProgram(call);' +- print r' }' ++ print(r' if (retrace::debug) {') ++ print(r' _validateActiveProgram(call);') ++ print(r' }') + + if function.name != 'glEnd': +- print r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {' ++ print(r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {') + if profileDraw: +- print r' glretrace::beginProfile(call, true);' ++ print(r' glretrace::beginProfile(call, true);') + else: +- print r' glretrace::beginProfile(call, false);' +- print r' }' ++ print(r' glretrace::beginProfile(call, false);') ++ print(r' }') + + if function.name in ('glCreateShaderProgramv', 'glCreateShaderProgramEXT', 'glCreateShaderProgramvEXT'): + # When dumping state, break down glCreateShaderProgram* so that the + # shader source can be recovered. +- print r' if (retrace::dumpingState) {' +- print r' GLuint _shader = glCreateShader(type);' +- print r' if (_shader) {' ++ print(r' if (retrace::dumpingState) {') ++ print(r' GLuint _shader = glCreateShader(type);') ++ print(r' if (_shader) {') + if not function.name.startswith('glCreateShaderProgramv'): +- print r' GLsizei count = 1;' +- print r' const GLchar **strings = &string;' +- print r' glShaderSource(_shader, count, strings, NULL);' +- print r' glCompileShader(_shader);' +- print r' const GLuint _program = glCreateProgram();' +- print r' if (_program) {' +- print r' GLint compiled = GL_FALSE;' +- print r' glGetShaderiv(_shader, GL_COMPILE_STATUS, &compiled);' ++ print(r' GLsizei count = 1;') ++ print(r' const GLchar **strings = &string;') ++ print(r' glShaderSource(_shader, count, strings, NULL);') ++ print(r' glCompileShader(_shader);') ++ print(r' const GLuint _program = glCreateProgram();') ++ print(r' if (_program) {') ++ print(r' GLint compiled = GL_FALSE;') ++ print(r' glGetShaderiv(_shader, GL_COMPILE_STATUS, &compiled);') + if function.name == 'glCreateShaderProgramvEXT': +- print r' glProgramParameteriEXT(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);' ++ print(r' glProgramParameteriEXT(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);') + else: +- print r' glProgramParameteri(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);' +- print r' if (compiled) {' +- print r' glAttachShader(_program, _shader);' +- print r' glLinkProgram(_program);' +- print r' if (false) glDetachShader(_program, _shader);' +- print r' }' +- print r' // TODO: append shader info log to program info log' +- print r' }' +- print r' glDeleteShader(_shader);' +- print r' _result = _program;' +- print r' } else {' +- print r' _result = 0;' +- print r' }' +- print r' } else {' ++ print(r' glProgramParameteri(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);') ++ print(r' if (compiled) {') ++ print(r' glAttachShader(_program, _shader);') ++ print(r' glLinkProgram(_program);') ++ print(r' if (false) glDetachShader(_program, _shader);') ++ print(r' }') ++ print(r' // TODO: append shader info log to program info log') ++ print(r' }') ++ print(r' glDeleteShader(_shader);') ++ print(r' _result = _program;') ++ print(r' } else {') ++ print(r' _result = 0;') ++ print(r' }') ++ print(r' } else {') + Retracer.invokeFunction(self, function) +- print r' }' ++ print(r' }') + elif function.name in ('glDetachShader', 'glDetachObjectARB'): +- print r' if (!retrace::dumpingState) {' ++ print(r' if (!retrace::dumpingState) {') + Retracer.invokeFunction(self, function) +- print r' }' ++ print(r' }') + elif function.name == 'glClientWaitSync': +- print r' _result = glretrace::clientWaitSync(call, sync, flags, timeout);' +- print r' (void)_result;' ++ print(r' _result = glretrace::clientWaitSync(call, sync, flags, timeout);') ++ print(r' (void)_result;') + elif function.name == 'glGetSynciv': +- print r' if (pname == GL_SYNC_STATUS &&' +- print r' bufSize >= 1 &&' +- print r' values != NULL &&' +- print r' call.arg(4)[0].toSInt() == GL_SIGNALED) {' +- print r' // Fence was signalled, so ensure it happened here' +- print r' glretrace::blockOnFence(call, sync, GL_SYNC_FLUSH_COMMANDS_BIT);' +- print r' (void)length;' +- print r' }' ++ print(r' if (pname == GL_SYNC_STATUS &&') ++ print(r' bufSize >= 1 &&') ++ print(r' values != NULL &&') ++ print(r' call.arg(4)[0].toSInt() == GL_SIGNALED) {') ++ print(r' // Fence was signalled, so ensure it happened here') ++ print(r' glretrace::blockOnFence(call, sync, GL_SYNC_FLUSH_COMMANDS_BIT);') ++ print(r' (void)length;') ++ print(r' }') + else: + Retracer.invokeFunction(self, function) + + if function.name == "glBegin": +- print ' if (currentContext) {' +- print ' currentContext->insideBeginEnd = true;' +- print ' }' ++ print(' if (currentContext) {') ++ print(' currentContext->insideBeginEnd = true;') ++ print(' }') + + if function.name == "glTexDirectVIV": +- print '#if defined(HAVE_VIVANTE_G2D)' +- print ' int32_t ysize = 0;' +- print ' int32_t usize = 0;' +- print ' int32_t vsize = 0;' +- print ' switch(format){' +- print ' case GL_VIV_YV12:' +- print ' case GL_VIV_I420:' +- print ' ysize=width * height;' +- print ' usize=ysize/4;' +- print ' vsize=usize;' +- print ' break;' +- print ' case GL_VIV_NV12:' +- print ' case GL_VIV_NV21:' +- print ' ysize=width * height;' +- print ' usize=ysize/2;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_RGBA:' +- print ' case GL_BGRA_EXT:' +- print ' ysize=width * height *4;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_RGB:' +- print ' ysize=width * height *3;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_VIV_YUY2:' +- print ' case GL_VIV_UYVY:' +- print ' case GL_RGB565_OES:' +- print ' ysize=width * height *2;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' default:' +- print ' break;' +- print ' }' +- print ' const trace::Array * arrayGLvoid = (call.arg(4)).toArray();' +- print ' if(ysize > 0)' +- print ' retrace::addRegion(call,(*arrayGLvoid->values[0]).toUInt(),(GLvoid*)pixels[0], ysize);' +- print ' if(usize > 0)' +- print ' retrace::addRegion(call,(*arrayGLvoid->values[1]).toUInt(),(GLvoid*)pixels[1], usize);' +- print ' if(vsize > 0)' +- print ' retrace::addRegion(call,(*arrayGLvoid->values[2]).toUInt(),(GLvoid*)pixels[2], vsize);' +- print '#endif /* HAVE_VIVANTE_G2D */' +- +- print r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {' ++ print('#if defined(HAVE_VIVANTE_G2D)') ++ print(' int32_t ysize = 0;') ++ print(' int32_t usize = 0;') ++ print(' int32_t vsize = 0;') ++ print(' switch(format){') ++ print(' case GL_VIV_YV12:') ++ print(' case GL_VIV_I420:') ++ print(' ysize=width * height;') ++ print(' usize=ysize/4;') ++ print(' vsize=usize;') ++ print(' break;') ++ print(' case GL_VIV_NV12:') ++ print(' case GL_VIV_NV21:') ++ print(' ysize=width * height;') ++ print(' usize=ysize/2;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_RGBA:') ++ print(' case GL_BGRA_EXT:') ++ print(' ysize=width * height *4;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_RGB:') ++ print(' ysize=width * height *3;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_VIV_YUY2:') ++ print(' case GL_VIV_UYVY:') ++ print(' case GL_RGB565_OES:') ++ print(' ysize=width * height *2;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' default:') ++ print(' break;') ++ print(' }') ++ print(' const trace::Array * arrayGLvoid = (call.arg(4)).toArray();') ++ print(' if(ysize > 0)') ++ print(' retrace::addRegion(call,(*arrayGLvoid->values[0]).toUInt(),(GLvoid*)pixels[0], ysize);') ++ print(' if(usize > 0)') ++ print(' retrace::addRegion(call,(*arrayGLvoid->values[1]).toUInt(),(GLvoid*)pixels[1], usize);') ++ print(' if(vsize > 0)') ++ print(' retrace::addRegion(call,(*arrayGLvoid->values[2]).toUInt(),(GLvoid*)pixels[2], vsize);') ++ print('#endif /* HAVE_VIVANTE_G2D */') ++ ++ print(r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {') + if profileDraw: +- print r' glretrace::endProfile(call, true);' ++ print(r' glretrace::endProfile(call, true);') + else: +- print r' glretrace::endProfile(call, false);' +- print r' }' ++ print(r' glretrace::endProfile(call, false);') ++ print(r' }') + + # Error checking + if function.name.startswith('gl'): + # glGetError is not allowed inside glBegin/glEnd +- print ' if (retrace::debug && currentContext && !currentContext->insideBeginEnd) {' +- print ' glretrace::checkGlError(call);' ++ print(' if (retrace::debug && currentContext && !currentContext->insideBeginEnd) {') ++ print(' glretrace::checkGlError(call);') + if function.name in ('glProgramStringARB', 'glLoadProgramNV'): +- print r' GLint error_position = -1;' +- print r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);' +- print r' if (error_position != -1) {' +- print r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);' +- print r' retrace::warning(call) << "error in position " << error_position << ": " << error_string << "\n";' +- print r' }' ++ print(r' GLint error_position = -1;') ++ print(r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);') ++ print(r' if (error_position != -1) {') ++ print(r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);') ++ print(r' retrace::warning(call) << "error in position " << error_position << ": " << error_string << "\n";') ++ print(r' }') + if function.name == 'glCompileShader': +- print r' GLint compile_status = 0;' +- print r' glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);' +- print r' if (!compile_status) {' +- print r' retrace::warning(call) << "compilation failed\n";' +- print r' }' +- print r' GLint info_log_length = 0;' +- print r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);' +- print r' if (info_log_length > 1) {' +- print r' GLchar *infoLog = new GLchar[info_log_length];' +- print r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);' +- print r' retrace::warning(call) << infoLog << "\n";' +- print r' delete [] infoLog;' +- print r' }' ++ print(r' GLint compile_status = 0;') ++ print(r' glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);') ++ print(r' if (!compile_status) {') ++ print(r' retrace::warning(call) << "compilation failed\n";') ++ print(r' }') ++ print(r' GLint info_log_length = 0;') ++ print(r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);') ++ print(r' if (info_log_length > 1) {') ++ print(r' GLchar *infoLog = new GLchar[info_log_length];') ++ print(r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);') ++ print(r' retrace::warning(call) << infoLog << "\n";') ++ print(r' delete [] infoLog;') ++ print(r' }') + if function.name in ('glLinkProgram', 'glCreateShaderProgramv', 'glCreateShaderProgramEXT', 'glCreateShaderProgramvEXT', 'glProgramBinary', 'glProgramBinaryOES'): + if function.name.startswith('glCreateShaderProgram'): +- print r' GLuint program = _result;' +- print r' GLint link_status = 0;' +- print r' glGetProgramiv(program, GL_LINK_STATUS, &link_status);' +- print r' if (!link_status) {' +- print r' retrace::warning(call) << "link failed\n";' +- print r' }' +- print r' GLint info_log_length = 0;' +- print r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);' +- print r' if (info_log_length > 1) {' +- print r' GLchar *infoLog = new GLchar[info_log_length];' +- print r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);' +- print r' retrace::warning(call) << infoLog << "\n";' +- print r' delete [] infoLog;' +- print r' }' ++ print(r' GLuint program = _result;') ++ print(r' GLint link_status = 0;') ++ print(r' glGetProgramiv(program, GL_LINK_STATUS, &link_status);') ++ print(r' if (!link_status) {') ++ print(r' retrace::warning(call) << "link failed\n";') ++ print(r' }') ++ print(r' GLint info_log_length = 0;') ++ print(r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);') ++ print(r' if (info_log_length > 1) {') ++ print(r' GLchar *infoLog = new GLchar[info_log_length];') ++ print(r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);') ++ print(r' retrace::warning(call) << infoLog << "\n";') ++ print(r' delete [] infoLog;') ++ print(r' }') + if function.name == 'glCompileShaderARB': +- print r' GLint compile_status = 0;' +- print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);' +- print r' if (!compile_status) {' +- print r' retrace::warning(call) << "compilation failed\n";' +- print r' }' +- print r' GLint info_log_length = 0;' +- print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);' +- print r' if (info_log_length > 1) {' +- print r' GLchar *infoLog = new GLchar[info_log_length];' +- print r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);' +- print r' retrace::warning(call) << infoLog << "\n";' +- print r' delete [] infoLog;' +- print r' }' ++ print(r' GLint compile_status = 0;') ++ print(r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);') ++ print(r' if (!compile_status) {') ++ print(r' retrace::warning(call) << "compilation failed\n";') ++ print(r' }') ++ print(r' GLint info_log_length = 0;') ++ print(r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);') ++ print(r' if (info_log_length > 1) {') ++ print(r' GLchar *infoLog = new GLchar[info_log_length];') ++ print(r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);') ++ print(r' retrace::warning(call) << infoLog << "\n";') ++ print(r' delete [] infoLog;') ++ print(r' }') + if function.name == 'glLinkProgramARB': +- print r' GLint link_status = 0;' +- print r' glGetObjectParameterivARB(programObj, GL_OBJECT_LINK_STATUS_ARB, &link_status);' +- print r' if (!link_status) {' +- print r' retrace::warning(call) << "link failed\n";' +- print r' }' +- print r' GLint info_log_length = 0;' +- print r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);' +- print r' if (info_log_length > 1) {' +- print r' GLchar *infoLog = new GLchar[info_log_length];' +- print r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);' +- print r' retrace::warning(call) << infoLog << "\n";' +- print r' delete [] infoLog;' +- print r' }' ++ print(r' GLint link_status = 0;') ++ print(r' glGetObjectParameterivARB(programObj, GL_OBJECT_LINK_STATUS_ARB, &link_status);') ++ print(r' if (!link_status) {') ++ print(r' retrace::warning(call) << "link failed\n";') ++ print(r' }') ++ print(r' GLint info_log_length = 0;') ++ print(r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);') ++ print(r' if (info_log_length > 1) {') ++ print(r' GLchar *infoLog = new GLchar[info_log_length];') ++ print(r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);') ++ print(r' retrace::warning(call) << infoLog << "\n";') ++ print(r' delete [] infoLog;') ++ print(r' }') + if self.map_function_regex.match(function.name): +- print r' if (!_result) {' +- print r' retrace::warning(call) << "failed to map buffer\n";' +- print r' }' ++ print(r' if (!_result) {') ++ print(r' retrace::warning(call) << "failed to map buffer\n";') ++ print(r' }') + if self.unmap_function_regex.match(function.name) and function.type is not stdapi.Void: +- print r' if (!_result) {' +- print r' retrace::warning(call) << "failed to unmap buffer\n";' +- print r' }' ++ print(r' if (!_result) {') ++ print(r' retrace::warning(call) << "failed to unmap buffer\n";') ++ print(r' }') + if function.name in ('glGetAttribLocation', 'glGetAttribLocationARB'): +- print r' GLint _origResult = call.ret->toSInt();' +- print r' if (_result != _origResult) {' +- print r' retrace::warning(call) << "vertex attrib location mismatch " << _origResult << " -> " << _result << "\n";' +- print r' }' ++ print(r' GLint _origResult = call.ret->toSInt();') ++ print(r' if (_result != _origResult) {') ++ print(r' retrace::warning(call) << "vertex attrib location mismatch " << _origResult << " -> " << _result << "\n";') ++ print(r' }') + if function.name in ('glCheckFramebufferStatus', 'glCheckFramebufferStatusEXT', 'glCheckNamedFramebufferStatus', 'glCheckNamedFramebufferStatusEXT'): +- print r' GLint _origResult = call.ret->toSInt();' +- print r' if (_origResult == GL_FRAMEBUFFER_COMPLETE &&' +- print r' _result != GL_FRAMEBUFFER_COMPLETE) {' +- print r' retrace::warning(call) << "incomplete framebuffer (" << glstate::enumToString(_result) << ")\n";' +- print r' }' +- print ' }' ++ print(r' GLint _origResult = call.ret->toSInt();') ++ print(r' if (_origResult == GL_FRAMEBUFFER_COMPLETE &&') ++ print(r' _result != GL_FRAMEBUFFER_COMPLETE) {') ++ print(r' retrace::warning(call) << "incomplete framebuffer (" << glstate::enumToString(_result) << ")\n";') ++ print(r' }') ++ print(' }') + + # Query the buffer length for whole buffer mappings + if self.map_function_regex.match(function.name): +@@ -566,23 +566,23 @@ class GlRetracer(Retracer): + assert 'BufferRange' in function.name + else: + assert 'BufferRange' not in function.name +- print r' GLint length = 0;' ++ print(r' GLint length = 0;') + if function.name in ('glMapBuffer', 'glMapBufferOES'): +- print r' glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);' ++ print(r' glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);') + elif function.name == 'glMapBufferARB': +- print r' glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, &length);' ++ print(r' glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, &length);') + elif function.name == 'glMapNamedBuffer': +- print r' glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &length);' ++ print(r' glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &length);') + elif function.name == 'glMapNamedBufferEXT': +- print r' glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_SIZE, &length);' ++ print(r' glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_SIZE, &length);') + elif function.name == 'glMapObjectBufferATI': +- print r' glGetObjectBufferivATI(buffer, GL_OBJECT_BUFFER_SIZE_ATI, &length);' ++ print(r' glGetObjectBufferivATI(buffer, GL_OBJECT_BUFFER_SIZE_ATI, &length);') + else: + assert False + + def extractArg(self, function, arg, arg_type, lvalue, rvalue): + if function.name in self.array_pointer_function_names and arg.name == 'pointer': +- print ' %s = static_cast<%s>(retrace::toPointer(%s, true));' % (lvalue, arg_type, rvalue) ++ print(' %s = static_cast<%s>(retrace::toPointer(%s, true));' % (lvalue, arg_type, rvalue)) + return + + if self.draw_elements_function_regex.match(function.name) and arg.name == 'indices' or\ +@@ -594,18 +594,18 @@ class GlRetracer(Retracer): + # object. + if self.pack_function_regex.match(function.name) and arg.output: + assert isinstance(arg_type, (stdapi.Pointer, stdapi.Array, stdapi.Blob, stdapi.Opaque)) +- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, arg_type, rvalue) ++ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, arg_type, rvalue)) + return + + if (arg.type.depends(glapi.GLlocation) or \ + arg.type.depends(glapi.GLsubroutine)) \ + and 'program' not in function.argNames(): + # Determine the active program for uniforms swizzling +- print ' GLint program = _getActiveProgram();' ++ print(' GLint program = _getActiveProgram();') + + if arg.type is glapi.GLlocationARB \ + and 'programObj' not in function.argNames(): +- print ' GLhandleARB programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);' ++ print(' GLhandleARB programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);') + + Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue) + +@@ -613,28 +613,28 @@ class GlRetracer(Retracer): + if arg.name == 'samples': + if function.name == 'glRasterSamplesEXT': + assert arg.type is glapi.GLuint +- print ' GLint max_samples = 0;' +- print ' glGetIntegerv(GL_MAX_RASTER_SAMPLES_EXT, &max_samples);' +- print ' if (samples > static_cast(max_samples)) {' +- print ' samples = static_cast(max_samples);' +- print ' }' ++ print(' GLint max_samples = 0;') ++ print(' glGetIntegerv(GL_MAX_RASTER_SAMPLES_EXT, &max_samples);') ++ print(' if (samples > static_cast(max_samples)) {') ++ print(' samples = static_cast(max_samples);') ++ print(' }') + else: + assert arg.type is glapi.GLsizei +- print ' GLint max_samples = 0;' +- print ' glGetIntegerv(GL_MAX_SAMPLES, &max_samples);' +- print ' if (samples > max_samples) {' +- print ' samples = max_samples;' +- print ' }' ++ print(' GLint max_samples = 0;') ++ print(' glGetIntegerv(GL_MAX_SAMPLES, &max_samples);') ++ print(' if (samples > max_samples) {') ++ print(' samples = max_samples;') ++ print(' }') + + # These parameters are referred beyond the call life-time + # TODO: Replace ad-hoc solution for bindable parameters with general one + if function.name in ('glFeedbackBuffer', 'glSelectBuffer') and arg.output: +- print ' _allocator.bind(%s);' % arg.name ++ print(' _allocator.bind(%s);' % arg.name) + + + + if __name__ == '__main__': +- print r''' ++ print(r''' + #include + + #include "glproc.hpp" +@@ -692,13 +692,13 @@ static void free_dma_buffer(void *buf) + + #endif /* HAVE_VIVANTE_G2D */ + +-''' ++''') + api = stdapi.API() + api.addModule(glapi.glapi) + retracer = GlRetracer() + retracer.retraceApi(api) + +- print r''' ++ print(r''' + static GLint + _getActiveProgram(void) + { +@@ -771,4 +771,4 @@ _validateActiveProgram(trace::Call &call) + } + } + +-''' ++''') +diff --git a/retrace/glstate_params.py b/retrace/glstate_params.py +index fb49ff9a..bc90f66b 100755 +--- a/retrace/glstate_params.py ++++ b/retrace/glstate_params.py +@@ -134,17 +134,17 @@ class StateGetter(Visitor): + elem_type = self.inflector.reduced_type(type) + inflection = self.inflector.inflect(type) + if inflection.endswith('v' + self.inflector.suffix): +- print ' %s %s = 0;' % (elem_type, temp_name) +- print ' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name) ++ print(' %s %s = 0;' % (elem_type, temp_name)) ++ print(' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name)) + else: +- print ' %s %s = %s(%s);' % (elem_type, temp_name, inflection, ', '.join(args)) ++ print(' %s %s = %s(%s);' % (elem_type, temp_name, inflection, ', '.join(args))) + return temp_name + + def visitString(self, string, args): + temp_name = self.temp_name(args) + inflection = self.inflector.inflect(string) + assert not inflection.endswith('v' + self.inflector.suffix) +- print ' %s %s = (%s)%s(%s);' % (string, temp_name, string, inflection, ', '.join(args)) ++ print(' %s %s = (%s)%s(%s);' % (string, temp_name, string, inflection, ', '.join(args))) + return temp_name + + def visitAlias(self, alias, args): +@@ -166,28 +166,28 @@ class StateGetter(Visitor): + array_length = array.length + if isinstance(array_length, int): + # Static integer length +- print ' %s %s[%s + 1];' % (elem_type, temp_name, array_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) ++ 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 ' if (%s) {' % array_length +- print ' %s(%s, %s);' % (inflection, ', '.join(args), temp_name) +- print ' }' ++ 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(' if (%s) {' % array_length) ++ print(' %s(%s, %s);' % (inflection, ', '.join(args), temp_name)) ++ print(' }') + # 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): + temp_name = self.temp_name(args) + inflection = self.inflector.inflect(pointer) + assert inflection.endswith('v' + self.inflector.suffix) +- print ' GLvoid *%s;' % temp_name +- print ' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name) ++ print(' GLvoid *%s;' % temp_name) ++ print(' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name)) + return temp_name + + +@@ -236,26 +236,26 @@ class JsonWriter(Visitor): + + def visitLiteral(self, literal, instance): + if literal.kind == 'Bool': +- print ' writer.writeBool(%s);' % instance ++ print(' writer.writeBool(%s);' % instance) + elif literal.kind in ('SInt', 'Uint'): +- print ' writer.writeInt(%s);' % instance ++ print(' writer.writeInt(%s);' % instance) + elif literal.kind in ('Float', 'Double'): +- print ' writer.writeFloat(%s);' % instance ++ print(' writer.writeFloat(%s);' % instance) + else: + raise NotImplementedError + + def visitString(self, string, instance): + assert string.length is None +- print ' writer.writeString((const char *)%s);' % instance ++ print(' writer.writeString((const char *)%s);' % instance) + + def visitEnum(self, enum, instance): + if enum is GLboolean: +- print ' dumpBoolean(writer, %s);' % instance ++ print(' dumpBoolean(writer, %s);' % instance) + elif enum is GLenum: +- print ' dumpEnum(writer, %s);' % instance ++ print(' dumpEnum(writer, %s);' % instance) + else: + assert False +- print ' writer.writeInt(%s);' % instance ++ print(' writer.writeInt(%s);' % instance) + + def visitBitmask(self, bitmask, instance): + raise NotImplementedError +@@ -264,18 +264,18 @@ class JsonWriter(Visitor): + self.visit(alias.type, instance) + + def visitOpaque(self, opaque, instance): +- print ' writer.writeInt((size_t)%s);' % instance ++ print(' writer.writeInt((size_t)%s);' % instance) + + __index = 0 + + def visitArray(self, array, instance): + index = '_i%u' % JsonWriter.__index + JsonWriter.__index += 1 +- print ' writer.beginArray();' +- print ' for (unsigned %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index) ++ print(' writer.beginArray();') ++ print(' for (unsigned %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index)) + self.visit(array.type, '%s[%s]' % (instance, index)) +- print ' }' +- print ' writer.endArray();' ++ print(' }') ++ print(' writer.endArray();') + + + +@@ -287,75 +287,75 @@ class StateDumper: + pass + + def dump(self): +- print '#include ' +- print '#include ' +- print +- print '#include "state_writer.hpp"' +- print '#include "scoped_allocator.hpp"' +- print '#include "glproc.hpp"' +- print '#include "glsize.hpp"' +- print '#include "glstate.hpp"' +- print '#include "glstate_internal.hpp"' +- print +- print 'namespace glstate {' +- print +- +- print 'const char *' +- print 'enumToString(GLenum pname)' +- print '{' +- print ' switch (pname) {' ++ print('#include ') ++ print('#include ') ++ print() ++ print('#include "state_writer.hpp"') ++ print('#include "scoped_allocator.hpp"') ++ print('#include "glproc.hpp"') ++ print('#include "glsize.hpp"') ++ print('#include "glstate.hpp"') ++ print('#include "glstate_internal.hpp"') ++ print() ++ print('namespace glstate {') ++ print() ++ ++ print('const char *') ++ print('enumToString(GLenum pname)') ++ print('{') ++ print(' switch (pname) {') + for name in GLenum.values: +- print ' case %s:' % name +- print ' return "%s";' % name +- print ' default:' +- print ' return NULL;' +- print ' }' +- print '}' +- print +- +- print 'static void' +- print 'dumpTextureTargetParameters(StateWriter &writer, Context &context, GLenum target, GLuint texture)' +- print '{' +- print ' writer.beginMember(enumToString(target));' +- print ' writer.beginObject();' +- print ' dumpObjectLabel(writer, context, GL_TEXTURE, texture, "GL_TEXTURE_LABEL");' ++ print(' case %s:' % name) ++ print(' return "%s";' % name) ++ print(' default:') ++ print(' return NULL;') ++ print(' }') ++ print('}') ++ print() ++ ++ print('static void') ++ print('dumpTextureTargetParameters(StateWriter &writer, Context &context, GLenum target, GLuint texture)') ++ print('{') ++ print(' writer.beginMember(enumToString(target));') ++ print(' writer.beginObject();') ++ print(' dumpObjectLabel(writer, context, GL_TEXTURE, texture, "GL_TEXTURE_LABEL");') + # ARB_texture_buffer forbids glGetTexParameter and + # glGetTexLevelParameter for TEXTURE_BUFFER, but + # ARB_texture_buffer_range introduced parameters which can be queries + # with glGetTexLevelParameter... +- print ' if (target != GL_TEXTURE_BUFFER) {' ++ print(' if (target != GL_TEXTURE_BUFFER) {') + self.dump_atoms(glGetTexParameter, 'target') +- print ' }' +- print ' if (!context.ES) {' +- print ' GLenum levelTarget;' +- print ' if (target == GL_TEXTURE_CUBE_MAP ||' +- print ' target == GL_TEXTURE_CUBE_MAP_ARRAY) {' +- print ' // Must pick a face' +- print ' levelTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;' +- print ' } else {' +- print ' levelTarget = target;' +- print ' }' ++ print(' }') ++ print(' if (!context.ES) {') ++ print(' GLenum levelTarget;') ++ print(' if (target == GL_TEXTURE_CUBE_MAP ||') ++ print(' target == GL_TEXTURE_CUBE_MAP_ARRAY) {') ++ print(' // Must pick a face') ++ print(' levelTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;') ++ print(' } else {') ++ print(' levelTarget = target;') ++ print(' }') + self.dump_atoms(glGetTexLevelParameter, 'levelTarget', '0') +- print ' }' +- print ' writer.endObject();' +- print ' writer.endMember(); // target' +- print '}' +- print +- +- print 'static void' +- print 'dumpFramebufferAttachementParameters(StateWriter &writer, Context &context, GLenum target, GLenum attachment)' +- print '{' ++ print(' }') ++ print(' writer.endObject();') ++ print(' writer.endMember(); // target') ++ print('}') ++ print() ++ ++ print('static void') ++ print('dumpFramebufferAttachementParameters(StateWriter &writer, Context &context, GLenum target, GLenum attachment)') ++ print('{') + self.dump_attachment_parameters('target', 'attachment') +- print '}' +- print +- +- print 'void dumpParameters(StateWriter &writer, Context &context)' +- print '{' +- print ' ScopedAllocator _allocator;' +- print ' (void)_allocator;' +- print +- print ' writer.beginMember("parameters");' +- print ' writer.beginObject();' ++ print('}') ++ print() ++ ++ print('void dumpParameters(StateWriter &writer, Context &context)') ++ print('{') ++ print(' ScopedAllocator _allocator;') ++ print(' (void)_allocator;') ++ print() ++ print(' writer.beginMember("parameters");') ++ print(' writer.beginObject();') + + self.dump_atoms(glGet) + +@@ -368,58 +368,58 @@ class StateDumper: + self.dump_framebuffer_parameters() + self.dump_labels() + +- print ' writer.endObject();' +- print ' writer.endMember(); // parameters' +- print '}' +- print ++ print(' writer.endObject();') ++ print(' writer.endMember(); // parameters') ++ print('}') ++ print() + +- print '} /*namespace glstate */' ++ print('} /*namespace glstate */') + + def dump_material_params(self): +- print ' if (!context.ES) {' ++ print(' if (!context.ES) {') + for face in ['GL_FRONT', 'GL_BACK']: +- print ' writer.beginMember("%s");' % face +- print ' writer.beginObject();' ++ print(' writer.beginMember("%s");' % face) ++ print(' writer.beginObject();') + self.dump_atoms(glGetMaterial, face) +- print ' writer.endObject();' +- print ' }' +- print ++ print(' writer.endObject();') ++ print(' }') ++ print() + + def dump_light_params(self): +- print ' GLint max_lights = 0;' +- print ' _glGetIntegerv(GL_MAX_LIGHTS, &max_lights);' +- print ' for (GLint index = 0; index < max_lights; ++index) {' +- print ' GLenum light = GL_LIGHT0 + index;' +- print ' if (glIsEnabled(light)) {' +- print ' char name[32];' +- print ' snprintf(name, sizeof name, "GL_LIGHT%i", index);' +- print ' writer.beginMember(name);' +- print ' writer.beginObject();' ++ print(' GLint max_lights = 0;') ++ print(' _glGetIntegerv(GL_MAX_LIGHTS, &max_lights);') ++ print(' for (GLint index = 0; index < max_lights; ++index) {') ++ print(' GLenum light = GL_LIGHT0 + index;') ++ print(' if (glIsEnabled(light)) {') ++ print(' char name[32];') ++ print(' snprintf(name, sizeof name, "GL_LIGHT%i", index);') ++ print(' writer.beginMember(name);') ++ print(' writer.beginObject();') + self.dump_atoms(glGetLight, ' GL_LIGHT0 + index') +- print ' writer.endObject();' +- print ' writer.endMember(); // GL_LIGHTi' +- print ' }' +- print ' }' +- print ++ print(' writer.endObject();') ++ print(' writer.endMember(); // GL_LIGHTi') ++ print(' }') ++ print(' }') ++ print() + + def dump_sampler_params(self): +- print ' // GL_SAMPLER_BINDING' +- print ' if (context.ARB_sampler_objects) {' +- print ' GLint sampler_binding = 0;' +- print ' glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);' +- print ' writer.beginMember("GL_SAMPLER_BINDING");' +- print ' writer.writeInt(sampler_binding);' +- print ' writer.endMember();' +- print ' if (sampler_binding) {' +- print ' writer.beginMember("GL_SAMPLER");' +- print ' writer.beginObject();' +- print ' dumpObjectLabel(writer, context, GL_SAMPLER, sampler_binding, "GL_SAMPLER_LABEL");' ++ print(' // GL_SAMPLER_BINDING') ++ print(' if (context.ARB_sampler_objects) {') ++ print(' GLint sampler_binding = 0;') ++ print(' glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);') ++ print(' writer.beginMember("GL_SAMPLER_BINDING");') ++ print(' writer.writeInt(sampler_binding);') ++ print(' writer.endMember();') ++ print(' if (sampler_binding) {') ++ print(' writer.beginMember("GL_SAMPLER");') ++ print(' writer.beginObject();') ++ print(' dumpObjectLabel(writer, context, GL_SAMPLER, sampler_binding, "GL_SAMPLER_LABEL");') + for _, _, name in glGetSamplerParameter.iter(): + self.dump_atom(glGetSamplerParameter, 'sampler_binding', name) +- print ' writer.endObject();' +- print ' writer.endMember(); // GL_SAMPLER' +- print ' }' +- print ' }' ++ print(' writer.endObject();') ++ print(' writer.endMember(); // GL_SAMPLER') ++ print(' }') ++ print(' }') + + def texenv_param_target(self, name): + if name == 'GL_TEXTURE_LOD_BIAS': +@@ -431,34 +431,34 @@ class StateDumper: + + def dump_texenv_params(self): + for target in ['GL_TEXTURE_ENV', 'GL_TEXTURE_FILTER_CONTROL', 'GL_POINT_SPRITE']: +- print ' if (!context.ES) {' +- print ' writer.beginMember("%s");' % target +- print ' writer.beginObject();' ++ print(' if (!context.ES) {') ++ print(' writer.beginMember("%s");' % target) ++ print(' writer.beginObject();') + for _, _, name in glGetTexEnv.iter(): + if self.texenv_param_target(name) == target: + self.dump_atom(glGetTexEnv, target, name) +- print ' writer.endObject();' +- print ' }' ++ print(' writer.endObject();') ++ print(' }') + + def dump_vertex_attribs(self): +- print ' GLint max_vertex_attribs = 0;' +- print ' _glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs);' +- print ' for (GLint index = 0; index < max_vertex_attribs; ++index) {' +- print ' char name[32];' +- print ' snprintf(name, sizeof name, "GL_VERTEX_ATTRIB_ARRAY%i", index);' +- print ' writer.beginMember(name);' +- print ' writer.beginObject();' ++ print(' GLint max_vertex_attribs = 0;') ++ print(' _glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs);') ++ print(' for (GLint index = 0; index < max_vertex_attribs; ++index) {') ++ print(' char name[32];') ++ print(' snprintf(name, sizeof name, "GL_VERTEX_ATTRIB_ARRAY%i", index);') ++ print(' writer.beginMember(name);') ++ print(' writer.beginObject();') + self.dump_atoms(glGetVertexAttrib, 'index') + + # Dump vertex attrib buffer label +- print ' GLint buffer_binding = 0;' +- print ' glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_binding);' +- print ' dumpObjectLabel(writer, context, GL_BUFFER, buffer_binding, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_LABEL");' ++ print(' GLint buffer_binding = 0;') ++ print(' glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_binding);') ++ print(' dumpObjectLabel(writer, context, GL_BUFFER, buffer_binding, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_LABEL");') + +- print ' writer.endObject();' +- print ' writer.endMember(); // GL_VERTEX_ATTRIB_ARRAYi' +- print ' }' +- print ++ print(' writer.endObject();') ++ print(' writer.endMember(); // GL_VERTEX_ATTRIB_ARRAYi') ++ print(' }') ++ print() + + object_bindings = [ + ('GL_BUFFER', 'GL_ARRAY_BUFFER_BINDING'), +@@ -488,11 +488,11 @@ class StateDumper: + member_name = object_binding.replace('BINDING', 'LABEL') + if member_name == object_binding: + member_name += '_LABEL' +- print ' {' +- print ' GLint binding = 0;' +- print ' glGetIntegerv(%s, &binding);' % object_binding +- print ' dumpObjectLabel(writer, context, %s, binding, "%s");' % (object_type, member_name) +- print ' }' ++ print(' {') ++ print(' GLint binding = 0;') ++ print(' glGetIntegerv(%s, &binding);' % object_binding) ++ print(' dumpObjectLabel(writer, context, %s, binding, "%s");' % (object_type, member_name)) ++ print(' }') + + program_targets = [ + 'GL_FRAGMENT_PROGRAM_ARB', +@@ -501,12 +501,12 @@ class StateDumper: + + def dump_program_params(self): + for target in self.program_targets: +- print ' if (glIsEnabled(%s)) {' % target +- print ' writer.beginMember("%s");' % target +- print ' writer.beginObject();' ++ print(' if (glIsEnabled(%s)) {' % target) ++ print(' writer.beginMember("%s");' % target) ++ print(' writer.beginObject();') + self.dump_atoms(glGetProgramARB, target) +- print ' writer.endObject();' +- print ' }' ++ print(' writer.endObject();') ++ print(' }') + + buffer_targets = [ + ('GL_ARRAY_BUFFER', 'GL_ARRAY_BUFFER_BINDING', None), +@@ -529,135 +529,135 @@ class StateDumper: + def dump_buffer_parameters(self): + # general binding points + for target, binding, max_bindings in self.buffer_targets: +- print ' // %s' % target +- print ' {' +- print ' writer.beginMember("%s");' % target +- print ' writer.beginObject();' +- print ' GLint buffer = 0;' +- print ' glGetIntegerv(%s, &buffer);' % binding +- print ' if (buffer) {' ++ print(' // %s' % target) ++ print(' {') ++ print(' writer.beginMember("%s");' % target) ++ print(' writer.beginObject();') ++ print(' GLint buffer = 0;') ++ print(' glGetIntegerv(%s, &buffer);' % binding) ++ print(' if (buffer) {') + self.dump_atoms(glGetBufferParameter, target) +- print ' }' ++ print(' }') + if max_bindings is not None: + # indexed binding points + start = target + '_START' + size = target + '_SIZE' +- print ' GLint max_bindings = 0;' +- print ' glGetIntegerv(%s, &max_bindings);' % max_bindings +- print ' if (max_bindings) {' +- print ' writer.beginMember("i");' +- print ' writer.beginArray();' +- print ' for (GLint i = 0; i < max_bindings; ++i) {' +- print ' writer.beginObject();' ++ print(' GLint max_bindings = 0;') ++ print(' glGetIntegerv(%s, &max_bindings);' % max_bindings) ++ print(' if (max_bindings) {') ++ print(' writer.beginMember("i");') ++ print(' writer.beginArray();') ++ print(' for (GLint i = 0; i < max_bindings; ++i) {') ++ print(' writer.beginObject();') + for pname in [binding, start, size]: + self.dump_atom(glGet_i, pname, 'i') +- print ' writer.endObject();' +- print ' }' +- print ' writer.endArray();' +- print ' writer.endMember();' +- print ' }' ++ print(' writer.endObject();') ++ print(' }') ++ print(' writer.endArray();') ++ print(' writer.endMember();') ++ print(' }') + +- print ' writer.endObject();' +- print ' writer.endMember();' +- print ' }' +- print ++ print(' writer.endObject();') ++ print(' writer.endMember();') ++ print(' }') ++ print() + + def dump_texture_parameters(self): +- print ' {' +- print ' GLint active_texture = GL_TEXTURE0;' +- print ' glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);' +- print ' GLint max_texture_coords = 0;' +- print ' if (!context.core) {' +- print ' glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);' +- print ' }' +- print ' GLint max_combined_texture_image_units = 0;' +- print ' glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);' +- print ' max_combined_texture_image_units = std::max(max_combined_texture_image_units, 2);' +- print ' GLint max_units = std::max(max_combined_texture_image_units, max_texture_coords);' +- print ' for (GLint unit = 0; unit < max_units; ++unit) {' +- print ' char name[32];' +- print ' snprintf(name, sizeof name, "GL_TEXTURE%i", unit);' +- print ' writer.beginMember(name);' +- print ' glActiveTexture(GL_TEXTURE0 + unit);' +- print ' writer.beginObject();' +- print ++ print(' {') ++ print(' GLint active_texture = GL_TEXTURE0;') ++ print(' glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);') ++ print(' GLint max_texture_coords = 0;') ++ print(' if (!context.core) {') ++ print(' glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);') ++ print(' }') ++ print(' GLint max_combined_texture_image_units = 0;') ++ print(' glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);') ++ print(' max_combined_texture_image_units = std::max(max_combined_texture_image_units, 2);') ++ print(' GLint max_units = std::max(max_combined_texture_image_units, max_texture_coords);') ++ print(' for (GLint unit = 0; unit < max_units; ++unit) {') ++ print(' char name[32];') ++ print(' snprintf(name, sizeof name, "GL_TEXTURE%i", unit);') ++ print(' writer.beginMember(name);') ++ print(' glActiveTexture(GL_TEXTURE0 + unit);') ++ print(' writer.beginObject();') ++ print() + self.dump_atoms(glGet_texture) +- print +- print ' for (unsigned i = 0; i < numTextureTargets; ++i) {' +- print ' GLenum target = textureTargets[i];' +- print ' GLboolean enabled = GL_FALSE;' +- print ' if (unit < max_texture_coords &&' +- print ' (target == GL_TEXTURE_1D ||' +- print ' target == GL_TEXTURE_2D ||' +- print ' target == GL_TEXTURE_3D ||' +- print ' target == GL_TEXTURE_CUBE_MAP ||' +- print ' target == GL_TEXTURE_RECTANGLE)) {' +- print ' glGetBooleanv(target, &enabled);' +- print ' writer.beginMember(enumToString(target));' +- print ' dumpBoolean(writer, enabled);' +- print ' writer.endMember();' +- print ' }' +- print ' GLint texture = 0;' +- print ' GLenum binding = getTextureBinding(target);' +- print ' glGetIntegerv(binding, &texture);' +- print ' if (enabled || texture) {' +- print ' dumpTextureTargetParameters(writer, context, target, texture);' +- print ' }' +- print ' }' +- print ++ print() ++ print(' for (unsigned i = 0; i < numTextureTargets; ++i) {') ++ print(' GLenum target = textureTargets[i];') ++ print(' GLboolean enabled = GL_FALSE;') ++ print(' if (unit < max_texture_coords &&') ++ print(' (target == GL_TEXTURE_1D ||') ++ print(' target == GL_TEXTURE_2D ||') ++ print(' target == GL_TEXTURE_3D ||') ++ print(' target == GL_TEXTURE_CUBE_MAP ||') ++ print(' target == GL_TEXTURE_RECTANGLE)) {') ++ print(' glGetBooleanv(target, &enabled);') ++ print(' writer.beginMember(enumToString(target));') ++ print(' dumpBoolean(writer, enabled);') ++ print(' writer.endMember();') ++ print(' }') ++ print(' GLint texture = 0;') ++ print(' GLenum binding = getTextureBinding(target);') ++ print(' glGetIntegerv(binding, &texture);') ++ print(' if (enabled || texture) {') ++ print(' dumpTextureTargetParameters(writer, context, target, texture);') ++ print(' }') ++ print(' }') ++ print() + self.dump_sampler_params() +- print +- print ' if (unit < max_texture_coords) {' ++ print() ++ print(' if (unit < max_texture_coords) {') + self.dump_texenv_params() +- print ' }' +- print ' writer.endObject();' +- print ' writer.endMember(); // GL_TEXTUREi' +- print ' }' +- print ' glActiveTexture(active_texture);' +- print ' }' +- print ++ print(' }') ++ print(' writer.endObject();') ++ print(' writer.endMember(); // GL_TEXTUREi') ++ print(' }') ++ print(' glActiveTexture(active_texture);') ++ print(' }') ++ print() + + def dump_framebuffer_parameters(self): +- print ' {' +- print ' GLint max_color_attachments = 0;' +- print ' glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &max_color_attachments);' +- print ' GLint framebuffer;' ++ print(' {') ++ print(' GLint max_color_attachments = 0;') ++ print(' glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &max_color_attachments);') ++ print(' GLint framebuffer;') + for target, binding in framebuffer_targets: +- print ' // %s' % target +- print ' framebuffer = 0;' +- print ' glGetIntegerv(%s, &framebuffer);' % binding +- print ' if (framebuffer) {' +- print ' writer.beginMember("%s");' % target +- print ' writer.beginObject();' +- print ' dumpObjectLabel(writer, context, GL_FRAMEBUFFER, framebuffer, "GL_FRAMEBUFFER_LABEL");' +- print ' for (GLint i = 0; i < max_color_attachments; ++i) {' +- print ' GLint color_attachment = GL_COLOR_ATTACHMENT0 + i;' +- print ' dumpFramebufferAttachementParameters(writer, context, %s, color_attachment);' % target +- print ' }' +- print ' dumpFramebufferAttachementParameters(writer, context, %s, GL_DEPTH_ATTACHMENT);' % target +- print ' dumpFramebufferAttachementParameters(writer, context, %s, GL_STENCIL_ATTACHMENT);' % target +- print ' writer.endObject();' +- print ' writer.endMember(); // %s' % target +- print ' }' +- print +- print ' }' +- print ++ print(' // %s' % target) ++ print(' framebuffer = 0;') ++ print(' glGetIntegerv(%s, &framebuffer);' % binding) ++ print(' if (framebuffer) {') ++ print(' writer.beginMember("%s");' % target) ++ print(' writer.beginObject();') ++ print(' dumpObjectLabel(writer, context, GL_FRAMEBUFFER, framebuffer, "GL_FRAMEBUFFER_LABEL");') ++ print(' for (GLint i = 0; i < max_color_attachments; ++i) {') ++ print(' GLint color_attachment = GL_COLOR_ATTACHMENT0 + i;') ++ print(' dumpFramebufferAttachementParameters(writer, context, %s, color_attachment);' % target) ++ print(' }') ++ print(' dumpFramebufferAttachementParameters(writer, context, %s, GL_DEPTH_ATTACHMENT);' % target) ++ print(' dumpFramebufferAttachementParameters(writer, context, %s, GL_STENCIL_ATTACHMENT);' % target) ++ print(' writer.endObject();') ++ print(' writer.endMember(); // %s' % target) ++ print(' }') ++ print() ++ print(' }') ++ print() + + def dump_attachment_parameters(self, target, attachment): +- print ' {' +- print ' GLint object_type = GL_NONE;' +- print ' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &object_type);' % (target, attachment) +- print ' if (object_type != GL_NONE) {' +- print ' writer.beginMember(enumToString(%s));' % attachment +- print ' writer.beginObject();' ++ print(' {') ++ print(' GLint object_type = GL_NONE;') ++ print(' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &object_type);' % (target, attachment)) ++ print(' if (object_type != GL_NONE) {') ++ print(' writer.beginMember(enumToString(%s));' % attachment) ++ print(' writer.beginObject();') + self.dump_atoms(glGetFramebufferAttachmentParameter, target, attachment) +- print ' GLint object_name = 0;' +- print ' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &object_name);' % (target, attachment) +- print ' dumpObjectLabel(writer, context, object_type, object_name, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_LABEL");' +- print ' writer.endObject();' +- print ' writer.endMember(); // GL_x_ATTACHMENT' +- print ' }' +- print ' }' ++ print(' GLint object_name = 0;') ++ print(' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &object_name);' % (target, attachment)) ++ print(' dumpObjectLabel(writer, context, object_type, object_name, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_LABEL");') ++ print(' writer.endObject();') ++ print(' writer.endMember(); // GL_x_ATTACHMENT') ++ print(' }') ++ print(' }') + + def dump_atoms(self, getter, *args): + for _, _, name in getter.iter(): +@@ -666,20 +666,20 @@ class StateDumper: + def dump_atom(self, getter, *args): + name = args[getter.pnameIdx] + +- print ' // %s' % name +- print ' {' +- print ' flushErrors();' ++ print(' // %s' % name) ++ print(' {') ++ print(' flushErrors();') + type, value = getter(*args) +- print ' if (glGetError() != GL_NO_ERROR) {' ++ print(' if (glGetError() != GL_NO_ERROR) {') + #print ' std::cerr << "warning: %s(%s) failed\\n";' % (inflection, name) +- print ' flushErrors();' +- print ' } else {' +- print ' writer.beginMember("%s");' % name ++ print(' flushErrors();') ++ print(' } else {') ++ print(' writer.beginMember("%s");' % name) + JsonWriter().visit(type, value) +- print ' writer.endMember();' +- print ' }' +- print ' }' +- print ++ print(' writer.endMember();') ++ print(' }') ++ print(' }') ++ print() + + + if __name__ == '__main__': +diff --git a/retrace/retrace.py b/retrace/retrace.py +index 164944ed..0149817c 100644 +--- a/retrace/retrace.py ++++ b/retrace/retrace.py +@@ -69,10 +69,10 @@ class ValueAllocator(stdapi.Visitor): + pass + + def visitArray(self, array, lvalue, rvalue): +- print ' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue) ++ print(' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue)) + + def visitPointer(self, pointer, lvalue, rvalue): +- print ' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, pointer.type, rvalue) ++ print(' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, pointer.type, rvalue)) + + def visitIntPointer(self, pointer, lvalue, rvalue): + pass +@@ -109,7 +109,7 @@ class ValueAllocator(stdapi.Visitor): + class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + + def visitLiteral(self, literal, lvalue, rvalue): +- print ' %s = (%s).to%s();' % (lvalue, rvalue, literal.kind) ++ print(' %s = (%s).to%s();' % (lvalue, rvalue, literal.kind)) + + def visitConst(self, const, lvalue, rvalue): + self.visit(const.type, lvalue, rvalue) +@@ -118,7 +118,7 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + self.visit(alias.type, lvalue, rvalue) + + def visitEnum(self, enum, lvalue, rvalue): +- print ' %s = static_cast<%s>((%s).toSInt());' % (lvalue, enum, rvalue) ++ print(' %s = static_cast<%s>((%s).toSInt());' % (lvalue, enum, rvalue)) + + def visitBitmask(self, bitmask, lvalue, rvalue): + self.visit(bitmask.type, lvalue, rvalue) +@@ -127,50 +127,50 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + tmp = '_a_' + array.tag + '_' + str(self.seq) + self.seq += 1 + +- print ' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue) +- print ' if (%s) {' % (tmp,) ++ print(' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue)) ++ print(' if (%s) {' % (tmp,)) + + length = '%s->values.size()' % (tmp,) + if self.insideStruct: + if isinstance(array.length, int): + # Member is an array +- print r' static_assert( std::is_array< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be an array" );' % lvalue +- print r' static_assert( std::extent< std::remove_reference< decltype( %s ) >::type >::value == %s, "array size mismatch" );' % (lvalue, array.length) +- print r' assert( %s );' % (tmp,) +- print r' assert( %s->size() == %s );' % (tmp, array.length) ++ print(r' static_assert( std::is_array< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be an array" );' % lvalue) ++ print(r' static_assert( std::extent< std::remove_reference< decltype( %s ) >::type >::value == %s, "array size mismatch" );' % (lvalue, array.length)) ++ print(r' assert( %s );' % (tmp,)) ++ print(r' assert( %s->size() == %s );' % (tmp, array.length)) + length = str(array.length) + else: + # Member is a pointer to an array, hence must be allocated +- print r' static_assert( std::is_pointer< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be a pointer" );' % lvalue +- print r' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue) ++ print(r' static_assert( std::is_pointer< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be a pointer" );' % lvalue) ++ print(r' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue)) + + index = '_j' + array.tag +- print ' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length) ++ print(' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)) + try: + self.visit(array.type, '%s[%s]' % (lvalue, index), '*%s->values[%s]' % (tmp, index)) + finally: +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + + def visitPointer(self, pointer, lvalue, rvalue): + tmp = '_a_' + pointer.tag + '_' + str(self.seq) + self.seq += 1 + +- print ' if (%s) {' % (lvalue,) +- print ' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue) ++ print(' if (%s) {' % (lvalue,)) ++ print(' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue)) + try: + self.visit(pointer.type, '%s[0]' % (lvalue,), '*%s->values[0]' % (tmp,)) + finally: +- print ' }' ++ print(' }') + + def visitIntPointer(self, pointer, lvalue, rvalue): +- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue) ++ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue)) + + def visitObjPointer(self, pointer, lvalue, rvalue): +- print ' %s = retrace::asObjPointer<%s>(call, %s);' % (lvalue, pointer.type, rvalue) ++ print(' %s = retrace::asObjPointer<%s>(call, %s);' % (lvalue, pointer.type, rvalue)) + + def visitLinearPointer(self, pointer, lvalue, rvalue): +- print ' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, pointer, rvalue) ++ print(' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, pointer, rvalue)) + + def visitReference(self, reference, lvalue, rvalue): + self.visit(reference.type, lvalue, rvalue); +@@ -179,23 +179,23 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + #OpaqueValueDeserializer().visit(handle.type, lvalue, rvalue); + self.visit(handle.type, lvalue, rvalue); + new_lvalue = lookupHandle(handle, lvalue) +- print ' if (retrace::verbosity >= 2) {' +- print ' std::cout << "%s " << size_t(%s) << " <- " << size_t(%s) << "\\n";' % (handle.name, lvalue, new_lvalue) +- print ' }' ++ print(' if (retrace::verbosity >= 2) {') ++ print(' std::cout << "%s " << size_t(%s) << " <- " << size_t(%s) << "\\n";' % (handle.name, lvalue, new_lvalue)) ++ print(' }') + if (new_lvalue.startswith('_program_map') or new_lvalue.startswith('_shader_map')): +- print 'if (glretrace::supportsARBShaderObjects) {' +- print ' %s = _handleARB_map[%s];' % (lvalue, lvalue) +- print '} else {' +- print ' %s = %s;' % (lvalue, new_lvalue) +- print '}' ++ print('if (glretrace::supportsARBShaderObjects) {') ++ print(' %s = _handleARB_map[%s];' % (lvalue, lvalue)) ++ print('} else {') ++ print(' %s = %s;' % (lvalue, new_lvalue)) ++ print('}') + else: +- print ' %s = %s;' % (lvalue, new_lvalue) ++ print(' %s = %s;' % (lvalue, new_lvalue)) + + def visitBlob(self, blob, lvalue, rvalue): +- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, blob, rvalue) ++ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, blob, rvalue)) + + def visitString(self, string, lvalue, rvalue): +- print ' %s = (%s)((%s).toString());' % (lvalue, string.expr, rvalue) ++ print(' %s = (%s)((%s).toString());' % (lvalue, string.expr, rvalue)) + + seq = 0 + +@@ -207,8 +207,8 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + + self.insideStruct += 1 + +- print ' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue) +- print ' assert(%s);' % (tmp) ++ print(' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue)) ++ print(' assert(%s);' % (tmp)) + for i in range(len(struct.members)): + member = struct.members[i] + self.visitMember(member, lvalue, '*%s->members[%s]' % (tmp, i)) +@@ -218,24 +218,24 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin): + def visitPolymorphic(self, polymorphic, lvalue, rvalue): + if polymorphic.defaultType is None: + switchExpr = self.expand(polymorphic.switchExpr) +- print r' switch (%s) {' % switchExpr ++ print(r' switch (%s) {' % switchExpr) + for cases, type in polymorphic.iterSwitch(): + for case in cases: +- print r' %s:' % case ++ print(r' %s:' % case) + caseLvalue = lvalue + if type.expr is not None: + caseLvalue = 'static_cast<%s>(%s)' % (type, caseLvalue) +- print r' {' ++ print(r' {') + try: + self.visit(type, caseLvalue, rvalue) + finally: +- print r' }' +- print r' break;' ++ print(r' }') ++ print(r' break;') + if polymorphic.defaultType is None: +- print r' default:' +- print r' retrace::warning(call) << "unexpected polymorphic case" << %s << "\n";' % (switchExpr,) +- print r' break;' +- print r' }' ++ print(r' default:') ++ print(r' retrace::warning(call) << "unexpected polymorphic case" << %s << "\n";' % (switchExpr,)) ++ print(r' break;') ++ print(r' }') + else: + self.visit(polymorphic.defaultType, lvalue, rvalue) + +@@ -250,7 +250,7 @@ class OpaqueValueDeserializer(ValueDeserializer): + in the context of handles.''' + + def visitOpaque(self, opaque, lvalue, rvalue): +- print ' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, opaque, rvalue) ++ print(' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, opaque, rvalue)) + + + class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin): +@@ -270,67 +270,67 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin): + pass + + def visitArray(self, array, lvalue, rvalue): +- print ' const trace::Array *_a%s = (%s).toArray();' % (array.tag, rvalue) +- print ' if (_a%s) {' % (array.tag) ++ print(' const trace::Array *_a%s = (%s).toArray();' % (array.tag, rvalue)) ++ print(' if (_a%s) {' % (array.tag)) + length = '_a%s->values.size()' % array.tag + index = '_j' + array.tag +- print ' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length) ++ 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.tag, index)) + finally: +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + + def visitPointer(self, pointer, lvalue, rvalue): +- print ' const trace::Array *_a%s = (%s).toArray();' % (pointer.tag, rvalue) +- print ' if (_a%s) {' % (pointer.tag) ++ print(' const trace::Array *_a%s = (%s).toArray();' % (pointer.tag, rvalue)) ++ print(' if (_a%s) {' % (pointer.tag)) + try: + self.visit(pointer.type, '%s[0]' % (lvalue,), '*_a%s->values[0]' % (pointer.tag,)) + finally: +- print ' }' ++ print(' }') + + def visitIntPointer(self, pointer, lvalue, rvalue): + pass + + def visitObjPointer(self, pointer, lvalue, rvalue): +- print r' retrace::addObj(call, %s, %s);' % (rvalue, lvalue) ++ print(r' retrace::addObj(call, %s, %s);' % (rvalue, lvalue)) + + def visitLinearPointer(self, pointer, lvalue, rvalue): + assert pointer.size is not None + if pointer.size is not None: +- print r' retrace::addRegion(call, (%s).toUIntPtr(), %s, %s);' % (rvalue, lvalue, pointer.size) ++ print(r' retrace::addRegion(call, (%s).toUIntPtr(), %s, %s);' % (rvalue, lvalue, pointer.size)) + + def visitReference(self, reference, lvalue, rvalue): + pass + + def visitHandle(self, handle, lvalue, rvalue): +- print ' %s _origResult;' % handle.type ++ print(' %s _origResult;' % handle.type) + OpaqueValueDeserializer().visit(handle.type, '_origResult', rvalue); + if handle.range is None: + rvalue = "_origResult" + entry = lookupHandle(handle, rvalue, True) + if (entry.startswith('_program_map') or entry.startswith('_shader_map')): +- print 'if (glretrace::supportsARBShaderObjects) {' +- print ' _handleARB_map[%s] = %s;' % (rvalue, lvalue) +- print '} else {' +- print ' %s = %s;' % (entry, lvalue) +- print '}' ++ print('if (glretrace::supportsARBShaderObjects) {') ++ print(' _handleARB_map[%s] = %s;' % (rvalue, lvalue)) ++ print('} else {') ++ print(' %s = %s;' % (entry, lvalue)) ++ print('}') + else: +- print " %s = %s;" % (entry, lvalue) +- print ' if (retrace::verbosity >= 2) {' +- print ' std::cout << "{handle.name} " << {rvalue} << " -> " << {lvalue} << "\\n";'.format(**locals()) +- print ' }' ++ print(" %s = %s;" % (entry, lvalue)) ++ print(' if (retrace::verbosity >= 2) {') ++ print(' std::cout << "{handle.name} " << {rvalue} << " -> " << {lvalue} << "\\n";'.format(**locals())) ++ print(' }') + else: + i = '_h' + handle.tag + lvalue = "%s + %s" % (lvalue, i) + rvalue = "_origResult + %s" % (i,) + entry = lookupHandle(handle, rvalue) +- print ' for ({handle.type} {i} = 0; {i} < {handle.range}; ++{i}) {{'.format(**locals()) +- print ' {entry} = {lvalue};'.format(**locals()) +- print ' if (retrace::verbosity >= 2) {' +- print ' std::cout << "{handle.name} " << ({rvalue}) << " -> " << ({lvalue}) << "\\n";'.format(**locals()) +- print ' }' +- print ' }' ++ print(' for ({handle.type} {i} = 0; {i} < {handle.range}; ++{i}) {{'.format(**locals())) ++ print(' {entry} = {lvalue};'.format(**locals())) ++ print(' if (retrace::verbosity >= 2) {') ++ print(' std::cout << "{handle.name} " << ({rvalue}) << " -> " << ({lvalue}) << "\\n";'.format(**locals())) ++ print(' }') ++ print(' }') + + def visitBlob(self, blob, lvalue, rvalue): + pass +@@ -344,9 +344,9 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin): + tmp = '_s_' + struct.tag + '_' + str(self.seq) + self.seq += 1 + +- print ' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue) +- print ' assert(%s);' % (tmp,) +- print ' (void)%s;' % (tmp,) ++ print(' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue)) ++ print(' assert(%s);' % (tmp,)) ++ print(' (void)%s;' % (tmp,)) + for i in range(len(struct.members)): + member = struct.members[i] + self.visitMember(member, lvalue, '*%s->members[%s]' % (tmp, i)) +@@ -362,16 +362,16 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin): + class Retracer: + + def retraceFunction(self, function): +- print 'static void retrace_%s(trace::Call &call) {' % function.name ++ print('static void retrace_%s(trace::Call &call) {' % function.name) + self.retraceFunctionBody(function) +- print '}' +- print ++ print('}') ++ print() + + def retraceInterfaceMethod(self, interface, method): +- print 'static void retrace_%s__%s(trace::Call &call) {' % (interface.name, method.name) ++ print('static void retrace_%s__%s(trace::Call &call) {' % (interface.name, method.name)) + self.retraceInterfaceMethodBody(interface, method) +- print '}' +- print ++ print('}') ++ print() + + def retraceFunctionBody(self, function): + assert function.sideeffects +@@ -409,38 +409,38 @@ class Retracer: + assert function.type is not stdapi.Void + + if str(function.type) == 'HRESULT': +- print r' if (call.ret && FAILED(call.ret->toSInt())) {' +- print r' return;' +- print r' }' ++ print(r' if (call.ret && FAILED(call.ret->toSInt())) {') ++ print(r' return;') ++ print(r' }') + + def deserializeThisPointer(self, interface): +- print r' %s *_this;' % (interface.name,) +- print r' _this = retrace::asObjPointer<%s>(call, call.arg(0));' % (interface.name,) +- print r' if (!_this) {' +- print r' return;' +- print r' }' ++ print(r' %s *_this;' % (interface.name,)) ++ print(r' _this = retrace::asObjPointer<%s>(call, call.arg(0));' % (interface.name,)) ++ print(r' if (!_this) {') ++ print(r' return;') ++ print(r' }') + + def deserializeArgs(self, function): +- print ' retrace::ScopedAllocator _allocator;' +- print ' (void)_allocator;' ++ print(' retrace::ScopedAllocator _allocator;') ++ print(' (void)_allocator;') + success = True + for arg in function.args: + arg_type = arg.type.mutable() +- print ' %s %s;' % (arg_type, arg.name) ++ print(' %s %s;' % (arg_type, arg.name)) + rvalue = 'call.arg(%u)' % (arg.index,) + lvalue = arg.name + try: + self.extractArg(function, arg, arg_type, lvalue, rvalue) + except UnsupportedType: + success = False +- print ' memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name) +- print ++ print(' memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name)) ++ print() + + if not success: +- print ' if (1) {' ++ print(' if (1) {') + self.failFunction(function) + sys.stderr.write('warning: unsupported %s call\n' % function.name) +- print ' }' ++ print(' }') + + def swizzleValues(self, function): + for arg in function.args: +@@ -451,7 +451,7 @@ class Retracer: + try: + self.regiterSwizzledValue(arg_type, lvalue, rvalue) + except UnsupportedType: +- print ' // XXX: %s' % arg.name ++ print(' // XXX: %s' % arg.name) + if function.type is not stdapi.Void: + rvalue = '*call.ret' + lvalue = '_result' +@@ -459,15 +459,15 @@ class Retracer: + self.regiterSwizzledValue(function.type, lvalue, rvalue) + except UnsupportedType: + raise +- print ' // XXX: result' ++ print(' // XXX: result') + + def failFunction(self, function): +- print ' if (retrace::verbosity >= 0) {' +- print ' retrace::unsupported(call);' +- print ' }' ++ print(' if (retrace::verbosity >= 0) {') ++ print(' retrace::unsupported(call);') ++ print(' }') + # MGS-469: GPU hangs when retracing OGLESParticles on mx6sx + # Workaround: do not `return` +- #print ' return;' ++ #print(' return;') + + def extractArg(self, function, arg, arg_type, lvalue, rvalue): + ValueAllocator().visit(arg_type, lvalue, rvalue) +@@ -487,22 +487,22 @@ class Retracer: + + def declareRet(self, function): + if function.type is not stdapi.Void: +- print ' %s _result;' % (function.type) ++ print(' %s _result;' % (function.type)) + + def invokeFunction(self, function): + arg_names = ", ".join(function.argNames()) + if function.type is not stdapi.Void: +- print ' _result = %s(%s);' % (function.name, arg_names) ++ print(' _result = %s(%s);' % (function.name, arg_names)) + self.checkResult(None, function) + else: +- print ' %s(%s);' % (function.name, arg_names) ++ print(' %s(%s);' % (function.name, arg_names)) + + def invokeInterfaceMethod(self, interface, method): + arg_names = ", ".join(method.argNames()) + if method.type is not stdapi.Void: +- print ' _result = _this->%s(%s);' % (method.name, arg_names) ++ print(' _result = _this->%s(%s);' % (method.name, arg_names)) + else: +- print ' _this->%s(%s);' % (method.name, arg_names) ++ print(' _this->%s(%s);' % (method.name, arg_names)) + + # Adjust reference count when QueryInterface fails. This is + # particularly useful when replaying traces on older Direct3D runtimes +@@ -511,12 +511,12 @@ class Retracer: + # + # TODO: Generalize to other methods that return interfaces + if method.name == 'QueryInterface': +- print r' if (FAILED(_result)) {' +- print r' IUnknown *pObj = retrace::asObjPointer(call, *call.arg(2).toArray()->values[0]);' +- print r' if (pObj) {' +- print r' pObj->AddRef();' +- print r' }' +- print r' }' ++ print(r' if (FAILED(_result)) {') ++ print(r' IUnknown *pObj = retrace::asObjPointer(call, *call.arg(2).toArray()->values[0]);') ++ print(r' if (pObj) {') ++ print(r' pObj->AddRef();') ++ print(r' }') ++ print(r' }') + + if method.type is not stdapi.Void: + self.checkResult(interface, method) +@@ -524,28 +524,28 @@ class Retracer: + # Debug COM reference counting. Disabled by default as reported + # reference counts depend on internal implementation details. + if method.name in ('AddRef', 'Release'): +- print r' if (0) retrace::checkMismatch(call, "cRef", call.ret, _result);' ++ print(r' if (0) retrace::checkMismatch(call, "cRef", call.ret, _result);') + + # On release our reference when we reach Release() == 0 call in the + # trace. + if method.name == 'Release': +- print r' ULONG _orig_result = call.ret->toUInt();' +- print r' if (_orig_result == 0 || _result == 0) {' +- print r' if (_orig_result != 0) {' +- print r' retrace::warning(call) << "unexpected object destruction\n";' +- print r' }' +- print r' retrace::delObj(call.arg(0));' +- print r' }' ++ print(r' ULONG _orig_result = call.ret->toUInt();') ++ print(r' if (_orig_result == 0 || _result == 0) {') ++ print(r' if (_orig_result != 0) {') ++ print(r' retrace::warning(call) << "unexpected object destruction\n";') ++ print(r' }') ++ print(r' retrace::delObj(call.arg(0));') ++ print(r' }') + + def checkResult(self, interface, methodOrFunction): + assert methodOrFunction.type is not stdapi.Void + if str(methodOrFunction.type) == 'HRESULT': +- print r' if (FAILED(_result)) {' +- print r' retrace::failed(call, _result);' +- print r' return;' +- print r' }' ++ print(r' if (FAILED(_result)) {') ++ print(r' retrace::failed(call, _result);') ++ print(r' return;') ++ print(r' }') + else: +- print r' (void)_result;' ++ print(r' (void)_result;') + + def checkPitchMismatch(self, method): + # Warn for mismatches in 2D/3D mappings. +@@ -554,19 +554,19 @@ class Retracer: + if outArg.output \ + and isinstance(outArg.type, stdapi.Pointer) \ + and isinstance(outArg.type.type, stdapi.Struct): +- print r' const trace::Array *_%s = call.arg(%u).toArray();' % (outArg.name, outArg.index) +- print r' if (%s) {' % outArg.name +- print r' const trace::Struct *_struct = _%s->values[0]->toStruct();' % (outArg.name) +- print r' if (_struct) {' ++ print(r' const trace::Array *_%s = call.arg(%u).toArray();' % (outArg.name, outArg.index)) ++ print(r' if (%s) {' % outArg.name) ++ print(r' const trace::Struct *_struct = _%s->values[0]->toStruct();' % (outArg.name)) ++ print(r' if (_struct) {') + struct = outArg.type.type + for memberIndex in range(len(struct.members)): + memberType, memberName = struct.members[memberIndex] + if memberName.endswith('Pitch'): +- print r' if (%s->%s) {' % (outArg.name, memberName) +- print r' retrace::checkMismatch(call, "%s", _struct->members[%u], %s->%s);' % (memberName, memberIndex, outArg.name, memberName) +- print r' }' +- print r' }' +- print r' }' ++ print(r' if (%s->%s) {' % (outArg.name, memberName)) ++ print(r' retrace::checkMismatch(call, "%s", _struct->members[%u], %s->%s);' % (memberName, memberIndex, outArg.name, memberName)) ++ print(r' }') ++ print(r' }') ++ print(r' }') + + def filterFunction(self, function): + return True +@@ -575,11 +575,11 @@ class Retracer: + + def retraceApi(self, api): + +- print '#include "os_time.hpp"' +- print '#include "trace_parser.hpp"' +- print '#include "retrace.hpp"' +- print '#include "retrace_swizzle.hpp"' +- print ++ print('#include "os_time.hpp"') ++ print('#include "trace_parser.hpp"') ++ print('#include "retrace.hpp"') ++ print('#include "retrace_swizzle.hpp"') ++ print() + + types = api.getAllTypes() + handles = [type for type in types if isinstance(type, stdapi.Handle)] +@@ -587,14 +587,14 @@ class Retracer: + for handle in handles: + if handle.name not in handle_names: + if handle.key is None: +- print 'static retrace::map<%s> _%s_map;' % (handle.type, handle.name) ++ print('static retrace::map<%s> _%s_map;' % (handle.type, handle.name)) + else: + key_name, key_type = handle.key +- print 'static std::map<%s, retrace::map<%s> > _%s_map;' % (key_type, handle.type, handle.name) ++ print('static std::map<%s, retrace::map<%s> > _%s_map;' % (key_type, handle.type, handle.name)) + handle_names.add(handle.name) +- print ++ print() + +- functions = filter(self.filterFunction, api.getAllFunctions()) ++ functions = list(filter(self.filterFunction, api.getAllFunctions())) + for function in functions: + if function.sideeffects and not function.internal: + self.retraceFunction(function) +@@ -604,20 +604,20 @@ class Retracer: + if method.sideeffects and not method.internal: + self.retraceInterfaceMethod(interface, method) + +- print 'const retrace::Entry %s[] = {' % self.table_name ++ print('const retrace::Entry %s[] = {' % self.table_name) + for function in functions: + if not function.internal: + if function.sideeffects: +- print ' {"%s", &retrace_%s},' % (function.name, function.name) ++ print(' {"%s", &retrace_%s},' % (function.name, function.name)) + else: +- print ' {"%s", &retrace::ignore},' % (function.name,) ++ print(' {"%s", &retrace::ignore},' % (function.name,)) + for interface in interfaces: + for base, method in interface.iterBaseMethods(): + if method.sideeffects: +- print ' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, base.name, method.name) ++ print(' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, base.name, method.name)) + else: +- print ' {"%s::%s", &retrace::ignore},' % (interface.name, method.name) +- print ' {NULL, NULL}' +- print '};' +- print ++ print(' {"%s::%s", &retrace::ignore},' % (interface.name, method.name)) ++ print(' {NULL, NULL}') ++ print('};') ++ print() + +diff --git a/scripts/convert.py b/scripts/convert.py +index 5f338d80..83df70ce 100755 +--- a/scripts/convert.py ++++ b/scripts/convert.py +@@ -100,9 +100,9 @@ def detectApiFromCsv(inCsv): + import csv + csvReader = csv.reader(open(inCsv, 'rt'), ) + for row in csvReader: +- print row ++ print(row) + event = row[2] +- print event ++ print(event) + if event.startswith("Direct3DCreate9"): + return "d3d9" + if event.startswith("CreateDXGIFactory"): +diff --git a/scripts/jsondiff.py b/scripts/jsondiff.py +index 3b1f9110..25c4840e 100755 +--- a/scripts/jsondiff.py ++++ b/scripts/jsondiff.py +@@ -36,7 +36,7 @@ import sys + def strip_object_hook(obj): + if '__class__' in obj: + return None +- for name in obj.keys(): ++ for name in list(obj.keys()): + if name.startswith('__') and name.endswith('__'): + del obj[name] + return obj +@@ -80,7 +80,7 @@ class Dumper(Visitor): + def visitObject(self, node): + self.enter_object() + +- members = node.keys() ++ members = list(node.keys()) + members.sort() + for i in range(len(members)): + name = members[i] +@@ -148,8 +148,8 @@ class Comparer(Visitor): + return False + if len(a) != len(b) and not self.ignore_added: + return False +- ak = a.keys() +- bk = b.keys() ++ ak = list(a.keys()) ++ bk = list(b.keys()) + ak.sort() + bk.sort() + if ak != bk and not self.ignore_added: +@@ -175,8 +175,8 @@ class Comparer(Visitor): + return True + + def visitValue(self, a, b): +- if isinstance(a, float) and isinstance(b, (int, long, float)) or \ +- isinstance(b, float) and isinstance(a, (int, long, float)): ++ if isinstance(a, float) and isinstance(b, (int, float)) or \ ++ isinstance(b, float) and isinstance(a, (int, float)): + if a is b: + # NaNs take this path + return True +@@ -208,7 +208,7 @@ class Differ(Visitor): + self.dumper.enter_object() + names = set(a.keys()) + if not self.comparer.ignore_added: +- names.update(b.keys()) ++ names.update(list(b.keys())) + names = list(names) + names.sort() + +@@ -284,7 +284,7 @@ class Differ(Visitor): + self.dumper.visit(b) + + def isMultilineString(self, value): +- return isinstance(value, basestring) and '\n' in value ++ return isinstance(value, str) and '\n' in value + + + # +diff --git a/scripts/jsonextractimages.py b/scripts/jsonextractimages.py +index ea1c927d..917ee7e4 100755 +--- a/scripts/jsonextractimages.py ++++ b/scripts/jsonextractimages.py +@@ -38,7 +38,7 @@ pngSignature = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" + + + def dumpSurfaces(state, memberName): +- for name, imageObj in state[memberName].iteritems(): ++ for name, imageObj in state[memberName].items(): + data = imageObj['__data__'] + data = base64.b64decode(data) + +diff --git a/scripts/leaks.py b/scripts/leaks.py +new file mode 100755 +index 00000000..325af1e2 +--- /dev/null ++++ b/scripts/leaks.py +@@ -0,0 +1,163 @@ ++#!/usr/bin/env python ++########################################################################## ++# ++# Copyright 2014-2016 VMware, Inc. ++# All Rights Reserved. ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to deal ++# in the Software without restriction, including without limitation the rights ++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++# copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++# THE SOFTWARE. ++# ++##########################################################################/ ++ ++ ++import subprocess ++import sys ++import os.path ++import optparse ++import re ++ ++import unpickle ++ ++ ++class LeakDetector(unpickle.Unpickler): ++ ++ def __init__(self, apitrace, trace): ++ ++ cmd = [apitrace, 'pickle', '--symbolic', trace] ++ p = subprocess.Popen(args = cmd, stdout = subprocess.PIPE) ++ ++ unpickle.Unpickler.__init__(self, p.stdout) ++ ++ self.numContexts = 0 ++ ++ # a map of maps ++ self.objectDicts = {} ++ ++ def parse(self): ++ unpickle.Unpickler.parse(self) ++ ++ # Reached the end of the trace -- dump any live objects ++ self.dumpLeaks("") ++ ++ genDelRegExp = re.compile('^gl(Gen|Delete)(Buffers|Textures|FrameBuffers|RenderBuffers)[A-Z]*$') ++ ++ def handleCall(self, call): ++ # Ignore calls without side effects ++ if call.flags & unpickle.CALL_FLAG_NO_SIDE_EFFECTS: ++ return ++ ++ # Dump call for debugging: ++ if 0: ++ sys.stderr.write('%s\n' % call) ++ ++ mo = self.genDelRegExp.match(call.functionName) ++ if mo: ++ verb = mo.group(1) ++ subject = mo.group(2) ++ ++ subject = subject.lower().rstrip('s') ++ objectDict = self.objectDicts.setdefault(subject, {}) ++ ++ if verb == 'Gen': ++ self.handleGenerate(call, objectDict) ++ elif verb == 'Delete': ++ self.handleDelete(call, objectDict) ++ else: ++ assert 0 ++ ++ # TODO: Track labels via glObjectLabel* calls ++ ++ if call.functionName in [ ++ 'CGLCreateContext', ++ 'eglCreateContext', ++ 'glXCreateContext', ++ 'glXCreateNewContext', ++ 'glXCreateContextAttribsARB', ++ 'glXCreateContextWithConfigSGIX', ++ 'wglCreateContext', ++ 'wglCreateContextAttribsARB', ++ ]: ++ # FIXME: Ignore failing context creation calls ++ self.numContexts += 1 ++ ++ if call.functionName in [ ++ 'CGLDestroyContext', ++ 'glXDestroyContext', ++ 'eglDestroyContext', ++ 'wglDeleteContext', ++ ]: ++ assert self.numContexts > 0 ++ self.numContexts -= 1 ++ if self.numContexts == 0: ++ self.dumpLeaks(call.no) ++ ++ def handleGenerate(self, call, objectDict): ++ n, names = call.argValues() ++ for i in range(n): ++ name = names[i] ++ objectDict[name] = call.no ++ # TODO: Keep track of call stack backtrace too ++ ++ def handleDelete(self, call, objectDict): ++ n, names = call.argValues() ++ for i in range(n): ++ name = names[i] ++ try: ++ del objectDict[name] ++ except KeyError: ++ # Ignore if texture name was never generated ++ pass ++ ++ def dumpLeaks(self, currentCallNo): ++ for kind, objectDict in self.objectDicts.items(): ++ self.dumpNamespaceLeaks(currentCallNo, objectDict, kind) ++ ++ def dumpNamespaceLeaks(self, currentCallNo, objectDict, kind): ++ for name, creationCallNo in (sorted(iter(objectDict.items()),key=lambda t: t[1])): ++ sys.stderr.write('%u: error: %s %u was not destroyed until %s\n' % (creationCallNo, kind, name, currentCallNo)) ++ objectDict.clear() ++ ++ ++def main(): ++ '''Main program. ++ ''' ++ ++ # Parse command line options ++ optparser = optparse.OptionParser( ++ usage='\n\t%prog [options] TRACE', ++ version='%%prog') ++ optparser.add_option( ++ '-a', '--apitrace', metavar='PROGRAM', ++ type='string', dest='apitrace', default='apitrace', ++ help='apitrace command [default: %default]') ++ ++ options, args = optparser.parse_args(sys.argv[1:]) ++ if len(args) != 1: ++ optparser.error("incorrect number of arguments") ++ ++ inTrace = args[0] ++ if not os.path.isfile(inTrace): ++ sys.stderr.write("error: `%s` does not exist\n" % inTrace) ++ sys.exit(1) ++ ++ detector = LeakDetector(options.apitrace, inTrace) ++ detector.parse() ++ ++ ++if __name__ == '__main__': ++ main() +diff --git a/scripts/profileshader.py b/scripts/profileshader.py +index 3c490a0e..5c2a58fb 100755 +--- a/scripts/profileshader.py ++++ b/scripts/profileshader.py +@@ -58,13 +58,13 @@ def process(stream, groupField): + continue + + if fields[callCol] == 'call': +- callId = long(fields[callIdCol]) +- duration = long(fields[gpuDuraCol]) ++ callId = int(fields[callIdCol]) ++ duration = int(fields[gpuDuraCol]) + group = fields[groupCol] + + maxGroupLen = max(maxGroupLen, len(group)) + +- if times.has_key(group): ++ if group in times: + times[group]['draws'] += 1 + times[group]['duration'] += duration + +@@ -74,7 +74,7 @@ def process(stream, groupField): + else: + times[group] = {'draws': 1, 'duration': duration, 'longest': callId, 'longestDuration': duration} + +- times = sorted(times.items(), key=lambda x: x[1]['duration'], reverse=True) ++ times = sorted(list(times.items()), key=lambda x: x[1]['duration'], reverse=True) + + if groupField == 'program': + groupTitle = 'Shader[id]' +@@ -84,9 +84,9 @@ def process(stream, groupField): + groupTitle = groupField.center(maxGroupLen) + groupLine = '-' * maxGroupLen + +- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine +- print '| %s | Draws [#] | Duration [ns] v | Per Call[ns] | Longest[id] |' % groupTitle +- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine ++ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine) ++ print('| %s | Draws [#] | Duration [ns] v | Per Call[ns] | Longest[id] |' % groupTitle) ++ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine) + + for group in times: + id = str(group[0]).rjust(maxGroupLen) +@@ -94,9 +94,9 @@ def process(stream, groupField): + dura = str(group[1]['duration']).rjust(18) + perCall = str(group[1]['duration'] / group[1]['draws']).rjust(12) + longest = str(group[1]['longest']).rjust(11) +- print "| %s | %s | %s | %s | %s |" % (id, draw, dura, perCall, longest) ++ print("| %s | %s | %s | %s | %s |" % (id, draw, dura, perCall, longest)) + +- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine ++ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine) + + + def main(): +diff --git a/scripts/retracediff.py b/scripts/retracediff.py +index bb5aa7f5..8105f536 100755 +--- a/scripts/retracediff.py ++++ b/scripts/retracediff.py +@@ -83,12 +83,12 @@ class Retracer: + self.retraceExe, + ] + args + self.args + if self.env: +- for name, value in self.env.iteritems(): ++ for name, value in self.env.items(): + sys.stderr.write('%s=%s ' % (name, value)) + sys.stderr.write(' '.join(cmd) + '\n') + try: + return subprocess.Popen(cmd, env=self.env, stdout=stdout, stderr=NULL) +- except OSError, ex: ++ except OSError as ex: + sys.stderr.write('error: failed to execute %s: %s\n' % (cmd[0], ex.strerror)) + sys.exit(1) + +@@ -160,7 +160,7 @@ def read_pnm(stream): + while line.startswith('#'): + comment += line[1:] + line = stream.readline() +- width, height = map(int, line.strip().split()) ++ width, height = list(map(int, line.strip().split())) + maximum = int(stream.readline().strip()) + if bytesPerChannel == 1: + assert maximum == 255 +diff --git a/scripts/snapdiff.py b/scripts/snapdiff.py +index 59ec870e..b0d5f757 100755 +--- a/scripts/snapdiff.py ++++ b/scripts/snapdiff.py +@@ -40,6 +40,7 @@ from PIL import Image + from PIL import ImageChops + from PIL import ImageEnhance + from PIL import ImageFilter ++from functools import reduce + + + thumbSize = 320 +@@ -50,12 +51,12 @@ class Comparer: + '''Image comparer.''' + + def __init__(self, ref_image, src_image, alpha = False): +- if isinstance(ref_image, basestring): ++ if isinstance(ref_image, str): + self.ref_im = Image.open(ref_image) + else: + self.ref_im = ref_image + +- if isinstance(src_image, basestring): ++ if isinstance(src_image, str): + self.src_im = Image.open(src_image) + else: + self.src_im = src_image +@@ -106,7 +107,7 @@ class Comparer: + # Compute absolute error + + if self.size_mismatch(): +- return sys.maxint ++ return sys.maxsize + + # TODO: this is approximate due to the grayscale conversion + h = self.diff.convert('L').histogram() +diff --git a/scripts/tracediff.py b/scripts/tracediff.py +index f111322a..0cd9c8c6 100755 +--- a/scripts/tracediff.py ++++ b/scripts/tracediff.py +@@ -237,7 +237,7 @@ class BlobReplacer(Rebuilder): + return Blob(len(obj), hash(str(obj))) + + def visitCall(self, call): +- call.args = map(self.visit, call.args) ++ call.args = list(map(self.visit, call.args)) + call.ret = self.visit(call.ret) + + +@@ -312,7 +312,7 @@ class PythonDiffer(Differ): + elif tag == 'equal': + self.equal(alo, ahi, blo, bhi) + else: +- raise ValueError, 'unknown tag %s' % (tag,) ++ raise ValueError('unknown tag %s' % (tag,)) + + def isjunk(self, call): + return call.functionName == 'glGetError' and call.ret in ('GL_NO_ERROR', 0) +@@ -338,12 +338,12 @@ class PythonDiffer(Differ): + elif tag == 'equal': + self.replace_similar(_alo, _ahi, _blo, _bhi) + else: +- raise ValueError, 'unknown tag %s' % (tag,) ++ raise ValueError('unknown tag %s' % (tag,)) + + def replace_similar(self, alo, ahi, blo, bhi): + assert alo < ahi and blo < bhi + assert ahi - alo == bhi - blo +- for i in xrange(0, bhi - blo): ++ for i in range(0, bhi - blo): + self.highlighter.write('| ') + a_call = self.a[alo + i] + b_call = self.b[blo + i] +@@ -355,7 +355,7 @@ class PythonDiffer(Differ): + self.highlighter.write('(') + sep = '' + numArgs = max(len(a_call.args), len(b_call.args)) +- for j in xrange(numArgs): ++ for j in range(numArgs): + self.highlighter.write(sep) + try: + a_argName, a_argVal = a_call.args[j] +@@ -402,7 +402,7 @@ class PythonDiffer(Differ): + def delete(self, alo, ahi, blo, bhi): + assert alo < ahi + assert blo == bhi +- for i in xrange(alo, ahi): ++ for i in range(alo, ahi): + call = self.a[i] + self.highlighter.write('- ') + self.dumpCallNos(call.no, None) +@@ -413,7 +413,7 @@ class PythonDiffer(Differ): + def insert(self, alo, ahi, blo, bhi): + assert alo == ahi + assert blo < bhi +- for i in xrange(blo, bhi): ++ for i in range(blo, bhi): + call = self.b[i] + self.highlighter.write('+ ') + self.dumpCallNos(None, call.no) +@@ -425,7 +425,7 @@ class PythonDiffer(Differ): + return + assert alo < ahi and blo < bhi + assert ahi - alo == bhi - blo +- for i in xrange(0, bhi - blo): ++ for i in range(0, bhi - blo): + self.highlighter.write(' ') + a_call = self.a[alo + i] + b_call = self.b[blo + i] +diff --git a/scripts/unpickle.py b/scripts/unpickle.py +index 334c1a01..86891d29 100755 +--- a/scripts/unpickle.py ++++ b/scripts/unpickle.py +@@ -38,7 +38,7 @@ import optparse + import sys + import time + import re +-import cPickle as pickle ++import pickle as pickle + + + # Same as trace_model.hpp's call flags +@@ -58,7 +58,7 @@ CALL_FLAG_MARKER_POP = (1 << 10) + class Pointer(long): + + def __str__(self): +- if self == 0L: ++ if self == 0: + return 'NULL' + else: + return hex(self).rstrip('L') +@@ -73,7 +73,7 @@ class Visitor: + self.dispatch[type(None)] = self.visitNone + self.dispatch[bool] = self.visitBool + self.dispatch[int] = self.visitInt +- self.dispatch[long] = self.visitInt ++ self.dispatch[int] = self.visitInt + self.dispatch[float] = self.visitFloat + self.dispatch[str] = self.visitStr + self.dispatch[tuple] = self.visitTuple +@@ -140,18 +140,18 @@ class Dumper(Visitor): + return repr(obj) + + def visitTuple(self, obj): +- return '(' + ', '.join(itertools.imap(self.visit, obj)) + ')' ++ return '(' + ', '.join(map(self.visit, obj)) + ')' + + def visitList(self, obj): + if len(obj) == 1: + return '&' + self.visit(obj[0]) +- return '{' + ', '.join(itertools.imap(self.visit, obj)) + '}' ++ return '{' + ', '.join(map(self.visit, obj)) + '}' + + def visitItems(self, items): + return ', '.join(['%s = %s' % (name, self.visit(value)) for name, value in items]) + + def visitDict(self, obj): +- return '{' + self.visitItems(obj.iteritems()) + '}' ++ return '{' + self.visitItems(iter(obj.items())) + '}' + + def visitByteArray(self, obj): + return 'blob(%u)' % len(obj) +@@ -167,7 +167,7 @@ class Hasher(Visitor): + return obj + + def visitIterable(self, obj): +- return tuple(itertools.imap(self.visit, obj)) ++ return tuple(map(self.visit, obj)) + + def visitByteArray(self, obj): + return str(obj) +@@ -268,7 +268,7 @@ class Counter(Unpickler): + def parse(self): + Unpickler.parse(self) + +- functionFrequencies = self.functionFrequencies.items() ++ functionFrequencies = list(self.functionFrequencies.items()) + functionFrequencies.sort(lambda (name1, freq1), (name2, freq2): cmp(freq1, freq2)) + for name, frequency in functionFrequencies: + sys.stdout.write('%8u %s\n' % (frequency, name)) +diff --git a/specs/cglapi.py b/specs/cglapi.py +index 69faeeb4..5d61886f 100644 +--- a/specs/cglapi.py ++++ b/specs/cglapi.py +@@ -29,9 +29,9 @@ http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/ + """ + + +-from stdapi import * +-from glapi import * +-from glapi import glapi ++from .stdapi import * ++from .glapi import * ++from .glapi import glapi + + IOSurfaceRef = Opaque("IOSurfaceRef") + CGLContextObj = Opaque("CGLContextObj") +diff --git a/specs/d2d1.py b/specs/d2d1.py +index dacbea69..9bae43c5 100644 +--- a/specs/d2d1.py ++++ b/specs/d2d1.py +@@ -25,9 +25,9 @@ + ##########################################################################/ + + +-from winapi import * +-from dxgi import DXGI_FORMAT, IDXGISurface +-from dwrite import * ++from .winapi import * ++from .dxgi import DXGI_FORMAT, IDXGISurface ++from .dwrite import * + + + +diff --git a/specs/d3d.py b/specs/d3d.py +index 0dde09f4..4b7244b2 100644 +--- a/specs/d3d.py ++++ b/specs/d3d.py +@@ -25,10 +25,10 @@ + + """d3d.h""" + +-from winapi import * +-from ddraw import * +-from d3dtypes import * +-from d3dcaps import * ++from .winapi import * ++from .ddraw import * ++from .d3dtypes import * ++from .d3dcaps import * + + d3dnextFlags = Flags(DWORD, [ + "D3DNEXT_NEXT", +diff --git a/specs/d3d10.py b/specs/d3d10.py +index 2161a5fd..e22bc230 100644 +--- a/specs/d3d10.py ++++ b/specs/d3d10.py +@@ -24,8 +24,8 @@ + ##########################################################################/ + + +-from dxgi import * +-from d3d10sdklayers import * ++from .dxgi import * ++from .d3d10sdklayers import * + + + HRESULT = MAKE_HRESULT([ +diff --git a/specs/d3d10sdklayers.py b/specs/d3d10sdklayers.py +index aad53f04..82beb721 100644 +--- a/specs/d3d10sdklayers.py ++++ b/specs/d3d10sdklayers.py +@@ -24,7 +24,7 @@ + ##########################################################################/ + + +-from dxgi import * ++from .dxgi import * + + + D3D10_DEBUG_FEATURE = Flags(UINT, [ +diff --git a/specs/d3d11.py b/specs/d3d11.py +index f704b062..0a28caa3 100644 +--- a/specs/d3d11.py ++++ b/specs/d3d11.py +@@ -24,8 +24,8 @@ + ##########################################################################/ + + +-from dxgi import * +-from d3d11sdklayers import * ++from .dxgi import * ++from .d3d11sdklayers import * + + + HRESULT = MAKE_HRESULT([ +diff --git a/specs/d3d11sdklayers.py b/specs/d3d11sdklayers.py +index 907c4b09..97d07750 100644 +--- a/specs/d3d11sdklayers.py ++++ b/specs/d3d11sdklayers.py +@@ -24,7 +24,7 @@ + ##########################################################################/ + + +-from dxgi import * ++from .dxgi import * + + + ID3D11DeviceChild = Interface("ID3D11DeviceChild", IUnknown) +diff --git a/specs/d3d8.py b/specs/d3d8.py +index 2dbf1140..400af498 100644 +--- a/specs/d3d8.py ++++ b/specs/d3d8.py +@@ -25,9 +25,9 @@ + + """d3d8.h""" + +-from winapi import * +-from d3d8types import * +-from d3d8caps import * ++from .winapi import * ++from .d3d8types import * ++from .d3d8caps import * + + + D3DSHADER8 = Blob(Const(DWORD), "_shaderSize(pFunction)") +diff --git a/specs/d3d8caps.py b/specs/d3d8caps.py +index 1af1a19f..b7ee5873 100644 +--- a/specs/d3d8caps.py ++++ b/specs/d3d8caps.py +@@ -25,8 +25,8 @@ + + """d3d8caps.h""" + +-from winapi import * +-from d3d8types import * ++from .winapi import * ++from .d3d8types import * + + D3DCAPS = Flags(DWORD, [ + "D3DCAPS_READ_SCANLINE", +diff --git a/specs/d3d8types.py b/specs/d3d8types.py +index fe58a0cd..a2482328 100644 +--- a/specs/d3d8types.py ++++ b/specs/d3d8types.py +@@ -25,7 +25,7 @@ + + """d3d8types.h""" + +-from winapi import * ++from .winapi import * + + D3DCOLOR = Alias("D3DCOLOR", DWORD) + +diff --git a/specs/d3d9.py b/specs/d3d9.py +index 21015149..68dcaca2 100644 +--- a/specs/d3d9.py ++++ b/specs/d3d9.py +@@ -25,9 +25,9 @@ + + """d3d9.h""" + +-from winapi import * +-from d3d9types import * +-from d3d9caps import * ++from .winapi import * ++from .d3d9types import * ++from .d3d9caps import * + + + D3DSHADER9 = Blob(Const(DWORD), "_shaderSize(pFunction)") +diff --git a/specs/d3d9caps.py b/specs/d3d9caps.py +index b3582879..541263b6 100644 +--- a/specs/d3d9caps.py ++++ b/specs/d3d9caps.py +@@ -25,8 +25,8 @@ + + """d3d9caps.h""" + +-from winapi import * +-from d3d9types import * ++from .winapi import * ++from .d3d9types import * + + D3DVS20CAPS = Flags(DWORD, [ + "D3DVS20CAPS_PREDICATION", +diff --git a/specs/d3d9types.py b/specs/d3d9types.py +index 2545a767..c9847030 100644 +--- a/specs/d3d9types.py ++++ b/specs/d3d9types.py +@@ -26,7 +26,7 @@ + + """d3d9types.h""" + +-from winapi import * ++from .winapi import * + + D3DCOLOR = Alias("D3DCOLOR", DWORD) + +diff --git a/specs/d3dcaps.py b/specs/d3dcaps.py +index 0fa9f1cc..88725067 100644 +--- a/specs/d3dcaps.py ++++ b/specs/d3dcaps.py +@@ -25,8 +25,8 @@ + + """d3dcaps.h""" + +-from winapi import * +-from d3dtypes import * ++from .winapi import * ++from .d3dtypes import * + + D3DTRANSFORMCAPS = Flags(DWORD, [ + "D3DTRANSFORMCAPS_CLIP", +diff --git a/specs/d3dtypes.py b/specs/d3dtypes.py +index e1507975..ba460022 100644 +--- a/specs/d3dtypes.py ++++ b/specs/d3dtypes.py +@@ -25,7 +25,7 @@ + + """d3dtypes.h""" + +-from winapi import * ++from .winapi import * + + D3DVALUE = Float + LPD3DVALUE = Pointer(D3DVALUE) +diff --git a/specs/dcommon.py b/specs/dcommon.py +index 21659a5e..6324db3a 100644 +--- a/specs/dcommon.py ++++ b/specs/dcommon.py +@@ -24,7 +24,7 @@ + ##########################################################################/ + + +-from winapi import * ++from .winapi import * + + + DWRITE_MEASURING_MODE = Enum("DWRITE_MEASURING_MODE", [ +diff --git a/specs/dcomp.py b/specs/dcomp.py +new file mode 100644 +index 00000000..b139a89e +--- /dev/null ++++ b/specs/dcomp.py +@@ -0,0 +1,303 @@ ++########################################################################## ++# ++# Copyright 2009-2016 VMware, Inc. ++# All Rights Reserved. ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to deal ++# in the Software without restriction, including without limitation the rights ++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++# copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++# THE SOFTWARE. ++# ++##########################################################################/ ++ ++ ++from .dxgi import * ++from .d2d1 import D2D_MATRIX_3X2_F, D2D_RECT_F ++from .d3d9types import D3DMATRIX ++from .d2d1 import D2D1_COMPOSITE_MODE ++ ++DCOMPOSITION_BITMAP_INTERPOLATION_MODE = Enum('DCOMPOSITION_BITMAP_INTERPOLATION_MODE', [ ++ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR', ++ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_LINEAR', ++ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_INHERIT', ++]) ++ ++DCOMPOSITION_BORDER_MODE = Enum('DCOMPOSITION_BORDER_MODE', [ ++ 'DCOMPOSITION_BORDER_MODE_SOFT', ++ 'DCOMPOSITION_BORDER_MODE_HARD', ++ 'DCOMPOSITION_BORDER_MODE_INHERIT', ++]) ++ ++DCOMPOSITION_COMPOSITE_MODE = Enum('DCOMPOSITION_COMPOSITE_MODE', [ ++ 'DCOMPOSITION_COMPOSITE_MODE_SOURCE_OVER', ++ 'DCOMPOSITION_COMPOSITE_MODE_DESTINATION_INVERT', ++ 'DCOMPOSITION_COMPOSITE_MODE_INHERIT', ++]) ++ ++DCOMPOSITION_FRAME_STATISTICS = Struct('DCOMPOSITION_FRAME_STATISTICS', [ ++ (LARGE_INTEGER, 'lastFrameTime'), ++ (DXGI_RATIONAL, 'currentCompositionRate'), ++ (LARGE_INTEGER, 'currentTime'), ++ (LARGE_INTEGER, 'timeFrequency'), ++ (LARGE_INTEGER, 'nextEstimatedFrameTime'), ++]) ++ ++COMPOSITIONOBJECT = Flags(DWORD, [ ++ 'COMPOSITIONOBJECT_ALL_ACCESS', # 0x0003 ++ 'COMPOSITIONOBJECT_READ', # 0x0001 ++ 'COMPOSITIONOBJECT_WRITE', # 0x0002 ++]) ++ ++IDCompositionAnimation = Interface('IDCompositionAnimation', IUnknown) ++IDCompositionDevice = Interface('IDCompositionDevice', IUnknown) ++IDCompositionTarget = Interface('IDCompositionTarget', IUnknown) ++IDCompositionVisual = Interface('IDCompositionVisual', IUnknown) ++IDCompositionEffect = Interface('IDCompositionEffect', IUnknown) ++IDCompositionEffectGroup = Interface('IDCompositionEffectGroup', IDCompositionEffect) ++IDCompositionTransform3D = Interface('IDCompositionTransform3D', IDCompositionEffect) ++IDCompositionTransform = Interface('IDCompositionTransform', IDCompositionTransform3D) ++IDCompositionTranslateTransform = Interface('IDCompositionTranslateTransform', IDCompositionTransform) ++IDCompositionTranslateTransform3D = Interface('IDCompositionTranslateTransform3D', IDCompositionTransform3D) ++IDCompositionScaleTransform = Interface('IDCompositionScaleTransform', IDCompositionTransform) ++IDCompositionScaleTransform3D = Interface('IDCompositionScaleTransform3D', IDCompositionTransform3D) ++IDCompositionRotateTransform = Interface('IDCompositionRotateTransform', IDCompositionTransform) ++IDCompositionRotateTransform3D = Interface('IDCompositionRotateTransform3D', IDCompositionTransform3D) ++IDCompositionSkewTransform = Interface('IDCompositionSkewTransform', IDCompositionTransform) ++IDCompositionMatrixTransform = Interface('IDCompositionMatrixTransform', IDCompositionTransform) ++IDCompositionMatrixTransform3D = Interface('IDCompositionMatrixTransform3D', IDCompositionTransform3D) ++IDCompositionClip = Interface('IDCompositionClip', IUnknown) ++IDCompositionRectangleClip = Interface('IDCompositionRectangleClip', IDCompositionClip) ++IDCompositionSurface = Interface('IDCompositionSurface', IUnknown) ++IDCompositionVirtualSurface = Interface('IDCompositionVirtualSurface', IDCompositionSurface) ++ ++IDCompositionAnimation.methods += [ ++ StdMethod(HRESULT, 'Reset', []), ++ StdMethod(HRESULT, 'SetAbsoluteBeginTime', [(LARGE_INTEGER, 'beginTime')]), ++ StdMethod(HRESULT, 'AddCubic', [(Double, 'beginOffset'), (Float, 'constantCoefficient'), (Float, 'linearCoefficient'), (Float, 'quadraticCoefficient'), (Float, 'cubicCoefficient')]), ++ StdMethod(HRESULT, 'AddSinusoidal', [(Double, 'beginOffset'), (Float, 'bias'), (Float, 'amplitude'), (Float, 'frequency'), (Float, 'phase')]), ++ StdMethod(HRESULT, 'AddRepeat', [(Double, 'beginOffset'), (Double, 'durationToRepeat')]), ++ StdMethod(HRESULT, 'End', [(Double, 'endOffset'), (Float, 'endValue')]), ++] ++ ++IDCompositionDevice.methods += [ ++ StdMethod(HRESULT, 'Commit', []), ++ StdMethod(HRESULT, 'WaitForCommitCompletion', []), ++ StdMethod(HRESULT, 'GetFrameStatistics', [Out(Pointer(DCOMPOSITION_FRAME_STATISTICS), 'statistics')]), ++ StdMethod(HRESULT, 'CreateTargetForHwnd', [(HWND, 'hwnd'), (BOOL, 'topmost'), Out(Pointer(ObjPointer(IDCompositionTarget)), 'target')]), ++ StdMethod(HRESULT, 'CreateVisual', [Out(Pointer(ObjPointer(IDCompositionVisual)), 'visual')]), ++ StdMethod(HRESULT, 'CreateSurface', [(UINT, 'width'), (UINT, 'height'), (DXGI_FORMAT, 'pixelFormat'), (DXGI_ALPHA_MODE, 'alphaMode'), Out(Pointer(ObjPointer(IDCompositionSurface)), 'surface')]), ++ StdMethod(HRESULT, 'CreateVirtualSurface', [(UINT, 'initialWidth'), (UINT, 'initialHeight'), (DXGI_FORMAT, 'pixelFormat'), (DXGI_ALPHA_MODE, 'alphaMode'), Out(Pointer(ObjPointer(IDCompositionVirtualSurface)), 'virtualSurface')]), ++ StdMethod(HRESULT, 'CreateSurfaceFromHandle', [(HANDLE, 'handle'), Out(Pointer(ObjPointer(IUnknown)), 'surface')]), ++ StdMethod(HRESULT, 'CreateSurfaceFromHwnd', [(HWND, 'hwnd'), Out(Pointer(ObjPointer(IUnknown)), 'surface')]), ++ StdMethod(HRESULT, 'CreateTranslateTransform', [Out(Pointer(ObjPointer(IDCompositionTranslateTransform)), 'translateTransform')]), ++ StdMethod(HRESULT, 'CreateScaleTransform', [Out(Pointer(ObjPointer(IDCompositionScaleTransform)), 'scaleTransform')]), ++ StdMethod(HRESULT, 'CreateRotateTransform', [Out(Pointer(ObjPointer(IDCompositionRotateTransform)), 'rotateTransform')]), ++ StdMethod(HRESULT, 'CreateSkewTransform', [Out(Pointer(ObjPointer(IDCompositionSkewTransform)), 'skewTransform')]), ++ StdMethod(HRESULT, 'CreateMatrixTransform', [Out(Pointer(ObjPointer(IDCompositionMatrixTransform)), 'matrixTransform')]), ++ StdMethod(HRESULT, 'CreateTransformGroup', [(Array(ObjPointer(IDCompositionTransform), 'elements'), 'transforms'), (UINT, 'elements'), Out(Pointer(ObjPointer(IDCompositionTransform)), 'transformGroup')]), ++ StdMethod(HRESULT, 'CreateTranslateTransform3D', [Out(Pointer(ObjPointer(IDCompositionTranslateTransform3D)), 'translateTransform3D')]), ++ StdMethod(HRESULT, 'CreateScaleTransform3D', [Out(Pointer(ObjPointer(IDCompositionScaleTransform3D)), 'scaleTransform3D')]), ++ StdMethod(HRESULT, 'CreateRotateTransform3D', [Out(Pointer(ObjPointer(IDCompositionRotateTransform3D)), 'rotateTransform3D')]), ++ StdMethod(HRESULT, 'CreateMatrixTransform3D', [Out(Pointer(ObjPointer(IDCompositionMatrixTransform3D)), 'matrixTransform3D')]), ++ StdMethod(HRESULT, 'CreateTransform3DGroup', [(Array(ObjPointer(IDCompositionTransform3D), 'elements'), 'transforms3D'), (UINT, 'elements'), Out(Pointer(ObjPointer(IDCompositionTransform3D)), 'transform3DGroup')]), ++ StdMethod(HRESULT, 'CreateEffectGroup', [Out(Pointer(ObjPointer(IDCompositionEffectGroup)), 'effectGroup')]), ++ StdMethod(HRESULT, 'CreateRectangleClip', [Out(Pointer(ObjPointer(IDCompositionRectangleClip)), 'clip')]), ++ StdMethod(HRESULT, 'CreateAnimation', [Out(Pointer(ObjPointer(IDCompositionAnimation)), 'animation')]), ++ StdMethod(HRESULT, 'CheckDeviceState', [Out(Pointer(BOOL), 'pfValid')]), ++] ++ ++IDCompositionTarget.methods += [ ++ StdMethod(HRESULT, 'SetRoot', [(ObjPointer(IDCompositionVisual), 'visual')]), ++] ++ ++IDCompositionVisual.methods += [ ++ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTransform', [(Reference(Const(D2D_MATRIX_3X2_F)), 'matrix')], overloaded=True), ++ StdMethod(HRESULT, 'SetTransform', [(ObjPointer(IDCompositionTransform), 'transform')], overloaded=True), ++ StdMethod(HRESULT, 'SetTransformParent', [(ObjPointer(IDCompositionVisual), 'visual')]), ++ StdMethod(HRESULT, 'SetEffect', [(ObjPointer(IDCompositionEffect), 'effect')]), ++ StdMethod(HRESULT, 'SetBitmapInterpolationMode', [(DCOMPOSITION_BITMAP_INTERPOLATION_MODE, 'interpolationMode')]), ++ StdMethod(HRESULT, 'SetBorderMode', [(DCOMPOSITION_BORDER_MODE, 'borderMode')]), ++ StdMethod(HRESULT, 'SetClip', [(Reference(Const(D2D_RECT_F)), 'rect')], overloaded=True), ++ StdMethod(HRESULT, 'SetClip', [(ObjPointer(IDCompositionClip), 'clip')], overloaded=True), ++ StdMethod(HRESULT, 'SetContent', [(ObjPointer(IUnknown), 'content')]), ++ StdMethod(HRESULT, 'AddVisual', [(ObjPointer(IDCompositionVisual), 'visual'), (BOOL, 'insertAbove'), (ObjPointer(IDCompositionVisual), 'referenceVisual')]), ++ StdMethod(HRESULT, 'RemoveVisual', [(ObjPointer(IDCompositionVisual), 'visual')]), ++ StdMethod(HRESULT, 'RemoveAllVisuals', []), ++ StdMethod(HRESULT, 'SetCompositeMode', [(DCOMPOSITION_COMPOSITE_MODE, 'compositeMode')]), ++] ++ ++IDCompositionTransform.methods += [ ++] ++ ++IDCompositionTransform3D.methods += [ ++] ++ ++IDCompositionTranslateTransform.methods += [ ++ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionTranslateTransform3D.methods += [ ++ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetZ', [(Float, 'offsetZ')], overloaded=True), ++ StdMethod(HRESULT, 'SetOffsetZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionScaleTransform.methods += [ ++ StdMethod(HRESULT, 'SetScaleX', [(Float, 'scaleX')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleY', [(Float, 'scaleY')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionScaleTransform3D.methods += [ ++ StdMethod(HRESULT, 'SetScaleX', [(Float, 'scaleX')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleY', [(Float, 'scaleY')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleZ', [(Float, 'scaleZ')], overloaded=True), ++ StdMethod(HRESULT, 'SetScaleZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterZ', [(Float, 'centerZ')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionRotateTransform.methods += [ ++ StdMethod(HRESULT, 'SetAngle', [(Float, 'angle')], overloaded=True), ++ StdMethod(HRESULT, 'SetAngle', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionRotateTransform3D.methods += [ ++ StdMethod(HRESULT, 'SetAngle', [(Float, 'angle')], overloaded=True), ++ StdMethod(HRESULT, 'SetAngle', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisX', [(Float, 'axisX')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisY', [(Float, 'axisY')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisZ', [(Float, 'axisZ')], overloaded=True), ++ StdMethod(HRESULT, 'SetAxisZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterZ', [(Float, 'centerZ')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionSkewTransform.methods += [ ++ StdMethod(HRESULT, 'SetAngleX', [(Float, 'angleX')], overloaded=True), ++ StdMethod(HRESULT, 'SetAngleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetAngleY', [(Float, 'angleY')], overloaded=True), ++ StdMethod(HRESULT, 'SetAngleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True), ++ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionMatrixTransform.methods += [ ++ StdMethod(HRESULT, 'SetMatrix', [(Reference(Const(D2D_MATRIX_3X2_F)), 'matrix')]), ++ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (Float, 'value')], overloaded=True), ++ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionMatrixTransform3D.methods += [ ++ StdMethod(HRESULT, 'SetMatrix', [(Reference(Const(D3DMATRIX)), 'matrix')]), ++ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (Float, 'value')], overloaded=True), ++ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionEffect.methods += [ ++] ++ ++IDCompositionEffectGroup.methods += [ ++ StdMethod(HRESULT, 'SetOpacity', [(Float, 'opacity')], overloaded=True), ++ StdMethod(HRESULT, 'SetOpacity', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTransform3D', [(ObjPointer(IDCompositionTransform3D), 'transform3D')]), ++] ++ ++IDCompositionClip.methods += [ ++] ++ ++IDCompositionRectangleClip.methods += [ ++ StdMethod(HRESULT, 'SetLeft', [(Float, 'left')], overloaded=True), ++ StdMethod(HRESULT, 'SetLeft', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTop', [(Float, 'top')], overloaded=True), ++ StdMethod(HRESULT, 'SetTop', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetRight', [(Float, 'right')], overloaded=True), ++ StdMethod(HRESULT, 'SetRight', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottom', [(Float, 'bottom')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottom', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopLeftRadiusX', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopLeftRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopLeftRadiusY', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopLeftRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopRightRadiusX', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopRightRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopRightRadiusY', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetTopRightRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomLeftRadiusX', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomLeftRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomLeftRadiusY', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomLeftRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomRightRadiusX', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomRightRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomRightRadiusY', [(Float, 'radius')], overloaded=True), ++ StdMethod(HRESULT, 'SetBottomRightRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True), ++] ++ ++IDCompositionSurface.methods += [ ++ # XXX: riid might be ID2D1DeviceContext ++ StdMethod(HRESULT, 'BeginDraw', [(Pointer(Const(RECT)), 'updateRect'), (REFIID, 'iid'), Out(Pointer(ObjPointer(Void)), 'updateObject'), Out(Pointer(POINT), 'updateOffset')]), ++ StdMethod(HRESULT, 'EndDraw', []), ++ StdMethod(HRESULT, 'SuspendDraw', []), ++ StdMethod(HRESULT, 'ResumeDraw', []), ++ StdMethod(HRESULT, 'Scroll', [(Pointer(Const(RECT)), 'scrollRect'), (Pointer(Const(RECT)), 'clipRect'), (Int, 'offsetX'), (Int, 'offsetY')]), ++] ++ ++IDCompositionVirtualSurface.methods += [ ++ StdMethod(HRESULT, 'Resize', [(UINT, 'width'), (UINT, 'height')]), ++ StdMethod(HRESULT, 'Trim', [(Array(Const(RECT), 'count'), 'rectangles'), (UINT, 'count')]), ++] ++ ++dcomp = Module('dcomp') ++dcomp.addFunctions([ ++ StdFunction(HRESULT, 'DCompositionCreateDevice', [(ObjPointer(IDXGIDevice), 'dxgiDevice'), (REFIID, 'iid'), Out(Pointer(ObjPointer(Void)), 'dcompositionDevice')]), ++ StdFunction(HRESULT, 'DCompositionCreateSurfaceHandle', [(COMPOSITIONOBJECT, 'desiredAccess'), (Pointer(SECURITY_ATTRIBUTES), 'securityAttributes'), Out(Pointer(HANDLE), 'surfaceHandle')]), ++]) ++dcomp.addInterfaces([ ++ IDCompositionDevice, ++]) +diff --git a/specs/ddraw.py b/specs/ddraw.py +index 99f542fe..5df48be0 100644 +--- a/specs/ddraw.py ++++ b/specs/ddraw.py +@@ -25,7 +25,7 @@ + + """ddraw.h""" + +-from winapi import * ++from .winapi import * + + DirectDrawOptSurfaceDescFlags = Flags(DWORD, [ + "DDOSD_GUID", +diff --git a/specs/debug.py b/specs/debug.py +index 0a004741..6ef80f64 100644 +--- a/specs/debug.py ++++ b/specs/debug.py +@@ -49,7 +49,7 @@ def excepthook(type, value, tb): + import traceback, pdb + # we are NOT in interactive mode, print the exception... + traceback.print_exception(type, value, tb) +- print ++ print() + # ...then start the debugger in post-mortem mode. + pdb.pm() + +diff --git a/specs/dwrite.py b/specs/dwrite.py +index 60e5034c..be273f81 100644 +--- a/specs/dwrite.py ++++ b/specs/dwrite.py +@@ -24,8 +24,8 @@ + ##########################################################################/ + + +-from winapi import * +-from dcommon import * ++from .winapi import * ++from .dcommon import * + + + ID2D1SimplifiedGeometrySink = Interface("ID2D1SimplifiedGeometrySink", IUnknown) +diff --git a/specs/dxgi.py b/specs/dxgi.py +index 0e880548..040f3bc4 100644 +--- a/specs/dxgi.py ++++ b/specs/dxgi.py +@@ -25,7 +25,7 @@ + ##########################################################################/ + + +-from winapi import * ++from .winapi import * + + + DXGI_FORMAT = Enum("DXGI_FORMAT", [ +diff --git a/specs/dxva2.py b/specs/dxva2.py +index 3936afac..65f5f0c0 100644 +--- a/specs/dxva2.py ++++ b/specs/dxva2.py +@@ -24,7 +24,7 @@ + ##########################################################################/ + + +-from d3d9 import * ++from .d3d9 import * + + + HRESULT = MAKE_HRESULT(errors = [ +diff --git a/specs/eglapi.py b/specs/eglapi.py +index 8379e45e..e1edff06 100644 +--- a/specs/eglapi.py ++++ b/specs/eglapi.py +@@ -26,9 +26,9 @@ + """EGL API description.""" + + +-from stdapi import * +-from gltypes import * +-from eglenum import * ++from .stdapi import * ++from .gltypes import * ++from .eglenum import * + + EGLNativeDisplayType = Opaque("EGLNativeDisplayType") + EGLNativeWindowType = Opaque("EGLNativeWindowType") +diff --git a/specs/eglenum.py b/specs/eglenum.py +index 8b10868d..e6290fb2 100644 +--- a/specs/eglenum.py ++++ b/specs/eglenum.py +@@ -28,7 +28,7 @@ + """EGL enum description""" + + +-from stdapi import * ++from .stdapi import * + + # Most of the following content was produced in a semi-automated fashion by + # the scripts/eglenum.sed sed script. +diff --git a/specs/glapi.py b/specs/glapi.py +index c0e92b3c..8d20052e 100644 +--- a/specs/glapi.py ++++ b/specs/glapi.py +@@ -34,9 +34,9 @@ corner cases correctly. + """ + + +-from stdapi import * +-from gltypes import * +-import glparams ++from .stdapi import * ++from .gltypes import * ++from . import glparams + + + def GlFunction(*args, **kwargs): +diff --git a/specs/glparams.py b/specs/glparams.py +index 1bed8a6b..5a036975 100644 +--- a/specs/glparams.py ++++ b/specs/glparams.py +@@ -27,9 +27,9 @@ + '''Describe GL parameters.''' + + +-from stdapi import * ++from .stdapi import * + +-from gltypes import * ++from .gltypes import * + + + # Shorthands for the types +diff --git a/specs/gltypes.py b/specs/gltypes.py +index a9ffc4a1..631eb868 100644 +--- a/specs/gltypes.py ++++ b/specs/gltypes.py +@@ -29,7 +29,7 @@ + + import platform + +-from stdapi import * ++from .stdapi import * + + + GLboolean = Enum("GLboolean", [ +diff --git a/specs/glxapi.py b/specs/glxapi.py +index 0d3cd969..f4182799 100644 +--- a/specs/glxapi.py ++++ b/specs/glxapi.py +@@ -26,8 +26,8 @@ + """GLX API description.""" + + +-from stdapi import * +-from glapi import * ++from .stdapi import * ++from .glapi import * + + VisualID = Alias("VisualID", UInt32) + Display = Opaque("Display *") +diff --git a/specs/scripts/c2api.py b/specs/scripts/c2api.py +index 7deb2955..b8aaa81d 100755 +--- a/specs/scripts/c2api.py ++++ b/specs/scripts/c2api.py +@@ -122,7 +122,7 @@ class DeclParser: + self.consume() + type = 'Pointer(%s)' % type + name = self.consume() +- print '%s = Alias("%s", %s)' % (name, name, type) ++ print('%s = Alias("%s", %s)' % (name, name, type)) + if self.match(','): + self.consume() + else: +@@ -136,7 +136,7 @@ class DeclParser: + name = self.consume() + self.consume('{') + +- print '%s = Enum("%s", [' % (name, name) ++ print('%s = Enum("%s", [' % (name, name)) + + #value = 0 + while self.lookahead() != '}': +@@ -148,12 +148,12 @@ class DeclParser: + self.consume(',') + tags = self.parse_tags() + #print ' "%s",\t# %s' % (name, value) +- print ' "%s",' % (name,) ++ print(' "%s",' % (name,)) + #value += 1 + self.consume('}') + +- print '])' +- print ++ print('])') ++ print() + + def parse_value(self, ref_token, constructor): + self.consume(ref_token) +@@ -161,14 +161,14 @@ class DeclParser: + name = self.consume() + self.consume('{') + +- print '%s = %s(%s, [' % (name, constructor, type) ++ print('%s = %s(%s, [' % (name, constructor, type)) + + while self.lookahead() != '}': + name, value = self.parse_define() + self.consume('}') + +- print '])' +- print ++ print('])') ++ print() + + def parse_define(self): + self.consume('#') +@@ -176,18 +176,18 @@ class DeclParser: + name = self.consume() + value = self.consume() + #print ' "%s",\t# %s' % (name, value) +- print ' "%s",' % (name,) ++ print(' "%s",' % (name,)) + return name, value + + def parse_struct(self): + self.consume('struct') + name = self.consume() + +- print '%s = Struct("%s", [' % (name, name) ++ print('%s = Struct("%s", [' % (name, name)) + for type, name in self.parse_members(): +- print ' (%s, "%s"),' % (type, name) +- print '])' +- print ++ print(' (%s, "%s"),' % (type, name)) ++ print('])') ++ print() + + def parse_union(self): + self.consume('union') +@@ -226,8 +226,8 @@ class DeclParser: + base = self.consume() + self.consume('{') + +- print '%s = Interface("%s", %s)' % (name, name, base) +- print '%s.methods += [' % (name,) ++ print('%s = Interface("%s", %s)' % (name, name, base)) ++ print('%s.methods += [' % (name,)) + + while self.lookahead() != '}': + if self.lookahead() in ('public', 'private'): +@@ -238,8 +238,8 @@ class DeclParser: + self.consume(';') + self.consume('}') + +- print ']' +- print ++ print(']') ++ print() + + def parse_prototype(self, creator = 'Function'): + if self.match('extern', 'virtual'): +@@ -275,7 +275,7 @@ class DeclParser: + self.consume() + self.consume('0') + +- print ' %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra) ++ print(' %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra)) + + def parse_arg(self): + tags = self.parse_tags() +@@ -404,8 +404,8 @@ class DeclParser: + type = 'S' + type + elif short: + type = 'Short' +- elif long: +- type = 'Long' * long ++ elif int: ++ type = 'Long' * int + else: + type = 'Int' + if unsigned: +diff --git a/specs/scripts/cxx2api.py b/specs/scripts/cxx2api.py +new file mode 100755 +index 00000000..9720615d +--- /dev/null ++++ b/specs/scripts/cxx2api.py +@@ -0,0 +1,488 @@ ++#!/usr/bin/env python ++ ++ ++ ++copyright = ''' ++########################################################################## ++# ++# Copyright 2009-2016 VMware, Inc. ++# All Rights Reserved. ++# ++# Permission is hereby granted, free of charge, to any person obtaining a copy ++# of this software and associated documentation files (the "Software"), to deal ++# in the Software without restriction, including without limitation the rights ++# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++# copies of the Software, and to permit persons to whom the Software is ++# furnished to do so, subject to the following conditions: ++# ++# The above copyright notice and this permission notice shall be included in ++# all copies or substantial portions of the Software. ++# ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++# THE SOFTWARE. ++# ++##########################################################################/ ++''' ++ ++ ++# ++# Generates API specs from headers using castxml/pygccxml. ++# ++# Usage: ++# ++# sudo apt-get install castxml mingw-w64-i686-dev ++# pip install 'pygccxml==1.9.1' ++# python specs/scripts/cxx2api.py -Idxsdk/Include -DD2D_USE_C_DEFINITIONS dcomp.h dcomptypes.h dcompanimation.h ++# ++# See also: ++# - http://pygccxml.readthedocs.org/en/develop/index.html ++# - https://github.com/CastXML/CastXML/blob/master/doc/manual/castxml.1.rst ++# ++ ++import os.path ++import sys ++import io as StringIO ++import subprocess ++ ++from pygccxml import utils ++from pygccxml import parser ++from pygccxml import declarations ++ ++from pygccxml.declarations import algorithm ++from pygccxml.declarations import decl_visitor ++from pygccxml.declarations import type_traits ++from pygccxml.declarations import type_visitor ++ ++ ++class decl_dumper_t(decl_visitor.decl_visitor_t): ++ ++ def __init__(self, decl = None): ++ decl_visitor.decl_visitor_t.__init__(self) ++ self.decl = decl ++ self.result = None ++ ++ def clone(self): ++ return decl_dumper_t(self.decl) ++ ++ def visit_class(self): ++ class_ = self.decl ++ assert class_.class_type in ('struct', 'union') ++ self.result = class_.name ++ ++ def visit_class_declaration(self): ++ class_ = self.decl ++ self.result = class_.name ++ ++ def visit_typedef(self): ++ typedef = self.decl ++ self.result = typedef.name ++ ++ def visit_enumeration(self): ++ self.result = self.decl.name ++ ++ ++def dump_decl(decl): ++ visitor = decl_dumper_t(decl) ++ algorithm.apply_visitor(visitor, decl) ++ return visitor.result ++ ++ ++class type_dumper_t(type_visitor.type_visitor_t): ++ ++ def __init__(self, type): ++ type_visitor.type_visitor_t.__init__(self) ++ self.type = type ++ self.result = None ++ ++ def clone(self): ++ return type_dumper_t(self.type) ++ ++ def visit_void(self): ++ self.result = 'Void' ++ ++ def visit_char(self): ++ self.result = 'Char' ++ ++ def visit_unsigned_char(self): ++ self.result = 'UChar' ++ ++ def visit_signed_char(self): ++ self.result = 'SChar' ++ ++ def visit_wchar(self): ++ raise NotImplementedError ++ ++ def visit_short_int(self): ++ self.result = 'Short' ++ ++ def visit_short_unsigned_int(self): ++ self.result = 'UShort' ++ ++ def visit_bool(self): ++ raise NotImplementedError ++ ++ def visit_int(self): ++ self.result = 'Int' ++ ++ def visit_unsigned_int(self): ++ self.result = 'UInt' ++ ++ def visit_long_int(self): ++ self.result = 'Long' ++ ++ def visit_long_unsigned_int(self): ++ self.result = 'ULong' ++ ++ def visit_long_long_int(self): ++ self.result = 'LongLong' ++ ++ def visit_long_long_unsigned_int(self): ++ self.result = 'ULongLong' ++ ++ def visit_float(self): ++ self.result = "Float" ++ ++ def visit_double(self): ++ self.result = "Double" ++ ++ def visit_array(self): ++ base_type = dump_type(self.type.base) ++ length = self.type.size ++ try: ++ int(length) ++ except ValueError: ++ length = '"%s"' % length ++ self.result = 'Array(%s, %s)' % (base_type, length) ++ ++ def visit_pointer(self): ++ base_type = dump_type(self.type.base) ++ # TODO: Use ObjPointer where appropriate ++ #if isinstance(self.type.base, declarations.cpptypes.declarated_t): ++ # decl = self.type.base.declaration ++ # if isinstance(decl, declarations.typedef.typedef_t): ++ # print(decl.type, type(decl.type)) ++ # if isinstance(decl, declarations.class_declaration.class_t): ++ # if decl.public_members: ++ # self.result = 'ObjPointer(%s)' % decl.name ++ # return ++ # if isinstance(decl, declarations.class_declaration.class_declaration_t): ++ # if decl.public_members: ++ # self.result = 'ObjPointer(%s)' % decl.name ++ # return ++ if base_type.startswith('IDComposition') or \ ++ base_type.startswith('IDXGI') or \ ++ base_type == 'IUnknown': ++ self.result = 'ObjPointer(%s)' % base_type ++ return ++ self.result = 'Pointer(%s)' % base_type ++ ++ def visit_reference(self): ++ base_type = dump_type(self.type.base) ++ if base_type == 'Const(IID)': ++ self.result = 'REFIID' ++ elif base_type == 'Const(GUID)': ++ self.result = 'REFGUID' ++ else: ++ self.result = 'Reference(%s)' % base_type ++ ++ def visit_const(self): ++ self.result = 'Const(%s)' % dump_type(self.type.base) ++ ++ def visit_declarated(self): ++ decl = self.type.declaration ++ self.result = dump_decl(decl) ++ ++ def visit_free_function_type(self): ++ self.result = 'Opaque("%s")' % self.type ++ ++ ++def dump_type(type): ++ visitor = type_dumper_t(type) ++ algorithm.apply_visitor(visitor, type) ++ # XXX: RECT becomes tagRECT somehow ++ if visitor.result == 'tagRECT': ++ return 'RECT' ++ return visitor.result ++ ++ ++def is_interface(class_): ++ if not class_.name.startswith('I'): ++ return ++ if len(class_.bases) != 1: ++ return False ++ # TODO: Ensure interface derives from IUnknown ++ return True ++ ++ ++class decl2_dumper_t(decl_visitor.decl_visitor_t): ++ ++ def __init__(self, name): ++ decl_visitor.decl_visitor_t.__init__(self) ++ ++ self.name = name ++ ++ # The current declaration ++ self.decl = None ++ ++ self.interfaces = StringIO.StringIO() ++ self.methods = StringIO.StringIO() ++ self.functions = StringIO.StringIO() ++ ++ def start(self): ++ print(copyright.strip()) ++ print() ++ print() ++ print(r'from winapi import *') ++ print() ++ ++ def finish(self): ++ sys.stdout.write(self.interfaces.getvalue()) ++ sys.stdout.write('\n') ++ sys.stdout.write(self.methods.getvalue()) ++ ++ name = self.name ++ sys.stdout.write('%s = Module(%r)\n' % (name, name)) ++ sys.stdout.write('%s.addFunctions([\n' % (name,)) ++ sys.stdout.write(self.functions.getvalue()) ++ sys.stdout.write('])\n\n') ++ ++ def clone(self): ++ return decl_dumper_t(self.decl) ++ ++ def visit_class(self): ++ class_ = self.decl ++ assert class_.class_type in ('struct', 'union') ++ ++ if is_interface(class_): ++ self.visit_interface() ++ elif class_.name != '': ++ self.visit_struct(class_.name, class_) ++ ++ def visit_struct(self, decl_name, decl): ++ struct = decl ++ print(r'%s = Struct(%r, [' % (decl_name, decl_name)) ++ for variable in struct.variables(allow_empty=True): ++ var_type = dump_type(variable.decl_type) ++ print(r' (%s, %r),' % (var_type, variable.name)) ++ print(r'])') ++ print() ++ ++ def visit_interface(self): ++ class_ = self.decl ++ assert len(class_.bases) == 1 ++ base = class_.bases[0] ++ ++ s = self.interfaces ++ s.write('%s = Interface(%r, %s)\n' % (class_.name, class_.name, base.related_class.name)) ++ ++ s = self.methods ++ s.write('%s.methods += [\n' % (class_.name,)) ++ for member in class_.public_members: ++ if member.virtuality != 'pure virtual': ++ continue ++ ret_type = dump_type(member.return_type) ++ arg_types = self.convert_args(member.arguments) ++ s.write(' StdMethod(%s, %r, [%s]),\n' % (ret_type, member.name, arg_types)) ++ s.write(']\n\n') ++ ++ def convert_args(self, args): ++ # TODO: use __attribute__ ((annotate ("out"))) ++ # See also: ++ # - https://github.com/CastXML/CastXML/issues/25 ++ # XXX: Requires a castxml version newer than the one in Ubuntu 15.10 ++ arg_types = [] ++ for arg in args: ++ if arg.attributes is not None: ++ sys.stderr.write('warning: found %s attribute %r\n' % (arg.name, arg.attributes)) ++ res_arg_type = dump_type(arg.decl_type) ++ res_arg = '(%s, %r)' % (res_arg_type, arg.name) ++ ++ # Infer output arguments ++ if res_arg_type.startswith('Pointer(') and \ ++ not res_arg_type.startswith('Pointer(Const('): ++ res_arg = 'Out' + res_arg ++ ++ arg_types.append(res_arg) ++ ++ arg_types = ', '.join(arg_types) ++ return arg_types ++ ++ def visit_class_declaration(self): ++ pass ++ ++ def visit_typedef(self): ++ typedef = self.decl ++ base_type = dump_type(typedef.decl_type) ++ if base_type == typedef.name: ++ # Ignore `typedef struct Foo Foo;` ++ return ++ if base_type == '': ++ if isinstance(typedef.decl_type, declarations.cpptypes.declarated_t): ++ base_decl = typedef.decl_type.declaration ++ self.visit_struct(typedef.name, base_decl) ++ return ++ print(r'%s = Alias(%r, %s)' % (typedef.name, typedef.name, base_type)) ++ print() ++ ++ def visit_enumeration(self): ++ enum = self.decl ++ print(r'%s = Enum(%r, [' % (enum.name, enum.name)) ++ for name, value in enum.values: ++ print(r' %r,' % (name,)) ++ print(r'])') ++ print() ++ ++ def visit_variable(self): ++ pass ++ ++ def visit_free_function(self): ++ function = self.decl ++ if function.has_inline: ++ return ++ ++ s = self.functions ++ ret_type = dump_type(function.return_type) ++ arg_types = self.convert_args(function.arguments) ++ s.write(' StdFunction(%s, %r, [%s]),\n' % (ret_type, function.name, arg_types)) ++ ++ def visit_free_operator(self): ++ pass ++ ++ ++def main(): ++ defines = [] ++ includes = [] ++ cxxflags = [ ++ '-Wno-unknown-attributes', ++ '-Wno-unused-value', ++ '-Wno-macro-redefined', ++ ] ++ compiler = 'g++' ++ ++ args = sys.argv[1:] ++ while args and args[0].startswith('-'): ++ arg = args.pop(0) ++ if arg.startswith('-I'): ++ include = arg[2:] ++ includes.append(include) ++ elif arg.startswith('-D'): ++ define = arg[2:] ++ defines.append(define) ++ else: ++ sys.stderr.write('error: unknown option %r\n' % arg) ++ sys.exit(1) ++ ++ winsdk = True ++ if winsdk: ++ # Set up Clang compiler flags to use MinGW runtime ++ # http://stackoverflow.com/a/19839946 ++ p = subprocess.Popen( ++ ["x86_64-w64-mingw32-g++", "-x", "c++", "-E", "-Wp,-v", '-', '-fsyntax-only'], ++ stdin=open(os.devnull, 'rt'), ++ stdout=open(os.devnull, 'wt'), ++ stderr=subprocess.PIPE) ++ includes.append('/usr/share/castxml/clang/include') ++ for line in p.stderr: ++ if line.startswith(' '): ++ include = line.strip() ++ if os.path.isdir(include): ++ if os.path.exists(os.path.join(include, 'ia32intrin.h')): ++ # XXX: We must use Clang's intrinsic headers ++ continue ++ includes.append(os.path.normpath(include)) ++ ++ winver = 0x0602 ++ ++ defines += [ ++ # emulate MinGW ++ '__MINGW32__', ++ '_WIN32', ++ '_WIN64', ++ '__declspec(x)=', ++ # Avoid namespace pollution when including windows.h ++ # http://support.microsoft.com/kb/166474 ++ 'WIN32_LEAN_AND_MEAN', ++ # Set Windows version to 8.1 ++ '_WIN32_WINNT=0x%04X' % winver, ++ 'WINVER=0x%04X' % winver, ++ 'NTDDI_VERSION=0x%04X0000' % winver, ++ # Prevent headers from requiring a rpcndr.h version beyond MinGW's ++ '__REQUIRED_RPCNDR_H_VERSION__=475', ++ # Avoid C++ helper classes ++ 'D3D10_NO_HELPERS', ++ 'D3D11_NO_HELPERS', ++ 'D3D11_VIDEO_NO_HELPERS', ++ ] ++ ++ # XXX: Change compiler? ++ #compiler = 'cl' ++ ++ # XXX: This doesn't seem to work well ++ cxxflags += [ ++ #'-m32', ++ #'-target', 'x86_64-pc-mingw32', ++ ] ++ ++ sys.stderr.write('Include path:\n') ++ for include in includes: ++ sys.stderr.write(' %s\n' % include) ++ sys.stderr.write('Definitions:\n') ++ for define in defines: ++ sys.stderr.write(' %s\n' % define) ++ ++ import logging ++ utils.loggers.set_level(logging.DEBUG) ++ ++ # Find the location of the xml generator (castxml or gccxml) ++ generator_path, generator_name = utils.find_xml_generator("castxml") ++ ++ # Configure the xml generator ++ config = parser.xml_generator_configuration_t( ++ xml_generator_path=generator_path, ++ xml_generator=generator_name, ++ define_symbols = defines, ++ include_paths = includes, ++ cflags = ' '.join(cxxflags), ++ compiler = compiler, ++ #keep_xml = True, ++ ) ++ ++ script_dir = os.path.dirname(__file__) ++ headers = [ ++ os.path.join(script_dir, '..', '..', 'compat', 'winsdk_compat.h'), ++ os.path.join(script_dir, 'cxx2api.h'), ++ ] ++ main_header = args[0] ++ headers.append(main_header) ++ ++ decls = parser.parse(headers, config, parser.COMPILATION_MODE.ALL_AT_ONCE) ++ global_ns = declarations.get_global_namespace(decls) ++ ++ def decl_filter(decl): ++ location = decl.location ++ if location is None: ++ return False ++ return os.path.basename(location.file_name) in list(map(os.path.basename, args)) ++ ++ module, _ = os.path.splitext(main_header) ++ visitor = decl2_dumper_t(module) ++ visitor.start() ++ for decl in global_ns.declarations: ++ if not decl_filter(decl): ++ continue ++ ++ if sys.stdout.isatty(): ++ print('# ' + str(decl)) ++ ++ visitor.decl = decl ++ algorithm.apply_visitor(visitor, decl) ++ visitor.finish() ++ ++ ++if __name__ == '__main__': ++ main() +diff --git a/specs/scripts/spec2api.py b/specs/scripts/spec2api.py +index f21b08d5..7fb395a4 100755 +--- a/specs/scripts/spec2api.py ++++ b/specs/scripts/spec2api.py +@@ -181,8 +181,8 @@ class SpecParser(LineParser): + category = self.prefix.upper() + '_' + category + if category != self.category: + if self.category is not None: +- print +- print ' # %s' % category ++ print() ++ print(' # %s' % category) + self.category = category + + if self.prefix == 'wgl': +@@ -190,7 +190,7 @@ class SpecParser(LineParser): + else: + constructor = 'GlFunction' + +- print ' %s(%s, "%s", [%s]%s),' % (constructor, ret_type, function_name, ', '.join(args), extra) ++ print(' %s(%s, "%s", [%s]%s),' % (constructor, ret_type, function_name, ', '.join(args), extra)) + + array_re = re.compile(r'^array\s+\[(.*)\]$') + +diff --git a/specs/scripts/txt2api.py b/specs/scripts/txt2api.py +index 6cd99dd9..e9469d3c 100755 +--- a/specs/scripts/txt2api.py ++++ b/specs/scripts/txt2api.py +@@ -31,7 +31,7 @@ + import sys + import re + import optparse +-from urllib2 import urlopen ++from urllib.request import urlopen + + + def stderr(x): +@@ -116,7 +116,7 @@ class TxtParser(LineParser): + self.consume() + line = self.consume() + self.parse_section(line) +- print ++ print() + + def parse_section(self, name): + if name == 'Name Strings': +@@ -136,7 +136,7 @@ class TxtParser(LineParser): + name = line.strip() + if name.startswith('EGL_'): + self.prefix = '' +- print ' # %s' % name ++ print(' # %s' % name) + + def skip_c_comments(self): + while not self.eof(): +@@ -192,7 +192,7 @@ class TxtParser(LineParser): + args.append(arg) + if self.tokens[0] == ',': + self.tokens.pop(0) +- print ' GlFunction(%s, "%s", [%s]%s),' % (ret, name, ', '.join(args), extra) ++ print(' GlFunction(%s, "%s", [%s]%s),' % (ret, name, ', '.join(args), extra)) + + def parse_arg(self): + type = self.parse_type() +diff --git a/specs/scripts/xml2api.py b/specs/scripts/xml2api.py +index e3820e09..f09fe0bf 100755 +--- a/specs/scripts/xml2api.py ++++ b/specs/scripts/xml2api.py +@@ -126,7 +126,7 @@ def processRequire(node, filterName): + + + def printPrototypes(prototypes, extensionName, functionNames, skip=set()): +- print ' # %s' % extensionName ++ print(' # %s' % extensionName) + + if extensionName == 'GL_EXT_direct_state_access': + functionNames.sort() +@@ -134,9 +134,9 @@ def printPrototypes(prototypes, extensionName, functionNames, skip=set()): + for functionName in functionNames: + if functionName not in skip: + prototype = prototypes[functionName] +- print ' %s,' % prototype ++ print(' %s,' % prototype) + +- print ++ print() + + + def main(): +diff --git a/specs/scripts/xml2enum.py b/specs/scripts/xml2enum.py +index 6d49e11c..cb2c4ae9 100755 +--- a/specs/scripts/xml2enum.py ++++ b/specs/scripts/xml2enum.py +@@ -58,8 +58,8 @@ for arg in sys.argv[1:]: + params.setdefault(value, name) + + +- values = params.keys() ++ values = list(params.keys()) + values.sort() + for value in values: + name = params[value] +- print ' "%s",\t\t# 0x%04X' % (name, value) ++ print(' "%s",\t\t# 0x%04X' % (name, value)) +diff --git a/specs/scripts/xml2glparams.py b/specs/scripts/xml2glparams.py +index 7e2bc351..805aac86 100755 +--- a/specs/scripts/xml2glparams.py ++++ b/specs/scripts/xml2glparams.py +@@ -58,8 +58,8 @@ for arg in sys.argv[1:]: + params.setdefault(value, name) + + +- values = params.keys() ++ values = list(params.keys()) + values.sort() + for value in values: + name = params[value] +- print ' ("",\tX,\t1,\t"%s"),\t# 0x%04X' % (name, value) ++ print(' ("",\tX,\t1,\t"%s"),\t# 0x%04X' % (name, value)) +diff --git a/specs/stdapi.py b/specs/stdapi.py +index c72c264b..487b6c1e 100644 +--- a/specs/stdapi.py ++++ b/specs/stdapi.py +@@ -26,7 +26,9 @@ + """C basic types""" + + +-import debug ++import sys ++ ++from . import debug + + + class Type: +@@ -266,6 +268,10 @@ class Bitmask(Type): + Flags = Bitmask + + ++def EnumFlags(name, values): ++ return Flags(Alias(name, UInt), values) ++ ++ + class Array(Type): + + def __init__(self, type_, length): +@@ -273,7 +279,7 @@ class Array(Type): + self.type = type_ + self.length = length + if not isinstance(length, int): +- assert isinstance(length, basestring) ++ assert isinstance(length, str) + # Check if length is actually a valid constant expression + try: + eval(length, {}, {}) +@@ -329,6 +335,10 @@ class Struct(Type): + def visit(self, visitor, *args, **kwargs): + return visitor.visitStruct(self, *args, **kwargs) + ++ def getMemberByName(self, name): ++ memberNames = [memberName for memberType, memberName in self.members] ++ return memberNames.index(name) ++ + + def Union(kindExpr, kindTypes, contextLess=True): + switchTypes = [] +@@ -372,7 +382,7 @@ def InOut(type, name): + + class Function: + +- def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False): ++ def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False, overloaded=False): + self.type = type + self.name = name + +@@ -394,6 +404,7 @@ class Function: + self.fail = fail + self.sideeffects = sideeffects + self.internal = internal ++ self.overloaded = overloaded + + def prototype(self, name=None): + if name is not None: +@@ -414,6 +425,17 @@ class Function: + s += ")" + return s + ++ def sigName(self): ++ name = self.name ++ if self.overloaded: ++ # suffix used to make overloaded functions/methods unique ++ suffix = ','.join([str(arg.type) for arg in self.args]) ++ suffix = suffix.replace(' *', '*') ++ suffix = suffix.replace(' &', '&') ++ suffix = '(' + suffix + ')' ++ name += suffix ++ return name ++ + def argNames(self): + return [arg.name for arg in self.args] + +@@ -463,14 +485,12 @@ class Interface(Type): + yield method + for method in self.methods: + yield method +- raise StopIteration + + def iterBases(self): + iface = self + while iface is not None: + yield iface + iface = iface.base +- raise StopIteration + + def hasBase(self, *bases): + for iface in self.iterBases(): +@@ -484,14 +504,13 @@ class Interface(Type): + yield iface, method + for method in self.methods: + yield self, method +- raise StopIteration + + + class Method(Function): + +- def __init__(self, type, name, args, call = '', const=False, sideeffects=True): ++ def __init__(self, type, name, args, call = '', const=False, sideeffects=True, overloaded=False): + assert call == '__stdcall' +- Function.__init__(self, type, name, args, call = call, sideeffects=sideeffects) ++ Function.__init__(self, type, name, args, call = call, sideeffects=sideeffects, overloaded=overloaded) + for index in range(len(self.args)): + self.args[index].index = index + 1 + self.const = const +@@ -576,7 +595,7 @@ class Polymorphic(Type): + else: + cases[i].append(case) + +- return zip(cases, types) ++ return list(zip(cases, types)) + + + def EnumPolymorphic(enumName, switchExpr, switchTypes, defaultType, contextLess=True): +@@ -734,7 +753,7 @@ class Rebuilder(Visitor): + if pointer_type is pointer.type: + return pointer + else: +- return LinearPointer(pointer_type) ++ return LinearPointer(pointer_type, self.size) + + def visitReference(self, reference): + reference_type = self.visit(reference.type) +@@ -792,7 +811,7 @@ class MutableRebuilder(Rebuilder): + + def visitReference(self, reference): + # Strip out references +- return reference.type ++ return self.visit(reference.type) + + + class Traverser(Visitor): +@@ -894,7 +913,7 @@ class ExpanderMixin: + + def expand(self, expr): + # Expand a C expression, replacing certain variables +- if not isinstance(expr, basestring): ++ if not isinstance(expr, str): + return expr + variables = {} + +diff --git a/specs/wglapi.py b/specs/wglapi.py +index f24a8d21..563f0269 100644 +--- a/specs/wglapi.py ++++ b/specs/wglapi.py +@@ -27,9 +27,9 @@ + """WGL API description""" + + +-from glapi import * +-from winapi import * +-from wglenum import * ++from .glapi import * ++from .winapi import * ++from .wglenum import * + + + wglapi = Module("WGL") +diff --git a/specs/wglenum.py b/specs/wglenum.py +index ad9bbccf..6bc4e74d 100644 +--- a/specs/wglenum.py ++++ b/specs/wglenum.py +@@ -27,7 +27,7 @@ + """WGL enum description""" + + +-from stdapi import * ++from .stdapi import * + + WGLenum = FakeEnum(Int, [ + "WGL_GPU_VENDOR_AMD", # 0x1F00 +diff --git a/specs/winapi.py b/specs/winapi.py +index 445039ff..e66d063a 100644 +--- a/specs/winapi.py ++++ b/specs/winapi.py +@@ -26,7 +26,7 @@ + """Win32 API type description.""" + + +-from stdapi import * ++from .stdapi import * + + + SHORT = Alias("SHORT", Short) +diff --git a/wrappers/CMakeLists.txt b/wrappers/CMakeLists.txt +index 2ceac332..7a452ed4 100644 +--- a/wrappers/CMakeLists.txt ++++ b/wrappers/CMakeLists.txt +@@ -79,7 +79,7 @@ if (WIN32) + include_directories (BEFORE SYSTEM ${DirectX_D3D_INCLUDE_DIR}) + add_custom_command ( + OUTPUT ddrawtrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/ddrawtrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/ddrawtrace.cpp + DEPENDS + ddrawtrace.py + dlltrace.py +@@ -109,7 +109,7 @@ if (WIN32) + include_directories (BEFORE SYSTEM ${DirectX_D3D9_INCLUDE_DIR} ${DirectX_D3D8_INCLUDE_DIR}) + add_custom_command ( + OUTPUT d3d8trace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d8trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d8trace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d8trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d8trace.cpp + DEPENDS + d3d8trace.py + dlltrace.py +@@ -143,7 +143,7 @@ if (WIN32) + include_directories (BEFORE SYSTEM ${DirectX_D3D9_INCLUDE_DIR}) + add_custom_command ( + OUTPUT d3d9trace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d9trace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d9trace.cpp + DEPENDS + d3d9trace.py + dlltrace.py +@@ -179,7 +179,7 @@ if (WIN32) + + add_custom_command ( + OUTPUT dxgitrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgitrace.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgitrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgitrace.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgitrace.cpp + DEPENDS + dxgitrace.py + dlltrace.py +@@ -216,7 +216,7 @@ if (WIN32) + + add_custom_command ( + OUTPUT d2d1trace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d2d1trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d2d1trace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d2d1trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d2d1trace.cpp + DEPENDS + d2d1trace.py + trace.py +@@ -241,7 +241,7 @@ if (WIN32) + # opengl32.dll + add_custom_command ( + OUTPUT wgltrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp + DEPENDS + wgltrace.py + gltrace.py +@@ -278,7 +278,7 @@ elseif (APPLE) + # OpenGL framework + add_custom_command ( + OUTPUT cgltrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/cgltrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/cgltrace.cpp + DEPENDS + cgltrace.py + gltrace.py +@@ -322,7 +322,7 @@ elseif (X11_FOUND) + # libGL.so + add_custom_command ( + OUTPUT glxtrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glxtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glxtrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glxtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glxtrace.cpp + DEPENDS + glxtrace.py + gltrace.py +@@ -372,7 +372,7 @@ if (ENABLE_EGL AND NOT WIN32 AND NOT APPLE) + # libEGL.so/libGL.so + add_custom_command ( + OUTPUT egltrace.cpp +- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/egltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/egltrace.cpp ++ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/egltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/egltrace.cpp + DEPENDS + egltrace.py + gltrace.py +diff --git a/wrappers/cgltrace.py b/wrappers/cgltrace.py +index 6c72f696..02b3c518 100644 +--- a/wrappers/cgltrace.py ++++ b/wrappers/cgltrace.py +@@ -43,55 +43,55 @@ class CglTracer(GlTracer): + if function.name == 'CGLReleaseContext': + # Unlike other GL APIs like EGL or GLX, CGL will make the context + # not current if it's the current context. +- print ' if (_CGLGetContextRetainCount(ctx) == 1) {' +- print ' if (gltrace::releaseContext((uintptr_t)ctx)) {' +- print ' if (_CGLGetCurrentContext() == ctx) {' +- print ' gltrace::clearContext();' +- print ' }' +- print ' }' +- print ' }' ++ print(' if (_CGLGetContextRetainCount(ctx) == 1) {') ++ print(' if (gltrace::releaseContext((uintptr_t)ctx)) {') ++ print(' if (_CGLGetCurrentContext() == ctx) {') ++ print(' gltrace::clearContext();') ++ print(' }') ++ print(' }') ++ print(' }') + + if function.name == 'CGLDestroyContext': + # The same rule applies here about the as for CGLReleaseContext. +- print ' if (gltrace::releaseContext((uintptr_t)ctx)) {' +- print ' if (_CGLGetCurrentContext() == ctx) {' +- print ' gltrace::clearContext();' +- print ' }' +- print ' }' ++ print(' if (gltrace::releaseContext((uintptr_t)ctx)) {') ++ print(' if (_CGLGetCurrentContext() == ctx) {') ++ print(' gltrace::clearContext();') ++ print(' }') ++ print(' }') + + GlTracer.traceFunctionImplBody(self, function) + + if function.name == 'CGLCreateContext': +- print ' if (_result == kCGLNoError) {' +- print ' gltrace::createContext((uintptr_t)*ctx);' +- print ' }' ++ print(' if (_result == kCGLNoError) {') ++ print(' gltrace::createContext((uintptr_t)*ctx);') ++ print(' }') + + if function.name == 'CGLSetCurrentContext': +- print ' if (_result == kCGLNoError) {' +- print ' if (ctx != NULL) {' +- print ' gltrace::setContext((uintptr_t)ctx);' +- print ' } else {' +- print ' gltrace::clearContext();' +- print ' }' +- print ' }' ++ print(' if (_result == kCGLNoError) {') ++ print(' if (ctx != NULL) {') ++ print(' gltrace::setContext((uintptr_t)ctx);') ++ print(' } else {') ++ print(' gltrace::clearContext();') ++ print(' }') ++ print(' }') + + if function.name == 'CGLRetainContext': +- print ' gltrace::retainContext((uintptr_t)ctx);' ++ print(' gltrace::retainContext((uintptr_t)ctx);') + + + if __name__ == '__main__': +- print +- print '#include ' +- print '#include ' +- print +- print '#include "trace_writer_local.hpp"' +- print +- print '// To validate our prototypes' +- print '#define GL_GLEXT_PROTOTYPES' +- print +- print '#include "glproc.hpp"' +- print '#include "glsize.hpp"' +- print ++ print() ++ print('#include ') ++ print('#include ') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print() ++ print('// To validate our prototypes') ++ print('#define GL_GLEXT_PROTOTYPES') ++ print() ++ print('#include "glproc.hpp"') ++ print('#include "glsize.hpp"') ++ print() + + module = Module() + module.mergeModule(cglapi) +@@ -101,7 +101,7 @@ if __name__ == '__main__': + tracer = CglTracer() + tracer.traceApi(api) + +- print r''' ++ print(r''' + + PUBLIC + void * gll_noop = 0; +@@ -130,4 +130,4 @@ _init(void) { + setenv("SDL_OPENGL_LIBRARY", "/System/Library/Frameworks/OpenGL.framework/OpenGL", 1); + } + +-''' ++''') +diff --git a/wrappers/d2d1trace.py b/wrappers/d2d1trace.py +index 26223005..2176341f 100644 +--- a/wrappers/d2d1trace.py ++++ b/wrappers/d2d1trace.py +@@ -31,15 +31,15 @@ from specs.d2d1 import d2d1 + + + if __name__ == '__main__': +- print '#include "guids_defs.hpp"' +- print +- print '#include "trace_writer_local.hpp"' +- print '#include "os.hpp"' +- print +- print '#define DWRITE_EXPORT WINAPI' +- print +- print '#include "d2dimports.hpp"' +- print ++ print('#include "guids_defs.hpp"') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print('#include "os.hpp"') ++ print() ++ print('#define DWRITE_EXPORT WINAPI') ++ print() ++ print('#include "d2dimports.hpp"') ++ print() + + api = API() + api.addModule(d2d1) +diff --git a/wrappers/d3d8trace.py b/wrappers/d3d8trace.py +index 2903c48f..11afbca5 100644 +--- a/wrappers/d3d8trace.py ++++ b/wrappers/d3d8trace.py +@@ -34,7 +34,7 @@ class D3D8Tracer(DllTracer): + def serializeArgValue(self, function, arg): + # Dump shaders as strings + if arg.type is D3DSHADER8: +- print ' DumpShader(trace::localWriter, %s);' % (arg.name) ++ print(' DumpShader(trace::localWriter, %s);' % (arg.name)) + return + + DllTracer.serializeArgValue(self, function, arg) +@@ -55,32 +55,32 @@ class D3D8Tracer(DllTracer): + + def implementWrapperInterfaceMethodBody(self, interface, base, method): + if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): +- print ' if (_MappedSize && m_pbData) {' ++ print(' if (_MappedSize && m_pbData) {') + self.emit_memcpy('(LPBYTE)m_pbData', '_MappedSize') +- print ' }' ++ print(' }') + + DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method) + + if method.name in ('Lock', 'LockRect', 'LockBox'): + # FIXME: handle recursive locks +- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {' +- print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) +- print ' } else {' +- print ' m_pbData = NULL;' +- print ' _MappedSize = 0;' +- print ' }' ++ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {') ++ print(' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])) ++ print(' } else {') ++ print(' m_pbData = NULL;') ++ print(' _MappedSize = 0;') ++ print(' }') + + + if __name__ == '__main__': +- print '#define INITGUID' +- print +- print '#include "trace_writer_local.hpp"' +- print '#include "os.hpp"' +- print +- print '#include "d3d8imports.hpp"' +- print '#include "d3d8size.hpp"' +- print '#include "d3d9shader.hpp"' +- print ++ print('#define INITGUID') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print('#include "os.hpp"') ++ print() ++ print('#include "d3d8imports.hpp"') ++ print('#include "d3d8size.hpp"') ++ print('#include "d3d9shader.hpp"') ++ print() + + api = API() + api.addModule(d3d8) +diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py +index 0850ba3e..53d5152f 100644 +--- a/wrappers/d3d9trace.py ++++ b/wrappers/d3d9trace.py +@@ -35,7 +35,7 @@ class D3D9Tracer(DllTracer): + def serializeArgValue(self, function, arg): + # Dump shaders as strings + if arg.type is D3DSHADER9: +- print ' DumpShader(trace::localWriter, %s);' % (arg.name) ++ print(' DumpShader(trace::localWriter, %s);' % (arg.name)) + return + + DllTracer.serializeArgValue(self, function, arg) +@@ -72,49 +72,49 @@ class D3D9Tracer(DllTracer): + def implementWrapperInterfaceMethodBody(self, interface, base, method): + if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): + if interface.name in ['IDirect3DTexture9']: +- print ' std::map >::iterator it = _MappedData.find(Level);' +- print ' if (it != _MappedData.end()) {' ++ print(' std::map >::iterator it = _MappedData.find(Level);') ++ print(' if (it != _MappedData.end()) {') + self.emit_memcpy('(LPBYTE)it->second.second', 'it->second.first') +- print ' _MappedData.erase(it);' +- print ' }' ++ print(' _MappedData.erase(it);') ++ print(' }') + else: +- print ' if (_MappedSize && m_pbData) {' ++ print(' if (_MappedSize && m_pbData) {') + self.emit_memcpy('(LPBYTE)m_pbData', '_MappedSize') +- print ' }' ++ print(' }') + + DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method) + + if method.name in ('Lock', 'LockRect', 'LockBox'): + if interface.name in ['IDirect3DTexture9']: +- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {' +- print ' size_t mappedSize;' +- print ' VOID * pbData;' +- print ' _getMapInfo(_this, %s, pbData, mappedSize);' % ', '.join(method.argNames()[:-1]) +- print ' _MappedData[Level] = std::make_pair(mappedSize, pbData);' +- print ' } else {' +- print ' _MappedData.erase(Level);' +- print ' }' ++ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {') ++ print(' size_t mappedSize;') ++ print(' VOID * pbData;') ++ print(' _getMapInfo(_this, %s, pbData, mappedSize);' % ', '.join(method.argNames()[:-1])) ++ print(' _MappedData[Level] = std::make_pair(mappedSize, pbData);') ++ print(' } else {') ++ print(' _MappedData.erase(Level);') ++ print(' }') + else: + # FIXME: handle recursive locks +- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {' +- print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) +- print ' } else {' +- print ' m_pbData = NULL;' +- print ' _MappedSize = 0;' +- print ' }' ++ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {') ++ print(' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])) ++ print(' } else {') ++ print(' m_pbData = NULL;') ++ print(' _MappedSize = 0;') ++ print(' }') + + + if __name__ == '__main__': +- print '#define INITGUID' +- print +- print '#include "trace_writer_local.hpp"' +- print '#include "os.hpp"' +- print +- print '#include "d3d9imports.hpp"' +- print '#include "d3d9size.hpp"' +- print '#include "d3d9shader.hpp"' +- print '#include "dxva2imports.hpp"' +- print ++ print('#define INITGUID') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print('#include "os.hpp"') ++ print() ++ print('#include "d3d9imports.hpp"') ++ print('#include "d3d9size.hpp"') ++ print('#include "d3d9shader.hpp"') ++ print('#include "dxva2imports.hpp"') ++ print() + + d3d9.mergeModule(d3dperf) + +diff --git a/wrappers/ddrawtrace.py b/wrappers/ddrawtrace.py +index 96602d21..da7ffbe7 100644 +--- a/wrappers/ddrawtrace.py ++++ b/wrappers/ddrawtrace.py +@@ -41,12 +41,12 @@ class DDrawTracer(DllTracer): + + + if __name__ == '__main__': +- print '#define INITGUID' +- print '#include "d3dimports.hpp"' +- print '#include "trace_writer_local.hpp"' +- print '#include "d3d7size.hpp"' +- print '#include "os.hpp"' +- print ++ print('#define INITGUID') ++ print('#include "d3dimports.hpp"') ++ print('#include "trace_writer_local.hpp"') ++ print('#include "d3d7size.hpp"') ++ print('#include "os.hpp"') ++ print() + + api = API() + api.addModule(ddraw) +diff --git a/wrappers/dlltrace.py b/wrappers/dlltrace.py +index 26962216..8ac18b0c 100644 +--- a/wrappers/dlltrace.py ++++ b/wrappers/dlltrace.py +@@ -37,24 +37,24 @@ class DllDispatcher(Dispatcher): + + def dispatchModule(self, module): + tag = module.name.upper() +- print r'HMODULE g_h%sModule = NULL;' % (tag,) +- print r'' +- print r'static PROC' +- print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag +- print r' if (!g_h%sModule) {' % tag +- print r' char szDll[MAX_PATH] = {0};' +- print r' if (!GetSystemDirectoryA(szDll, MAX_PATH)) {' +- print r' return NULL;' +- print r' }' +- print r' strcat(szDll, "\\%s.dll");' % module.name +- print r' g_h%sModule = LoadLibraryA(szDll);' % tag +- print r' if (!g_h%sModule) {' % tag +- print r' return NULL;' +- print r' }' +- print r' }' +- print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag +- print r'}' +- print r'' ++ print(r'HMODULE g_h%sModule = NULL;' % (tag,)) ++ print(r'') ++ print(r'static PROC') ++ print(r'_get%sProcAddress(LPCSTR lpProcName) {' % tag) ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' char szDll[MAX_PATH] = {0};') ++ print(r' if (!GetSystemDirectoryA(szDll, MAX_PATH)) {') ++ print(r' return NULL;') ++ print(r' }') ++ print(r' strcat(szDll, "\\%s.dll");' % module.name) ++ print(r' g_h%sModule = LoadLibraryA(szDll);' % tag) ++ print(r' if (!g_h%sModule) {' % tag) ++ print(r' return NULL;') ++ print(r' }') ++ print(r' }') ++ print(r' return GetProcAddress(g_h%sModule, lpProcName);' % tag) ++ print(r'}') ++ print(r'') + + Dispatcher.dispatchModule(self, module) + +diff --git a/wrappers/dxgitrace.py b/wrappers/dxgitrace.py +index 3edda2c2..134f45d7 100644 +--- a/wrappers/dxgitrace.py ++++ b/wrappers/dxgitrace.py +@@ -40,47 +40,47 @@ class D3DCommonTracer(DllTracer): + def serializeArgValue(self, function, arg): + # Dump shaders as strings + if isinstance(arg.type, stdapi.Blob) and arg.name.startswith('pShaderBytecode'): +- print ' DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size) ++ print(' DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size)) + return + + # Serialize the swapchain dimensions + if function.name == 'CreateSwapChain' and arg.name == 'pDesc' \ + or arg.name == 'pSwapChainDesc': +- print r' DXGI_SWAP_CHAIN_DESC *_pSwapChainDesc = NULL;' +- print r' DXGI_SWAP_CHAIN_DESC _SwapChainDesc;' +- print r' if (%s) {' % arg.name +- print r' _SwapChainDesc = *%s;' % arg.name ++ print(r' DXGI_SWAP_CHAIN_DESC *_pSwapChainDesc = NULL;') ++ print(r' DXGI_SWAP_CHAIN_DESC _SwapChainDesc;') ++ print(r' if (%s) {' % arg.name) ++ print(r' _SwapChainDesc = *%s;' % arg.name) + if function.name != 'CreateSwapChain' or not self.interface.name.endswith('DWM'): + # Obtain size from the window +- print r' RECT _rect;' +- print r' if (GetClientRect(%s->OutputWindow, &_rect)) {' % arg.name +- print r' if (%s->BufferDesc.Width == 0) {' % arg.name +- print r' _SwapChainDesc.BufferDesc.Width = _rect.right - _rect.left;' +- print r' }' +- print r' if (%s->BufferDesc.Height == 0) {' % arg.name +- print r' _SwapChainDesc.BufferDesc.Height = _rect.bottom - _rect.top;' +- print r' }' +- print r' }' ++ print(r' RECT _rect;') ++ print(r' if (GetClientRect(%s->OutputWindow, &_rect)) {' % arg.name) ++ print(r' if (%s->BufferDesc.Width == 0) {' % arg.name) ++ print(r' _SwapChainDesc.BufferDesc.Width = _rect.right - _rect.left;') ++ print(r' }') ++ print(r' if (%s->BufferDesc.Height == 0) {' % arg.name) ++ print(r' _SwapChainDesc.BufferDesc.Height = _rect.bottom - _rect.top;') ++ print(r' }') ++ print(r' }') + else: + # Obtain size from the output +- print r' DXGI_OUTPUT_DESC _OutputDesc;' +- print r' if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {' +- print r' _SwapChainDesc.BufferDesc.Width = _OutputDesc.DesktopCoordinates.right - _OutputDesc.DesktopCoordinates.left;' +- print r' _SwapChainDesc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;' +- print r' }' +- print r' _pSwapChainDesc = &_SwapChainDesc;' +- print r' }' ++ print(r' DXGI_OUTPUT_DESC _OutputDesc;') ++ print(r' if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {') ++ print(r' _SwapChainDesc.BufferDesc.Width = _OutputDesc.DesktopCoordinates.right - _OutputDesc.DesktopCoordinates.left;') ++ print(r' _SwapChainDesc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;') ++ print(r' }') ++ print(r' _pSwapChainDesc = &_SwapChainDesc;') ++ print(r' }') + self.serializeValue(arg.type, '_pSwapChainDesc') + return + + # Serialize object names + if function.name == 'SetPrivateData' and arg.name == 'pData': + iid = function.args[0].name +- print r' if (%s == WKPDID_D3DDebugObjectName) {' % iid +- print r' trace::localWriter.writeString(static_cast(pData), DataSize);' +- print r' } else {' ++ print(r' if (%s == WKPDID_D3DDebugObjectName) {' % iid) ++ print(r' trace::localWriter.writeString(static_cast(pData), DataSize);') ++ print(r' } else {') + DllTracer.serializeArgValue(self, function, arg) +- print r' }' ++ print(r' }') + return + + DllTracer.serializeArgValue(self, function, arg) +@@ -110,47 +110,47 @@ class D3DCommonTracer(DllTracer): + if method.getArgByName('pInitialData'): + pDesc1 = method.getArgByName('pDesc1') + if pDesc1 is not None: +- print r' %s pDesc = pDesc1;' % (pDesc1.type,) ++ print(r' %s pDesc = pDesc1;' % (pDesc1.type,)) + + if method.name in ('Map', 'Unmap'): + # On D3D11 Map/Unmap is not a resource method, but a context method instead. + resourceArg = method.getArgByName('pResource') + if resourceArg is None: +- print ' _MAP_DESC & _MapDesc = m_MapDesc;' ++ print(' _MAP_DESC & _MapDesc = m_MapDesc;') + else: +- print ' _MAP_DESC & _MapDesc = m_MapDescs[std::pair<%s, UINT>(pResource, Subresource)];' % resourceArg.type ++ print(' _MAP_DESC & _MapDesc = m_MapDescs[std::pair<%s, UINT>(pResource, Subresource)];' % resourceArg.type) + + if method.name == 'Unmap': +- print ' if (_MapDesc.Size && _MapDesc.pData) {' ++ print(' if (_MapDesc.Size && _MapDesc.pData) {') + self.emit_memcpy('_MapDesc.pData', '_MapDesc.Size') +- print ' }' ++ print(' }') + + DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method) + + if method.name == 'Map': + # NOTE: recursive locks are explicitely forbidden +- print ' if (SUCCEEDED(_result)) {' +- print ' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames()) +- print ' } else {' +- print ' _MapDesc.pData = NULL;' +- print ' _MapDesc.Size = 0;' +- print ' }' ++ print(' if (SUCCEEDED(_result)) {') ++ print(' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames())) ++ print(' } else {') ++ print(' _MapDesc.pData = NULL;') ++ print(' _MapDesc.Size = 0;') ++ print(' }') + + + if __name__ == '__main__': +- print r'#define INITGUID' +- print +- print r'#include "trace_writer_local.hpp"' +- print r'#include "os.hpp"' +- print +- print r'#include "d3dcommonshader.hpp"' +- print +- print r'#include "d3d10imports.hpp"' +- print r'#include "d3d10size.hpp"' +- print r'#include "d3d11imports.hpp"' +- print r'#include "d3d11size.hpp"' +- print r'#include "d3d9imports.hpp" // D3DPERF_*' +- print ++ print(r'#define INITGUID') ++ print() ++ print(r'#include "trace_writer_local.hpp"') ++ print(r'#include "os.hpp"') ++ print() ++ print(r'#include "d3dcommonshader.hpp"') ++ print() ++ print(r'#include "d3d10imports.hpp"') ++ print(r'#include "d3d10size.hpp"') ++ print(r'#include "d3d11imports.hpp"') ++ print(r'#include "d3d11size.hpp"') ++ print(r'#include "d3d9imports.hpp" // D3DPERF_*') ++ print() + + api = API() + api.addModule(dxgi.dxgi) +diff --git a/wrappers/egltrace.py b/wrappers/egltrace.py +index 1fcb0fd6..f5b61c0c 100644 +--- a/wrappers/egltrace.py ++++ b/wrappers/egltrace.py +@@ -50,239 +50,239 @@ class EglTracer(GlTracer): + + def traceFunctionImplBody(self, function): + if function.name == 'glTexDirectMapVIV': +- print ' // prevent loop call' +- print ' glTexDirectVIVMap(target, width, height, format, Logical, Physical);' ++ print(' // prevent loop call') ++ print(' glTexDirectVIVMap(target, width, height, format, Logical, Physical);') + return + + if function.name == 'glTexDirectInvalidateVIV': +- print ' // get current texture' +- print ' GLint tex = 0;' +- print ' int32_t size = 0;' +- print ' int32_t ysize = 0;' +- print ' int32_t usize = 0;' +- print ' int32_t vsize = 0;' +- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);' +- print ' if(tex == 0)' +- print ' {' +- print ' return;' +- print ' }' +- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];' +- print ' switch(data.format){' +- print ' case GL_VIV_YV12:' +- print ' case GL_VIV_I420:' +- print ' ysize=data.width * data.height;' +- print ' usize=ysize/4;' +- print ' vsize=usize;' +- print ' break;' +- print ' case GL_VIV_NV12:' +- print ' case GL_VIV_NV21:' +- print ' ysize=data.width * data.height;' +- print ' usize=ysize/2;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_RGBA:' +- print ' case GL_BGRA_EXT:' +- print ' ysize=data.width * data.height *4;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_RGB:' +- print ' ysize=data.width * data.height *3;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_VIV_YUY2:' +- print ' case GL_VIV_UYVY:' +- print ' case GL_RGB565_OES:' +- print ' case GL_LUMINANCE8_ALPHA8_EXT:' +- print ' ysize=data.width * data.height *2;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' case GL_ALPHA:' +- print ' ysize=data.width * data.height;' +- print ' usize=0;' +- print ' vsize=0;' +- print ' break;' +- print ' default:' +- print ' return;' +- print ' }' +- print ' if (NULL==(GLvoid*)data.logical) {' +- print ' if (ysize > 0) {' ++ print(' // get current texture') ++ print(' GLint tex = 0;') ++ print(' int32_t size = 0;') ++ print(' int32_t ysize = 0;') ++ print(' int32_t usize = 0;') ++ print(' int32_t vsize = 0;') ++ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);') ++ print(' if(tex == 0)') ++ print(' {') ++ print(' return;') ++ print(' }') ++ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];') ++ print(' switch(data.format){') ++ print(' case GL_VIV_YV12:') ++ print(' case GL_VIV_I420:') ++ print(' ysize=data.width * data.height;') ++ print(' usize=ysize/4;') ++ print(' vsize=usize;') ++ print(' break;') ++ print(' case GL_VIV_NV12:') ++ print(' case GL_VIV_NV21:') ++ print(' ysize=data.width * data.height;') ++ print(' usize=ysize/2;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_RGBA:') ++ print(' case GL_BGRA_EXT:') ++ print(' ysize=data.width * data.height *4;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_RGB:') ++ print(' ysize=data.width * data.height *3;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_VIV_YUY2:') ++ print(' case GL_VIV_UYVY:') ++ print(' case GL_RGB565_OES:') ++ print(' case GL_LUMINANCE8_ALPHA8_EXT:') ++ print(' ysize=data.width * data.height *2;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' case GL_ALPHA:') ++ print(' ysize=data.width * data.height;') ++ print(' usize=0;') ++ print(' vsize=0;') ++ print(' break;') ++ print(' default:') ++ print(' return;') ++ print(' }') ++ print(' if (NULL==(GLvoid*)data.logical) {') ++ print(' if (ysize > 0) {') + self.emit_memcpy_opt('(GLvoid*)data.planes[0]', 'ysize') +- print ' }' +- print ' if (usize > 0) {' ++ print(' }') ++ print(' if (usize > 0) {') + self.emit_memcpy_opt('(GLvoid*)data.planes[1]', 'usize') +- print ' }' +- print ' if (vsize > 0) {' ++ print(' }') ++ print(' if (vsize > 0) {') + self.emit_memcpy_opt('(GLvoid*)data.planes[2]', 'vsize') +- print ' }' +- print ' } else {' +- print ' size = ysize + usize + vsize;' +- print ' if (size > 0) {' ++ print(' }') ++ print(' } else {') ++ print(' size = ysize + usize + vsize;') ++ print(' if (size > 0) {') + self.emit_memcpy_opt('(GLvoid*)data.logical', 'size') +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + + if function.name == 'eglGetProcAddress': +- print ' procname = __get_alias_func_name(procname);' ++ print(' procname = __get_alias_func_name(procname);') + + GlTracer.traceFunctionImplBody(self, function) + + if function.name == 'glTexDirectVIV': +- print ' // get current texture' +- print ' GLint tex = 0;' +- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);' +- print ' if(tex != 0)' +- print ' {' +- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];' +- print ' data.width = width;' +- print ' data.height = height;' +- print ' data.format = format;' +- print ' data.planes[0] = pixels[0];' +- print ' data.planes[1] = pixels[1];' +- print ' data.planes[2] = pixels[2];' +- print ' }' ++ print(' // get current texture') ++ print(' GLint tex = 0;') ++ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);') ++ print(' if(tex != 0)') ++ print(' {') ++ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];') ++ print(' data.width = width;') ++ print(' data.height = height;') ++ print(' data.format = format;') ++ print(' data.planes[0] = pixels[0];') ++ print(' data.planes[1] = pixels[1];') ++ print(' data.planes[2] = pixels[2];') ++ print(' }') + + if function.name == 'glTexDirectVIVMap' or function.name == 'glTexDirectTiledMapVIV': +- print ' // get current texture' +- print ' GLint tex = 0;' +- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);' +- print ' if(tex != 0)' +- print ' {' +- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];' +- print ' data.width = width;' +- print ' data.height = height;' +- print ' data.format = format;' +- print ' data.logical = *Logical; // Logical != NULL' +- print ' data.physical = *Physical;' +- print ' }' ++ print(' // get current texture') ++ print(' GLint tex = 0;') ++ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);') ++ print(' if(tex != 0)') ++ print(' {') ++ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];') ++ print(' data.width = width;') ++ print(' data.height = height;') ++ print(' data.format = format;') ++ print(' data.logical = *Logical; // Logical != NULL') ++ print(' data.physical = *Physical;') ++ print(' }') + + if function.name == 'eglCreateContext': +- print ' if (_result != EGL_NO_CONTEXT)' +- print ' gltrace::createContext((uintptr_t)_result);' ++ print(' if (_result != EGL_NO_CONTEXT)') ++ print(' gltrace::createContext((uintptr_t)_result);') + + if function.name == 'eglMakeCurrent': +- print r' if (_result) {' +- print r' // update the profile' +- print r' if (ctx != EGL_NO_CONTEXT) {' +- print r' gltrace::setContext((uintptr_t)ctx);' +- print r' gltrace::Context *tr = gltrace::getContext();' +- print r' EGLint api = EGL_OPENGL_ES_API;' +- print r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);' +- print r' if (api == EGL_OPENGL_API) {' +- print r' assert(tr->profile.api == glprofile::API_GL);' +- print r' } else if (api == EGL_OPENGL_ES_API) {' +- print r' EGLint client_version = 1;' +- print r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &client_version);' +- print r' if (tr->profile.api != glprofile::API_GLES ||' +- print r' tr->profile.major < client_version) {' +- print r' std::string version = tr->profile.str();' +- print r' os::log("apitrace: warning: eglMakeCurrent: expected OpenGL ES %i.x context, but got %s\n",' +- print r' client_version, version.c_str());' +- print r' }' +- print r' } else {' +- print r' assert(0);' +- print r' }' +- print r' } else {' +- print r' gltrace::clearContext();' +- print r' }' +- print r' }' ++ print(r' if (_result) {') ++ print(r' // update the profile') ++ print(r' if (ctx != EGL_NO_CONTEXT) {') ++ print(r' gltrace::setContext((uintptr_t)ctx);') ++ print(r' gltrace::Context *tr = gltrace::getContext();') ++ print(r' EGLint api = EGL_OPENGL_ES_API;') ++ print(r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);') ++ print(r' if (api == EGL_OPENGL_API) {') ++ print(r' assert(tr->profile.api == glprofile::API_GL);') ++ print(r' } else if (api == EGL_OPENGL_ES_API) {') ++ print(r' EGLint client_version = 1;') ++ print(r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &client_version);') ++ print(r' if (tr->profile.api != glprofile::API_GLES ||') ++ print(r' tr->profile.major < client_version) {') ++ print(r' std::string version = tr->profile.str();') ++ print(r' os::log("apitrace: warning: eglMakeCurrent: expected OpenGL ES %i.x context, but got %s\n",') ++ print(r' client_version, version.c_str());') ++ print(r' }') ++ print(r' } else {') ++ print(r' assert(0);') ++ print(r' }') ++ print(r' } else {') ++ print(r' gltrace::clearContext();') ++ print(r' }') ++ print(r' }') + + if function.name == 'eglDestroyContext': +- print ' if (_result) {' +- print ' gltrace::releaseContext((uintptr_t)ctx);' +- print ' }' ++ print(' if (_result) {') ++ print(' gltrace::releaseContext((uintptr_t)ctx);') ++ print(' }') + + if function.name == 'glEGLImageTargetTexture2DOES': +- print ' image_info *info = _EGLImageKHR_get_image_info(target, image);' +- print ' if (info) {' +- print ' GLint level = 0;' +- print ' GLint internalformat = info->internalformat;' +- print ' GLsizei width = info->width;' +- print ' GLsizei height = info->height;' +- print ' GLint border = 0;' +- print ' GLenum format = info->format;' +- print ' GLenum type = info->type;' +- print ' const GLvoid * pixels = info->pixels;' ++ print(' image_info *info = _EGLImageKHR_get_image_info(target, image);') ++ print(' if (info) {') ++ print(' GLint level = 0;') ++ print(' GLint internalformat = info->internalformat;') ++ print(' GLsizei width = info->width;') ++ print(' GLsizei height = info->height;') ++ print(' GLint border = 0;') ++ print(' GLenum format = info->format;') ++ print(' GLenum type = info->type;') ++ print(' const GLvoid * pixels = info->pixels;') + self.emitFakeTexture2D() +- print ' _EGLImageKHR_free_image_info(info);' +- print ' }' ++ print(' _EGLImageKHR_free_image_info(info);') ++ print(' }') + + + if __name__ == '__main__': +- print '#include ' +- print '#include ' +- print +- print '#include "trace_writer_local.hpp"' +- print +- print '// To validate our prototypes' +- print '#define GL_GLEXT_PROTOTYPES' +- print '#define EGL_EGLEXT_PROTOTYPES' +- print +- print '#include "dlopen.hpp"' +- print '#include "glproc.hpp"' +- print '#include "glsize.hpp"' +- print '#include "eglsize.hpp"' +- print +- print 'static const char *__get_alias_func_name(const char *origFunName)' +- print '{' +- print ' /* Vivante driver uses alias name for following OES/EXT functions, that means dlsym for thoese functions will fail */' +- print ' static const char * __glExtProcAlias[][2] =' +- print ' {' +- print ' /* Extension API alias for GL_OES_texture_3D */' +- print ' {"glTexImage3DOES", "glTexImage3D"},' +- print ' {"glTexSubImage3DOES", "glTexSubImage3D"},' +- print ' {"glCopyTexSubImage3DOES", "glCopyTexSubImage3D"},' +- print ' {"glCompressedTexImage3DOES", "glCompressedTexImage3D"},' +- print ' {"glCompressedTexSubImage3DOES", "glCompressedTexSubImage3D"},' +- print +- print ' /* Extension API alias for GL_OES_get_program_binary */' +- print ' {"glGetProgramBinaryOES", "glGetProgramBinary"},' +- print ' {"glProgramBinaryOES", "glProgramBinary"},' +- print +- print ' /* Extension API alias for GL_OES_vertex_array_object */' +- print ' {"glBindVertexArrayOES", "glBindVertexArray"},' +- print ' {"glDeleteVertexArraysOES", "glDeleteVertexArrays"},' +- print ' {"glGenVertexArraysOES", "glGenVertexArrays"},' +- print ' {"glIsVertexArrayOES", "glIsVertexArray"},' +- print +- print ' /* Extension API alias for GL_OES_blend_minmax */' +- print ' {"glBlendEquationEXT", "glBlendEquation"}' +- print ' };' +- print +- print ' int count = sizeof(__glExtProcAlias) / sizeof(__glExtProcAlias[0]);' +- print ' int i;' +- print +- print ' for(i=0; i _directTextureDataMap;' +- print +- print '#define GL_VIV_YV12 0x8FC0' +- print '#define GL_VIV_NV12 0x8FC1' +- print '#define GL_VIV_YUY2 0x8FC2' +- print '#define GL_VIV_UYVY 0x8FC3' +- print '#define GL_VIV_NV21 0x8FC4' +- print '#define GL_VIV_I420 0x8FC5' +- print ++ print('#include ') ++ print('#include ') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print() ++ print('// To validate our prototypes') ++ print('#define GL_GLEXT_PROTOTYPES') ++ print('#define EGL_EGLEXT_PROTOTYPES') ++ print() ++ print('#include "dlopen.hpp"') ++ print('#include "glproc.hpp"') ++ print('#include "glsize.hpp"') ++ print('#include "eglsize.hpp"') ++ print() ++ print('static const char *__get_alias_func_name(const char *origFunName)') ++ print('{') ++ print(' /* Vivante driver uses alias name for following OES/EXT functions, that means dlsym for thoese functions will fail */') ++ print(' static const char * __glExtProcAlias[][2] =') ++ print(' {') ++ print(' /* Extension API alias for GL_OES_texture_3D */') ++ print(' {"glTexImage3DOES", "glTexImage3D"},') ++ print(' {"glTexSubImage3DOES", "glTexSubImage3D"},') ++ print(' {"glCopyTexSubImage3DOES", "glCopyTexSubImage3D"},') ++ print(' {"glCompressedTexImage3DOES", "glCompressedTexImage3D"},') ++ print(' {"glCompressedTexSubImage3DOES", "glCompressedTexSubImage3D"},') ++ print() ++ print(' /* Extension API alias for GL_OES_get_program_binary */') ++ print(' {"glGetProgramBinaryOES", "glGetProgramBinary"},') ++ print(' {"glProgramBinaryOES", "glProgramBinary"},') ++ print() ++ print(' /* Extension API alias for GL_OES_vertex_array_object */') ++ print(' {"glBindVertexArrayOES", "glBindVertexArray"},') ++ print(' {"glDeleteVertexArraysOES", "glDeleteVertexArrays"},') ++ print(' {"glGenVertexArraysOES", "glGenVertexArrays"},') ++ print(' {"glIsVertexArrayOES", "glIsVertexArray"},') ++ print() ++ print(' /* Extension API alias for GL_OES_blend_minmax */') ++ print(' {"glBlendEquationEXT", "glBlendEquation"}') ++ print(' };') ++ print() ++ print(' int count = sizeof(__glExtProcAlias) / sizeof(__glExtProcAlias[0]);') ++ print(' int i;') ++ print() ++ print(' for(i=0; i _directTextureDataMap;') ++ print() ++ print('#define GL_VIV_YV12 0x8FC0') ++ print('#define GL_VIV_NV12 0x8FC1') ++ print('#define GL_VIV_YUY2 0x8FC2') ++ print('#define GL_VIV_UYVY 0x8FC3') ++ print('#define GL_VIV_NV21 0x8FC4') ++ print('#define GL_VIV_I420 0x8FC5') ++ print() + + module = Module() + module.mergeModule(eglapi) +@@ -292,7 +292,7 @@ if __name__ == '__main__': + tracer = EglTracer() + tracer.traceApi(api) + +- print r''' ++ print(r''' + + + +@@ -453,8 +453,8 @@ void APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, GLsizei stride, + #endif /* ANDROID */ + + +-''' +- print r''' ++''') ++ print(r''' + /* + * let the GPU driver know that we are in apitrace + */ +@@ -464,4 +464,4 @@ int APIENTRY ApiTraceEnabled(void) { + return 1; + } + +-''' ++''') +diff --git a/wrappers/gltrace.py b/wrappers/gltrace.py +index cf13ae18..02504148 100644 +--- a/wrappers/gltrace.py ++++ b/wrappers/gltrace.py +@@ -79,7 +79,7 @@ class TypeGetter(stdapi.Visitor): + suffix = 'iv' + arg_type = 'GLint' + else: +- print alias.expr ++ print(alias.expr) + assert False + function_name = self.prefix + suffix + self.ext_suffix + return function_name, arg_type +@@ -114,48 +114,48 @@ class GlTracer(Tracer): + def header(self, api): + Tracer.header(self, api) + +- print '#include ' +- print +- print '#include "gltrace.hpp"' +- print ++ print('#include ') ++ print() ++ print('#include "gltrace.hpp"') ++ print() + + # Which glVertexAttrib* variant to use +- print 'enum vertex_attrib {' +- print ' VERTEX_ATTRIB,' +- print ' VERTEX_ATTRIB_NV,' +- print '};' +- print +- print 'static vertex_attrib _get_vertex_attrib(void) {' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' if (ctx->user_arrays_nv) {' +- print ' GLboolean _vertex_program = GL_FALSE;' +- print ' _glGetBooleanv(GL_VERTEX_PROGRAM_ARB, &_vertex_program);' +- print ' if (_vertex_program) {' +- print ' if (ctx->user_arrays_nv) {' +- print ' GLint _vertex_program_binding_nv = _glGetInteger(GL_VERTEX_PROGRAM_BINDING_NV);' +- print ' if (_vertex_program_binding_nv) {' +- print ' return VERTEX_ATTRIB_NV;' +- print ' }' +- print ' }' +- print ' }' +- print ' }' +- print ' return VERTEX_ATTRIB;' +- print '}' +- print ++ print('enum vertex_attrib {') ++ print(' VERTEX_ATTRIB,') ++ print(' VERTEX_ATTRIB_NV,') ++ print('};') ++ print() ++ print('static vertex_attrib _get_vertex_attrib(void) {') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' if (ctx->user_arrays_nv) {') ++ print(' GLboolean _vertex_program = GL_FALSE;') ++ print(' _glGetBooleanv(GL_VERTEX_PROGRAM_ARB, &_vertex_program);') ++ print(' if (_vertex_program) {') ++ print(' if (ctx->user_arrays_nv) {') ++ print(' GLint _vertex_program_binding_nv = _glGetInteger(GL_VERTEX_PROGRAM_BINDING_NV);') ++ print(' if (_vertex_program_binding_nv) {') ++ print(' return VERTEX_ATTRIB_NV;') ++ print(' }') ++ print(' }') ++ print(' }') ++ print(' }') ++ print(' return VERTEX_ATTRIB;') ++ print('}') ++ print() + + self.defineShadowBufferHelper() + + # Whether we need user arrays +- print 'static inline bool _need_user_arrays(void)' +- print '{' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' if (!ctx->user_arrays) {' +- print ' return false;' +- print ' }' +- print +- print ' glprofile::Profile profile = ctx->profile;' +- print ' bool es1 = profile.es() && profile.major == 1;' +- print ++ print('static inline bool _need_user_arrays(void)') ++ print('{') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' if (!ctx->user_arrays) {') ++ print(' return false;') ++ print(' }') ++ print() ++ print(' glprofile::Profile profile = ctx->profile;') ++ print(' bool es1 = profile.es() && profile.major == 1;') ++ print() + + for camelcase_name, uppercase_name in self.arrays: + # in which profile is the array available? +@@ -166,120 +166,120 @@ class GlTracer(Tracer): + function_name = 'gl%sPointer' % camelcase_name + enable_name = 'GL_%s_ARRAY' % uppercase_name + binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name +- print ' // %s' % function_name +- print ' if (%s) {' % profile_check ++ print(' // %s' % function_name) ++ print(' if (%s) {' % profile_check) + self.array_prolog(api, uppercase_name) +- print ' if (_glIsEnabled(%s) &&' % enable_name +- print ' _glGetInteger(%s) == 0) {' % binding_name ++ print(' if (_glIsEnabled(%s) &&' % enable_name) ++ print(' _glGetInteger(%s) == 0) {' % binding_name) + self.array_cleanup(api, uppercase_name) +- print ' return true;' +- print ' }' ++ print(' return true;') ++ print(' }') + self.array_epilog(api, uppercase_name) +- print ' }' +- print +- +- print ' // ES1 does not support generic vertex attributes' +- print ' if (es1)' +- print ' return false;' +- print +- print ' vertex_attrib _vertex_attrib = _get_vertex_attrib();' +- print +- print ' // glVertexAttribPointer' +- print ' if (_vertex_attrib == VERTEX_ATTRIB) {' +- print ' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);' +- print ' for (GLint index = 0; index < _max_vertex_attribs; ++index) {' +- print ' if (_glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED) &&' +- print ' _glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) == 0) {' +- print ' return true;' +- print ' }' +- print ' }' +- print ' }' +- print +- print ' // glVertexAttribPointerNV' +- print ' if (_vertex_attrib == VERTEX_ATTRIB_NV) {' +- print ' for (GLint index = 0; index < 16; ++index) {' +- print ' if (_glIsEnabled(GL_VERTEX_ATTRIB_ARRAY0_NV + index)) {' +- print ' return true;' +- print ' }' +- print ' }' +- print ' }' +- print +- +- print ' return false;' +- print '}' +- print +- +- print 'static void _trace_user_arrays(GLuint count);' +- print +- +- print '// whether glLockArraysEXT() has ever been called' +- print 'static bool _checkLockArraysEXT = false;' +- print ++ print(' }') ++ print() ++ ++ print(' // ES1 does not support generic vertex attributes') ++ print(' if (es1)') ++ print(' return false;') ++ print() ++ print(' vertex_attrib _vertex_attrib = _get_vertex_attrib();') ++ print() ++ print(' // glVertexAttribPointer') ++ print(' if (_vertex_attrib == VERTEX_ATTRIB) {') ++ print(' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);') ++ print(' for (GLint index = 0; index < _max_vertex_attribs; ++index) {') ++ print(' if (_glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED) &&') ++ print(' _glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) == 0) {') ++ print(' return true;') ++ print(' }') ++ print(' }') ++ print(' }') ++ print() ++ print(' // glVertexAttribPointerNV') ++ print(' if (_vertex_attrib == VERTEX_ATTRIB_NV) {') ++ print(' for (GLint index = 0; index < 16; ++index) {') ++ print(' if (_glIsEnabled(GL_VERTEX_ATTRIB_ARRAY0_NV + index)) {') ++ print(' return true;') ++ print(' }') ++ print(' }') ++ print(' }') ++ print() ++ ++ print(' return false;') ++ print('}') ++ print() ++ ++ print('static void _trace_user_arrays(GLuint count);') ++ print() ++ ++ print('// whether glLockArraysEXT() has ever been called') ++ print('static bool _checkLockArraysEXT = false;') ++ print() + + # Buffer mappings +- print '// whether glMapBufferRange(GL_MAP_WRITE_BIT) has ever been called' +- print 'static bool _checkBufferMapRange = false;' +- print +- print '// whether glBufferParameteriAPPLE(GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE) has ever been called' +- print 'static bool _checkBufferFlushingUnmapAPPLE = false;' +- print ++ print('// whether glMapBufferRange(GL_MAP_WRITE_BIT) has ever been called') ++ print('static bool _checkBufferMapRange = false;') ++ print() ++ print('// whether glBufferParameteriAPPLE(GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE) has ever been called') ++ print('static bool _checkBufferFlushingUnmapAPPLE = false;') ++ print() + + # Generate a helper function to determine whether a parameter name + # refers to a symbolic value or not +- print 'static bool' +- print 'is_symbolic_pname(GLenum pname) {' +- print ' switch (pname) {' ++ print('static bool') ++ print('is_symbolic_pname(GLenum pname) {') ++ print(' switch (pname) {') + for function, type, count, name in glparams.parameters: + if type is glapi.GLenum: +- print ' case %s:' % name +- print ' return true;' +- print ' default:' +- print ' return false;' +- print ' }' +- print '}' +- print ++ print(' case %s:' % name) ++ print(' return true;') ++ print(' default:') ++ print(' return false;') ++ print(' }') ++ print('}') ++ print() + + # Generate a helper function to determine whether a parameter value is + # potentially symbolic or not; i.e., if the value can be represented in + # an enum or not +- print 'template' +- print 'static inline bool' +- print 'is_symbolic_param(T param) {' +- print ' return static_cast(static_cast(param)) == param;' +- print '}' +- print ++ print('template') ++ print('static inline bool') ++ print('is_symbolic_param(T param) {') ++ print(' return static_cast(static_cast(param)) == param;') ++ print('}') ++ print() + + # Generate a helper function to know how many elements a parameter has +- print 'static size_t' +- print '_gl_param_size(GLenum pname) {' +- print ' switch (pname) {' ++ print('static size_t') ++ print('_gl_param_size(GLenum pname) {') ++ print(' switch (pname) {') + for function, type, count, name in glparams.parameters: + if name == 'GL_PROGRAM_BINARY_FORMATS': + count = 0 + if type is not None: +- print ' case %s: return %s;' % (name, count) +- print ' default:' +- print r' os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);' +- print ' return 1;' +- print ' }' +- print '}' +- print ++ print(' case %s: return %s;' % (name, count)) ++ print(' default:') ++ print(r' os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);') ++ print(' return 1;') ++ print(' }') ++ print('}') ++ print() + + # states such as GL_UNPACK_ROW_LENGTH are not available in GLES +- print 'static inline bool' +- print 'can_unpack_subimage(void) {' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' return ctx->profile.desktop();' +- print '}' +- print ++ print('static inline bool') ++ print('can_unpack_subimage(void) {') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' return ctx->profile.desktop();') ++ print('}') ++ print() + + # VMWX_map_buffer_debug +- print r'extern "C" PUBLIC' +- print r'void APIENTRY' +- print r'glNotifyMappedBufferRangeVMWX(const void * start, GLsizeiptr length) {' ++ print(r'extern "C" PUBLIC') ++ print(r'void APIENTRY') ++ print(r'glNotifyMappedBufferRangeVMWX(const void * start, GLsizeiptr length) {') + self.emit_memcpy('start', 'length') +- print r'}' +- print ++ print(r'}') ++ print() + + getProcAddressFunctionNames = [] + +@@ -290,70 +290,70 @@ class GlTracer(Tracer): + argType = getProcAddressFunction.args[0].type + retType = getProcAddressFunction.type + +- print 'static %s _wrapProcAddress(%s procName, %s procPtr);' % (retType, argType, retType) +- print ++ print('static %s _wrapProcAddress(%s procName, %s procPtr);' % (retType, argType, retType)) ++ print() + + Tracer.traceApi(self, api) + +- print 'static %s _wrapProcAddress(%s procName, %s procPtr) {' % (retType, argType, retType) ++ print('static %s _wrapProcAddress(%s procName, %s procPtr) {' % (retType, argType, retType)) + + # Provide fallback functions to missing debug functions +- print ' if (!procPtr) {' ++ print(' if (!procPtr) {') + else_ = '' + for function_name in self.debug_functions: + if self.api.getFunctionByName(function_name): +- print ' %sif (strcmp("%s", (const char *)procName) == 0) {' % (else_, function_name) +- print ' return (%s)&%s;' % (retType, function_name) +- print ' }' ++ print(' %sif (strcmp("%s", (const char *)procName) == 0) {' % (else_, function_name)) ++ print(' return (%s)&%s;' % (retType, function_name)) ++ print(' }') + else_ = 'else ' +- print ' %s{' % else_ +- print ' return NULL;' +- print ' }' +- print ' }' ++ print(' %s{' % else_) ++ print(' return NULL;') ++ print(' }') ++ print(' }') + + for function in api.getAllFunctions(): + ptype = function_pointer_type(function) + pvalue = function_pointer_value(function) +- print ' if (strcmp("%s", (const char *)procName) == 0) {' % function.name +- print ' assert(procPtr != (%s)&%s);' % (retType, function.name) +- print ' %s = (%s)procPtr;' % (pvalue, ptype) +- print ' return (%s)&%s;' % (retType, function.name,) +- print ' }' +- print ' os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);' +- print ' return procPtr;' +- print '}' +- print ++ print(' if (strcmp("%s", (const char *)procName) == 0) {' % function.name) ++ print(' assert(procPtr != (%s)&%s);' % (retType, function.name)) ++ print(' %s = (%s)procPtr;' % (pvalue, ptype)) ++ print(' return (%s)&%s;' % (retType, function.name,)) ++ print(' }') ++ print(' os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);') ++ print(' return procPtr;') ++ print('}') ++ print() + else: + Tracer.traceApi(self, api) + + def defineShadowBufferHelper(self): +- print 'void _shadow_glGetBufferSubData(GLenum target, GLintptr offset,' +- print ' GLsizeiptr size, GLvoid *data)' +- print '{' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' if (!ctx->needsShadowBuffers() || target != GL_ELEMENT_ARRAY_BUFFER) {' +- print ' _glGetBufferSubData(target, offset, size, data);' +- print ' return;' +- print ' }' +- print +- print ' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);' +- print ' if (buffer_binding > 0) {' +- print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];' +- print ' buf.getSubData(offset, size, data);' +- print ' }' +- print '}' ++ print('void _shadow_glGetBufferSubData(GLenum target, GLintptr offset,') ++ print(' GLsizeiptr size, GLvoid *data)') ++ print('{') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' if (!ctx->needsShadowBuffers() || target != GL_ELEMENT_ARRAY_BUFFER) {') ++ print(' _glGetBufferSubData(target, offset, size, data);') ++ print(' return;') ++ print(' }') ++ print() ++ print(' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);') ++ print(' if (buffer_binding > 0) {') ++ print(' gltrace::Buffer & buf = ctx->buffers[buffer_binding];') ++ print(' buf.getSubData(offset, size, data);') ++ print(' }') ++ print('}') + + def shadowBufferMethod(self, method): + # Emit code to fetch the shadow buffer, and invoke a method +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' if (ctx->needsShadowBuffers() && target == GL_ELEMENT_ARRAY_BUFFER) {' +- print ' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);' +- print ' if (buffer_binding > 0) {' +- print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];' +- print ' buf.' + method + ';' +- print ' }' +- print ' }' +- print ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' if (ctx->needsShadowBuffers() && target == GL_ELEMENT_ARRAY_BUFFER) {') ++ print(' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);') ++ print(' if (buffer_binding > 0) {') ++ print(' gltrace::Buffer & buf = ctx->buffers[buffer_binding];') ++ print(' buf.' + method + ';') ++ print(' }') ++ print(' }') ++ print() + + def shadowBufferProlog(self, function): + if function.name == 'glBufferData': +@@ -363,12 +363,12 @@ class GlTracer(Tracer): + self.shadowBufferMethod('bufferSubData(offset, size, data)') + + if function.name == 'glDeleteBuffers': +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' if (ctx->needsShadowBuffers()) {' +- print ' for (GLsizei i = 0; i < n; i++) {' +- print ' ctx->buffers.erase(buffer[i]);' +- print ' }' +- print ' }' ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' if (ctx->needsShadowBuffers()) {') ++ print(' for (GLsizei i = 0; i < n; i++) {') ++ print(' ctx->buffers.erase(buffer[i]);') ++ print(' }') ++ print(' }') + + array_pointer_function_names = set(( + "glVertexPointer", +@@ -426,42 +426,42 @@ class GlTracer(Tracer): + def traceFunctionImplBody(self, function): + # Defer tracing of user array pointers... + if function.name in self.array_pointer_function_names: +- print ' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);' +- print ' if (!_array_buffer) {' +- print ' static bool warned = false;' +- print ' if (!warned) {' +- print ' warned = true;' +- print ' os::log("apitrace: warning: %s: call will be faked due to pointer to user memory (https://github.com/apitrace/apitrace/blob/master/docs/BUGS.markdown#tracing)\\n", __FUNCTION__);' +- print ' }' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' ctx->user_arrays = true;' ++ print(' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);') ++ print(' if (!_array_buffer) {') ++ print(' static bool warned = false;') ++ print(' if (!warned) {') ++ print(' warned = true;') ++ print(' os::log("apitrace: warning: %s: call will be faked due to pointer to user memory (https://github.com/apitrace/apitrace/blob/master/docs/BUGS.markdown#tracing)\\n", __FUNCTION__);') ++ print(' }') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' ctx->user_arrays = true;') + if function.name == "glVertexAttribPointerNV": +- print ' ctx->user_arrays_nv = true;' ++ print(' ctx->user_arrays_nv = true;') + self.invokeFunction(function) + + # And also break down glInterleavedArrays into the individual calls + if function.name == 'glInterleavedArrays': +- print ++ print() + + # Initialize the enable flags + for camelcase_name, uppercase_name in self.arrays: + flag_name = '_' + uppercase_name.lower() +- print ' GLboolean %s = GL_FALSE;' % flag_name +- print ++ print(' GLboolean %s = GL_FALSE;' % flag_name) ++ print() + + # Switch for the interleaved formats +- print ' switch (format) {' ++ print(' switch (format) {') + for format in self.interleaved_formats: +- print ' case %s:' % format ++ print(' case %s:' % format) + for camelcase_name, uppercase_name in self.arrays: + flag_name = '_' + uppercase_name.lower() + if format.find('_' + uppercase_name[0]) >= 0: +- print ' %s = GL_TRUE;' % flag_name +- print ' break;' +- print ' default:' +- print ' return;' +- print ' }' +- print ++ print(' %s = GL_TRUE;' % flag_name) ++ print(' break;') ++ print(' default:') ++ print(' return;') ++ print(' }') ++ print() + + # Emit fake glEnableClientState/glDisableClientState flags + for camelcase_name, uppercase_name in self.arrays: +@@ -469,16 +469,16 @@ class GlTracer(Tracer): + enable_name = 'GL_%s_ARRAY' % uppercase_name + + # Emit a fake function +- print ' {' +- print ' static const trace::FunctionSig &_sig = %s ? _glEnableClientState_sig : _glDisableClientState_sig;' % flag_name +- print ' unsigned _call = trace::localWriter.beginEnter(&_sig, true);' +- print ' trace::localWriter.beginArg(0);' ++ print(' {') ++ print(' static const trace::FunctionSig &_sig = %s ? _glEnableClientState_sig : _glDisableClientState_sig;' % flag_name) ++ print(' unsigned _call = trace::localWriter.beginEnter(&_sig, true);') ++ print(' trace::localWriter.beginArg(0);') + self.serializeValue(glapi.GLenum, enable_name) +- print ' trace::localWriter.endArg();' +- print ' trace::localWriter.endEnter();' +- print ' trace::localWriter.beginLeave(_call);' +- print ' trace::localWriter.endLeave();' +- print ' }' ++ print(' trace::localWriter.endArg();') ++ print(' trace::localWriter.endEnter();') ++ print(' trace::localWriter.beginLeave(_call);') ++ print(' trace::localWriter.endLeave();') ++ print(' }') + + # Warn about buggy glGet(GL_*ARRAY_SIZE) not returning GL_BGRA + buggyFunctions = { +@@ -489,224 +489,224 @@ class GlTracer(Tracer): + } + if function.name in buggyFunctions: + getter, extraArg, pname = buggyFunctions[function.name] +- print r' static bool _checked = false;' +- print r' if (!_checked && size == GL_BGRA) {' +- print r' GLint _size = 0;' +- print r' _%s(%s%s, &_size);' % (getter, extraArg, pname) +- print r' if (_size != GL_BGRA) {' +- print r' os::log("apitrace: warning: %s(%s) does not return GL_BGRA; trace will be incorrect (https://github.com/apitrace/apitrace/issues/261)\n");' % (getter, pname) +- print r' }' +- print r' _checked = true;' +- print r' }' +- +- print ' return;' +- print ' }' ++ print(r' static bool _checked = false;') ++ print(r' if (!_checked && size == GL_BGRA) {') ++ print(r' GLint _size = 0;') ++ print(r' _%s(%s%s, &_size);' % (getter, extraArg, pname)) ++ print(r' if (_size != GL_BGRA) {') ++ print(r' os::log("apitrace: warning: %s(%s) does not return GL_BGRA; trace will be incorrect (https://github.com/apitrace/apitrace/issues/261)\n");' % (getter, pname)) ++ print(r' }') ++ print(r' _checked = true;') ++ print(r' }') ++ ++ print(' return;') ++ print(' }') + + # ... to the draw calls + if self.draw_function_regex.match(function.name): + if not self.multi_draw_function_regex.match(function.name): +- print ' if (trace::localWriter.isIgnored()) {' ++ print(' if (trace::localWriter.isIgnored()) {') + self.invokeFunction(function) +- print ' return;' +- print ' }' +- print ' if (_need_user_arrays()) {' ++ print(' return;') ++ print(' }') ++ print(' if (_need_user_arrays()) {') + if 'Indirect' in function.name: +- print r' os::log("apitrace: warning: %s: indirect user arrays not supported\n");' % (function.name,) ++ print(r' os::log("apitrace: warning: %s: indirect user arrays not supported\n");' % (function.name,)) + else: + arg_names = ', '.join([arg.name for arg in function.args[1:]]) +- print ' GLuint _count = _%s_count(%s);' % (function.name, arg_names) ++ print(' GLuint _count = _%s_count(%s);' % (function.name, arg_names)) + # Some apps, in particular Quake3, can tell the driver to lock more + # vertices than those actually required for the draw call. +- print ' if (_checkLockArraysEXT) {' +- print ' GLuint _locked_count = _glGetInteger(GL_ARRAY_ELEMENT_LOCK_FIRST_EXT)' +- print ' + _glGetInteger(GL_ARRAY_ELEMENT_LOCK_COUNT_EXT);' +- print ' _count = std::max(_count, _locked_count);' +- print ' }' +- print ' _trace_user_arrays(_count);' +- print ' }' ++ print(' if (_checkLockArraysEXT) {') ++ print(' GLuint _locked_count = _glGetInteger(GL_ARRAY_ELEMENT_LOCK_FIRST_EXT)') ++ print(' + _glGetInteger(GL_ARRAY_ELEMENT_LOCK_COUNT_EXT);') ++ print(' _count = std::max(_count, _locked_count);') ++ print(' }') ++ print(' _trace_user_arrays(_count);') ++ print(' }') + if function.name == 'glLockArraysEXT': +- print ' _checkLockArraysEXT = true;' ++ print(' _checkLockArraysEXT = true;') + + # Warn if user arrays are used with glBegin/glArrayElement/glEnd. + if function.name == 'glBegin': +- print r' gltrace::Context *ctx = gltrace::getContext();' +- print r' ctx->userArraysOnBegin = _need_user_arrays();' ++ print(r' gltrace::Context *ctx = gltrace::getContext();') ++ print(r' ctx->userArraysOnBegin = _need_user_arrays();') + if function.name.startswith('glArrayElement'): +- print r' gltrace::Context *ctx = gltrace::getContext();' +- print r' if (ctx->userArraysOnBegin) {' +- print r' os::log("apitrace: warning: user arrays with glArrayElement not supported (https://github.com/apitrace/apitrace/issues/276)\n");' +- print r' ctx->userArraysOnBegin = false;' +- print r' }' ++ print(r' gltrace::Context *ctx = gltrace::getContext();') ++ print(r' if (ctx->userArraysOnBegin) {') ++ print(r' os::log("apitrace: warning: user arrays with glArrayElement not supported (https://github.com/apitrace/apitrace/issues/276)\n");') ++ print(r' ctx->userArraysOnBegin = false;') ++ print(r' }') + + # Emit a fake memcpy on buffer uploads + if function.name == 'glBufferParameteriAPPLE': +- print ' if (pname == GL_BUFFER_FLUSHING_UNMAP_APPLE && param == GL_FALSE) {' +- print ' _checkBufferFlushingUnmapAPPLE = true;' +- print ' }' ++ print(' if (pname == GL_BUFFER_FLUSHING_UNMAP_APPLE && param == GL_FALSE) {') ++ print(' _checkBufferFlushingUnmapAPPLE = true;') ++ print(' }') + if function.name in ('glUnmapBuffer', 'glUnmapBufferARB'): + if function.name.endswith('ARB'): + suffix = 'ARB' + else: + suffix = '' +- print ' GLint access_flags = 0;' +- print ' GLint access = 0;' +- print ' bool flush;' +- print ' // GLES3 does not have GL_BUFFER_ACCESS;' +- print ' if (_checkBufferMapRange) {' +- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);' % suffix +- print ' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));' +- print ' } else {' +- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS, &access);' % suffix +- print ' flush = access != GL_READ_ONLY;' +- print ' }' +- print ' if (flush) {' +- print ' GLvoid *map = NULL;' +- print ' _glGetBufferPointerv%s(target, GL_BUFFER_MAP_POINTER, &map);' % suffix +- print ' if (map) {' +- print ' GLint length = -1;' +- print ' if (_checkBufferMapRange) {' +- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_MAP_LENGTH, &length);' % suffix +- print ' if (length == -1) {' +- print ' // Mesa drivers refuse GL_BUFFER_MAP_LENGTH without GL 3.0 up-to' +- print ' // http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffee498fb848b253a7833373fe5430f8c7ca0c5f' +- print ' static bool warned = false;' +- print ' if (!warned) {' +- print ' os::log("apitrace: warning: glGetBufferParameteriv%s(GL_BUFFER_MAP_LENGTH) failed\\n");' % suffix +- print ' warned = true;' +- print ' }' +- print ' }' +- print ' } else {' +- print ' length = 0;' +- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_SIZE, &length);' % suffix +- print ' }' +- print ' if (_checkBufferFlushingUnmapAPPLE) {' +- print ' GLint flushing_unmap = GL_TRUE;' +- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_FLUSHING_UNMAP_APPLE, &flushing_unmap);' % suffix +- print ' flush = flush && flushing_unmap;' +- print ' }' +- print ' if (flush && length > 0) {' ++ print(' GLint access_flags = 0;') ++ print(' GLint access = 0;') ++ print(' bool flush;') ++ print(' // GLES3 does not have GL_BUFFER_ACCESS;') ++ print(' if (_checkBufferMapRange) {') ++ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);' % suffix) ++ print(' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));') ++ print(' } else {') ++ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS, &access);' % suffix) ++ print(' flush = access != GL_READ_ONLY;') ++ print(' }') ++ print(' if (flush) {') ++ print(' GLvoid *map = NULL;') ++ print(' _glGetBufferPointerv%s(target, GL_BUFFER_MAP_POINTER, &map);' % suffix) ++ print(' if (map) {') ++ print(' GLint length = -1;') ++ print(' if (_checkBufferMapRange) {') ++ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_MAP_LENGTH, &length);' % suffix) ++ print(' if (length == -1) {') ++ print(' // Mesa drivers refuse GL_BUFFER_MAP_LENGTH without GL 3.0 up-to') ++ print(' // http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffee498fb848b253a7833373fe5430f8c7ca0c5f') ++ print(' static bool warned = false;') ++ print(' if (!warned) {') ++ print(' os::log("apitrace: warning: glGetBufferParameteriv%s(GL_BUFFER_MAP_LENGTH) failed\\n");' % suffix) ++ print(' warned = true;') ++ print(' }') ++ print(' }') ++ print(' } else {') ++ print(' length = 0;') ++ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_SIZE, &length);' % suffix) ++ print(' }') ++ print(' if (_checkBufferFlushingUnmapAPPLE) {') ++ print(' GLint flushing_unmap = GL_TRUE;') ++ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_FLUSHING_UNMAP_APPLE, &flushing_unmap);' % suffix) ++ print(' flush = flush && flushing_unmap;') ++ print(' }') ++ print(' if (flush && length > 0) {') + self.emit_memcpy('map', 'length') +- print ' }' +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') ++ print(' }') + if function.name == 'glUnmapBufferOES': +- print ' GLint access_flags = 0;' +- print ' GLint access = 0;' +- print ' bool flush;' +- print ' // GLES3 does not have GL_BUFFER_ACCESS;' +- print ' if (_checkBufferMapRange) {' +- print ' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);' +- print ' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));' +- print ' } else {' +- print ' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS, &access);' +- print ' flush = access != GL_READ_ONLY;' +- print ' }' +- print ' if (flush) {' +- print ' GLvoid *map = NULL;' +- print ' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER, &map);' +- print ' if (map) {' +- print ' GLint length = 0;' +- print ' GLint offset = 0;' +- print ' if (_checkBufferMapRange) {' +- print ' _glGetBufferParameteriv(target, GL_BUFFER_MAP_LENGTH, &length);' +- print ' _glGetBufferParameteriv(target, GL_BUFFER_MAP_OFFSET, &offset);' +- print ' } else {' +- print ' _glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);' +- print ' }' +- print ' if (flush && length > 0) {' ++ print(' GLint access_flags = 0;') ++ print(' GLint access = 0;') ++ print(' bool flush;') ++ print(' // GLES3 does not have GL_BUFFER_ACCESS;') ++ print(' if (_checkBufferMapRange) {') ++ print(' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);') ++ print(' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));') ++ print(' } else {') ++ print(' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS, &access);') ++ print(' flush = access != GL_READ_ONLY;') ++ print(' }') ++ print(' if (flush) {') ++ print(' GLvoid *map = NULL;') ++ print(' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER, &map);') ++ print(' if (map) {') ++ print(' GLint length = 0;') ++ print(' GLint offset = 0;') ++ print(' if (_checkBufferMapRange) {') ++ print(' _glGetBufferParameteriv(target, GL_BUFFER_MAP_LENGTH, &length);') ++ print(' _glGetBufferParameteriv(target, GL_BUFFER_MAP_OFFSET, &offset);') ++ print(' } else {') ++ print(' _glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);') ++ print(' }') ++ print(' if (flush && length > 0) {') + self.emit_memcpy('map', 'length') + self.shadowBufferMethod('bufferSubData(offset, length, map)') +- print ' }' +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') ++ print(' }') + if function.name == 'glUnmapNamedBuffer': +- print ' GLint access_flags = 0;' +- print ' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);' +- print ' if ((access_flags & GL_MAP_WRITE_BIT) &&' +- print ' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {' +- print ' GLvoid *map = NULL;' +- print ' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);' +- print ' GLint length = 0;' +- print ' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_MAP_LENGTH, &length);' +- print ' if (map && length > 0) {' ++ print(' GLint access_flags = 0;') ++ print(' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);') ++ print(' if ((access_flags & GL_MAP_WRITE_BIT) &&') ++ print(' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {') ++ print(' GLvoid *map = NULL;') ++ print(' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);') ++ print(' GLint length = 0;') ++ print(' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_MAP_LENGTH, &length);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('map', 'length') +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + if function.name == 'glUnmapNamedBufferEXT': +- print ' GLint access_flags = 0;' +- print ' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);' +- print ' if ((access_flags & GL_MAP_WRITE_BIT) &&' +- print ' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {' +- print ' GLvoid *map = NULL;' +- print ' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);' +- print ' GLint length = 0;' +- print ' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_MAP_LENGTH, &length);' +- print ' if (map && length > 0) {' ++ print(' GLint access_flags = 0;') ++ print(' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);') ++ print(' if ((access_flags & GL_MAP_WRITE_BIT) &&') ++ print(' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {') ++ print(' GLvoid *map = NULL;') ++ print(' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);') ++ print(' GLint length = 0;') ++ print(' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_MAP_LENGTH, &length);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('map', 'length') +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + if function.name == 'glFlushMappedBufferRange': +- print ' GLvoid *map = NULL;' +- print ' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);' +- print ' if (map && length > 0) {' ++ print(' GLvoid *map = NULL;') ++ print(' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('(const char *)map + offset', 'length') +- print ' }' ++ print(' }') + if function.name == 'glFlushMappedBufferRangeEXT': +- print ' GLvoid *map = NULL;' +- print ' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &map);' +- print ' if (map && length > 0) {' ++ print(' GLvoid *map = NULL;') ++ print(' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &map);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('(const char *)map + offset', 'length') +- print ' }' ++ print(' }') + if function.name == 'glFlushMappedBufferRangeAPPLE': +- print ' GLvoid *map = NULL;' +- print ' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);' +- print ' if (map && size > 0) {' ++ print(' GLvoid *map = NULL;') ++ print(' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);') ++ print(' if (map && size > 0) {') + self.emit_memcpy('(const char *)map + offset', 'size') +- print ' }' ++ print(' }') + if function.name == 'glFlushMappedNamedBufferRange': +- print ' GLvoid *map = NULL;' +- print ' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);' +- print ' if (map && length > 0) {' ++ print(' GLvoid *map = NULL;') ++ print(' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('(const char *)map + offset', 'length') +- print ' }' ++ print(' }') + if function.name == 'glFlushMappedNamedBufferRangeEXT': +- print ' GLvoid *map = NULL;' +- print ' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);' +- print ' if (map && length > 0) {' ++ print(' GLvoid *map = NULL;') ++ print(' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);') ++ print(' if (map && length > 0) {') + self.emit_memcpy('(const char *)map + offset', 'length') +- print ' }' ++ print(' }') + + # FIXME: We don't support coherent/pinned memory mappings + if function.name in ('glBufferStorage', 'glNamedBufferStorage', 'glNamedBufferStorageEXT'): +- print r' if (!(flags & GL_MAP_PERSISTENT_BIT)) {' +- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);' +- print r' }' +- print r' flags &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;' ++ print(r' if (!(flags & GL_MAP_PERSISTENT_BIT)) {') ++ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);') ++ print(r' }') ++ print(r' flags &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;') + if function.name in ('glMapBufferRange', 'glMapBufferRangeEXT', 'glMapNamedBufferRange', 'glMapNamedBufferRangeEXT'): +- print r' if (access & GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX) {' +- print r' if (!(access & GL_MAP_PERSISTENT_BIT)) {' +- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);' +- print r' }' +- print r' if (access & GL_MAP_FLUSH_EXPLICIT_BIT) {' +- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/ MAP_FLUSH_EXPLICIT_BIT\n", __FUNCTION__);' +- print r' }' +- print r' access &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;' +- print r' } else if (access & GL_MAP_COHERENT_BIT) {' +- print r' os::log("apitrace: warning: %s: MAP_COHERENT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);' +- print r' } else if ((access & GL_MAP_PERSISTENT_BIT) &&' +- print r' !(access & GL_MAP_FLUSH_EXPLICIT_BIT)) {' +- print r' os::log("apitrace: warning: %s: MAP_PERSISTENT_BIT w/o FLUSH_EXPLICIT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);' +- print r' }' ++ print(r' if (access & GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX) {') ++ print(r' if (!(access & GL_MAP_PERSISTENT_BIT)) {') ++ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);') ++ print(r' }') ++ print(r' if (access & GL_MAP_FLUSH_EXPLICIT_BIT) {') ++ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/ MAP_FLUSH_EXPLICIT_BIT\n", __FUNCTION__);') ++ print(r' }') ++ print(r' access &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;') ++ print(r' } else if (access & GL_MAP_COHERENT_BIT) {') ++ print(r' os::log("apitrace: warning: %s: MAP_COHERENT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);') ++ print(r' } else if ((access & GL_MAP_PERSISTENT_BIT) &&') ++ print(r' !(access & GL_MAP_FLUSH_EXPLICIT_BIT)) {') ++ print(r' os::log("apitrace: warning: %s: MAP_PERSISTENT_BIT w/o FLUSH_EXPLICIT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);') ++ print(r' }') + if function.name in ('glBufferData', 'glBufferDataARB'): +- print r' if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {' +- print r' os::log("apitrace: warning: GL_AMD_pinned_memory not fully supported\n");' +- print r' }' ++ print(r' if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {') ++ print(r' os::log("apitrace: warning: GL_AMD_pinned_memory not fully supported\n");') ++ print(r' }') + + # TODO: We don't track GL_INTEL_map_texture mappings + if function.name == 'glMapTexture2DINTEL': +- print r' if (access & GL_MAP_WRITE_BIT) {' +- print r' os::log("apitrace: warning: GL_INTEL_map_texture not fully supported\n");' +- print r' }' ++ print(r' if (access & GL_MAP_WRITE_BIT) {') ++ print(r' os::log("apitrace: warning: GL_INTEL_map_texture not fully supported\n");') ++ print(r' }') + + # Don't leave vertex attrib locations to chance. Instead emit fake + # glBindAttribLocation calls to ensure that the same locations will be +@@ -715,40 +715,40 @@ class GlTracer(Tracer): + # many entry-points, including non-shader related ones. + if function.name == 'glLinkProgram': + Tracer.invokeFunction(self, function) +- print ' GLint active_attributes = 0;' +- print ' _glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attributes);' +- print ' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {' +- print ' GLint size = 0;' +- print ' GLenum type = 0;' +- print ' GLchar name[256];' ++ print(' GLint active_attributes = 0;') ++ print(' _glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attributes);') ++ print(' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {') ++ print(' GLint size = 0;') ++ print(' GLenum type = 0;') ++ print(' GLchar name[256];') + # TODO: Use ACTIVE_ATTRIBUTE_MAX_LENGTH instead of 256 +- print ' _glGetActiveAttrib(program, attrib, sizeof name, NULL, &size, &type, name);' +- print " if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {" +- print ' GLint location = _glGetAttribLocation(program, name);' +- print ' if (location >= 0) {' ++ print(' _glGetActiveAttrib(program, attrib, sizeof name, NULL, &size, &type, name);') ++ print(" if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {") ++ print(' GLint location = _glGetAttribLocation(program, name);') ++ print(' if (location >= 0) {') + bind_function = glapi.glapi.getFunctionByName('glBindAttribLocation') + self.fake_call(bind_function, ['program', 'location', 'name']) +- print ' }' +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') ++ print(' }') + if function.name == 'glLinkProgramARB': + Tracer.invokeFunction(self, function) +- print ' GLint active_attributes = 0;' +- print ' _glGetObjectParameterivARB(programObj, GL_OBJECT_ACTIVE_ATTRIBUTES_ARB, &active_attributes);' +- print ' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {' +- print ' GLint size = 0;' +- print ' GLenum type = 0;' +- print ' GLcharARB name[256];' ++ print(' GLint active_attributes = 0;') ++ print(' _glGetObjectParameterivARB(programObj, GL_OBJECT_ACTIVE_ATTRIBUTES_ARB, &active_attributes);') ++ print(' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {') ++ print(' GLint size = 0;') ++ print(' GLenum type = 0;') ++ print(' GLcharARB name[256];') + # TODO: Use ACTIVE_ATTRIBUTE_MAX_LENGTH instead of 256 +- print ' _glGetActiveAttribARB(programObj, attrib, sizeof name, NULL, &size, &type, name);' +- print " if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {" +- print ' GLint location = _glGetAttribLocationARB(programObj, name);' +- print ' if (location >= 0) {' ++ print(' _glGetActiveAttribARB(programObj, attrib, sizeof name, NULL, &size, &type, name);') ++ print(" if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {") ++ print(' GLint location = _glGetAttribLocationARB(programObj, name);') ++ print(' if (location >= 0) {') + bind_function = glapi.glapi.getFunctionByName('glBindAttribLocationARB') + self.fake_call(bind_function, ['programObj', 'location', 'name']) +- print ' }' +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') ++ print(' }') + + self.shadowBufferProlog(function) + +@@ -815,9 +815,9 @@ class GlTracer(Tracer): + # Force glProgramBinary to fail. Per ARB_get_program_binary this + # should signal the app that it needs to recompile. + if function.name in ('glProgramBinary', 'glProgramBinaryOES'): +- print r' binaryFormat = 0xDEADDEAD;' +- print r' binary = &binaryFormat;' +- print r' length = sizeof binaryFormat;' ++ print(r' binaryFormat = 0xDEADDEAD;') ++ print(r' binary = &binaryFormat;') ++ print(r' length = sizeof binaryFormat;') + + Tracer.invokeFunction(self, function) + +@@ -838,25 +838,25 @@ class GlTracer(Tracer): + # We may be faking KHR_debug, so ensure the pointer queries result is + # always zeroed to prevent dereference of unitialized pointers + if function.name == 'glGetPointerv': +- print ' if (params &&' +- print ' (pname == GL_DEBUG_CALLBACK_FUNCTION ||' +- print ' pname == GL_DEBUG_CALLBACK_USER_PARAM)) {' +- print ' *params = NULL;' +- print ' }' ++ print(' if (params &&') ++ print(' (pname == GL_DEBUG_CALLBACK_FUNCTION ||') ++ print(' pname == GL_DEBUG_CALLBACK_USER_PARAM)) {') ++ print(' *params = NULL;') ++ print(' }') + + if function.name in self.getProcAddressFunctionNames: + nameArg = function.args[0].name +- print ' if (strcmp("glNotifyMappedBufferRangeVMWX", (const char *)%s) == 0) {' % (nameArg,) +- print ' _result = (%s)&glNotifyMappedBufferRangeVMWX;' % (function.type,) +- print ' } else if (strcmp("glTexDirectVIV", (const char *)%s) == 0) {' % (nameArg,) +- print ' _result = (%s)&glTexDirectVIV;' % (function.type,) +- print ' } else if (strcmp("glTexDirectInvalidateVIV", (const char *)%s) == 0) {' % (nameArg,) +- print ' _result = (%s)&glTexDirectInvalidateVIV;' % (function.type,) ++ print(' if (strcmp("glNotifyMappedBufferRangeVMWX", (const char *)%s) == 0) {' % (nameArg,)) ++ print(' _result = (%s)&glNotifyMappedBufferRangeVMWX;' % (function.type,)) ++ print(' } else if (strcmp("glTexDirectVIV", (const char *)%s) == 0) {' % (nameArg,)) ++ print(' _result = (%s)&glTexDirectVIV;' % (function.type,)) ++ print(' } else if (strcmp("glTexDirectInvalidateVIV", (const char *)%s) == 0) {' % (nameArg,)) ++ print(' _result = (%s)&glTexDirectInvalidateVIV;' % (function.type,)) + for marker_function in self.marker_functions: + if self.api.getFunctionByName(marker_function): +- print ' } else if (strcmp("%s", (const char *)%s) == 0) {' % (marker_function, nameArg) +- print ' _result = (%s)&%s;' % (function.type, marker_function) +- print ' } else {' ++ print(' } else if (strcmp("%s", (const char *)%s) == 0) {' % (marker_function, nameArg)) ++ print(' _result = (%s)&%s;' % (function.type, marker_function)) ++ print(' } else {') + Tracer.doInvokeFunction(self, function) + + # Replace function addresses with ours +@@ -864,24 +864,24 @@ class GlTracer(Tracer): + # contain the addresses of the wrapper functions, and not the real + # functions, but in practice this should make no difference. + if function.name in self.getProcAddressFunctionNames: +- print ' _result = _wrapProcAddress(%s, _result);' % (nameArg,) ++ print(' _result = _wrapProcAddress(%s, _result);' % (nameArg,)) + +- print ' }' ++ print(' }') + return + + if function.name in ('glGetProgramBinary', 'glGetProgramBinaryOES'): +- print r' bufSize = 0;' ++ print(r' bufSize = 0;') + + Tracer.doInvokeFunction(self, function) + + if function.name == 'glGetProgramiv': +- print r' if (params && pname == GL_PROGRAM_BINARY_LENGTH) {' +- print r' *params = 0;' +- print r' }' ++ print(r' if (params && pname == GL_PROGRAM_BINARY_LENGTH) {') ++ print(r' *params = 0;') ++ print(r' }') + if function.name in ('glGetProgramBinary', 'glGetProgramBinaryOES'): +- print r' if (length) {' +- print r' *length = 0;' +- print r' }' ++ print(r' if (length) {') ++ print(r' *length = 0;') ++ print(r' }') + + buffer_targets = [ + 'ARRAY_BUFFER', +@@ -902,9 +902,9 @@ class GlTracer(Tracer): + + # Keep track of buffer mappings + if function.name in ('glMapBufferRange', 'glMapBufferRangeEXT'): +- print ' if (access & GL_MAP_WRITE_BIT) {' +- print ' _checkBufferMapRange = true;' +- print ' }' ++ print(' if (access & GL_MAP_WRITE_BIT) {') ++ print(' _checkBufferMapRange = true;') ++ print(' }') + + boolean_names = [ + 'GL_FALSE', +@@ -932,17 +932,17 @@ class GlTracer(Tracer): + and (isinstance(arg.type, stdapi.Blob) \ + or (isinstance(arg.type, stdapi.Const) \ + and isinstance(arg.type.type, stdapi.Blob))): +- print ' {' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print ' GLint _unpack_buffer = 0;' +- print ' if (ctx->profile.desktop())' +- print ' _glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &_unpack_buffer);' +- print ' if (_unpack_buffer) {' +- print ' trace::localWriter.writePointer((uintptr_t)%s);' % arg.name +- print ' } else {' ++ print(' {') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print(' GLint _unpack_buffer = 0;') ++ print(' if (ctx->profile.desktop())') ++ print(' _glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &_unpack_buffer);') ++ print(' if (_unpack_buffer) {') ++ print(' trace::localWriter.writePointer((uintptr_t)%s);' % arg.name) ++ print(' } else {') + Tracer.serializeArgValue(self, function, arg) +- print ' }' +- print ' }' ++ print(' }') ++ print(' }') + return + + # Several GL state functions take GLenum symbolic names as +@@ -953,11 +953,11 @@ class GlTracer(Tracer): + assert arg.index > 0 + assert function.args[arg.index - 1].name == 'pname' + assert function.args[arg.index - 1].type == glapi.GLenum +- print ' if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name ++ print(' if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name) + self.serializeValue(glapi.GLenum, arg.name) +- print ' } else {' ++ print(' } else {') + Tracer.serializeArgValue(self, function, arg) +- print ' }' ++ print(' }') + return + + Tracer.serializeArgValue(self, function, arg) +@@ -967,20 +967,20 @@ class GlTracer(Tracer): + + # A simple state tracker to track the pointer values + # update the state +- print 'static void _trace_user_arrays(GLuint count)' +- print '{' +- print ' gltrace::Context *ctx = gltrace::getContext();' +- print +- print ' glprofile::Profile profile = ctx->profile;' +- print ' bool es1 = profile.es() && profile.major == 1;' +- print ++ print('static void _trace_user_arrays(GLuint count)') ++ print('{') ++ print(' gltrace::Context *ctx = gltrace::getContext();') ++ print() ++ print(' glprofile::Profile profile = ctx->profile;') ++ print(' bool es1 = profile.es() && profile.major == 1;') ++ print() + + # Temporarily unbind the array buffer +- print ' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);' +- print ' if (_array_buffer) {' ++ print(' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);') ++ print(' if (_array_buffer) {') + self.fake_glBindBuffer(api, 'GL_ARRAY_BUFFER', '0') +- print ' }' +- print ++ print(' }') ++ print() + + for camelcase_name, uppercase_name in self.arrays: + # in which profile is the array available? +@@ -993,45 +993,45 @@ class GlTracer(Tracer): + binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name + function = api.getFunctionByName(function_name) + +- print ' // %s' % function.prototype() +- print ' if (%s) {' % profile_check ++ print(' // %s' % function.prototype()) ++ print(' if (%s) {' % profile_check) + self.array_trace_prolog(api, uppercase_name) + self.array_prolog(api, uppercase_name) +- print ' if (_glIsEnabled(%s)) {' % enable_name +- print ' GLint _binding = _glGetInteger(%s);' % binding_name +- print ' if (!_binding) {' ++ print(' if (_glIsEnabled(%s)) {' % enable_name) ++ print(' GLint _binding = _glGetInteger(%s);' % binding_name) ++ print(' if (!_binding) {') + + # Get the arguments via glGet* + for arg in function.args: + arg_get_enum = 'GL_%s_ARRAY_%s' % (uppercase_name, arg.name.upper()) + arg_get_function, arg_type = TypeGetter().visit(arg.type) +- print ' %s %s = 0;' % (arg_type, arg.name) +- print ' _%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name) ++ print(' %s %s = 0;' % (arg_type, arg.name)) ++ print(' _%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name)) + + arg_names = ', '.join([arg.name for arg in function.args[:-1]]) +- print ' size_t _size = _%s_size(%s, count);' % (function.name, arg_names) ++ print(' size_t _size = _%s_size(%s, count);' % (function.name, arg_names)) + + # Emit a fake function + self.array_trace_intermezzo(api, uppercase_name) +- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,) ++ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)) + for arg in function.args: + assert not arg.output +- print ' trace::localWriter.beginArg(%u);' % (arg.index,) ++ print(' trace::localWriter.beginArg(%u);' % (arg.index,)) + if arg.name != 'pointer': + self.serializeValue(arg.type, arg.name) + else: +- print ' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name) +- print ' trace::localWriter.endArg();' ++ print(' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name)) ++ print(' trace::localWriter.endArg();') + +- print ' trace::localWriter.endEnter();' +- print ' trace::localWriter.beginLeave(_call);' +- print ' trace::localWriter.endLeave();' +- print ' }' +- print ' }' ++ print(' trace::localWriter.endEnter();') ++ print(' trace::localWriter.beginLeave(_call);') ++ print(' trace::localWriter.endLeave();') ++ print(' }') ++ print(' }') + self.array_epilog(api, uppercase_name) + self.array_trace_epilog(api, uppercase_name) +- print ' }' +- print ++ print(' }') ++ print() + + # Samething, but for glVertexAttribPointer* + # +@@ -1043,12 +1043,12 @@ class GlTracer(Tracer): + # This means that the implementations of these functions do not always + # alias, and they need to be considered independently. + # +- print ' // ES1 does not support generic vertex attributes' +- print ' if (es1)' +- print ' return;' +- print +- print ' vertex_attrib _vertex_attrib = _get_vertex_attrib();' +- print ++ print(' // ES1 does not support generic vertex attributes') ++ print(' if (es1)') ++ print(' return;') ++ print() ++ print(' vertex_attrib _vertex_attrib = _get_vertex_attrib();') ++ print() + for suffix in ['', 'NV']: + if suffix: + SUFFIX = '_' + suffix +@@ -1057,24 +1057,24 @@ class GlTracer(Tracer): + function_name = 'glVertexAttribPointer' + suffix + function = api.getFunctionByName(function_name) + +- print ' // %s' % function.prototype() +- print ' if (_vertex_attrib == VERTEX_ATTRIB%s) {' % SUFFIX ++ print(' // %s' % function.prototype()) ++ print(' if (_vertex_attrib == VERTEX_ATTRIB%s) {' % SUFFIX) + if suffix == 'NV': +- print ' GLint _max_vertex_attribs = 16;' ++ print(' GLint _max_vertex_attribs = 16;') + else: +- print ' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);' +- print ' for (GLint index = 0; index < _max_vertex_attribs; ++index) {' +- print ' GLint _enabled = 0;' ++ print(' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);') ++ print(' for (GLint index = 0; index < _max_vertex_attribs; ++index) {') ++ print(' GLint _enabled = 0;') + if suffix == 'NV': +- print ' _glGetIntegerv(GL_VERTEX_ATTRIB_ARRAY0_NV + index, &_enabled);' ++ print(' _glGetIntegerv(GL_VERTEX_ATTRIB_ARRAY0_NV + index, &_enabled);') + else: +- print ' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED%s, &_enabled);' % (suffix, SUFFIX) +- print ' if (_enabled) {' +- print ' GLint _binding = 0;' ++ print(' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED%s, &_enabled);' % (suffix, SUFFIX)) ++ print(' if (_enabled) {') ++ print(' GLint _binding = 0;') + if suffix != 'NV': + # It doesn't seem possible to use VBOs with NV_vertex_program. +- print ' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING%s, &_binding);' % (suffix, SUFFIX) +- print ' if (!_binding) {' ++ print(' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING%s, &_binding);' % (suffix, SUFFIX)) ++ print(' if (!_binding) {') + + # Get the arguments via glGet* + for arg in function.args[1:]: +@@ -1083,40 +1083,40 @@ class GlTracer(Tracer): + else: + arg_get_enum = 'GL_VERTEX_ATTRIB_ARRAY_%s%s' % (arg.name.upper(), SUFFIX) + arg_get_function, arg_type = TypeGetter('glGetVertexAttrib', False, suffix).visit(arg.type) +- print ' %s %s = 0;' % (arg_type, arg.name) +- print ' _%s(index, %s, &%s);' % (arg_get_function, arg_get_enum, arg.name) ++ print(' %s %s = 0;' % (arg_type, arg.name)) ++ print(' _%s(index, %s, &%s);' % (arg_get_function, arg_get_enum, arg.name)) + + arg_names = ', '.join([arg.name for arg in function.args[1:-1]]) +- print ' size_t _size = _%s_size(%s, count);' % (function.name, arg_names) ++ print(' size_t _size = _%s_size(%s, count);' % (function.name, arg_names)) + + # Emit a fake function +- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,) ++ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)) + for arg in function.args: + assert not arg.output +- print ' trace::localWriter.beginArg(%u);' % (arg.index,) ++ print(' trace::localWriter.beginArg(%u);' % (arg.index,)) + if arg.name != 'pointer': + self.serializeValue(arg.type, arg.name) + else: +- print ' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name) +- print ' trace::localWriter.endArg();' ++ print(' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name)) ++ print(' trace::localWriter.endArg();') + +- print ' trace::localWriter.endEnter();' +- print ' trace::localWriter.beginLeave(_call);' +- print ' trace::localWriter.endLeave();' +- print ' }' +- print ' }' +- print ' }' +- print ' }' +- print ++ print(' trace::localWriter.endEnter();') ++ print(' trace::localWriter.beginLeave(_call);') ++ print(' trace::localWriter.endLeave();') ++ print(' }') ++ print(' }') ++ print(' }') ++ print(' }') ++ print() + + # Restore the original array_buffer +- print ' if (_array_buffer) {' ++ print(' if (_array_buffer) {') + self.fake_glBindBuffer(api, 'GL_ARRAY_BUFFER', '_array_buffer') +- print ' }' +- print ++ print(' }') ++ print() + +- print '}' +- print ++ print('}') ++ print() + + # + # Hooks for glTexCoordPointer, which is identical to the other array +@@ -1125,49 +1125,49 @@ class GlTracer(Tracer): + + def array_prolog(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' GLint max_units = 0;' +- print ' if (ctx->profile.desktop())' +- print ' _glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_units);' +- print ' else' +- print ' _glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_units);' +- print ' GLint client_active_texture = GL_TEXTURE0;' +- print ' if (max_units > 0) {' +- print ' _glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &client_active_texture);' +- print ' }' +- print ' GLint unit = 0;' +- print ' do {' +- print ' GLint texture = GL_TEXTURE0 + unit;' +- print ' if (max_units > 0) {' +- print ' _glClientActiveTexture(texture);' +- print ' }' ++ print(' GLint max_units = 0;') ++ print(' if (ctx->profile.desktop())') ++ print(' _glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_units);') ++ print(' else') ++ print(' _glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_units);') ++ print(' GLint client_active_texture = GL_TEXTURE0;') ++ print(' if (max_units > 0) {') ++ print(' _glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &client_active_texture);') ++ print(' }') ++ print(' GLint unit = 0;') ++ print(' do {') ++ print(' GLint texture = GL_TEXTURE0 + unit;') ++ print(' if (max_units > 0) {') ++ print(' _glClientActiveTexture(texture);') ++ print(' }') + + def array_trace_prolog(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' bool client_active_texture_dirty = false;' ++ print(' bool client_active_texture_dirty = false;') + + def array_epilog(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' } while (++unit < max_units);' ++ print(' } while (++unit < max_units);') + self.array_cleanup(api, uppercase_name) + + def array_cleanup(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' if (max_units > 0) {' +- print ' _glClientActiveTexture(client_active_texture);' +- print ' }' ++ print(' if (max_units > 0) {') ++ print(' _glClientActiveTexture(client_active_texture);') ++ print(' }') + + def array_trace_intermezzo(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' if (texture != client_active_texture || client_active_texture_dirty) {' +- print ' client_active_texture_dirty = true;' ++ print(' if (texture != client_active_texture || client_active_texture_dirty) {') ++ print(' client_active_texture_dirty = true;') + self.fake_glClientActiveTexture_call(api, "texture"); +- print ' }' ++ print(' }') + + def array_trace_epilog(self, api, uppercase_name): + if uppercase_name == 'TEXTURE_COORD': +- print ' if (client_active_texture_dirty) {' ++ print(' if (client_active_texture_dirty) {') + self.fake_glClientActiveTexture_call(api, "client_active_texture"); +- print ' }' ++ print(' }') + + def fake_glBindBuffer(self, api, target, buffer): + function = api.getFunctionByName('glBindBuffer') +@@ -1180,13 +1180,13 @@ class GlTracer(Tracer): + def emitFakeTexture2D(self): + function = glapi.glapi.getFunctionByName('glTexImage2D') + instances = function.argNames() +- print ' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,) ++ print(' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)) + for arg in function.args: + assert not arg.output + self.serializeArg(function, arg) +- print ' trace::localWriter.endEnter();' +- print ' trace::localWriter.beginLeave(_fake_call);' +- print ' trace::localWriter.endLeave();' ++ print(' trace::localWriter.endEnter();') ++ print(' trace::localWriter.beginLeave(_fake_call);') ++ print(' trace::localWriter.endLeave();') + + + +diff --git a/wrappers/glxtrace.py b/wrappers/glxtrace.py +index f35d1fe9..b05028e2 100644 +--- a/wrappers/glxtrace.py ++++ b/wrappers/glxtrace.py +@@ -64,7 +64,7 @@ class GlxTracer(GlTracer): + + def traceFunctionImplBody(self, function): + if function.name in self.destroyContextFunctionNames: +- print ' gltrace::releaseContext((uintptr_t)ctx);' ++ print(' gltrace::releaseContext((uintptr_t)ctx);') + + if function.name == 'glXGetCurrentDisplay': + print ' if(_glXGetCurrentDisplay == &glXGetCurrentDisplay ){' +@@ -74,16 +74,16 @@ class GlxTracer(GlTracer): + GlTracer.traceFunctionImplBody(self, function) + + if function.name in self.createContextFunctionNames: +- print ' if (_result != NULL)' +- print ' gltrace::createContext((uintptr_t)_result);' ++ print(' if (_result != NULL)') ++ print(' gltrace::createContext((uintptr_t)_result);') + + if function.name in self.makeCurrentFunctionNames: +- print ' if (_result) {' +- print ' if (ctx != NULL)' +- print ' gltrace::setContext((uintptr_t)ctx);' +- print ' else' +- print ' gltrace::clearContext();' +- print ' }' ++ print(' if (_result) {') ++ print(' if (ctx != NULL)') ++ print(' gltrace::setContext((uintptr_t)ctx);') ++ print(' else') ++ print(' gltrace::clearContext();') ++ print(' }') + + if function.name == 'glXBindTexImageEXT': + # FIXME: glXBindTexImageEXT gets called frequently, so we should +@@ -92,7 +92,7 @@ class GlxTracer(GlTracer): + # emit emitFakeTexture2D when it changes + # - keep a global hash of the pixels + # FIXME: Handle mipmaps +- print r''' ++ print(r''' + unsigned glx_target = 0; + _glXQueryDrawable(display, drawable, GLX_TEXTURE_TARGET_EXT, &glx_target); + GLenum target; +@@ -152,29 +152,29 @@ class GlxTracer(GlTracer): + GLint row_stride = _align(width * 4, alignment); + GLvoid * pixels = malloc(height * row_stride); + _glGetTexImage(target, level, format, type, pixels); +- ''' ++ ''') + self.emitFakeTexture2D() +- print r''' ++ print(r''' + free(pixels); + } +- ''' ++ ''') + + + if __name__ == '__main__': +- print +- print '#include ' +- print '#include ' +- print +- print '#include "trace_writer_local.hpp"' +- print +- print '// To validate our prototypes' +- print '#define GL_GLEXT_PROTOTYPES' +- print '#define GLX_GLXEXT_PROTOTYPES' +- print +- print '#include "dlopen.hpp"' +- print '#include "glproc.hpp"' +- print '#include "glsize.hpp"' +- print ++ print() ++ print('#include ') ++ print('#include ') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print() ++ print('// To validate our prototypes') ++ print('#define GL_GLEXT_PROTOTYPES') ++ print('#define GLX_GLXEXT_PROTOTYPES') ++ print() ++ print('#include "dlopen.hpp"') ++ print('#include "glproc.hpp"') ++ print('#include "glsize.hpp"') ++ print() + + module = Module() + module.mergeModule(glxapi) +diff --git a/wrappers/trace.py b/wrappers/trace.py +index 7d1baa10..318f0990 100644 +--- a/wrappers/trace.py ++++ b/wrappers/trace.py +@@ -69,21 +69,21 @@ class ComplexValueSerializer(stdapi.OnceVisitor): + + def visitStruct(self, struct): + # Ensure member array has nonzero length to avoid MSVC error C2466 +- print 'static const char * _struct%s_members[%u] = {' % (struct.tag, max(len(struct.members), 1)) ++ print('static const char * _struct%s_members[%u] = {' % (struct.tag, max(len(struct.members), 1))) + for type, name, in struct.members: + if name is None: +- print ' "",' ++ print(' "",') + else: +- print ' "%s",' % (name,) +- print '};' +- print 'static const trace::StructSig _struct%s_sig = {' % (struct.tag,) ++ print(' "%s",' % (name,)) ++ print('};') ++ print('static const trace::StructSig _struct%s_sig = {' % (struct.tag,)) + if struct.name is None: + structName = '""' + else: + structName = '"%s"' % struct.name +- print ' %u, %s, %u, _struct%s_members' % (struct.id, structName, len(struct.members), struct.tag) +- print '};' +- print ++ print(' %u, %s, %u, _struct%s_members' % (struct.id, structName, len(struct.members), struct.tag)) ++ print('};') ++ print() + + def visitArray(self, array): + self.visit(array.type) +@@ -95,26 +95,26 @@ class ComplexValueSerializer(stdapi.OnceVisitor): + pass + + def visitEnum(self, enum): +- print 'static const trace::EnumValue _enum%s_values[] = {' % (enum.tag) ++ print('static const trace::EnumValue _enum%s_values[] = {' % (enum.tag)) + for value in enum.values: +- print ' {"%s", %s},' % (value, value) +- print '};' +- print +- print 'static const trace::EnumSig _enum%s_sig = {' % (enum.tag) +- print ' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag) +- print '};' +- print ++ print(' {"%s", %s},' % (value, value)) ++ print('};') ++ print() ++ print('static const trace::EnumSig _enum%s_sig = {' % (enum.tag)) ++ print(' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag)) ++ print('};') ++ print() + + def visitBitmask(self, bitmask): +- print 'static const trace::BitmaskFlag _bitmask%s_flags[] = {' % (bitmask.tag) ++ print('static const trace::BitmaskFlag _bitmask%s_flags[] = {' % (bitmask.tag)) + for value in bitmask.values: +- print ' {"%s", %s},' % (value, value) +- print '};' +- print +- print 'static const trace::BitmaskSig _bitmask%s_sig = {' % (bitmask.tag) +- print ' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag) +- print '};' +- print ++ print(' {"%s", %s},' % (value, value)) ++ print('};') ++ print() ++ print('static const trace::BitmaskSig _bitmask%s_sig = {' % (bitmask.tag)) ++ print(' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag)) ++ print('};') ++ print() + + def visitPointer(self, pointer): + self.visit(pointer.type) +@@ -146,16 +146,16 @@ class ComplexValueSerializer(stdapi.OnceVisitor): + def visitPolymorphic(self, polymorphic): + if not polymorphic.contextLess: + return +- print 'static void _write__%s(int selector, %s const & value) {' % (polymorphic.tag, polymorphic.expr) +- print ' switch (selector) {' ++ print('static void _write__%s(int selector, %s const & value) {' % (polymorphic.tag, polymorphic.expr)) ++ print(' switch (selector) {') + for cases, type in polymorphic.iterSwitch(): + for case in cases: +- print ' %s:' % case ++ print(' %s:' % case) + self.serializer.visit(type, '(%s)(value)' % (type,)) +- print ' break;' +- print ' }' +- print '}' +- print ++ print(' break;') ++ print(' }') ++ print('}') ++ print() + + + class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): +@@ -167,7 +167,7 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): + ''' + + def visitLiteral(self, literal, instance): +- print ' trace::localWriter.write%s(%s);' % (literal.kind, instance) ++ print(' trace::localWriter.write%s(%s);' % (literal.kind, instance)) + + def visitString(self, string, instance): + if not string.wide: +@@ -183,33 +183,33 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): + length = ', %s' % self.expand(string.length) + else: + length = '' +- print ' trace::localWriter.write%s(%s%s);' % (suffix, instance, length) ++ print(' trace::localWriter.write%s(%s%s);' % (suffix, instance, length)) + + def visitConst(self, const, instance): + self.visit(const.type, instance) + + def visitStruct(self, struct, instance): +- print ' trace::localWriter.beginStruct(&_struct%s_sig);' % (struct.tag,) ++ print(' trace::localWriter.beginStruct(&_struct%s_sig);' % (struct.tag,)) + for member in struct.members: + self.visitMember(member, instance) +- print ' trace::localWriter.endStruct();' ++ print(' trace::localWriter.endStruct();') + + def visitArray(self, array, instance): + length = '_c' + array.type.tag + index = '_i' + array.type.tag + array_length = self.expand(array.length) +- print ' if (%s) {' % instance +- print ' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length) +- print ' trace::localWriter.beginArray(%s);' % length +- print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index) +- print ' trace::localWriter.beginElement();' ++ print(' if (%s) {' % instance) ++ print(' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length)) ++ print(' trace::localWriter.beginArray(%s);' % length) ++ print(' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index)) ++ print(' trace::localWriter.beginElement();') + self.visitElement(index, array.type, '(%s)[%s]' % (instance, index)) +- print ' trace::localWriter.endElement();' +- print ' }' +- print ' trace::localWriter.endArray();' +- print ' } else {' +- print ' trace::localWriter.writeNull();' +- print ' }' ++ print(' trace::localWriter.endElement();') ++ print(' }') ++ print(' trace::localWriter.endArray();') ++ print(' } else {') ++ print(' trace::localWriter.writeNull();') ++ print(' }') + + def visitAttribArray(self, array, instance): + # For each element, decide if it is a key or a value (which depends on the previous key). +@@ -218,90 +218,90 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): + + # determine the array length which must be passed to writeArray() up front + count = '_c' + array.baseType.tag +- print ' {' +- print ' int %s;' % count +- print ' for (%(c)s = 0; %(array)s && %(array)s[%(c)s] != %(terminator)s; %(c)s += 2) {' \ +- % {'c': count, 'array': instance, 'terminator': array.terminator} ++ print(' {') ++ print(' int %s;' % count) ++ print(' for (%(c)s = 0; %(array)s && %(array)s[%(c)s] != %(terminator)s; %(c)s += 2) {' \ ++ % {'c': count, 'array': instance, 'terminator': array.terminator}) + if array.hasKeysWithoutValues: +- print ' switch (int(%(array)s[%(c)s])) {' % {'array': instance, 'c': count} ++ print(' switch (int(%(array)s[%(c)s])) {' % {'array': instance, 'c': count}) + for key, valueType in array.valueTypes: + if valueType is None: +- print ' case %s:' % key +- print ' %s--;' % count # the next value is a key again and checked if it's the terminator +- print ' break;' +- print ' }' +- print ' }' +- print ' %(c)s += %(array)s ? 1 : 0;' % {'c': count, 'array': instance} +- print ' trace::localWriter.beginArray(%s);' % count ++ print(' case %s:' % key) ++ print(' %s--;' % count) # the next value is a key again and checked if it's the terminator ++ print(' break;') ++ print(' }') ++ print(' }') ++ print(' %(c)s += %(array)s ? 1 : 0;' % {'c': count, 'array': instance}) ++ print(' trace::localWriter.beginArray(%s);' % count) + + # for each key / key-value pair write the key and the value, if the key requires one + + index = '_i' + array.baseType.tag +- print ' for (int %(i)s = 0; %(i)s < %(count)s; %(i)s++) {' % {'i': index, 'count': count} +- print ' trace::localWriter.beginElement();' ++ print(' for (int %(i)s = 0; %(i)s < %(count)s; %(i)s++) {' % {'i': index, 'count': count}) ++ print(' trace::localWriter.beginElement();') + self.visit(array.baseType, "%(array)s[%(i)s]" % {'array': instance, 'i': index}) +- print ' trace::localWriter.endElement();' +- print ' if (%(i)s + 1 >= %(count)s) {' % {'i': index, 'count': count} +- print ' break;' +- print ' }' +- print ' switch (int(%(array)s[%(i)s++])) {' % {'array': instance, 'i': index} ++ print(' trace::localWriter.endElement();') ++ print(' if (%(i)s + 1 >= %(count)s) {' % {'i': index, 'count': count}) ++ print(' break;') ++ print(' }') ++ print(' switch (int(%(array)s[%(i)s++])) {' % {'array': instance, 'i': index}) + # write generic value the usual way + for key, valueType in array.valueTypes: + if valueType is not None: +- print ' case %s:' % key +- print ' trace::localWriter.beginElement();' ++ print(' case %s:' % key) ++ print(' trace::localWriter.beginElement();') + self.visitElement(index, valueType, '(%(array)s)[%(i)s]' % {'array': instance, 'i': index}) +- print ' trace::localWriter.endElement();' +- print ' break;' ++ print(' trace::localWriter.endElement();') ++ print(' break;') + # known key with no value, just decrease the index so we treat the next value as a key + if array.hasKeysWithoutValues: + for key, valueType in array.valueTypes: + if valueType is None: +- print ' case %s:' % key +- print ' %s--;' % index +- print ' break;' ++ print(' case %s:' % key) ++ print(' %s--;' % index) ++ print(' break;') + # unknown key, write an int value +- print ' default:' +- print ' trace::localWriter.beginElement();' +- print ' os::log("apitrace: warning: %s: unknown key 0x%04X, interpreting value as int\\n", ' + \ +- '__FUNCTION__, int(%(array)s[%(i)s - 1]));' % {'array': instance, 'i': index} +- print ' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index} +- print ' trace::localWriter.endElement();' +- print ' break;' +- print ' }' +- print ' }' +- print ' trace::localWriter.endArray();' +- print ' }' ++ print(' default:') ++ print(' trace::localWriter.beginElement();') ++ print(' os::log("apitrace: warning: %s: unknown key 0x%04X, interpreting value as int\\n", ' + \ ++ '__FUNCTION__, int(%(array)s[%(i)s - 1]));' % {'array': instance, 'i': index}) ++ print(' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index}) ++ print(' trace::localWriter.endElement();') ++ print(' break;') ++ print(' }') ++ print(' }') ++ print(' trace::localWriter.endArray();') ++ print(' }') + + + def visitBlob(self, blob, instance): +- print ' trace::localWriter.writeBlob(%s, %s);' % (instance, self.expand(blob.size)) ++ print(' trace::localWriter.writeBlob(%s, %s);' % (instance, self.expand(blob.size))) + + def visitEnum(self, enum, instance): +- print ' trace::localWriter.writeEnum(&_enum%s_sig, %s);' % (enum.tag, instance) ++ print(' trace::localWriter.writeEnum(&_enum%s_sig, %s);' % (enum.tag, instance)) + + def visitBitmask(self, bitmask, instance): +- print ' trace::localWriter.writeBitmask(&_bitmask%s_sig, %s);' % (bitmask.tag, instance) ++ print(' trace::localWriter.writeBitmask(&_bitmask%s_sig, %s);' % (bitmask.tag, instance)) + + def visitPointer(self, pointer, instance): +- print ' if (%s) {' % instance +- print ' trace::localWriter.beginArray(1);' +- print ' trace::localWriter.beginElement();' ++ print(' if (%s) {' % instance) ++ print(' trace::localWriter.beginArray(1);') ++ print(' trace::localWriter.beginElement();') + self.visit(pointer.type, "*" + instance) +- print ' trace::localWriter.endElement();' +- print ' trace::localWriter.endArray();' +- print ' } else {' +- print ' trace::localWriter.writeNull();' +- print ' }' ++ print(' trace::localWriter.endElement();') ++ print(' trace::localWriter.endArray();') ++ print(' } else {') ++ print(' trace::localWriter.writeNull();') ++ print(' }') + + def visitIntPointer(self, pointer, instance): +- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance ++ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance) + + def visitObjPointer(self, pointer, instance): +- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance ++ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance) + + def visitLinearPointer(self, pointer, instance): +- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance ++ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance) + + def visitReference(self, reference, instance): + self.visit(reference.type, instance) +@@ -313,31 +313,31 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): + self.visit(alias.type, instance) + + def visitOpaque(self, opaque, instance): +- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance ++ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance) + + def visitInterface(self, interface, instance): + assert False + + def visitPolymorphic(self, polymorphic, instance): + if polymorphic.contextLess: +- print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) ++ print(' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance)) + else: + switchExpr = self.expand(polymorphic.switchExpr) +- print ' switch (%s) {' % switchExpr ++ print(' switch (%s) {' % switchExpr) + for cases, type in polymorphic.iterSwitch(): + for case in cases: +- print ' %s:' % case ++ print(' %s:' % case) + caseInstance = instance + if type.expr is not None: + caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance) + self.visit(type, caseInstance) +- print ' break;' ++ print(' break;') + if polymorphic.defaultType is None: +- print r' default:' +- print r' os::log("apitrace: warning: %%s: unexpected polymorphic case %%i\n", __FUNCTION__, (int)%s);' % (switchExpr,) +- print r' trace::localWriter.writeNull();' +- print r' break;' +- print ' }' ++ print(r' default:') ++ print(r' os::log("apitrace: warning: %%s: unexpected polymorphic case %%i\n", __FUNCTION__, (int)%s);' % (switchExpr,)) ++ print(r' trace::localWriter.writeNull();') ++ print(r' break;') ++ print(' }') + + + class WrapDecider(stdapi.Traverser): +@@ -369,16 +369,16 @@ class ValueWrapper(stdapi.Traverser, stdapi.ExpanderMixin): + + def visitArray(self, array, instance): + array_length = self.expand(array.length) +- print " if (%s) {" % instance +- print " for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length ++ print(" if (%s) {" % instance) ++ print(" for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length) + self.visitElement('_i', array.type, instance + "[_i]") +- print " }" +- print " }" ++ print(" }") ++ print(" }") + + def visitPointer(self, pointer, instance): +- print " if (%s) {" % instance ++ print(" if (%s) {" % instance) + self.visit(pointer.type, "*" + instance) +- print " }" ++ print(" }") + + def visitObjPointer(self, pointer, instance): + elem_type = pointer.type.mutable() +@@ -388,13 +388,13 @@ class ValueWrapper(stdapi.Traverser, stdapi.ExpanderMixin): + self.visitInterfacePointer(elem_type.type, instance) + else: + # All interfaces should at least implement IUnknown +- print " WrapIUnknown::_wrap(__FUNCTION__, (IUnknown **) &%s);" % (instance,) ++ print(" WrapIUnknown::_wrap(__FUNCTION__, (IUnknown **) &%s);" % (instance,)) + + def visitInterface(self, interface, instance): + raise NotImplementedError + + def visitInterfacePointer(self, interface, instance): +- print " Wrap%s::_wrap(__FUNCTION__, &%s);" % (interface.name, instance) ++ print(" Wrap%s::_wrap(__FUNCTION__, &%s);" % (interface.name, instance)) + + def visitPolymorphic(self, type, instance): + # XXX: There might be polymorphic values that need wrapping in the future +@@ -409,17 +409,17 @@ class ValueUnwrapper(ValueWrapper): + def visitStruct(self, struct, instance): + if not self.allocated: + # Argument is constant. We need to create a non const +- print ' {' +- print " %s * _t = static_cast<%s *>(alloca(sizeof *_t));" % (struct, struct) +- print ' *_t = %s;' % (instance,) ++ print(' {') ++ print(" %s * _t = static_cast<%s *>(alloca(sizeof *_t));" % (struct, struct)) ++ print(' *_t = %s;' % (instance,)) + assert instance.startswith('*') +- print ' %s = _t;' % (instance[1:],) ++ print(' %s = _t;' % (instance[1:],)) + instance = '*_t' + self.allocated = True + try: + return ValueWrapper.visitStruct(self, struct, instance) + finally: +- print ' }' ++ print(' }') + else: + return ValueWrapper.visitStruct(self, struct, instance) + +@@ -428,18 +428,18 @@ class ValueUnwrapper(ValueWrapper): + return ValueWrapper.visitArray(self, array, instance) + array_length = self.expand(array.length) + elem_type = array.type.mutable() +- print " if (%s && %s) {" % (instance, array_length) +- print " %s * _t = static_cast<%s *>(alloca(%s * sizeof *_t));" % (elem_type, elem_type, array_length) +- print " for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length +- print " _t[_i] = %s[_i];" % instance ++ print(" if (%s && %s) {" % (instance, array_length)) ++ print(" %s * _t = static_cast<%s *>(alloca(%s * sizeof *_t));" % (elem_type, elem_type, array_length)) ++ print(" for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length) ++ print(" _t[_i] = %s[_i];" % instance) + self.allocated = True + self.visit(array.type, "_t[_i]") +- print " }" +- print " %s = _t;" % instance +- print " }" ++ print(" }") ++ print(" %s = _t;" % instance) ++ print(" }") + + def visitInterfacePointer(self, interface, instance): +- print r' Wrap%s::_unwrap(__FUNCTION__, &%s);' % (interface.name, instance) ++ print(r' Wrap%s::_unwrap(__FUNCTION__, &%s);' % (interface.name, instance)) + + + def _getInterfaceHierarchy(allIfaces, baseIface, result): +@@ -479,14 +479,17 @@ class Tracer: + # Includes + for module in api.modules: + for header in module.headers: +- print header +- print ++ print(header) ++ print() + + # Generate the serializer functions + types = api.getAllTypes() + visitor = ComplexValueSerializer(self.serializerFactory()) +- map(visitor.visit, types) +- print ++ ++ for tp in types: ++ visitor.visit(tp) ++ ++ print() + + # Interfaces wrapers + self.traceInterfaces(api) +@@ -498,22 +501,22 @@ class Tracer: + self.traceFunctionDecl(function) + for function in api.getAllFunctions(): + self.traceFunctionImpl(function) +- print ++ print() + + self.footer(api) + + def header(self, api): +- print '#ifdef _WIN32' +- print '# include // alloca' +- print '# ifndef alloca' +- print '# define alloca _alloca' +- print '# endif' +- print '#else' +- print '# include // alloca' +- print '#endif' +- print +- print +- print 'static std::map g_WrappedObjects;' ++ print('#ifdef _WIN32') ++ print('# include // alloca') ++ print('# ifndef alloca') ++ print('# define alloca _alloca') ++ print('# endif') ++ print('#else') ++ print('# include // alloca') ++ print('#endif') ++ print() ++ print() ++ print('static std::map g_WrappedObjects;') + + def footer(self, api): + pass +@@ -523,11 +526,11 @@ class Tracer: + + if not function.internal: + if function.args: +- print 'static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args])) ++ print('static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args]))) + else: +- print 'static const char ** _%s_args = NULL;' % (function.name,) +- print 'static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, self.getFunctionSigId(), function.name, len(function.args), function.name) +- print ++ print('static const char ** _%s_args = NULL;' % (function.name,)) ++ print('static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, self.getFunctionSigId(), function.sigName(), len(function.args), function.name)) ++ print() + + def getFunctionSigId(self): + id = Tracer.__id +@@ -539,12 +542,12 @@ class Tracer: + + def traceFunctionImpl(self, function): + if self.isFunctionPublic(function): +- print 'extern "C" PUBLIC' ++ print('extern "C" PUBLIC') + else: +- print 'extern "C" PRIVATE' +- print function.prototype() + ' {' ++ print('extern "C" PRIVATE') ++ print(function.prototype() + ' {') + if function.type is not stdapi.Void: +- print ' %s _result;' % function.type ++ print(' %s _result;' % function.type) + + for arg in function.args: + if not arg.output: +@@ -555,43 +558,43 @@ class Tracer: + # XXX: wrapping should go here, but before we can do that we'll need to protect g_WrappedObjects with its own mutex + + if function.type is not stdapi.Void: +- print ' return _result;' ++ print(' return _result;') + +- print '}' +- print ++ print('}') ++ print() + + def traceFunctionImplBody(self, function): + multi_draw_function_regex = re.compile(r'^glMultiDraw(Arrays|Elements)([A-Z][a-zA-Z]*)?$' ) + if not function.internal: +- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,) ++ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,)) + for arg in function.args: + if not arg.output: + self.serializeArg(function, arg) +- print ' trace::localWriter.endEnter();' ++ print(' trace::localWriter.endEnter();') + + if self.multi_draw_function_regex.match(function.name): +- print ' trace::localWriter.beginIgnore();' +- print ' trace::localWriter.endIgnore();' ++ print(' trace::localWriter.beginIgnore();') ++ print(' trace::localWriter.endEnter();') + + self.invokeFunction(function) + + if self.multi_draw_function_regex.match(function.name): +- print ' trace::localWriter.beginTrace();' +- print ' trace::localWriter.endTrace();' ++ print(' trace::localWriter.beginTrace();') ++ print(' trace::localWriter.endTrace();') + + if not function.internal: +- print ' trace::localWriter.beginLeave(_call);' +- print ' if (%s) {' % self.wasFunctionSuccessful(function) ++ print(' trace::localWriter.beginLeave(_call);') ++ print(' if (%s) {' % self.wasFunctionSuccessful(function)) + for arg in function.args: + if arg.output: + self.serializeArg(function, arg) + self.wrapArg(function, arg) +- print ' }' ++ print(' }') + if function.type is not stdapi.Void: + self.serializeRet(function, "_result") + if function.type is not stdapi.Void: + self.wrapRet(function, "_result") +- print ' trace::localWriter.endLeave();' ++ print(' trace::localWriter.endLeave();') + + def invokeFunction(self, function): + self.doInvokeFunction(function) +@@ -603,7 +606,7 @@ class Tracer: + else: + result = '_result = ' + dispatch = prefix + function.name + suffix +- print ' %s%s(%s);' % (result, dispatch, ', '.join([str(arg.name) for arg in function.args])) ++ print(' %s%s(%s);' % (result, dispatch, ', '.join([str(arg.name) for arg in function.args]))) + + def wasFunctionSuccessful(self, function): + if function.type is stdapi.Void: +@@ -613,9 +616,9 @@ class Tracer: + return 'true' + + def serializeArg(self, function, arg): +- print ' trace::localWriter.beginArg(%u);' % (arg.index,) ++ print(' trace::localWriter.beginArg(%u);' % (arg.index,)) + self.serializeArgValue(function, arg) +- print ' trace::localWriter.endArg();' ++ print(' trace::localWriter.endArg();') + + def serializeArgValue(self, function, arg): + self.serializeValue(arg.type, arg.name) +@@ -641,9 +644,9 @@ class Tracer: + self.unwrapValue(arg.type, arg.name) + + def serializeRet(self, function, instance): +- print ' trace::localWriter.beginReturn();' ++ print(' trace::localWriter.beginReturn();') + self.serializeValue(function.type, instance) +- print ' trace::localWriter.endReturn();' ++ print(' trace::localWriter.endReturn();') + + def serializeValue(self, type, instance): + serializer = self.serializerFactory() +@@ -672,70 +675,72 @@ class Tracer: + if not interfaces: + return + +- print r'#include "guids.hpp"' +- print ++ print(r'#include "guids.hpp"') ++ print() + + map(self.declareWrapperInterface, interfaces) + + # Helper functions to wrap/unwrap interface pointers +- print r'static inline bool' +- print r'hasChildInterface(REFIID riid, IUnknown *pUnknown) {' +- print r' IUnknown *pObj = NULL;' +- print r' HRESULT hr = pUnknown->QueryInterface(riid, (VOID **)&pObj);' +- print r' if (FAILED(hr)) {' +- print r' return false;' +- print r' }' +- print r' assert(pObj);' +- print r' pObj->Release();' +- print r' return pUnknown == pObj;' +- print r'}' +- print +- print r'static inline const void *' +- print r'getVtbl(const void *pvObj) {' +- print r' return pvObj ? *(const void **)pvObj : NULL;' +- print r'}' +- print ++ print(r'static inline bool') ++ print(r'hasChildInterface(REFIID riid, IUnknown *pUnknown) {') ++ print(r' IUnknown *pObj = NULL;') ++ print(r' HRESULT hr = pUnknown->QueryInterface(riid, (VOID **)&pObj);') ++ print(r' if (FAILED(hr)) {') ++ print(r' return false;') ++ print(r' }') ++ print(r' assert(pObj);') ++ print(r' pObj->Release();') ++ print(r' return pUnknown == pObj;') ++ print(r'}') ++ print() ++ print(r'static inline const void *') ++ print(r'getVtbl(const void *pvObj) {') ++ print(r' return pvObj ? *(const void **)pvObj : NULL;') ++ print(r'}') ++ print() + + self.implementIidWrapper(api) + +- map(self.implementWrapperInterface, interfaces) +- print ++ for iface in interfaces: ++ self.implementWrapperInterface(iface) ++ ++ print() + + def declareWrapperInterface(self, interface): + wrapperInterfaceName = getWrapperInterfaceName(interface) +- print "class %s : public %s " % (wrapperInterfaceName, interface.name) +- print "{" +- print "private:" +- print " %s(%s * pInstance);" % (wrapperInterfaceName, interface.name) +- print " virtual ~%s();" % wrapperInterfaceName +- print "public:" +- print " static %s* _create(const char *entryName, %s * pInstance);" % (wrapperInterfaceName, interface.name) +- print " static void _wrap(const char *entryName, %s ** ppInstance);" % (interface.name,) +- print " static void _unwrap(const char *entryName, %s ** pInstance);" % (interface.name,) +- print ++ print("class %s : public %s " % (wrapperInterfaceName, interface.name)) ++ print("{") ++ print("private:") ++ print(" %s(%s * pInstance);" % (wrapperInterfaceName, interface.name)) ++ print(" virtual ~%s();" % wrapperInterfaceName) ++ print("public:") ++ print(" static %s* _create(const char *entryName, %s * pInstance);" % (wrapperInterfaceName, interface.name)) ++ print(" static void _wrap(const char *entryName, %s ** ppInstance);" % (interface.name,)) ++ print(" static void _unwrap(const char *entryName, %s ** pInstance);" % (interface.name,)) ++ print() + + methods = list(interface.iterMethods()) + for method in methods: +- print " " + method.prototype() + ";" ++ print(" " + method.prototype() + ";") + print + + for type, name, value in self.enumWrapperInterfaceVariables(interface): +- print ' %s %s;' % (type, name) +- print +- +- print r'private:' +- print r' void _dummy(unsigned i) const {' +- print r' os::log("error: %%s: unexpected virtual method %%i of instance pWrapper=%%p pvObj=%%p pVtbl=%%p\n", "%s", i, this, m_pInstance, m_pVtbl);' % interface.name +- print r' trace::localWriter.flush();' +- print r' os::abort();' +- print r' }' +- print ++ print(' %s %s;' % (type, name)) ++ print() ++ ++ print(r'private:') ++ print(r' void _dummy(unsigned i) const {') ++ print(r' os::log("error: %%s: unexpected virtual method %%i of instance pWrapper=%%p pvObj=%%p pVtbl=%%p\n", "%s", i, this, m_pInstance, m_pVtbl);' % interface.name) ++ print(r' trace::localWriter.flush();') ++ print(r' os::abort();') ++ print(r' }') ++ print() + for i in range(len(methods), 64): +- print r' virtual void _dummy%i(void) const { _dummy(%i); }' % (i, i) +- print ++ print(r' virtual void _dummy%i(void) const { _dummy(%i); }' % (i, i)) ++ print() + +- print "};" +- print ++ print("};") ++ print() + + def enumWrapperInterfaceVariables(self, interface): + return [ +@@ -751,101 +756,101 @@ class Tracer: + wrapperInterfaceName = getWrapperInterfaceName(iface) + + # Private constructor +- print '%s::%s(%s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name) ++ print('%s::%s(%s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name)) + for type, name, value in self.enumWrapperInterfaceVariables(iface): + if value is not None: +- print ' %s = %s;' % (name, value) +- print '}' +- print ++ print(' %s = %s;' % (name, value)) ++ print('}') ++ print() + + # Public constructor +- print '%s *%s::_create(const char *entryName, %s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name) +- print r' Wrap%s *pWrapper = new Wrap%s(pInstance);' % (iface.name, iface.name) ++ print('%s *%s::_create(const char *entryName, %s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name)) ++ print(r' Wrap%s *pWrapper = new Wrap%s(pInstance);' % (iface.name, iface.name)) + if debug: +- print r' os::log("%%s: created %s pvObj=%%p pWrapper=%%p pVtbl=%%p\n", entryName, pInstance, pWrapper, pWrapper->m_pVtbl);' % iface.name +- print r' g_WrappedObjects[pInstance] = pWrapper;' +- print r' return pWrapper;' +- print '}' +- print ++ print(r' os::log("%%s: created %s pvObj=%%p pWrapper=%%p pVtbl=%%p\n", entryName, pInstance, pWrapper, pWrapper->m_pVtbl);' % iface.name) ++ print(r' g_WrappedObjects[pInstance] = pWrapper;') ++ print(r' return pWrapper;') ++ print('}') ++ print() + + # Destructor +- print '%s::~%s() {' % (wrapperInterfaceName, wrapperInterfaceName) ++ print('%s::~%s() {' % (wrapperInterfaceName, wrapperInterfaceName)) + if debug: +- print r' os::log("%s::Release: deleted pvObj=%%p pWrapper=%%p pVtbl=%%p\n", m_pInstance, this, m_pVtbl);' % iface.name +- print r' g_WrappedObjects.erase(m_pInstance);' +- print '}' +- print ++ print(r' os::log("%s::Release: deleted pvObj=%%p pWrapper=%%p pVtbl=%%p\n", m_pInstance, this, m_pVtbl);' % iface.name) ++ print(r' g_WrappedObjects.erase(m_pInstance);') ++ print('}') ++ print() + + baseMethods = list(iface.iterBaseMethods()) + for base, method in baseMethods: + self.base = base + self.implementWrapperInterfaceMethod(iface, base, method) + +- print ++ print() + + # Wrap pointer + ifaces = self.api.getAllInterfaces() +- print r'void' +- print r'%s::_wrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name) +- print r' if (!ppObj) {' +- print r' return;' +- print r' }' +- print r' %s *pObj = *ppObj;' % (iface.name,) +- print r' if (!pObj) {' +- print r' return;' +- print r' }' +- print r' assert(hasChildInterface(IID_%s, pObj));' % iface.name +- print r' std::map::const_iterator it = g_WrappedObjects.find(pObj);' +- print r' if (it != g_WrappedObjects.end()) {' +- print r' Wrap%s *pWrapper = (Wrap%s *)it->second;' % (iface.name, iface.name) +- print r' assert(pWrapper);' +- print r' assert(pWrapper->m_dwMagic == 0xd8365d6c);' +- print r' assert(pWrapper->m_pInstance == pObj);' +- print r' if (pWrapper->m_pVtbl == getVtbl(pObj) &&' +- print r' pWrapper->m_NumMethods >= %s) {' % len(baseMethods) ++ print(r'void') ++ print(r'%s::_wrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name)) ++ print(r' if (!ppObj) {') ++ print(r' return;') ++ print(r' }') ++ print(r' %s *pObj = *ppObj;' % (iface.name,)) ++ print(r' if (!pObj) {') ++ print(r' return;') ++ print(r' }') ++ print(r' assert(hasChildInterface(IID_%s, pObj));' % iface.name) ++ print(r' std::map::const_iterator it = g_WrappedObjects.find(pObj);') ++ print(r' if (it != g_WrappedObjects.end()) {') ++ print(r' Wrap%s *pWrapper = (Wrap%s *)it->second;' % (iface.name, iface.name)) ++ print(r' assert(pWrapper);') ++ print(r' assert(pWrapper->m_dwMagic == 0xd8365d6c);') ++ print(r' assert(pWrapper->m_pInstance == pObj);') ++ print(r' if (pWrapper->m_pVtbl == getVtbl(pObj) &&') ++ print(r' pWrapper->m_NumMethods >= %s) {' % len(baseMethods)) + if debug: +- print r' os::log("%s: fetched pvObj=%p pWrapper=%p pVtbl=%p\n", entryName, pObj, pWrapper, pWrapper->m_pVtbl);' +- print r' *ppObj = pWrapper;' +- print r' return;' +- print r' }' +- print r' }' ++ print(r' os::log("%s: fetched pvObj=%p pWrapper=%p pVtbl=%p\n", entryName, pObj, pWrapper, pWrapper->m_pVtbl);') ++ print(r' *ppObj = pWrapper;') ++ print(r' return;') ++ print(r' }') ++ print(r' }') + for childIface in getInterfaceHierarchy(ifaces, iface): +- print r' if (hasChildInterface(IID_%s, pObj)) {' % (childIface.name,) +- print r' *ppObj = Wrap%s::_create(entryName, static_cast<%s *>(pObj));' % (childIface.name, childIface.name) +- print r' return;' +- print r' }' +- print r' *ppObj = Wrap%s::_create(entryName, pObj);' % iface.name +- print r'}' +- print ++ print(r' if (hasChildInterface(IID_%s, pObj)) {' % (childIface.name,)) ++ print(r' *ppObj = Wrap%s::_create(entryName, static_cast<%s *>(pObj));' % (childIface.name, childIface.name)) ++ print(r' return;') ++ print(r' }') ++ print(r' *ppObj = Wrap%s::_create(entryName, pObj);' % iface.name) ++ print(r'}') ++ print() + + # Unwrap pointer +- print r'void' +- print r'%s::_unwrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name) +- print r' if (!ppObj || !*ppObj) {' +- print r' return;' +- print r' }' +- print r' const %s *pWrapper = static_cast(*ppObj);' % (wrapperInterfaceName, getWrapperInterfaceName(iface)) +- print r' if (pWrapper && pWrapper->m_dwMagic == 0xd8365d6c) {' +- print r' *ppObj = pWrapper->m_pInstance;' +- print r' } else {' +- print r' os::log("apitrace: warning: %%s: unexpected %%s pointer %%p\n", entryName, "%s", *ppObj);' % iface.name +- print r' trace::localWriter.flush();' +- print r' }' +- print r'}' +- print ++ print(r'void') ++ print(r'%s::_unwrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name)) ++ print(r' if (!ppObj || !*ppObj) {') ++ print(r' return;') ++ print(r' }') ++ print(r' const %s *pWrapper = static_cast(*ppObj);' % (wrapperInterfaceName, getWrapperInterfaceName(iface))) ++ print(r' if (pWrapper && pWrapper->m_dwMagic == 0xd8365d6c) {') ++ print(r' *ppObj = pWrapper->m_pInstance;') ++ print(r' } else {') ++ print(r' os::log("apitrace: warning: %%s: unexpected %%s pointer %%p\n", entryName, "%s", *ppObj);' % iface.name) ++ print(r' trace::localWriter.flush();') ++ print(r' }') ++ print(r'}') ++ print() + + def implementWrapperInterfaceMethod(self, interface, base, method): + wrapperInterfaceName = getWrapperInterfaceName(interface) + +- print method.prototype(wrapperInterfaceName + '::' + method.name) + ' {' ++ print(method.prototype(wrapperInterfaceName + '::' + method.name) + ' {') + + if False: +- print r' os::log("%%s(%%p -> %%p)\n", "%s", this, m_pInstance);' % (wrapperInterfaceName + '::' + method.name) ++ print(r' os::log("%%s(%%p -> %%p)\n", "%s", this, m_pInstance);' % (wrapperInterfaceName + '::' + method.name)) + + if method.type is not stdapi.Void: +- print ' %s _result;' % method.type ++ print(' %s _result;' % method.type) + +- print ' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base) ++ print(' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base)) + for arg in method.args: + if not arg.output: + self.unwrapArg(method, arg) +@@ -855,36 +860,36 @@ class Tracer: + # XXX: wrapping should go here, but before we can do that we'll need to protect g_WrappedObjects with its own mutex + + if method.type is not stdapi.Void: +- print ' return _result;' ++ print(' return _result;') + +- print '}' +- print ++ print('}') ++ print() + + def implementWrapperInterfaceMethodBody(self, interface, base, method): + assert not method.internal + +- print ' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args])) +- print ' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (self.getFunctionSigId(), interface.name + '::' + method.name, len(method.args) + 1) ++ print(' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args]))) ++ print(' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (self.getFunctionSigId(), interface.name + '::' + method.name, len(method.args) + 1)) + +- print ' unsigned _call = trace::localWriter.beginEnter(&_sig);' +- print ' trace::localWriter.beginArg(0);' +- print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);' +- print ' trace::localWriter.endArg();' ++ print(' unsigned _call = trace::localWriter.beginEnter(&_sig);') ++ print(' trace::localWriter.beginArg(0);') ++ print(' trace::localWriter.writePointer((uintptr_t)m_pInstance);') ++ print(' trace::localWriter.endArg();') + for arg in method.args: + if not arg.output: + self.serializeArg(method, arg) +- print ' trace::localWriter.endEnter();' ++ print(' trace::localWriter.endEnter();') + + self.invokeMethod(interface, base, method) + +- print ' trace::localWriter.beginLeave(_call);' ++ print(' trace::localWriter.beginLeave(_call);') + +- print ' if (%s) {' % self.wasFunctionSuccessful(method) ++ print(' if (%s) {' % self.wasFunctionSuccessful(method)) + for arg in method.args: + if arg.output: + self.serializeArg(method, arg) + self.wrapArg(method, arg) +- print ' }' ++ print(' }') + + if method.type is not stdapi.Void: + self.serializeRet(method, '_result') +@@ -893,51 +898,51 @@ class Tracer: + + if method.name == 'Release': + assert method.type is not stdapi.Void +- print r' if (!_result) {' +- print r' delete this;' +- print r' }' ++ print(r' if (!_result) {') ++ print(r' delete this;') ++ print(r' }') + +- print ' trace::localWriter.endLeave();' ++ print(' trace::localWriter.endLeave();') + + def implementIidWrapper(self, api): + ifaces = api.getAllInterfaces() + +- print r'static void' +- print r'warnIID(const char *entryName, REFIID riid, void *pvObj, const char *reason) {' +- print r' os::log("apitrace: warning: %s: %s IID %s\n",' +- print r' entryName, reason,' +- print r' getGuidName(riid));' +- print r' void * pVtbl = *(void **)pvObj;' +- print r' HMODULE hModule = 0;' +- print r' BOOL bRet = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |' +- print r' GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,' +- print r' (LPCTSTR)pVtbl,' +- print r' &hModule);' +- print r' assert(bRet);' +- print r' if (bRet) {' +- print r' char szModule[MAX_PATH];' +- print r' DWORD dwRet = GetModuleFileNameA(hModule, szModule, sizeof szModule);' +- print r' assert(dwRet);' +- print r' if (dwRet) {' +- print r' DWORD dwOffset = (UINT_PTR)pVtbl - (UINT_PTR)hModule;' +- print r' os::log("apitrace: warning: pVtbl = %p (%s!+0x%0lx)\n", pVtbl, szModule, dwOffset);' +- print r' }' +- print r' }' +- print r'}' +- print +- print r'static void' +- print r'wrapIID(const char *entryName, REFIID riid, void * * ppvObj) {' +- print r' if (!ppvObj || !*ppvObj) {' +- print r' return;' +- print r' }' ++ print(r'static void') ++ print(r'warnIID(const char *entryName, REFIID riid, void *pvObj, const char *reason) {') ++ print(r' os::log("apitrace: warning: %s: %s IID %s\n",') ++ print(r' entryName, reason,') ++ print(r' getGuidName(riid));') ++ print(r' void * pVtbl = *(void **)pvObj;') ++ print(r' HMODULE hModule = 0;') ++ print(r' BOOL bRet = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |') ++ print(r' GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,') ++ print(r' (LPCTSTR)pVtbl,') ++ print(r' &hModule);') ++ print(r' assert(bRet);') ++ print(r' if (bRet) {') ++ print(r' char szModule[MAX_PATH];') ++ print(r' DWORD dwRet = GetModuleFileNameA(hModule, szModule, sizeof szModule);') ++ print(r' assert(dwRet);') ++ print(r' if (dwRet) {') ++ print(r' DWORD dwOffset = (UINT_PTR)pVtbl - (UINT_PTR)hModule;') ++ print(r' os::log("apitrace: warning: pVtbl = %p (%s!+0x%0lx)\n", pVtbl, szModule, dwOffset);') ++ print(r' }') ++ print(r' }') ++ print(r'}') ++ print() ++ print(r'static void') ++ print(r'wrapIID(const char *entryName, REFIID riid, void * * ppvObj) {') ++ print(r' if (!ppvObj || !*ppvObj) {') ++ print(r' return;') ++ print(r' }') + for iface in ifaces: +- print r' if (riid == IID_%s) {' % (iface.name,) +- print r' Wrap%s::_wrap(entryName, (%s **) ppvObj);' % (iface.name, iface.name) +- print r' return;' +- print r' }' +- print r' warnIID(entryName, riid, *ppvObj, "unsupported");' +- print r'}' +- print ++ print(r' if (riid == IID_%s) {' % (iface.name,)) ++ print(r' Wrap%s::_wrap(entryName, (%s **) ppvObj);' % (iface.name, iface.name)) ++ print(r' return;') ++ print(r' }') ++ print(r' warnIID(entryName, riid, *ppvObj, "unsupported");') ++ print(r'}') ++ print() + + def wrapIid(self, function, riid, out): + # Cast output arg to `void **` if necessary +@@ -947,42 +952,42 @@ class Tracer: + assert isinstance(obj_type, stdapi.Interface) + out_name = 'reinterpret_cast(%s)' % out_name + +- print r' if (%s && *%s) {' % (out.name, out.name) ++ print(r' if (%s && *%s) {' % (out.name, out.name)) + functionName = function.name + else_ = '' + if self.interface is not None: + functionName = self.interface.name + '::' + functionName +- print r' if (*%s == m_pInstance &&' % (out_name,) +- print r' (%s)) {' % ' || '.join('%s == IID_%s' % (riid.name, iface.name) for iface in self.interface.iterBases()) +- print r' *%s = this;' % (out_name,) +- print r' }' ++ print(r' if (*%s == m_pInstance &&' % (out_name,)) ++ print(r' (%s)) {' % ' || '.join('%s == IID_%s' % (riid.name, iface.name) for iface in self.interface.iterBases())) ++ print(r' *%s = this;' % (out_name,)) ++ print(r' }') + else_ = 'else ' +- print r' %s{' % else_ +- print r' wrapIID("%s", %s, %s);' % (functionName, riid.name, out_name) +- print r' }' +- print r' }' ++ print(r' %s{' % else_) ++ print(r' wrapIID("%s", %s, %s);' % (functionName, riid.name, out_name)) ++ print(r' }') ++ print(r' }') + + def invokeMethod(self, interface, base, method): + if method.type is stdapi.Void: + result = '' + else: + result = '_result = ' +- print ' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args])) ++ print(' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args]))) + + def emit_memcpy(self, ptr, size): +- print ' trace::fakeMemcpy(%s, %s);' % (ptr, size) ++ print(' trace::fakeMemcpy(%s, %s);' % (ptr, size)) + + def emit_memcpy_opt(self, ptr, size): +- print ' trace::fakeMemcpyOpt(%s, %s);' % (ptr, size) ++ print(' trace::fakeMemcpyOpt(%s, %s);' % (ptr, size)) + + def fake_call(self, function, args): +- print ' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,) ++ print(' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)) + for arg, instance in zip(function.args, args): + assert not arg.output +- print ' trace::localWriter.beginArg(%u);' % (arg.index,) ++ print(' trace::localWriter.beginArg(%u);' % (arg.index,)) + self.serializeValue(arg.type, instance) +- print ' trace::localWriter.endArg();' +- print ' trace::localWriter.endEnter();' +- print ' trace::localWriter.beginLeave(_fake_call);' +- print ' trace::localWriter.endLeave();' ++ print(' trace::localWriter.endArg();') ++ print(' trace::localWriter.endEnter();') ++ print(' trace::localWriter.beginLeave(_fake_call);') ++ print(' trace::localWriter.endLeave();') + +diff --git a/wrappers/wgltrace.py b/wrappers/wgltrace.py +index bc79d774..be86c36e 100644 +--- a/wrappers/wgltrace.py ++++ b/wrappers/wgltrace.py +@@ -66,63 +66,65 @@ class WglTracer(GlTracer): + # wglCreateContext/wglCreateLayerContext to obtain a HGLRC that's + # recognizable by OPENGL32.DLL. Therefore we need to detect and + # dispatch internal calls, without further ado. +- print r' if (_reentrant) {' ++ print(r' if (_reentrant) {') + self.invokeFunction(function) + if function.type is not Void: +- print ' return _result;' +- print r' }' +- print r' ReentryScope _reentry;' +- print r' (void)_reentry;' +- print ++ print(' return _result;') ++ print(r' }') ++ print(r' ReentryScope _reentry;') ++ print(r' (void)_reentry;') ++ print() + + if function.name in self.destroyContextFunctionNames: + # Unlike other GL APIs like EGL or GLX, WGL will make the context + # inactive if it's currently the active context. +- print ' if (_wglGetCurrentContext() == hglrc) {' +- print ' gltrace::clearContext();' +- print ' }' +- print ' gltrace::releaseContext((uintptr_t)hglrc);' ++ print(' if (_wglGetCurrentContext() == hglrc) {') ++ print(' gltrace::clearContext();') ++ print(' }') ++ print(' gltrace::releaseContext((uintptr_t)hglrc);') + + GlTracer.traceFunctionImplBody(self, function) + + if function.name in self.createContextFunctionNames: +- print ' if (_result)' +- print ' gltrace::createContext((uintptr_t)_result);' ++ print(' if (_result)') ++ print(' gltrace::createContext((uintptr_t)_result);') + + if function.name in self.makeCurrentFunctionNames: +- print ' if (_result) {' +- print ' if (hglrc != NULL)' +- print ' gltrace::setContext((uintptr_t)hglrc);' +- print ' else' +- print ' gltrace::clearContext();' +- print ' }' ++ print(' if (_result) {') ++ print(' if (hglrc != NULL)') ++ print(' gltrace::setContext((uintptr_t)hglrc);') ++ print(' else') ++ print(' gltrace::clearContext();') ++ print(' }') + + + if __name__ == '__main__': +- print +- print '#define _GDI32_' +- print +- print '#include ' +- print '#include ' +- print +- print '#include "trace_writer_local.hpp"' +- print '#include "os.hpp"' +- print +- print '// To validate our prototypes' +- print '#define GL_GLEXT_PROTOTYPES' +- print '#define WGL_GLXEXT_PROTOTYPES' +- print +- print '#include "glproc.hpp"' +- print '#include "glsize.hpp"' +- print +- print 'static OS_THREAD_SPECIFIC(uintptr_t) _reentrant;' +- print +- print '// Helper class to track reentries in function scope.' +- print 'struct ReentryScope {' +- print 'inline ReentryScope() { _reentrant = 1; }' +- print 'inline ~ReentryScope() { _reentrant = 0; }' +- print '};' +- print ++ print() ++ print('#define _GDI32_') ++ print() ++ print('#include ') ++ print('#include ') ++ print() ++ print('#include ') ++ print() ++ print('#include "trace_writer_local.hpp"') ++ print('#include "os.hpp"') ++ print() ++ print('// To validate our prototypes') ++ print('#define GL_GLEXT_PROTOTYPES') ++ print('#define WGL_GLXEXT_PROTOTYPES') ++ print() ++ print('#include "glproc.hpp"') ++ print('#include "glsize.hpp"') ++ print() ++ print('static OS_THREAD_LOCAL uintptr_t _reentrant;') ++ print() ++ print('// Helper class to track reentries in function scope.') ++ print('struct ReentryScope {') ++ print('inline ReentryScope() { _reentrant = 1; }') ++ print('inline ~ReentryScope() { _reentrant = 0; }') ++ print('};') ++ print() + module = Module() + module.mergeModule(glapi) + module.mergeModule(wglapi) +-- +2.17.1 + -- cgit 1.2.3-korg