summaryrefslogtreecommitdiffstats
path: root/recipes-graphics/imx-gpu-apitrace
diff options
context:
space:
mode:
authorAndrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>2020-08-31 21:56:42 +0000
committerOtavio Salvador <otavio@ossystems.com.br>2020-09-23 23:42:37 -0300
commitaf181163fec5ca859c6a3989c9ea8cd1ceb27449 (patch)
tree8521059aa06509f27d125c678b0037bbfd25e596 /recipes-graphics/imx-gpu-apitrace
parent0661394cdfef69afd454ea515eb9a395afda44fb (diff)
downloadmeta-freescale-af181163fec5ca859c6a3989c9ea8cd1ceb27449.tar.gz
imx-gpu-apitrace: fix the upgrade after rebase to 9.0.0
Bump the repository version as it was updated upstream in NXP repository and drop unused patches from the layer, they should be present now in the updated version from upstream. Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
Diffstat (limited to 'recipes-graphics/imx-gpu-apitrace')
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch10004
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0002-specs-Tie-Python-2-3-conversion-loose-ends.patch169
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0003-scripts-Tie-Python-2-3-conversion-loose-ends.patch276
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0004-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch62
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0005-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch60
-rw-r--r--recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace_9.0.0.bb5
6 files changed, 3 insertions, 10573 deletions
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch
deleted file mode 100644
index 27382c34..00000000
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0001-switch-from-python2-to-python3.patch
+++ /dev/null
@@ -1,10004 +0,0 @@
1From bfa1b7c7e675f198f4573325f1252e91f80f0b4d Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Piotr=20Podsiad=C5=82y?= <ppodsiadly@mykolab.com>
3Date: Thu, 3 Jan 2019 20:39:55 +0100
4Subject: [PATCH 1/4] switch from python2 to python3
5
6Upstream-Status: Backport [https://github.com/apitrace/apitrace/commit/0b8b019952f2668a5e8786cc2d331062b958f02e]
7
8(cherry picked from commit 0b8b019952f2668a5e8786cc2d331062b958f02e)
9Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
10---
11 CMakeLists.txt | 7 +-
12 cli/CMakeLists.txt | 2 +-
13 dispatch/CMakeLists.txt | 2 +-
14 dispatch/__init__.py | 2 +-
15 dispatch/dispatch.py | 56 +-
16 dispatch/glproc.py | 204 +++----
17 retrace/CMakeLists.txt | 14 +-
18 retrace/d3d9retrace.py | 248 ++++----
19 retrace/ddrawretrace.py | 102 ++--
20 retrace/dllretrace.py | 46 +-
21 retrace/dxgiretrace.py | 370 +++++------
22 retrace/dxgistate_so.py | 98 +--
23 retrace/glretrace.py | 660 ++++++++++----------
24 retrace/glstate_params.py | 556 ++++++++---------
25 retrace/retrace.py | 300 ++++-----
26 scripts/convert.py | 4 +-
27 scripts/jsondiff.py | 16 +-
28 scripts/jsonextractimages.py | 2 +-
29 scripts/leaks.py | 163 +++++
30 scripts/profileshader.py | 18 +-
31 scripts/retracediff.py | 6 +-
32 scripts/snapdiff.py | 7 +-
33 scripts/tracediff.py | 16 +-
34 scripts/unpickle.py | 16 +-
35 specs/cglapi.py | 6 +-
36 specs/d2d1.py | 6 +-
37 specs/d3d.py | 8 +-
38 specs/d3d10.py | 4 +-
39 specs/d3d10sdklayers.py | 2 +-
40 specs/d3d11.py | 4 +-
41 specs/d3d11sdklayers.py | 2 +-
42 specs/d3d8.py | 6 +-
43 specs/d3d8caps.py | 4 +-
44 specs/d3d8types.py | 2 +-
45 specs/d3d9.py | 6 +-
46 specs/d3d9caps.py | 4 +-
47 specs/d3d9types.py | 2 +-
48 specs/d3dcaps.py | 4 +-
49 specs/d3dtypes.py | 2 +-
50 specs/dcommon.py | 2 +-
51 specs/dcomp.py | 303 +++++++++
52 specs/ddraw.py | 2 +-
53 specs/debug.py | 2 +-
54 specs/dwrite.py | 4 +-
55 specs/dxgi.py | 2 +-
56 specs/dxva2.py | 2 +-
57 specs/eglapi.py | 6 +-
58 specs/eglenum.py | 2 +-
59 specs/glapi.py | 6 +-
60 specs/glparams.py | 4 +-
61 specs/gltypes.py | 2 +-
62 specs/glxapi.py | 4 +-
63 specs/scripts/c2api.py | 40 +-
64 specs/scripts/cxx2api.py | 488 +++++++++++++++
65 specs/scripts/spec2api.py | 6 +-
66 specs/scripts/txt2api.py | 8 +-
67 specs/scripts/xml2api.py | 6 +-
68 specs/scripts/xml2enum.py | 4 +-
69 specs/scripts/xml2glparams.py | 4 +-
70 specs/stdapi.py | 43 +-
71 specs/wglapi.py | 6 +-
72 specs/wglenum.py | 2 +-
73 specs/winapi.py | 2 +-
74 wrappers/CMakeLists.txt | 18 +-
75 wrappers/cgltrace.py | 74 +--
76 wrappers/d2d1trace.py | 18 +-
77 wrappers/d3d8trace.py | 36 +-
78 wrappers/d3d9trace.py | 62 +-
79 wrappers/ddrawtrace.py | 12 +-
80 wrappers/dlltrace.py | 36 +-
81 wrappers/dxgitrace.py | 98 +--
82 wrappers/egltrace.py | 420 ++++++-------
83 wrappers/gltrace.py | 1080 ++++++++++++++++-----------------
84 wrappers/glxtrace.py | 54 +-
85 wrappers/trace.py | 707 ++++++++++-----------
86 wrappers/wgltrace.py | 86 +--
87 76 files changed, 3803 insertions(+), 2825 deletions(-)
88 create mode 100755 scripts/leaks.py
89 create mode 100644 specs/dcomp.py
90 create mode 100755 specs/scripts/cxx2api.py
91
92diff --git a/CMakeLists.txt b/CMakeLists.txt
93index 900028c6..03ffd07c 100644
94--- a/CMakeLists.txt
95+++ b/CMakeLists.txt
96@@ -104,10 +104,7 @@ else ()
97 endmacro()
98 endif ()
99
100-find_host_package (PythonInterp 2.7 REQUIRED)
101-if (NOT PYTHON_VERSION_MAJOR EQUAL 2)
102- message (FATAL_ERROR "Python 2.x required and requested, but Python ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} found.")
103-endif ()
104+find_host_package(Python3 COMPONENTS Interpreter REQUIRED)
105
106 find_package (Threads)
107
108@@ -591,7 +588,7 @@ set (CPACK_PACKAGE_VERSION_MINOR "0")
109
110 # Use current date in YYYYMMDD format as patch number
111 execute_process (
112- COMMAND ${PYTHON_EXECUTABLE} -c "import time, sys; sys.stdout.write(time.strftime('%Y%m%d'))"
113+ COMMAND ${Python3_EXECUTABLE} -c "import time, sys; sys.stdout.write(time.strftime('%Y%m%d'))"
114 OUTPUT_VARIABLE CPACK_PACKAGE_VERSION_PATCH
115 )
116
117diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt
118index 9b621bb1..eb5d485d 100644
119--- a/cli/CMakeLists.txt
120+++ b/cli/CMakeLists.txt
121@@ -13,7 +13,7 @@ add_definitions(
122 if (WIN32)
123 add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="python")
124 else ()
125- add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="${PYTHON_EXECUTABLE}")
126+ add_definitions (-DAPITRACE_PYTHON_EXECUTABLE="${Python3_EXECUTABLE}")
127 endif ()
128
129 add_executable (apitrace
130diff --git a/dispatch/CMakeLists.txt b/dispatch/CMakeLists.txt
131index d023e6e9..e51eec48 100644
132--- a/dispatch/CMakeLists.txt
133+++ b/dispatch/CMakeLists.txt
134@@ -7,7 +7,7 @@ add_custom_command (
135 OUTPUT
136 ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
137 ${CMAKE_CURRENT_BINARY_DIR}/glproc.cpp
138- COMMAND ${PYTHON_EXECUTABLE}
139+ COMMAND ${Python3_EXECUTABLE}
140 ${CMAKE_CURRENT_SOURCE_DIR}/glproc.py
141 ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
142 ${CMAKE_CURRENT_BINARY_DIR}/glproc.cpp
143diff --git a/dispatch/__init__.py b/dispatch/__init__.py
144index b872135e..d8e8596e 100644
145--- a/dispatch/__init__.py
146+++ b/dispatch/__init__.py
147@@ -1 +1 @@
148-from dispatch import *
149+from .dispatch import *
150diff --git a/dispatch/dispatch.py b/dispatch/dispatch.py
151index 9e778561..e1dd8bc9 100644
152--- a/dispatch/dispatch.py
153+++ b/dispatch/dispatch.py
154@@ -58,18 +58,18 @@ class Dispatcher:
155 # define standard name aliases for convenience, but only when not
156 # tracing, as that would cause symbol clashing with the tracing
157 # functions
158- print '#ifdef RETRACE'
159+ print('#ifdef RETRACE')
160 for function in module.functions:
161- print '#define %s _%s' % (function.name, function.name)
162- print '#endif /* RETRACE */'
163- print
164+ print('#define %s _%s' % (function.name, function.name))
165+ print('#endif /* RETRACE */')
166+ print()
167
168 def dispatchFunctionDecl(self, module, function):
169 ptype = function_pointer_type(function)
170 pvalue = function_pointer_value(function)
171- print 'typedef ' + function.prototype('* %s' % ptype) + ';'
172- print 'extern %s %s;' % (ptype, pvalue)
173- print
174+ print('typedef ' + function.prototype('* %s' % ptype) + ';')
175+ print('extern %s %s;' % (ptype, pvalue))
176+ print()
177
178 def dispatchModuleImpl(self, module):
179 for function in module.functions:
180@@ -84,19 +84,19 @@ class Dispatcher:
181 else:
182 ret = 'return '
183
184- print 'static ' + function.prototype('_fail_' + function.name) + ' {'
185+ print('static ' + function.prototype('_fail_' + function.name) + ' {')
186 self.failFunction(function)
187- print '}'
188- print
189+ print('}')
190+ print()
191
192- print 'static ' + function.prototype('_get_' + function.name) + ' {'
193+ print('static ' + function.prototype('_get_' + function.name) + ' {')
194 self.invokeGetProcAddress(module, function)
195- print ' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args]))
196- print '}'
197- print
198+ print(' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args])))
199+ print('}')
200+ print()
201
202- print '%s %s = &%s;' % (ptype, pvalue, '_get_' + function.name)
203- print
204+ print('%s %s = &%s;' % (ptype, pvalue, '_get_' + function.name))
205+ print()
206
207 def getProcAddressName(self, module, function):
208 raise NotImplementedError
209@@ -105,25 +105,25 @@ class Dispatcher:
210 ptype = function_pointer_type(function)
211 pvalue = function_pointer_value(function)
212 getProcAddressName = self.getProcAddressName(module, function)
213- print ' %s _ptr;' % (ptype,)
214- print ' _ptr = (%s)%s("%s");' % (ptype, getProcAddressName, function.name)
215- print ' if (!_ptr) {'
216- print ' _ptr = &%s;' % ('_fail_' + function.name)
217- print ' }'
218- print ' %s = _ptr;' % (pvalue,)
219+ print(' %s _ptr;' % (ptype,))
220+ print(' _ptr = (%s)%s("%s");' % (ptype, getProcAddressName, function.name))
221+ print(' if (!_ptr) {')
222+ print(' _ptr = &%s;' % ('_fail_' + function.name))
223+ print(' }')
224+ print(' %s = _ptr;' % (pvalue,))
225
226 def failFunction(self, function):
227- print r' const char *_name = "%s";' % function.name
228+ print(r' const char *_name = "%s";' % function.name)
229 if function.type is stdapi.Void or function.fail is not None:
230- print r' os::log("warning: ignoring call to unavailable function %s\n", _name);'
231+ print(r' os::log("warning: ignoring call to unavailable function %s\n", _name);')
232 if function.type is stdapi.Void:
233 assert function.fail is None
234- print ' return;'
235+ print(' return;')
236 else:
237 assert function.fail is not None
238- print ' return %s;' % function.fail
239+ print(' return %s;' % function.fail)
240 else:
241- print r' os::log("error: unavailable function %s\n", _name);'
242- print r' os::abort();'
243+ print(r' os::log("error: unavailable function %s\n", _name);')
244+ print(r' os::abort();')
245
246
247diff --git a/dispatch/glproc.py b/dispatch/glproc.py
248index f26a4f7d..93bba232 100644
249--- a/dispatch/glproc.py
250+++ b/dispatch/glproc.py
251@@ -506,15 +506,15 @@ class GlDispatcher(Dispatcher):
252 if sys.platform == 'darwin':
253 # Fallback to EXT_debug_label on MacOSX, some enums need to be translated.
254 if function.name in ('glObjectLabel', 'glObjectLabelKHR'):
255- print r' if (translateDebugLabelIdentifier(identifier)) {'
256- print r' _glLabelObjectEXT(identifier, name, length < 0 ? 0 : length, length == 0 ? "" : label);'
257- print r' return;'
258- print r' }'
259+ print(r' if (translateDebugLabelIdentifier(identifier)) {')
260+ print(r' _glLabelObjectEXT(identifier, name, length < 0 ? 0 : length, length == 0 ? "" : label);')
261+ print(r' return;')
262+ print(r' }')
263 if function.name in ('glGetObjectLabel', 'glGetObjectLabelKHR'):
264- print r' if (translateDebugLabelIdentifier(identifier)) {'
265- print r' _glGetObjectLabelEXT(identifier, name, bufSize, length, label);'
266- print r' return;'
267- print r' }'
268+ print(r' if (translateDebugLabelIdentifier(identifier)) {')
269+ print(r' _glGetObjectLabelEXT(identifier, name, bufSize, length, label);')
270+ print(r' return;')
271+ print(r' }')
272 if function.name in (
273 # GL_KHR_debug
274 'glDebugMessageControl',
275@@ -549,25 +549,25 @@ class GlDispatcher(Dispatcher):
276 ):
277 return
278 if function.name.startswith('glGetObjectLabel'):
279- print r' if (length != 0) *length = 0;'
280- print r' if (label != 0 && bufSize > 0) *label = 0;'
281+ print(r' if (length != 0) *length = 0;')
282+ print(r' if (label != 0 && bufSize > 0) *label = 0;')
283 return
284 if function.name == 'glGetDebugMessageLogAMD':
285- print r' if (categories != 0) *categories = 0;'
286- print r' if (ids != 0) *ids = 0;'
287- print r' if (severities != 0) *severities = 0;'
288- print r' if (lengths != 0) *lengths = 0;'
289- print r' if (message != 0 && bufsize > 0) *message = 0;'
290- print r' return 0;'
291+ print(r' if (categories != 0) *categories = 0;')
292+ print(r' if (ids != 0) *ids = 0;')
293+ print(r' if (severities != 0) *severities = 0;')
294+ print(r' if (lengths != 0) *lengths = 0;')
295+ print(r' if (message != 0 && bufsize > 0) *message = 0;')
296+ print(r' return 0;')
297 return
298 if function.name.startswith('glGetDebugMessageLog'):
299- print r' if (sources != 0) *sources = 0;'
300- print r' if (types != 0) *types = 0;'
301- print r' if (ids != 0) *ids = 0;'
302- print r' if (severities != 0) *severities = 0;'
303- print r' if (lengths != 0) *lengths = 0;'
304- print r' if (messageLog != 0 && bufsize > 0) *messageLog = 0;'
305- print r' return 0;'
306+ print(r' if (sources != 0) *sources = 0;')
307+ print(r' if (types != 0) *types = 0;')
308+ print(r' if (ids != 0) *ids = 0;')
309+ print(r' if (severities != 0) *severities = 0;')
310+ print(r' if (lengths != 0) *lengths = 0;')
311+ print(r' if (messageLog != 0 && bufsize > 0) *messageLog = 0;')
312+ print(r' return 0;')
313 return
314
315 Dispatcher.failFunction(self, function)
316@@ -577,96 +577,96 @@ if __name__ == '__main__':
317 decl, impl = sys.argv[1:]
318
319 sys.stdout = open(decl, 'wt')
320- print
321- print '#pragma once'
322- print
323- print '#include "glimports.hpp"'
324- print
325- print '#if defined(_WIN32)'
326- print 'extern HMODULE _libGlHandle;'
327- print '#else'
328- print 'extern void * _libGlHandle;'
329- print '#endif'
330- print
331- print 'void * _getPublicProcAddress(const char *procName);'
332- print 'void * _getPrivateProcAddress(const char *procName);'
333- print
334+ print()
335+ print('#pragma once')
336+ print()
337+ print('#include "glimports.hpp"')
338+ print()
339+ print('#if defined(_WIN32)')
340+ print('extern HMODULE _libGlHandle;')
341+ print('#else')
342+ print('extern void * _libGlHandle;')
343+ print('#endif')
344+ print()
345+ print('void * _getPublicProcAddress(const char *procName);')
346+ print('void * _getPrivateProcAddress(const char *procName);')
347+ print()
348 dispatcher = GlDispatcher()
349- print
350+ print()
351 dispatcher.dispatchModuleDecl(eglapi)
352- print
353- print '#if defined(_WIN32)'
354- print
355+ print()
356+ print('#if defined(_WIN32)')
357+ print()
358 dispatcher.dispatchModuleDecl(wglapi)
359- print
360- print '#elif defined(__APPLE__)'
361- print
362+ print()
363+ print('#elif defined(__APPLE__)')
364+ print()
365 dispatcher.dispatchModuleDecl(cglapi)
366- print
367- print '#elif defined(HAVE_X11)'
368- print
369+ print()
370+ print('#elif defined(HAVE_X11)')
371+ print()
372 dispatcher.dispatchModuleDecl(glxapi)
373- print
374- print '#endif'
375- print
376+ print()
377+ print('#endif')
378+ print()
379 dispatcher.dispatchModuleDecl(glapi)
380- print
381+ print()
382
383 sys.stdout = open(impl, 'wt')
384- print
385- print '#include "glproc.hpp"'
386- print '#include "os.hpp"'
387- print
388+ print()
389+ print('#include "glproc.hpp"')
390+ print('#include "os.hpp"')
391+ print()
392 dispatcher = GlDispatcher()
393- print
394+ print()
395 dispatcher.dispatchModuleImpl(eglapi)
396- print
397- print '#if defined(_WIN32)'
398- print
399+ print()
400+ print('#if defined(_WIN32)')
401+ print()
402 dispatcher.dispatchModuleImpl(wglapi)
403- print
404- print '#elif defined(__APPLE__)'
405- print
406- print 'static inline bool'
407- print 'translateDebugLabelIdentifier(GLenum & identifier)'
408- print '{'
409- print ' switch (identifier) {'
410- print ' case GL_TEXTURE:'
411- print ' case GL_FRAMEBUFFER:'
412- print ' case GL_RENDERBUFFER:'
413- print ' case GL_SAMPLER:'
414- print ' case GL_TRANSFORM_FEEDBACK:'
415- print ' return true;'
416- print ' case GL_BUFFER:'
417- print ' identifier = GL_BUFFER_OBJECT_EXT;'
418- print ' return true;'
419- print ' case GL_SHADER:'
420- print ' identifier = GL_SHADER_OBJECT_EXT;'
421- print ' return true;'
422- print ' case GL_PROGRAM:'
423- print ' identifier = GL_PROGRAM_OBJECT_EXT;'
424- print ' return true;'
425- print ' case GL_VERTEX_ARRAY:'
426- print ' identifier = GL_VERTEX_ARRAY_OBJECT_EXT;'
427- print ' return true;'
428- print ' case GL_QUERY:'
429- print ' identifier = GL_QUERY_OBJECT_EXT;'
430- print ' return true;'
431- print ' case GL_PROGRAM_PIPELINE:'
432- print ' identifier = GL_PROGRAM_PIPELINE_OBJECT_EXT;'
433- print ' return true;'
434- print ' default:'
435- print ' return false;'
436- print ' }'
437- print '}'
438- print
439+ print()
440+ print('#elif defined(__APPLE__)')
441+ print()
442+ print('static inline bool')
443+ print('translateDebugLabelIdentifier(GLenum & identifier)')
444+ print('{')
445+ print(' switch (identifier) {')
446+ print(' case GL_TEXTURE:')
447+ print(' case GL_FRAMEBUFFER:')
448+ print(' case GL_RENDERBUFFER:')
449+ print(' case GL_SAMPLER:')
450+ print(' case GL_TRANSFORM_FEEDBACK:')
451+ print(' return true;')
452+ print(' case GL_BUFFER:')
453+ print(' identifier = GL_BUFFER_OBJECT_EXT;')
454+ print(' return true;')
455+ print(' case GL_SHADER:')
456+ print(' identifier = GL_SHADER_OBJECT_EXT;')
457+ print(' return true;')
458+ print(' case GL_PROGRAM:')
459+ print(' identifier = GL_PROGRAM_OBJECT_EXT;')
460+ print(' return true;')
461+ print(' case GL_VERTEX_ARRAY:')
462+ print(' identifier = GL_VERTEX_ARRAY_OBJECT_EXT;')
463+ print(' return true;')
464+ print(' case GL_QUERY:')
465+ print(' identifier = GL_QUERY_OBJECT_EXT;')
466+ print(' return true;')
467+ print(' case GL_PROGRAM_PIPELINE:')
468+ print(' identifier = GL_PROGRAM_PIPELINE_OBJECT_EXT;')
469+ print(' return true;')
470+ print(' default:')
471+ print(' return false;')
472+ print(' }')
473+ print('}')
474+ print()
475 dispatcher.dispatchModuleImpl(cglapi)
476- print
477- print '#elif defined(HAVE_X11)'
478- print
479+ print()
480+ print('#elif defined(HAVE_X11)')
481+ print()
482 dispatcher.dispatchModuleImpl(glxapi)
483- print
484- print '#endif'
485- print
486+ print()
487+ print('#endif')
488+ print()
489 dispatcher.dispatchModuleImpl(glapi)
490- print
491+ print()
492diff --git a/retrace/CMakeLists.txt b/retrace/CMakeLists.txt
493index c0c4f316..2475abb8 100644
494--- a/retrace/CMakeLists.txt
495+++ b/retrace/CMakeLists.txt
496@@ -14,7 +14,7 @@ add_definitions (-DRETRACE)
497
498 add_custom_command (
499 OUTPUT glretrace_gl.cpp
500- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_gl.cpp
501+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace_gl.cpp
502 DEPENDS
503 glretrace.py
504 retrace.py
505@@ -25,7 +25,7 @@ add_custom_command (
506
507 add_custom_command (
508 OUTPUT glstate_params.cpp
509- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate_params.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate_params.cpp
510+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate_params.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate_params.cpp
511 DEPENDS
512 glstate_params.py
513 ${CMAKE_SOURCE_DIR}/specs/glparams.py
514@@ -273,7 +273,7 @@ if (WIN32)
515 include_directories (BEFORE SYSTEM ${DirectX_D3D_INCLUDE_DIR})
516 add_custom_command (
517 OUTPUT d3dretrace_ddraw.cpp
518- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_ddraw.cpp
519+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_ddraw.cpp
520 DEPENDS
521 ddrawretrace.py
522 dllretrace.py
523@@ -306,7 +306,7 @@ if (WIN32)
524 endif ()
525 add_custom_command (
526 OUTPUT d3dretrace_d3d8.cpp
527- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d8 ${HAVE_D3D8} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d8.cpp
528+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d8 ${HAVE_D3D8} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d8.cpp
529 DEPENDS
530 d3d9retrace.py
531 dllretrace.py
532@@ -327,7 +327,7 @@ if (WIN32)
533 endif ()
534 add_custom_command (
535 OUTPUT d3dretrace_d3d9.cpp
536- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d9 ${HAVE_D3D9} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp
537+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d9 ${HAVE_D3D9} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp
538 DEPENDS
539 d3d9retrace.py
540 dllretrace.py
541@@ -359,7 +359,7 @@ if (WIN32)
542 )
543 add_custom_command (
544 OUTPUT dxgistate_so.cpp
545- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgistate_so.cpp
546+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgistate_so.cpp
547 DEPENDS
548 ${CMAKE_CURRENT_SOURCE_DIR}/dxgistate_so.py
549 ${CMAKE_SOURCE_DIR}/specs/d3d11.py
550@@ -372,7 +372,7 @@ if (WIN32)
551 )
552 add_custom_command (
553 OUTPUT d3dretrace_dxgi.cpp
554- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgiretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_dxgi.cpp
555+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgiretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_dxgi.cpp
556 DEPENDS
557 dxgiretrace.py
558 dllretrace.py
559diff --git a/retrace/d3d9retrace.py b/retrace/d3d9retrace.py
560index 7313acc9..22364476 100644
561--- a/retrace/d3d9retrace.py
562+++ b/retrace/d3d9retrace.py
563@@ -35,32 +35,32 @@ from specs.stdapi import API
564 class D3DRetracer(Retracer):
565
566 def retraceApi(self, api):
567- print '// Swizzling mapping for lock addresses'
568- print 'typedef std::pair<void *, UINT> MappingKey;'
569- print 'static std::map<MappingKey, void *> _maps;'
570- print
571+ print('// Swizzling mapping for lock addresses')
572+ print('typedef std::pair<void *, UINT> MappingKey;')
573+ print('static std::map<MappingKey, void *> _maps;')
574+ print()
575
576 Retracer.retraceApi(self, api)
577
578 def invokeFunction(self, function):
579 if function.name in ('Direct3DCreate9', 'Direct3DCreate9Ex'):
580- print 'if (retrace::debug >= 2 && !g_szD3D9DllName && LoadLibraryA("d3d9d.dll")) {'
581- print ' /*'
582- print ' * D3D9D only works for simple applications, it will often report bogus errors'
583- print ' * on complex traces, or traces which use unofficial D3D9 features.'
584- print ' */'
585- print ' g_szD3D9DllName = "d3d9d.dll";'
586- print ' SDKVersion |= 0x80000000;'
587- print '} else {'
588- print ' SDKVersion &= ~0x80000000;'
589- print '}'
590+ print('if (retrace::debug >= 2 && !g_szD3D9DllName && LoadLibraryA("d3d9d.dll")) {')
591+ print(' /*')
592+ print(' * D3D9D only works for simple applications, it will often report bogus errors')
593+ print(' * on complex traces, or traces which use unofficial D3D9 features.')
594+ print(' */')
595+ print(' g_szD3D9DllName = "d3d9d.dll";')
596+ print(' SDKVersion |= 0x80000000;')
597+ print('} else {')
598+ print(' SDKVersion &= ~0x80000000;')
599+ print('}')
600
601 # d3d8d.dll can be found in the Aug 2007 DXSDK. It works on XP, but
602 # not on Windows 7.
603 if function.name in ('Direct3DCreate8'):
604- print 'if (retrace::debug >= 2 && !g_szD3D8DllName && LoadLibraryA("d3d8d.dll")) {'
605- print ' g_szD3D8DllName = "d3d8d.dll";'
606- print '}'
607+ print('if (retrace::debug >= 2 && !g_szD3D8DllName && LoadLibraryA("d3d8d.dll")) {')
608+ print(' g_szD3D8DllName = "d3d8d.dll";')
609+ print('}')
610
611 Retracer.invokeFunction(self, function)
612
613@@ -73,37 +73,37 @@ class D3DRetracer(Retracer):
614 # keep track of the last used device for state dumping
615 if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
616 if method.name == 'Release':
617- print r' if (call.ret->toUInt() == 0) {'
618- print r' d3d9Dumper.unbindDevice(_this);'
619- print r' }'
620+ print(r' if (call.ret->toUInt() == 0) {')
621+ print(r' d3d9Dumper.unbindDevice(_this);')
622+ print(r' }')
623 else:
624- print r' d3d9Dumper.bindDevice(_this);'
625+ print(r' d3d9Dumper.bindDevice(_this);')
626 if interface.name in ('IDirect3DDevice8', 'IDirect3DDevice8Ex'):
627 if method.name == 'Release':
628- print r' if (call.ret->toUInt() == 0) {'
629- print r' d3d8Dumper.unbindDevice(_this);'
630- print r' }'
631+ print(r' if (call.ret->toUInt() == 0) {')
632+ print(r' d3d8Dumper.unbindDevice(_this);')
633+ print(r' }')
634 else:
635- print r' d3d8Dumper.bindDevice(_this);'
636+ print(r' d3d8Dumper.bindDevice(_this);')
637
638 # create windows as neccessary
639 if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'):
640- print r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
641- print r' pPresentationParameters->hDeviceWindow = hWnd;'
642+ print(r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);')
643+ print(r' pPresentationParameters->hDeviceWindow = hWnd;')
644 if 'hFocusWindow' in method.argNames():
645- print r' hFocusWindow = hWnd;'
646+ print(r' hFocusWindow = hWnd;')
647
648 # force windowed mode
649- print r' if (retrace::forceWindowed) {'
650- print r' pPresentationParameters->Windowed = TRUE;'
651- print r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;'
652+ print(r' if (retrace::forceWindowed) {')
653+ print(r' pPresentationParameters->Windowed = TRUE;')
654+ print(r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;')
655 if interface.name.startswith('IDirect3D8'):
656- print r' pPresentationParameters->FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;'
657- print r' }'
658+ print(r' pPresentationParameters->FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;')
659+ print(r' }')
660 if 'BehaviorFlags' in method.argNames():
661- print r' if (retrace::dumpingState) {'
662- print r' BehaviorFlags &= ~D3DCREATE_PUREDEVICE;'
663- print r' }'
664+ print(r' if (retrace::dumpingState) {')
665+ print(r' BehaviorFlags &= ~D3DCREATE_PUREDEVICE;')
666+ print(r' }')
667
668 # On D3D8, ensure we use BackBufferFormat compatible with the
669 # current DisplayFormat.
670@@ -113,76 +113,76 @@ class D3DRetracer(Retracer):
671 # valid values for BackBufferFormat include D3DFMT_X1R5G5B5 and
672 # D3DFMT_A1R5G5B5, but exclude D3DFMT_R5G6B5.
673 if interface.name.startswith('IDirect3D8'):
674- print r' if (pPresentationParameters->Windowed) {'
675- print r' D3DDISPLAYMODE Mode;'
676- print r' HRESULT hr;'
677- print r' hr = _this->GetAdapterDisplayMode(Adapter, &Mode);'
678- print r' assert(SUCCEEDED(hr));'
679- print r' hr = _this->CheckDeviceType(Adapter, DeviceType, Mode.Format, pPresentationParameters->BackBufferFormat, pPresentationParameters->Windowed);'
680- print r' if (hr == D3DERR_NOTAVAILABLE) {'
681- print r' retrace::warning(call) << "forcing back buffer format to match display mode format\n";'
682- print r' pPresentationParameters->BackBufferFormat = Mode.Format;'
683- print r' }'
684- print r' }'
685+ print(r' if (pPresentationParameters->Windowed) {')
686+ print(r' D3DDISPLAYMODE Mode;')
687+ print(r' HRESULT hr;')
688+ print(r' hr = _this->GetAdapterDisplayMode(Adapter, &Mode);')
689+ print(r' assert(SUCCEEDED(hr));')
690+ print(r' hr = _this->CheckDeviceType(Adapter, DeviceType, Mode.Format, pPresentationParameters->BackBufferFormat, pPresentationParameters->Windowed);')
691+ print(r' if (hr == D3DERR_NOTAVAILABLE) {')
692+ print(r' retrace::warning(call) << "forcing back buffer format to match display mode format\n";')
693+ print(r' pPresentationParameters->BackBufferFormat = Mode.Format;')
694+ print(r' }')
695+ print(r' }')
696
697 if method.name in self.createDeviceMethodNames:
698 # override the device type
699- print r' switch (retrace::driver) {'
700- print r' case retrace::DRIVER_HARDWARE:'
701- print r' DeviceType = D3DDEVTYPE_HAL;'
702- print r' break;'
703- print r' case retrace::DRIVER_SOFTWARE:'
704- print r' case retrace::DRIVER_REFERENCE:'
705- print r' DeviceType = D3DDEVTYPE_REF;'
706- print r' break;'
707- print r' case retrace::DRIVER_NULL:'
708+ print(r' switch (retrace::driver) {')
709+ print(r' case retrace::DRIVER_HARDWARE:')
710+ print(r' DeviceType = D3DDEVTYPE_HAL;')
711+ print(r' break;')
712+ print(r' case retrace::DRIVER_SOFTWARE:')
713+ print(r' case retrace::DRIVER_REFERENCE:')
714+ print(r' DeviceType = D3DDEVTYPE_REF;')
715+ print(r' break;')
716+ print(r' case retrace::DRIVER_NULL:')
717 if interface.name.startswith('IDirect3D9'):
718- print r' DeviceType = D3DDEVTYPE_NULLREF;'
719+ print(r' DeviceType = D3DDEVTYPE_NULLREF;')
720 else:
721- print r' retrace::warning(call) << "null driver not supported\n";'
722- print r' break;'
723- print r' case retrace::DRIVER_MODULE:'
724- print r' retrace::warning(call) << "driver module not supported\n";'
725- print r' break;'
726- print r' default:'
727- print r' assert(0);'
728- print r' /* fall-through */'
729- print r' case retrace::DRIVER_DEFAULT:'
730- print r' break;'
731- print r' }'
732+ print(r' retrace::warning(call) << "null driver not supported\n";')
733+ print(r' break;')
734+ print(r' case retrace::DRIVER_MODULE:')
735+ print(r' retrace::warning(call) << "driver module not supported\n";')
736+ print(r' break;')
737+ print(r' default:')
738+ print(r' assert(0);')
739+ print(r' /* fall-through */')
740+ print(r' case retrace::DRIVER_DEFAULT:')
741+ print(r' break;')
742+ print(r' }')
743
744 if method.name in ('Reset', 'ResetEx'):
745 # force windowed mode
746- print r' if (retrace::forceWindowed) {'
747- print r' pPresentationParameters->Windowed = TRUE;'
748- print r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;'
749- print r' }'
750+ print(r' if (retrace::forceWindowed) {')
751+ print(r' pPresentationParameters->Windowed = TRUE;')
752+ print(r' pPresentationParameters->FullScreen_RefreshRateInHz = 0;')
753+ print(r' }')
754 # resize window
755- print r' if (pPresentationParameters->Windowed) {'
756- print r' d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
757- print r' }'
758+ print(r' if (pPresentationParameters->Windowed) {')
759+ print(r' d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);')
760+ print(r' }')
761
762 # notify frame has been completed
763 if method.name in ('Present', 'PresentEx'):
764 if interface.name.startswith('IDirect3DSwapChain9'):
765- print r' d3d9scDumper.bindDevice(_this);'
766- print r' retrace::frameComplete(call);'
767- print r' hDestWindowOverride = NULL;'
768+ print(r' d3d9scDumper.bindDevice(_this);')
769+ print(r' retrace::frameComplete(call);')
770+ print(r' hDestWindowOverride = NULL;')
771
772 # Ensure textures can be locked when dumping
773 # TODO: Pre-check with CheckDeviceFormat
774 if method.name in ('CreateTexture', 'CreateCubeTexture', 'CreateVolumeTexture'):
775- print r' if (retrace::dumpingState &&'
776- print r' Pool == D3DPOOL_DEFAULT &&'
777- print r' !(Usage & (D3DUSAGE_RENDERTARGET|D3DUSAGE_DEPTHSTENCIL))) {'
778- print r' Usage |= D3DUSAGE_DYNAMIC;'
779- print r' }'
780+ print(r' if (retrace::dumpingState &&')
781+ print(r' Pool == D3DPOOL_DEFAULT &&')
782+ print(r' !(Usage & (D3DUSAGE_RENDERTARGET|D3DUSAGE_DEPTHSTENCIL))) {')
783+ print(r' Usage |= D3DUSAGE_DYNAMIC;')
784+ print(r' }')
785
786 if 'pSharedHandle' in method.argNames():
787- print r' if (pSharedHandle) {'
788- print r' retrace::warning(call) << "shared surfaces unsupported\n";'
789- print r' pSharedHandle = NULL;'
790- print r' }'
791+ print(r' if (pSharedHandle) {')
792+ print(r' retrace::warning(call) << "shared surfaces unsupported\n";')
793+ print(r' pSharedHandle = NULL;')
794+ print(r' }')
795
796 if method.name in ('Lock', 'LockRect', 'LockBox'):
797 # Reset _DONOTWAIT flags. Otherwise they may fail, and we have no
798@@ -190,7 +190,7 @@ class D3DRetracer(Retracer):
799 mapFlagsArg = method.getArgByName('Flags')
800 for flag in mapFlagsArg.type.values:
801 if flag.endswith('_DONOTWAIT'):
802- print r' Flags &= ~%s;' % flag
803+ print(r' Flags &= ~%s;' % flag)
804
805 Retracer.invokeInterfaceMethod(self, interface, method)
806
807@@ -201,7 +201,7 @@ class D3DRetracer(Retracer):
808
809 # process events after presents
810 if method.name == 'Present':
811- print r' d3dretrace::processEvents();'
812+ print(r' d3dretrace::processEvents();')
813
814 def mapping_subkey():
815 if 'Level' in method.argNames():
816@@ -210,35 +210,35 @@ class D3DRetracer(Retracer):
817 return ('0',)
818
819 if method.name in ('Lock', 'LockRect', 'LockBox'):
820- print ' VOID *_pbData = NULL;'
821- print ' size_t _MappedSize = 0;'
822- print ' if (!(Flags & D3DLOCK_READONLY)) {'
823- print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
824- print ' }'
825- print ' if (_MappedSize) {'
826- print ' _maps[MappingKey(_this, %s)] = _pbData;' % mapping_subkey()
827+ print(' VOID *_pbData = NULL;')
828+ print(' size_t _MappedSize = 0;')
829+ print(' if (!(Flags & D3DLOCK_READONLY)) {')
830+ print(' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]))
831+ print(' }')
832+ print(' if (_MappedSize) {')
833+ print(' _maps[MappingKey(_this, %s)] = _pbData;' % mapping_subkey())
834 self.checkPitchMismatch(method)
835- print ' } else {'
836- print ' return;'
837- print ' }'
838+ print(' } else {')
839+ print(' return;')
840+ print(' }')
841
842 if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
843- print ' VOID *_pbData = 0;'
844- print ' MappingKey _mappingKey(_this, %s);' % mapping_subkey()
845- print ' _pbData = _maps[_mappingKey];'
846- print ' if (_pbData) {'
847- print ' retrace::delRegionByPointer(_pbData);'
848- print ' _maps[_mappingKey] = 0;'
849- print ' }'
850+ print(' VOID *_pbData = 0;')
851+ print(' MappingKey _mappingKey(_this, %s);' % mapping_subkey())
852+ print(' _pbData = _maps[_mappingKey];')
853+ print(' if (_pbData) {')
854+ print(' retrace::delRegionByPointer(_pbData);')
855+ print(' _maps[_mappingKey] = 0;')
856+ print(' }')
857
858
859 def main():
860- print r'#include <string.h>'
861- print
862- print r'#include <iostream>'
863- print
864- print r'#include "d3dretrace.hpp"'
865- print
866+ print(r'#include <string.h>')
867+ print()
868+ print(r'#include <iostream>')
869+ print()
870+ print(r'#include "d3dretrace.hpp"')
871+ print()
872
873 moduleName = sys.argv[1]
874 support = int(sys.argv[2])
875@@ -249,24 +249,24 @@ def main():
876 if moduleName == 'd3d9':
877 from specs.d3d9 import d3d9, d3dperf
878 from specs.dxva2 import dxva2
879- print r'#include "d3d9imports.hpp"'
880- print r'#include "d3d9size.hpp"'
881- print r'#include "dxva2imports.hpp"'
882+ print(r'#include "d3d9imports.hpp"')
883+ print(r'#include "d3d9size.hpp"')
884+ print(r'#include "dxva2imports.hpp"')
885 d3d9.mergeModule(d3dperf)
886 api.addModule(d3d9)
887 api.addModule(dxva2)
888- print
889- print '''static d3dretrace::D3DDumper<IDirect3DDevice9> d3d9Dumper;'''
890- print '''static d3dretrace::D3DDumper<IDirect3DSwapChain9> d3d9scDumper;'''
891- print
892+ print()
893+ print('''static d3dretrace::D3DDumper<IDirect3DDevice9> d3d9Dumper;''')
894+ print('''static d3dretrace::D3DDumper<IDirect3DSwapChain9> d3d9scDumper;''')
895+ print()
896 elif moduleName == 'd3d8':
897 from specs.d3d8 import d3d8
898- print r'#include "d3d8imports.hpp"'
899- print r'#include "d3d8size.hpp"'
900+ print(r'#include "d3d8imports.hpp"')
901+ print(r'#include "d3d8size.hpp"')
902 api.addModule(d3d8)
903- print
904- print '''static d3dretrace::D3DDumper<IDirect3DDevice8> d3d8Dumper;'''
905- print
906+ print()
907+ print('''static d3dretrace::D3DDumper<IDirect3DDevice8> d3d8Dumper;''')
908+ print()
909 else:
910 assert False
911
912diff --git a/retrace/ddrawretrace.py b/retrace/ddrawretrace.py
913index 4f2ff944..863283fd 100644
914--- a/retrace/ddrawretrace.py
915+++ b/retrace/ddrawretrace.py
916@@ -37,12 +37,12 @@ from specs.ddraw import DDCREATE_LPGUID
917 class D3DRetracer(Retracer):
918
919 def retraceApi(self, api):
920- print '// Swizzling mapping for lock addresses'
921- print 'static std::map<void *, void *> _maps;'
922- print
923+ print('// Swizzling mapping for lock addresses')
924+ print('static std::map<void *, void *> _maps;')
925+ print()
926 # TODO: Keep a table of windows
927- print 'static HWND g_hWnd;'
928- print
929+ print('static HWND g_hWnd;')
930+ print()
931
932 Retracer.retraceApi(self, api)
933
934@@ -50,20 +50,20 @@ class D3DRetracer(Retracer):
935 # keep track of the last used device for state dumping
936 if interface.name in ('IDirect3DDevice7',):
937 if method.name == 'Release':
938- print r' if (call.ret->toUInt() == 0) {'
939- print r' d3d7Dumper.unbindDevice(_this);'
940- print r' }'
941+ print(r' if (call.ret->toUInt() == 0) {')
942+ print(r' d3d7Dumper.unbindDevice(_this);')
943+ print(r' }')
944 else:
945- print r' d3d7Dumper.bindDevice(_this);'
946+ print(r' d3d7Dumper.bindDevice(_this);')
947
948 # create windows as neccessary
949 hWndArg = method.getArgByType(HWND)
950 if hWndArg is not None:
951 # FIXME: Try to guess the window size (e.g., from IDirectDrawSurface7::Blt)
952- print r' if (!g_hWnd) {'
953- print r' g_hWnd = d3dretrace::createWindow(512, 512);'
954- print r' }'
955- print r' %s = g_hWnd;' % hWndArg.name
956+ print(r' if (!g_hWnd) {')
957+ print(r' g_hWnd = d3dretrace::createWindow(512, 512);')
958+ print(r' }')
959+ print(r' %s = g_hWnd;' % hWndArg.name)
960
961
962 if method.name == 'Lock':
963@@ -71,74 +71,74 @@ class D3DRetracer(Retracer):
964 # way to cope with it (other than retry).
965 mapFlagsArg = method.getArgByName('dwFlags')
966 if mapFlagsArg is not None:
967- print r' dwFlags &= DDLOCK_DONOTWAIT;'
968- print r' dwFlags |= DDLOCK_WAIT;'
969+ print(r' dwFlags &= DDLOCK_DONOTWAIT;')
970+ print(r' dwFlags |= DDLOCK_WAIT;')
971
972 Retracer.invokeInterfaceMethod(self, interface, method)
973
974 if method.name == 'CreateDevice':
975- print r' if (FAILED(_result)) {'
976- print r' exit(1);'
977- print r' }'
978+ print(r' if (FAILED(_result)) {')
979+ print(r' exit(1);')
980+ print(r' }')
981
982 # notify frame has been completed
983 # process events after presents
984 if interface.name == 'IDirectDrawSurface7' and method.name == 'Blt':
985- print r' DDSCAPS2 ddsCaps;'
986- print r' if (SUCCEEDED(_this->GetCaps(&ddsCaps)) &&'
987- print r' (ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) {'
988- print r' retrace::frameComplete(call);'
989- print r' d3dretrace::processEvents();'
990- print r' }'
991+ print(r' DDSCAPS2 ddsCaps;')
992+ print(r' if (SUCCEEDED(_this->GetCaps(&ddsCaps)) &&')
993+ print(r' (ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) {')
994+ print(r' retrace::frameComplete(call);')
995+ print(r' d3dretrace::processEvents();')
996+ print(r' }')
997
998 if method.name == 'Lock':
999- print ' VOID *_pbData = NULL;'
1000- print ' size_t _MappedSize = 0;'
1001+ print(' VOID *_pbData = NULL;')
1002+ print(' size_t _MappedSize = 0;')
1003 # FIXME: determine the mapping size
1004 #print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
1005- print ' if (_MappedSize) {'
1006- print ' _maps[_this] = _pbData;'
1007+ print(' if (_MappedSize) {')
1008+ print(' _maps[_this] = _pbData;')
1009 # TODO: check pitches match
1010- print ' } else {'
1011- print ' return;'
1012- print ' }'
1013+ print(' } else {')
1014+ print(' return;')
1015+ print(' }')
1016
1017 if method.name == 'Unlock':
1018- print ' VOID *_pbData = 0;'
1019- print ' _pbData = _maps[_this];'
1020- print ' if (_pbData) {'
1021- print ' retrace::delRegionByPointer(_pbData);'
1022- print ' _maps[_this] = 0;'
1023- print ' }'
1024+ print(' VOID *_pbData = 0;')
1025+ print(' _pbData = _maps[_this];')
1026+ print(' if (_pbData) {')
1027+ print(' retrace::delRegionByPointer(_pbData);')
1028+ print(' _maps[_this] = 0;')
1029+ print(' }')
1030
1031 def extractArg(self, function, arg, arg_type, lvalue, rvalue):
1032 # Handle DDCREATE_* flags
1033 if arg.type is DDCREATE_LPGUID:
1034- print ' if (%s.toArray()) {' % rvalue
1035+ print(' if (%s.toArray()) {' % rvalue)
1036 Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
1037- print ' } else {'
1038- print ' %s = static_cast<%s>(%s.toPointer());' % (lvalue, arg_type, rvalue)
1039- print ' }'
1040+ print(' } else {')
1041+ print(' %s = static_cast<%s>(%s.toPointer());' % (lvalue, arg_type, rvalue))
1042+ print(' }')
1043 return
1044
1045 Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
1046
1047
1048 def main():
1049- print r'#include <string.h>'
1050- print
1051- print r'#include <iostream>'
1052- print
1053- print r'#include "d3dretrace.hpp"'
1054- print
1055+ print(r'#include <string.h>')
1056+ print()
1057+ print(r'#include <iostream>')
1058+ print()
1059+ print(r'#include "d3dretrace.hpp"')
1060+ print()
1061
1062 api = API()
1063
1064- print r'#include "d3dimports.hpp"'
1065+ print(r'#include "d3dimports.hpp"')
1066 api.addModule(ddraw)
1067- print
1068- print '''static d3dretrace::D3DDumper<IDirect3DDevice7> d3d7Dumper;'''
1069- print
1070+ print()
1071+ print('''static d3dretrace::D3DDumper<IDirect3DDevice7> d3d7Dumper;''')
1072+ print()
1073
1074 retracer = D3DRetracer()
1075 retracer.table_name = 'd3dretrace::ddraw_callbacks'
1076diff --git a/retrace/dllretrace.py b/retrace/dllretrace.py
1077index c818b0a9..ad9db9a4 100644
1078--- a/retrace/dllretrace.py
1079+++ b/retrace/dllretrace.py
1080@@ -33,29 +33,29 @@ class DllDispatcher(Dispatcher):
1081
1082 def dispatchModule(self, module):
1083 tag = module.name.upper()
1084- print r'const char *g_sz%sDllName = NULL;' % (tag,)
1085- print r'HMODULE g_h%sModule = NULL;' % (tag,)
1086- print r''
1087- print r'static PROC'
1088- print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
1089- print r' if (!g_h%sModule) {' % tag
1090- print r' if (g_sz%sDllName) {' % tag
1091- print r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
1092- print r' if (!g_h%sModule) {' % tag
1093- print r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag
1094- print r' }'
1095- print r' }'
1096- print r' if (!g_h%sModule) {' % tag
1097- print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name)
1098- print r' }'
1099- print r' if (!g_h%sModule) {' % tag
1100- print r' os::log("error: failed to load %s.dll\n");' % module.name
1101- print r' exit(1);'
1102- print r' }'
1103- print r' }'
1104- print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag
1105- print r'}'
1106- print r''
1107+ print(r'const char *g_sz%sDllName = NULL;' % (tag,))
1108+ print(r'HMODULE g_h%sModule = NULL;' % (tag,))
1109+ print(r'')
1110+ print(r'static PROC')
1111+ print(r'_get%sProcAddress(LPCSTR lpProcName) {' % tag)
1112+ print(r' if (!g_h%sModule) {' % tag)
1113+ print(r' if (g_sz%sDllName) {' % tag)
1114+ print(r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag))
1115+ print(r' if (!g_h%sModule) {' % tag)
1116+ print(r' os::log("warning: failed to load %%s\n", g_sz%sDllName);' % tag)
1117+ print(r' }')
1118+ print(r' }')
1119+ print(r' if (!g_h%sModule) {' % tag)
1120+ print(r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name))
1121+ print(r' }')
1122+ print(r' if (!g_h%sModule) {' % tag)
1123+ print(r' os::log("error: failed to load %s.dll\n");' % module.name)
1124+ print(r' exit(1);')
1125+ print(r' }')
1126+ print(r' }')
1127+ print(r' return GetProcAddress(g_h%sModule, lpProcName);' % tag)
1128+ print(r'}')
1129+ print(r'')
1130
1131 Dispatcher.dispatchModule(self, module)
1132
1133diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py
1134index 799e3df9..8986a767 100755
1135--- a/retrace/dxgiretrace.py
1136+++ b/retrace/dxgiretrace.py
1137@@ -40,10 +40,10 @@ from specs.d3d11 import d3d11
1138 class D3DRetracer(Retracer):
1139
1140 def retraceApi(self, api):
1141- print '// Swizzling mapping for lock addresses, mapping a (pDeviceContext, pResource, Subresource) -> void *'
1142- print 'typedef std::pair< IUnknown *, UINT > SubresourceKey;'
1143- print 'static std::map< IUnknown *, std::map< SubresourceKey, void * > > g_Maps;'
1144- print
1145+ print('// Swizzling mapping for lock addresses, mapping a (pDeviceContext, pResource, Subresource) -> void *')
1146+ print('typedef std::pair< IUnknown *, UINT > SubresourceKey;')
1147+ print('static std::map< IUnknown *, std::map< SubresourceKey, void * > > g_Maps;')
1148+ print()
1149 self.table_name = 'd3dretrace::dxgi_callbacks'
1150
1151 Retracer.retraceApi(self, api)
1152@@ -61,41 +61,41 @@ class D3DRetracer(Retracer):
1153 if function.name in self.createDeviceFunctionNames:
1154 # create windows as neccessary
1155 if 'pSwapChainDesc' in function.argNames():
1156- print r' d3dretrace::createWindowForSwapChain(pSwapChainDesc);'
1157+ print(r' d3dretrace::createWindowForSwapChain(pSwapChainDesc);')
1158
1159 # Compensate for the fact we don't trace DXGI object creation
1160 if function.name.startswith('D3D11CreateDevice'):
1161- print r' if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {'
1162- print r' DriverType = D3D_DRIVER_TYPE_HARDWARE;'
1163- print r' }'
1164+ print(r' if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {')
1165+ print(r' DriverType = D3D_DRIVER_TYPE_HARDWARE;')
1166+ print(r' }')
1167
1168 if function.name.startswith('D3D10CreateDevice'):
1169 # Toggle debugging
1170- print r' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;'
1171- print r' if (retrace::debug) {'
1172- print r' HMODULE hD3d10SdkLayers = LoadLibraryA("d3d10sdklayers");'
1173- print r' if (hD3d10SdkLayers) {'
1174- print r' FreeLibrary(hD3d10SdkLayers);'
1175- print r' Flags |= D3D10_CREATE_DEVICE_DEBUG;'
1176- print r' } else {'
1177- print r' retrace::warning(call) << "Direct3D 10.x SDK Debug Layer (d3d10sdklayers.dll) not available, continuing without debug output\n";'
1178- print r' }'
1179- print r' }'
1180+ print(r' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;')
1181+ print(r' if (retrace::debug) {')
1182+ print(r' HMODULE hD3d10SdkLayers = LoadLibraryA("d3d10sdklayers");')
1183+ print(r' if (hD3d10SdkLayers) {')
1184+ print(r' FreeLibrary(hD3d10SdkLayers);')
1185+ print(r' Flags |= D3D10_CREATE_DEVICE_DEBUG;')
1186+ print(r' } else {')
1187+ print(r' retrace::warning(call) << "Direct3D 10.x SDK Debug Layer (d3d10sdklayers.dll) not available, continuing without debug output\n";')
1188+ print(r' }')
1189+ print(r' }')
1190
1191 # Force driver
1192 self.forceDriver('D3D10_DRIVER_TYPE')
1193
1194 if function.name.startswith('D3D11CreateDevice'):
1195 # Toggle debugging
1196- print r' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;'
1197- print r' if (retrace::debug) {'
1198- print r' HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, NULL, NULL, NULL);'
1199- print r' if (SUCCEEDED(hr)) {'
1200- print r' Flags |= D3D11_CREATE_DEVICE_DEBUG;'
1201- print r' } else {'
1202- print r' retrace::warning(call) << "Direct3D 11.x SDK Debug Layer (d3d11*sdklayers.dll) not available, continuing without debug output\n";'
1203- print r' }'
1204- print r' }'
1205+ print(r' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;')
1206+ print(r' if (retrace::debug) {')
1207+ print(r' HRESULT hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_NULL, 0, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, NULL, NULL, NULL);')
1208+ print(r' if (SUCCEEDED(hr)) {')
1209+ print(r' Flags |= D3D11_CREATE_DEVICE_DEBUG;')
1210+ print(r' } else {')
1211+ print(r' retrace::warning(call) << "Direct3D 11.x SDK Debug Layer (d3d11*sdklayers.dll) not available, continuing without debug output\n";')
1212+ print(r' }')
1213+ print(r' }')
1214
1215 # Force driver
1216 self.forceDriver('D3D_DRIVER_TYPE')
1217@@ -108,15 +108,15 @@ class D3DRetracer(Retracer):
1218 if interface is not None:
1219 getDeviceRemovedReasonMethod = interface.getMethodByName("GetDeviceRemovedReason")
1220 if getDeviceRemovedReasonMethod is not None:
1221- print r' if (FAILED(_result)) {'
1222- print r' retrace::failed(call, _result);'
1223- print r' if (_result == DXGI_ERROR_DEVICE_REMOVED) {'
1224- print r' HRESULT _reason = _this->GetDeviceRemovedReason();'
1225- print r' retrace::failed(call, _reason);'
1226- print r' exit(1);'
1227- print r' }'
1228- print r' return;'
1229- print r' }'
1230+ print(r' if (FAILED(_result)) {')
1231+ print(r' retrace::failed(call, _result);')
1232+ print(r' if (_result == DXGI_ERROR_DEVICE_REMOVED) {')
1233+ print(r' HRESULT _reason = _this->GetDeviceRemovedReason();')
1234+ print(r' retrace::failed(call, _reason);')
1235+ print(r' exit(1);')
1236+ print(r' }')
1237+ print(r' return;')
1238+ print(r' }')
1239 return
1240
1241 Retracer.checkResult(self, interface, methodOrFunction)
1242@@ -124,112 +124,112 @@ class D3DRetracer(Retracer):
1243 def forceDriver(self, enum):
1244 # This can only work when pAdapter is NULL. For non-NULL pAdapter we
1245 # need to override inside the EnumAdapters call below
1246- print r' if (pAdapter == NULL) {'
1247- print r' switch (retrace::driver) {'
1248- print r' case retrace::DRIVER_HARDWARE:'
1249- print r' DriverType = %s_HARDWARE;' % enum
1250- print r' Software = NULL;'
1251- print r' break;'
1252- print r' case retrace::DRIVER_SOFTWARE:'
1253- print r' DriverType = %s_WARP;' % enum
1254- print r' Software = NULL;'
1255- print r' break;'
1256- print r' case retrace::DRIVER_REFERENCE:'
1257- print r' DriverType = %s_REFERENCE;' % enum
1258- print r' Software = NULL;'
1259- print r' break;'
1260- print r' case retrace::DRIVER_NULL:'
1261- print r' DriverType = %s_NULL;' % enum
1262- print r' Software = NULL;'
1263- print r' break;'
1264- print r' case retrace::DRIVER_MODULE:'
1265- print r' DriverType = %s_SOFTWARE;' % enum
1266- print r' Software = LoadLibraryA(retrace::driverModule);'
1267- print r' if (!Software) {'
1268- print r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";'
1269- print r' }'
1270- print r' break;'
1271- print r' default:'
1272- print r' assert(0);'
1273- print r' /* fall-through */'
1274- print r' case retrace::DRIVER_DEFAULT:'
1275- print r' if (DriverType == %s_SOFTWARE) {' % enum
1276- print r' Software = LoadLibraryA("d3d10warp");'
1277- print r' if (!Software) {'
1278- print r' retrace::warning(call) << "failed to load d3d10warp.dll\n";'
1279- print r' }'
1280- print r' }'
1281- print r' break;'
1282- print r' }'
1283- print r' } else {'
1284- print r' Software = NULL;'
1285- print r' }'
1286+ print(r' if (pAdapter == NULL) {')
1287+ print(r' switch (retrace::driver) {')
1288+ print(r' case retrace::DRIVER_HARDWARE:')
1289+ print(r' DriverType = %s_HARDWARE;' % enum)
1290+ print(r' Software = NULL;')
1291+ print(r' break;')
1292+ print(r' case retrace::DRIVER_SOFTWARE:')
1293+ print(r' DriverType = %s_WARP;' % enum)
1294+ print(r' Software = NULL;')
1295+ print(r' break;')
1296+ print(r' case retrace::DRIVER_REFERENCE:')
1297+ print(r' DriverType = %s_REFERENCE;' % enum)
1298+ print(r' Software = NULL;')
1299+ print(r' break;')
1300+ print(r' case retrace::DRIVER_NULL:')
1301+ print(r' DriverType = %s_NULL;' % enum)
1302+ print(r' Software = NULL;')
1303+ print(r' break;')
1304+ print(r' case retrace::DRIVER_MODULE:')
1305+ print(r' DriverType = %s_SOFTWARE;' % enum)
1306+ print(r' Software = LoadLibraryA(retrace::driverModule);')
1307+ print(r' if (!Software) {')
1308+ print(r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";')
1309+ print(r' }')
1310+ print(r' break;')
1311+ print(r' default:')
1312+ print(r' assert(0);')
1313+ print(r' /* fall-through */')
1314+ print(r' case retrace::DRIVER_DEFAULT:')
1315+ print(r' if (DriverType == %s_SOFTWARE) {' % enum)
1316+ print(r' Software = LoadLibraryA("d3d10warp");')
1317+ print(r' if (!Software) {')
1318+ print(r' retrace::warning(call) << "failed to load d3d10warp.dll\n";')
1319+ print(r' }')
1320+ print(r' }')
1321+ print(r' break;')
1322+ print(r' }')
1323+ print(r' } else {')
1324+ print(r' Software = NULL;')
1325+ print(r' }')
1326
1327 def invokeInterfaceMethod(self, interface, method):
1328 # keep track of the last used device for state dumping
1329 if interface.name in ('ID3D10Device', 'ID3D10Device1'):
1330 if method.name == 'Release':
1331- print r' if (call.ret->toUInt() == 0) {'
1332- print r' d3d10Dumper.unbindDevice(_this);'
1333- print r' }'
1334+ print(r' if (call.ret->toUInt() == 0) {')
1335+ print(r' d3d10Dumper.unbindDevice(_this);')
1336+ print(r' }')
1337 else:
1338- print r' d3d10Dumper.bindDevice(_this);'
1339+ print(r' d3d10Dumper.bindDevice(_this);')
1340 if interface.name.startswith('ID3D11DeviceContext'):
1341 if method.name == 'Release':
1342- print r' if (call.ret->toUInt() == 0) {'
1343- print r' d3d11Dumper.unbindDevice(_this);'
1344- print r' }'
1345+ print(r' if (call.ret->toUInt() == 0) {')
1346+ print(r' d3d11Dumper.unbindDevice(_this);')
1347+ print(r' }')
1348 else:
1349- print r' if (_this->GetType() == D3D11_DEVICE_CONTEXT_IMMEDIATE) {'
1350- print r' d3d11Dumper.bindDevice(_this);'
1351- print r' }'
1352+ print(r' if (_this->GetType() == D3D11_DEVICE_CONTEXT_IMMEDIATE) {')
1353+ print(r' d3d11Dumper.bindDevice(_this);')
1354+ print(r' }')
1355
1356 # intercept private interfaces
1357 if method.name == 'QueryInterface':
1358- print r' if (!d3dretrace::overrideQueryInterface(_this, riid, ppvObj, &_result)) {'
1359+ print(r' if (!d3dretrace::overrideQueryInterface(_this, riid, ppvObj, &_result)) {')
1360 Retracer.invokeInterfaceMethod(self, interface, method)
1361- print r' }'
1362+ print(r' }')
1363 return
1364
1365 # create windows as neccessary
1366 if method.name == 'CreateSwapChain':
1367- print r' d3dretrace::createWindowForSwapChain(pDesc);'
1368+ print(r' d3dretrace::createWindowForSwapChain(pDesc);')
1369 if method.name == 'CreateSwapChainForHwnd':
1370- print r' WindowHandle = d3dretrace::createWindow(pDesc->Width, pDesc->Height);'
1371- print r' // DXGI_SCALING_NONE is only supported on Win8 and beyond'
1372- print r' if (pDesc->Scaling == DXGI_SCALING_NONE && !IsWindows8OrGreater()) {'
1373- print r' pDesc->Scaling = DXGI_SCALING_STRETCH;'
1374- print r' }'
1375+ print(r' WindowHandle = d3dretrace::createWindow(pDesc->Width, pDesc->Height);')
1376+ print(r' // DXGI_SCALING_NONE is only supported on Win8 and beyond')
1377+ print(r' if (pDesc->Scaling == DXGI_SCALING_NONE && !IsWindows8OrGreater()) {')
1378+ print(r' pDesc->Scaling = DXGI_SCALING_STRETCH;')
1379+ print(r' }')
1380 if method.name == 'CreateSwapChainForComposition':
1381- print r' HWND hWnd = d3dretrace::createWindow(pDesc->Width, pDesc->Height);'
1382- print r' _result = _this->CreateSwapChainForHwnd(pDevice, hWnd, pDesc, NULL, pRestrictToOutput, ppSwapChain);'
1383+ print(r' HWND hWnd = d3dretrace::createWindow(pDesc->Width, pDesc->Height);')
1384+ print(r' _result = _this->CreateSwapChainForHwnd(pDevice, hWnd, pDesc, NULL, pRestrictToOutput, ppSwapChain);')
1385 self.checkResult(interface, method)
1386 return
1387
1388 if method.name == 'SetFullscreenState':
1389- print r' if (retrace::forceWindowed) {'
1390- print r' Fullscreen = FALSE;'
1391- print r' pTarget = NULL;'
1392- print r' }'
1393+ print(r' if (retrace::forceWindowed) {')
1394+ print(r' Fullscreen = FALSE;')
1395+ print(r' pTarget = NULL;')
1396+ print(r' }')
1397
1398 # notify frame has been completed
1399 if interface.name.startswith('IDXGISwapChain') and method.name.startswith('Present'):
1400 if interface.name.startswith('IDXGISwapChainDWM'):
1401- print r' com_ptr<IDXGISwapChain> pSwapChain;'
1402- print r' if (SUCCEEDED(_this->QueryInterface(IID_IDXGISwapChain, (void **) &pSwapChain))) {'
1403- print r' dxgiDumper.bindDevice(pSwapChain);'
1404- print r' } else {'
1405- print r' assert(0);'
1406- print r' }'
1407+ print(r' com_ptr<IDXGISwapChain> pSwapChain;')
1408+ print(r' if (SUCCEEDED(_this->QueryInterface(IID_IDXGISwapChain, (void **) &pSwapChain))) {')
1409+ print(r' dxgiDumper.bindDevice(pSwapChain);')
1410+ print(r' } else {')
1411+ print(r' assert(0);')
1412+ print(r' }')
1413 else:
1414- print r' dxgiDumper.bindDevice(_this);'
1415- print r' retrace::frameComplete(call);'
1416+ print(r' dxgiDumper.bindDevice(_this);')
1417+ print(r' retrace::frameComplete(call);')
1418
1419 if 'pSharedResource' in method.argNames():
1420- print r' if (pSharedResource) {'
1421- print r' retrace::warning(call) << "shared surfaces unsupported\n";'
1422- print r' pSharedResource = NULL;'
1423- print r' }'
1424+ print(r' if (pSharedResource) {')
1425+ print(r' retrace::warning(call) << "shared surfaces unsupported\n";')
1426+ print(r' pSharedResource = NULL;')
1427+ print(r' }')
1428
1429 # Force driver
1430 if interface.name.startswith('IDXGIFactory') and method.name.startswith('EnumAdapters'):
1431@@ -260,31 +260,31 @@ class D3DRetracer(Retracer):
1432 return
1433
1434 if interface.name.startswith('ID3D10Device') and method.name.startswith('OpenSharedResource'):
1435- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";'
1436- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);'
1437+ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";')
1438+ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);')
1439 self.checkResult(interface, method)
1440 return
1441 if interface.name.startswith('ID3D11Device') and method.name == 'OpenSharedResource':
1442 # Some applications (e.g., video playing in IE11) create shared resources within the same process.
1443 # TODO: Generalize to other OpenSharedResource variants
1444- print r' retrace::map<HANDLE>::const_iterator it = _shared_handle_map.find(hResource);'
1445- print r' if (it == _shared_handle_map.end()) {'
1446- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";'
1447- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);'
1448+ print(r' retrace::map<HANDLE>::const_iterator it = _shared_handle_map.find(hResource);')
1449+ print(r' if (it == _shared_handle_map.end()) {')
1450+ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";')
1451+ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);')
1452 self.checkResult(interface, method)
1453- print r' } else {'
1454- print r' hResource = it->second;'
1455+ print(r' } else {')
1456+ print(r' hResource = it->second;')
1457 Retracer.invokeInterfaceMethod(self, interface, method)
1458- print r' }'
1459+ print(r' }')
1460 return
1461 if interface.name.startswith('ID3D11Device') and method.name.startswith('OpenSharedResource'):
1462- print r' retrace::warning(call) << "replacing shared resource with checker pattern\n";'
1463- print r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);'
1464+ print(r' retrace::warning(call) << "replacing shared resource with checker pattern\n";')
1465+ print(r' _result = d3dretrace::createSharedResource(_this, ReturnedInterface, ppResource);')
1466 if method.name == 'OpenSharedResourceByName':
1467- print r' (void)lpName;'
1468- print r' (void)dwDesiredAccess;'
1469+ print(r' (void)lpName;')
1470+ print(r' (void)dwDesiredAccess;')
1471 else:
1472- print r' (void)hResource;'
1473+ print(r' (void)hResource;')
1474 self.checkResult(interface, method)
1475 return
1476
1477@@ -294,7 +294,7 @@ class D3DRetracer(Retracer):
1478 mapFlagsArg = method.getArgByName('MapFlags')
1479 for flag in mapFlagsArg.type.values:
1480 if flag.endswith('_MAP_FLAG_DO_NOT_WAIT'):
1481- print r' MapFlags &= ~%s;' % flag
1482+ print(r' MapFlags &= ~%s;' % flag)
1483
1484 if method.name.startswith('UpdateSubresource'):
1485 # The D3D10 debug layer is buggy (or at least inconsistent with the
1486@@ -303,108 +303,108 @@ class D3DRetracer(Retracer):
1487 # SrcDepthPitch is garbagge for non 3D textures.
1488 # XXX: It also seems to expect padding bytes at the end of the last
1489 # row, but we never record (or allocate) those...
1490- print r' if (retrace::debug && pDstBox && pDstBox->front == 0 && pDstBox->back == 1) {'
1491- print r' SrcDepthPitch = 0;'
1492- print r' }'
1493+ print(r' if (retrace::debug && pDstBox && pDstBox->front == 0 && pDstBox->back == 1) {')
1494+ print(r' SrcDepthPitch = 0;')
1495+ print(r' }')
1496
1497 if method.name == 'SetGammaControl':
1498 # This method is only supported while in full-screen mode
1499- print r' if (retrace::forceWindowed) {'
1500- print r' return;'
1501- print r' }'
1502+ print(r' if (retrace::forceWindowed) {')
1503+ print(r' return;')
1504+ print(r' }')
1505
1506 Retracer.invokeInterfaceMethod(self, interface, method)
1507
1508 if method.name in ('AcquireSync', 'ReleaseSync'):
1509- print r' if (SUCCEEDED(_result) && _result != S_OK) {'
1510- print r' retrace::warning(call) << " returned " << _result << "\n";'
1511- print r' }'
1512+ print(r' if (SUCCEEDED(_result) && _result != S_OK) {')
1513+ print(r' retrace::warning(call) << " returned " << _result << "\n";')
1514+ print(r' }')
1515
1516 # process events after presents
1517 if interface.name.startswith('IDXGISwapChain') and method.name.startswith('Present'):
1518- print r' d3dretrace::processEvents();'
1519+ print(r' d3dretrace::processEvents();')
1520
1521 if method.name in ('Map', 'Unmap'):
1522 if interface.name.startswith('ID3D11DeviceContext'):
1523- print ' void * & _pbData = g_Maps[_this][SubresourceKey(pResource, Subresource)];'
1524+ print(' void * & _pbData = g_Maps[_this][SubresourceKey(pResource, Subresource)];')
1525 else:
1526 subresourceArg = method.getArgByName('Subresource')
1527 if subresourceArg is None:
1528- print ' UINT Subresource = 0;'
1529- print ' void * & _pbData = g_Maps[0][SubresourceKey(_this, Subresource)];'
1530+ print(' UINT Subresource = 0;')
1531+ print(' void * & _pbData = g_Maps[0][SubresourceKey(_this, Subresource)];')
1532
1533 if method.name == 'Map':
1534- print ' _MAP_DESC _MapDesc;'
1535- print ' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames())
1536- print ' size_t _MappedSize = _MapDesc.Size;'
1537- print ' if (_MapDesc.Size) {'
1538- print ' _pbData = _MapDesc.pData;'
1539+ print(' _MAP_DESC _MapDesc;')
1540+ print(' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames()))
1541+ print(' size_t _MappedSize = _MapDesc.Size;')
1542+ print(' if (_MapDesc.Size) {')
1543+ print(' _pbData = _MapDesc.pData;')
1544 if interface.name.startswith('ID3D11DeviceContext'):
1545 # Prevent false warnings on 1D and 2D resources, since the
1546 # pitches are often junk there...
1547- print ' _normalizeMap(pResource, pMappedResource);'
1548+ print(' _normalizeMap(pResource, pMappedResource);')
1549 self.checkPitchMismatch(method)
1550 else:
1551- print ' _pbData = _MapDesc.pData;'
1552+ print(' _pbData = _MapDesc.pData;')
1553 self.checkPitchMismatch(method)
1554- print ' } else {'
1555- print ' return;'
1556- print ' }'
1557+ print(' } else {')
1558+ print(' return;')
1559+ print(' }')
1560
1561 if method.name == 'Unmap':
1562- print ' if (_pbData) {'
1563- print ' retrace::delRegionByPointer(_pbData);'
1564- print ' _pbData = 0;'
1565- print ' }'
1566+ print(' if (_pbData) {')
1567+ print(' retrace::delRegionByPointer(_pbData);')
1568+ print(' _pbData = 0;')
1569+ print(' }')
1570
1571 # Attach shader byte code for lookup
1572 if 'pShaderBytecode' in method.argNames():
1573 ppShader = method.args[-1]
1574 assert ppShader.output
1575- print r' if (retrace::dumpingState && SUCCEEDED(_result)) {'
1576- print r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name
1577- print r' }'
1578+ print(r' if (retrace::dumpingState && SUCCEEDED(_result)) {')
1579+ print(r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name)
1580+ print(r' }')
1581
1582 def extractArg(self, function, arg, arg_type, lvalue, rvalue):
1583 # Set object names
1584 if function.name == 'SetPrivateData' and arg.name == 'pData':
1585 iid = function.args[0].name
1586- print r' if (%s != WKPDID_D3DDebugObjectName) {' % iid
1587- print r' return;'
1588- print r' }'
1589+ print(r' if (%s != WKPDID_D3DDebugObjectName) {' % iid)
1590+ print(r' return;')
1591+ print(r' }')
1592 # Interpret argument as string
1593 Retracer.extractArg(self, function, arg, LPCSTR, lvalue, rvalue)
1594- print r' assert(pData);'
1595- print r' assert(DataSize >= strlen((const char *)pData));'
1596- print r' // Some applications include the trailing zero terminator in the data'
1597- print r' DataSize = strlen((const char *)pData);'
1598+ print(r' assert(pData);')
1599+ print(r' assert(DataSize >= strlen((const char *)pData));')
1600+ print(r' // Some applications include the trailing zero terminator in the data')
1601+ print(r' DataSize = strlen((const char *)pData);')
1602 return
1603
1604 Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
1605
1606
1607 def main():
1608- print r'#define INITGUID'
1609- print
1610- print r'#include <string.h>'
1611- print
1612- print r'#include <iostream>'
1613- print
1614- print r'#include "d3dretrace.hpp"'
1615- print r'#include "os_version.hpp"'
1616- print
1617- print r'#include "d3dretrace_dxgi.hpp"'
1618- print r'#include "d3d10imports.hpp"'
1619- print r'#include "d3d10size.hpp"'
1620- print r'#include "d3d10state.hpp"'
1621- print r'#include "d3d11imports.hpp"'
1622- print r'#include "d3d11size.hpp"'
1623- print r'#include "d3dstate.hpp"'
1624- print
1625- print '''static d3dretrace::D3DDumper<IDXGISwapChain> dxgiDumper;'''
1626- print '''static d3dretrace::D3DDumper<ID3D10Device> d3d10Dumper;'''
1627- print '''static d3dretrace::D3DDumper<ID3D11DeviceContext> d3d11Dumper;'''
1628- print
1629+ print(r'#define INITGUID')
1630+ print()
1631+ print(r'#include <string.h>')
1632+ print()
1633+ print(r'#include <iostream>')
1634+ print()
1635+ print(r'#include "d3dretrace.hpp"')
1636+ print(r'#include "os_version.hpp"')
1637+ print()
1638+ print(r'#include "d3dretrace_dxgi.hpp"')
1639+ print(r'#include "d3d10imports.hpp"')
1640+ print(r'#include "d3d10size.hpp"')
1641+ print(r'#include "d3d10state.hpp"')
1642+ print(r'#include "d3d11imports.hpp"')
1643+ print(r'#include "d3d11size.hpp"')
1644+ print(r'#include "d3dstate.hpp"')
1645+ print()
1646+ print('''static d3dretrace::D3DDumper<IDXGISwapChain> dxgiDumper;''')
1647+ print('''static d3dretrace::D3DDumper<ID3D10Device> d3d10Dumper;''')
1648+ print('''static d3dretrace::D3DDumper<ID3D11DeviceContext> d3d11Dumper;''')
1649+ print()
1650
1651 api = API()
1652 api.addModule(dxgi)
1653diff --git a/retrace/dxgistate_so.py b/retrace/dxgistate_so.py
1654index 86f6db57..33745c8f 100644
1655--- a/retrace/dxgistate_so.py
1656+++ b/retrace/dxgistate_so.py
1657@@ -48,9 +48,9 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin):
1658
1659 def visitLiteral(self, literal, instance):
1660 if literal.kind in ('SInt', 'UInt'):
1661- print ' writer.writeInt(%s);' % (instance)
1662+ print(' writer.writeInt(%s);' % (instance))
1663 elif literal.kind in ('Float',):
1664- print ' writer.writeFloat(%s);' % (instance)
1665+ print(' writer.writeFloat(%s);' % (instance))
1666 else:
1667 raise NotImplementedError
1668
1669@@ -66,36 +66,36 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin):
1670 # reinterpret_cast is necessary for GLubyte * <=> char *
1671 instance = 'reinterpret_cast<%s>(%s)' % (cast, instance)
1672 assert string.length is None
1673- print ' writer.write%s(%s);' % (suffix, instance)
1674+ print(' writer.write%s(%s);' % (suffix, instance))
1675
1676 def visitConst(self, const, instance):
1677 self.visit(const.type, instance)
1678
1679 def visitStruct(self, struct, instance):
1680- print ' writer.beginObject();'
1681+ print(' writer.beginObject();')
1682 for member in struct.members:
1683 memberType, memberName = member
1684 if memberName is not None:
1685- print ' writer.beginMember("%s");' % memberName
1686+ print(' writer.beginMember("%s");' % memberName)
1687 self.visitMember(member, instance)
1688 if memberName is not None:
1689- print ' writer.endMember(); // %s' % memberName
1690- print ' writer.endObject();'
1691+ print(' writer.endMember(); // %s' % memberName)
1692+ print(' writer.endObject();')
1693
1694 def visitArray(self, array, instance):
1695 length = '_c' + array.type.tag
1696 index = '_i' + array.type.tag
1697 array_length = self.expand(array.length)
1698- print ' if (%s) {' % instance
1699- print ' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length)
1700- print ' writer.beginArray();'
1701- print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index)
1702+ print(' if (%s) {' % instance)
1703+ print(' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length))
1704+ print(' writer.beginArray();')
1705+ print(' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index))
1706 self.visitElement(index, array.type, '(%s)[%s]' % (instance, index))
1707- print ' }'
1708- print ' writer.endArray();'
1709- print ' } else {'
1710- print ' writer.writeNull();'
1711- print ' }'
1712+ print(' }')
1713+ print(' writer.endArray();')
1714+ print(' } else {')
1715+ print(' writer.writeNull();')
1716+ print(' }')
1717
1718 def visitAttribArray(self, array, instance):
1719 raise NotImplementedError
1720@@ -104,37 +104,37 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin):
1721 raise NotImplementedError
1722
1723 def visitEnum(self, enum, instance):
1724- print ' switch (%s) {' % instance
1725+ print(' switch (%s) {' % instance)
1726 for value in enum.values:
1727- print ' case %s:' % value
1728- print ' writer.writeString("%s");' % value
1729- print ' break;'
1730- print ' default:'
1731- print ' writer.writeInt(%s);' % instance
1732- print ' break;'
1733- print ' }'
1734+ print(' case %s:' % value)
1735+ print(' writer.writeString("%s");' % value)
1736+ print(' break;')
1737+ print(' default:')
1738+ print(' writer.writeInt(%s);' % instance)
1739+ print(' break;')
1740+ print(' }')
1741
1742 def visitBitmask(self, bitmask, instance):
1743 # TODO
1744 self.visit(bitmask.type, instance)
1745
1746 def visitPointer(self, pointer, instance):
1747- print ' if (%s) {' % instance
1748- print ' writer.beginArray();'
1749+ print(' if (%s) {' % instance)
1750+ print(' writer.beginArray();')
1751 self.visit(pointer.type, "*" + instance)
1752- print ' writer.endArray();'
1753- print ' } else {'
1754- print ' writer.writeNull();'
1755- print ' }'
1756+ print(' writer.endArray();')
1757+ print(' } else {')
1758+ print(' writer.writeNull();')
1759+ print(' }')
1760
1761 def visitIntPointer(self, pointer, instance):
1762- print ' writer.writeInt((uintptr_t)%s);' % instance
1763+ print(' writer.writeInt((uintptr_t)%s);' % instance)
1764
1765 def visitObjPointer(self, pointer, instance):
1766- print ' writer.writeInt((uintptr_t)%s);' % instance
1767+ print(' writer.writeInt((uintptr_t)%s);' % instance)
1768
1769 def visitLinearPointer(self, pointer, instance):
1770- print ' writer.writeInt((uintptr_t)%s);' % instance
1771+ print(' writer.writeInt((uintptr_t)%s);' % instance)
1772
1773 def visitReference(self, reference, instance):
1774 self.visit(reference.type, instance)
1775@@ -146,23 +146,23 @@ class ValueDumper(stdapi.Visitor, stdapi.ExpanderMixin):
1776 self.visit(alias.type, instance)
1777
1778 def visitOpaque(self, opaque, instance):
1779- print ' writer.writeInt((uintptr_t)%s);' % instance
1780+ print(' writer.writeInt((uintptr_t)%s);' % instance)
1781
1782 def visitInterface(self, interface, instance):
1783 assert False
1784
1785 def visitPolymorphic(self, polymorphic, instance):
1786 switchExpr = self.expand(polymorphic.switchExpr)
1787- print ' switch (static_cast<int>(%s)) {' % switchExpr
1788+ print(' switch (static_cast<int>(%s)) {' % switchExpr)
1789 for cases, type in polymorphic.iterSwitch():
1790 for case in cases:
1791- print ' %s:' % case
1792+ print(' %s:' % case)
1793 caseInstance = instance
1794 if type.expr is not None:
1795 caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance)
1796 self.visit(type, caseInstance)
1797- print ' break;'
1798- print ' }'
1799+ print(' break;')
1800+ print(' }')
1801
1802
1803 class Dumper:
1804@@ -187,8 +187,8 @@ class Dumper:
1805 # Includes
1806 for module in api.modules:
1807 for header in module.headers:
1808- print header
1809- print
1810+ print(header)
1811+ print()
1812
1813 # Generate the dumper functions
1814 types = api.getAllTypes()
1815@@ -196,13 +196,13 @@ class Dumper:
1816 self.dumpType(type)
1817
1818 def dumpType(self, type):
1819- print r'void'
1820- print r'dumpStateObject(StateWriter &writer, const %s & so)' % type
1821- print r'{'
1822+ print(r'void')
1823+ print(r'dumpStateObject(StateWriter &writer, const %s & so)' % type)
1824+ print(r'{')
1825 visitor = self.dumperFactory()
1826 visitor.visit(type, 'so')
1827- print r'}'
1828- print
1829+ print(r'}')
1830+ print()
1831
1832 def header(self):
1833 pass
1834@@ -212,10 +212,10 @@ class Dumper:
1835
1836
1837 if __name__ == '__main__':
1838- print r'#include "dxgistate_so.hpp"'
1839- print
1840- print r'#include "state_writer.hpp"'
1841- print
1842+ print(r'#include "dxgistate_so.hpp"')
1843+ print()
1844+ print(r'#include "state_writer.hpp"')
1845+ print()
1846
1847 api = stdapi.API()
1848 api.addModule(dxgi.dxgi)
1849diff --git a/retrace/glretrace.py b/retrace/glretrace.py
1850index 2ead195d..0dfe5c5b 100644
1851--- a/retrace/glretrace.py
1852+++ b/retrace/glretrace.py
1853@@ -127,190 +127,190 @@ class GlRetracer(Retracer):
1854
1855 # For backwards compatibility with old traces where non VBO drawing was supported
1856 if (is_array_pointer or is_draw_arrays or is_draw_elements) and not is_draw_indirect:
1857- print ' if (retrace::parser->getVersion() < 1) {'
1858+ print(' if (retrace::parser->getVersion() < 1) {')
1859
1860 if is_array_pointer or is_draw_arrays:
1861- print ' GLint _array_buffer = 0;'
1862- print ' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);'
1863- print ' if (!_array_buffer) {'
1864+ print(' GLint _array_buffer = 0;')
1865+ print(' glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &_array_buffer);')
1866+ print(' if (!_array_buffer) {')
1867 self.failFunction(function)
1868- print ' }'
1869+ print(' }')
1870
1871 if is_draw_elements:
1872- print ' GLint _element_array_buffer = 0;'
1873- print ' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);'
1874- print ' if (!_element_array_buffer) {'
1875+ print(' GLint _element_array_buffer = 0;')
1876+ print(' glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);')
1877+ print(' if (!_element_array_buffer) {')
1878 self.failFunction(function)
1879- print ' }'
1880+ print(' }')
1881
1882- print ' }'
1883+ print(' }')
1884
1885 # When no pack buffer object is bound, the pack functions are no-ops.
1886 if self.pack_function_regex.match(function.name):
1887- print ' GLint _pack_buffer = 0;'
1888- print ' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);'
1889- print ' if (!_pack_buffer) {'
1890- print ' return;'
1891- print ' }'
1892+ print(' GLint _pack_buffer = 0;')
1893+ print(' glGetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, &_pack_buffer);')
1894+ print(' if (!_pack_buffer) {')
1895+ print(' return;')
1896+ print(' }')
1897
1898 # Pre-snapshots
1899 if self.bind_framebuffer_function_regex.match(function.name):
1900- print ' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);'
1901+ print(' assert(call.flags & trace::CALL_FLAG_SWAP_RENDERTARGET);')
1902 if function.name == 'glStringMarkerGREMEDY':
1903 return
1904 if function.name == 'glFrameTerminatorGREMEDY':
1905- print ' glretrace::frame_complete(call);'
1906+ print(' glretrace::frame_complete(call);')
1907 return
1908
1909 Retracer.retraceFunctionBody(self, function)
1910
1911 # Post-snapshots
1912 if function.name in ('glFlush', 'glFinish'):
1913- print ' if (!retrace::doubleBuffer) {'
1914- print ' glretrace::frame_complete(call);'
1915- print ' }'
1916+ print(' if (!retrace::doubleBuffer) {')
1917+ print(' glretrace::frame_complete(call);')
1918+ print(' }')
1919 if is_draw_arrays or is_draw_elements or is_misc_draw:
1920- print ' assert(call.flags & trace::CALL_FLAG_RENDER);'
1921+ print(' assert(call.flags & trace::CALL_FLAG_RENDER);')
1922
1923
1924 def invokeFunction(self, function):
1925 if function.name == "glTexDirectVIVMap" or function.name == "glTexDirectMapVIV" or function.name == "glTexDirectTiledMapVIV":
1926- print '#if defined(HAVE_VIVANTE_G2D)'
1927- print ' GLint tex;'
1928- print ' glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);'
1929- print ' int32_t size = 0;'
1930- print ' switch(format){'
1931- print ' case GL_VIV_YV12:'
1932- print ' case GL_VIV_I420:'
1933- print ' case GL_VIV_NV12:'
1934- print ' case GL_VIV_NV21:'
1935- print ' size=width * height * 3 / 2;'
1936- print ' break;'
1937- print ' case GL_RGBA:'
1938- print ' case GL_BGRA_EXT:'
1939- print ' size=width * height * 4;'
1940- print ' break;'
1941- print ' case GL_RGB:'
1942- print ' size=width * height *3;'
1943- print ' break;'
1944- print ' case GL_VIV_YUY2:'
1945- print ' case GL_VIV_UYVY:'
1946- print ' case GL_RGB565_OES:'
1947- print ' case GL_LUMINANCE8_ALPHA8_EXT:'
1948- print ' size=width * height *2;'
1949- print ' break;'
1950- print ' case GL_ALPHA:'
1951- print ' size=width * height;'
1952- print ' break;'
1953- print ' default:'
1954- print ' break;'
1955- print ' }'
1956- print ' if(tex != 0)'
1957- print ' {'
1958- print ' GLuint pindex = *(GLuint*)Logical;'
1959- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];'
1960- print ' if(data.privateData == 0) // new entry'
1961- print ' {'
1962- print ' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);'
1963- print ' data.index = pindex;'
1964- print ' data.size = size;'
1965- print ' retrace::addRegion(call,data.index,data.logical,size);'
1966- print ' }'
1967- print ' else // already have one; check size and index'
1968- print ' {'
1969- print ' if((size!=data.size)||(pindex!=data.index))'
1970- print ' {'
1971- print ' retrace::delRegionByPointer(data.logical);'
1972- print ' free_dma_buffer(data.privateData);'
1973- print ' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);'
1974- print ' data.index = pindex;'
1975- print ' data.size = size;'
1976- print ' retrace::addRegion(call,data.index,data.logical,size);'
1977- print ' }'
1978- print ' }'
1979- print ' *Logical = data.logical;'
1980- print ' *Physical = data.physical;'
1981- print ' }'
1982- print '#endif /* HAVE_VIVANTE_G2D */'
1983+ print('#if defined(HAVE_VIVANTE_G2D)')
1984+ print(' GLint tex;')
1985+ print(' glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);')
1986+ print(' int32_t size = 0;')
1987+ print(' switch(format){')
1988+ print(' case GL_VIV_YV12:')
1989+ print(' case GL_VIV_I420:')
1990+ print(' case GL_VIV_NV12:')
1991+ print(' case GL_VIV_NV21:')
1992+ print(' size=width * height * 3 / 2;')
1993+ print(' break;')
1994+ print(' case GL_RGBA:')
1995+ print(' case GL_BGRA_EXT:')
1996+ print(' size=width * height * 4;')
1997+ print(' break;')
1998+ print(' case GL_RGB:')
1999+ print(' size=width * height *3;')
2000+ print(' break;')
2001+ print(' case GL_VIV_YUY2:')
2002+ print(' case GL_VIV_UYVY:')
2003+ print(' case GL_RGB565_OES:')
2004+ print(' case GL_LUMINANCE8_ALPHA8_EXT:')
2005+ print(' size=width * height *2;')
2006+ print(' break;')
2007+ print(' case GL_ALPHA:')
2008+ print(' size=width * height;')
2009+ print(' break;')
2010+ print(' default:')
2011+ print(' break;')
2012+ print(' }')
2013+ print(' if(tex != 0)')
2014+ print(' {')
2015+ print(' GLuint pindex = *(GLuint*)Logical;')
2016+ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];')
2017+ print(' if(data.privateData == 0) // new entry')
2018+ print(' {')
2019+ print(' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);')
2020+ print(' data.index = pindex;')
2021+ print(' data.size = size;')
2022+ print(' retrace::addRegion(call,data.index,data.logical,size);')
2023+ print(' }')
2024+ print(' else // already have one; check size and index')
2025+ print(' {')
2026+ print(' if((size!=data.size)||(pindex!=data.index))')
2027+ print(' {')
2028+ print(' retrace::delRegionByPointer(data.logical);')
2029+ print(' free_dma_buffer(data.privateData);')
2030+ print(' data.privateData = alloc_dma_buffer(size, (uintptr_t*)&data.logical, &data.physical);')
2031+ print(' data.index = pindex;')
2032+ print(' data.size = size;')
2033+ print(' retrace::addRegion(call,data.index,data.logical,size);')
2034+ print(' }')
2035+ print(' }')
2036+ print(' *Logical = data.logical;')
2037+ print(' *Physical = data.physical;')
2038+ print(' }')
2039+ print('#endif /* HAVE_VIVANTE_G2D */')
2040 # Infer the drawable size from GL calls
2041 if function.name == "glViewport":
2042- print ' glretrace::updateDrawable(x + width, y + height);'
2043+ print(' glretrace::updateDrawable(x + width, y + height);')
2044 if function.name == "glViewportArray":
2045 # We are concerned about drawables so only care for the first viewport
2046- print ' if (first == 0 && count > 0) {'
2047- print ' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];'
2048- print ' glretrace::updateDrawable(x + w, y + h);'
2049- print ' }'
2050+ print(' if (first == 0 && count > 0) {')
2051+ print(' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];')
2052+ print(' glretrace::updateDrawable(x + w, y + h);')
2053+ print(' }')
2054 if function.name == "glViewportIndexedf":
2055- print ' if (index == 0) {'
2056- print ' glretrace::updateDrawable(x + w, y + h);'
2057- print ' }'
2058+ print(' if (index == 0) {')
2059+ print(' glretrace::updateDrawable(x + w, y + h);')
2060+ print(' }')
2061 if function.name == "glViewportIndexedfv":
2062- print ' if (index == 0) {'
2063- print ' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];'
2064- print ' glretrace::updateDrawable(x + w, y + h);'
2065- print ' }'
2066+ print(' if (index == 0) {')
2067+ print(' GLfloat x = v[0], y = v[1], w = v[2], h = v[3];')
2068+ print(' glretrace::updateDrawable(x + w, y + h);')
2069+ print(' }')
2070 if function.name in ('glBlitFramebuffer', 'glBlitFramebufferEXT'):
2071 # Some applications do all their rendering in a framebuffer, and
2072 # then just blit to the drawable without ever calling glViewport.
2073- print ' glretrace::updateDrawable(std::max(dstX0, dstX1), std::max(dstY0, dstY1));'
2074+ print(' glretrace::updateDrawable(std::max(dstX0, dstX1), std::max(dstY0, dstY1));')
2075
2076 if function.name.startswith('gl') and not function.name.startswith('glX'):
2077 # The Windows OpenGL runtime will skip calls when there's no
2078 # context bound to the current context, but this might cause
2079 # crashes on other systems, particularly with NVIDIA Linux drivers.
2080- print r' glretrace::Context *currentContext = glretrace::getCurrentContext();'
2081- print r' if (!currentContext) {'
2082- print r' if (retrace::debug) {'
2083- print r' retrace::warning(call) << "no current context\n";'
2084- print r' }'
2085- print r'#ifndef _WIN32'
2086- print r' return;'
2087- print r'#endif'
2088- print r' }'
2089+ print(r' glretrace::Context *currentContext = glretrace::getCurrentContext();')
2090+ print(r' if (!currentContext) {')
2091+ print(r' if (retrace::debug) {')
2092+ print(r' retrace::warning(call) << "no current context\n";')
2093+ print(r' }')
2094+ print(r'#ifndef _WIN32')
2095+ print(r' return;')
2096+ print(r'#endif')
2097+ print(r' }')
2098
2099 if function.name == "glEnd":
2100- print r' if (currentContext) {'
2101- print r' currentContext->insideBeginEnd = false;'
2102- print r' }'
2103+ print(r' if (currentContext) {')
2104+ print(r' currentContext->insideBeginEnd = false;')
2105+ print(r' }')
2106
2107 if function.name == 'memcpy':
2108- print ' if (!dest || !src || !n) return;'
2109+ print(' if (!dest || !src || !n) return;')
2110
2111 # Skip glEnable/Disable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) as we don't
2112 # faithfully set the CONTEXT_DEBUG_BIT_ARB flags on context creation.
2113 if function.name in ('glEnable', 'glDisable'):
2114- print ' if (cap == GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) return;'
2115+ print(' if (cap == GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB) return;')
2116
2117 # Destroy the buffer mapping
2118 if self.unmap_function_regex.match(function.name):
2119- print r' GLvoid *ptr = NULL;'
2120+ print(r' GLvoid *ptr = NULL;')
2121 if function.name == 'glUnmapBuffer':
2122- print r' glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &ptr);'
2123+ print(r' glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &ptr);')
2124 elif function.name == 'glUnmapBufferARB':
2125- print r' glGetBufferPointervARB(target, GL_BUFFER_MAP_POINTER_ARB, &ptr);'
2126+ print(r' glGetBufferPointervARB(target, GL_BUFFER_MAP_POINTER_ARB, &ptr);')
2127 elif function.name == 'glUnmapBufferOES':
2128- print r' glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &ptr);'
2129+ print(r' glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &ptr);')
2130 elif function.name == 'glUnmapNamedBuffer':
2131- print r' glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &ptr);'
2132+ print(r' glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &ptr);')
2133 elif function.name == 'glUnmapNamedBufferEXT':
2134- print r' glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &ptr);'
2135+ print(r' glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &ptr);')
2136 elif function.name == 'glUnmapObjectBufferATI':
2137 # TODO
2138 pass
2139 else:
2140 assert False
2141- print r' if (ptr) {'
2142- print r' retrace::delRegionByPointer(ptr);'
2143- print r' } else {'
2144- print r' retrace::warning(call) << "failed to get mapped pointer\n";'
2145- print r' }'
2146+ print(r' if (ptr) {')
2147+ print(r' retrace::delRegionByPointer(ptr);')
2148+ print(r' } else {')
2149+ print(r' retrace::warning(call) << "failed to get mapped pointer\n";')
2150+ print(r' }')
2151
2152 if function.name in ('glBindProgramPipeline', 'glBindProgramPipelineEXT'):
2153 # Note if glBindProgramPipeline has ever been called
2154- print r' if (pipeline) {'
2155- print r' _pipelineHasBeenBound = true;'
2156- print r' }'
2157+ print(r' if (pipeline) {')
2158+ print(r' _pipelineHasBeenBound = true;')
2159+ print(r' }')
2160
2161 is_draw_arrays = self.draw_arrays_function_regex.match(function.name) is not None
2162 is_draw_elements = self.draw_elements_function_regex.match(function.name) is not None
2163@@ -325,240 +325,240 @@ class GlRetracer(Retracer):
2164
2165 # Keep track of active program for call lists
2166 if function.name in ('glUseProgram', 'glUseProgramObjectARB'):
2167- print r' if (currentContext) {'
2168- print r' currentContext->activeProgram = call.arg(0).toUInt();'
2169- print r' }'
2170+ print(r' if (currentContext) {')
2171+ print(r' currentContext->activeProgram = call.arg(0).toUInt();')
2172+ print(r' }')
2173
2174 # Only profile if not inside a list as the queries get inserted into list
2175 if function.name == 'glNewList':
2176- print r' if (currentContext) {'
2177- print r' currentContext->insideList = true;'
2178- print r' }'
2179+ print(r' if (currentContext) {')
2180+ print(r' currentContext->insideList = true;')
2181+ print(r' }')
2182
2183 if function.name == 'glEndList':
2184- print r' if (currentContext) {'
2185- print r' currentContext->insideList = false;'
2186- print r' }'
2187+ print(r' if (currentContext) {')
2188+ print(r' currentContext->insideList = false;')
2189+ print(r' }')
2190
2191 if function.name == 'glBegin' or \
2192 is_draw_arrays or \
2193 is_draw_elements or \
2194 function.name.startswith('glBeginTransformFeedback'):
2195- print r' if (retrace::debug) {'
2196- print r' _validateActiveProgram(call);'
2197- print r' }'
2198+ print(r' if (retrace::debug) {')
2199+ print(r' _validateActiveProgram(call);')
2200+ print(r' }')
2201
2202 if function.name != 'glEnd':
2203- print r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {'
2204+ print(r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {')
2205 if profileDraw:
2206- print r' glretrace::beginProfile(call, true);'
2207+ print(r' glretrace::beginProfile(call, true);')
2208 else:
2209- print r' glretrace::beginProfile(call, false);'
2210- print r' }'
2211+ print(r' glretrace::beginProfile(call, false);')
2212+ print(r' }')
2213
2214 if function.name in ('glCreateShaderProgramv', 'glCreateShaderProgramEXT', 'glCreateShaderProgramvEXT'):
2215 # When dumping state, break down glCreateShaderProgram* so that the
2216 # shader source can be recovered.
2217- print r' if (retrace::dumpingState) {'
2218- print r' GLuint _shader = glCreateShader(type);'
2219- print r' if (_shader) {'
2220+ print(r' if (retrace::dumpingState) {')
2221+ print(r' GLuint _shader = glCreateShader(type);')
2222+ print(r' if (_shader) {')
2223 if not function.name.startswith('glCreateShaderProgramv'):
2224- print r' GLsizei count = 1;'
2225- print r' const GLchar **strings = &string;'
2226- print r' glShaderSource(_shader, count, strings, NULL);'
2227- print r' glCompileShader(_shader);'
2228- print r' const GLuint _program = glCreateProgram();'
2229- print r' if (_program) {'
2230- print r' GLint compiled = GL_FALSE;'
2231- print r' glGetShaderiv(_shader, GL_COMPILE_STATUS, &compiled);'
2232+ print(r' GLsizei count = 1;')
2233+ print(r' const GLchar **strings = &string;')
2234+ print(r' glShaderSource(_shader, count, strings, NULL);')
2235+ print(r' glCompileShader(_shader);')
2236+ print(r' const GLuint _program = glCreateProgram();')
2237+ print(r' if (_program) {')
2238+ print(r' GLint compiled = GL_FALSE;')
2239+ print(r' glGetShaderiv(_shader, GL_COMPILE_STATUS, &compiled);')
2240 if function.name == 'glCreateShaderProgramvEXT':
2241- print r' glProgramParameteriEXT(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);'
2242+ print(r' glProgramParameteriEXT(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);')
2243 else:
2244- print r' glProgramParameteri(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);'
2245- print r' if (compiled) {'
2246- print r' glAttachShader(_program, _shader);'
2247- print r' glLinkProgram(_program);'
2248- print r' if (false) glDetachShader(_program, _shader);'
2249- print r' }'
2250- print r' // TODO: append shader info log to program info log'
2251- print r' }'
2252- print r' glDeleteShader(_shader);'
2253- print r' _result = _program;'
2254- print r' } else {'
2255- print r' _result = 0;'
2256- print r' }'
2257- print r' } else {'
2258+ print(r' glProgramParameteri(_program, GL_PROGRAM_SEPARABLE, GL_TRUE);')
2259+ print(r' if (compiled) {')
2260+ print(r' glAttachShader(_program, _shader);')
2261+ print(r' glLinkProgram(_program);')
2262+ print(r' if (false) glDetachShader(_program, _shader);')
2263+ print(r' }')
2264+ print(r' // TODO: append shader info log to program info log')
2265+ print(r' }')
2266+ print(r' glDeleteShader(_shader);')
2267+ print(r' _result = _program;')
2268+ print(r' } else {')
2269+ print(r' _result = 0;')
2270+ print(r' }')
2271+ print(r' } else {')
2272 Retracer.invokeFunction(self, function)
2273- print r' }'
2274+ print(r' }')
2275 elif function.name in ('glDetachShader', 'glDetachObjectARB'):
2276- print r' if (!retrace::dumpingState) {'
2277+ print(r' if (!retrace::dumpingState) {')
2278 Retracer.invokeFunction(self, function)
2279- print r' }'
2280+ print(r' }')
2281 elif function.name == 'glClientWaitSync':
2282- print r' _result = glretrace::clientWaitSync(call, sync, flags, timeout);'
2283- print r' (void)_result;'
2284+ print(r' _result = glretrace::clientWaitSync(call, sync, flags, timeout);')
2285+ print(r' (void)_result;')
2286 elif function.name == 'glGetSynciv':
2287- print r' if (pname == GL_SYNC_STATUS &&'
2288- print r' bufSize >= 1 &&'
2289- print r' values != NULL &&'
2290- print r' call.arg(4)[0].toSInt() == GL_SIGNALED) {'
2291- print r' // Fence was signalled, so ensure it happened here'
2292- print r' glretrace::blockOnFence(call, sync, GL_SYNC_FLUSH_COMMANDS_BIT);'
2293- print r' (void)length;'
2294- print r' }'
2295+ print(r' if (pname == GL_SYNC_STATUS &&')
2296+ print(r' bufSize >= 1 &&')
2297+ print(r' values != NULL &&')
2298+ print(r' call.arg(4)[0].toSInt() == GL_SIGNALED) {')
2299+ print(r' // Fence was signalled, so ensure it happened here')
2300+ print(r' glretrace::blockOnFence(call, sync, GL_SYNC_FLUSH_COMMANDS_BIT);')
2301+ print(r' (void)length;')
2302+ print(r' }')
2303 else:
2304 Retracer.invokeFunction(self, function)
2305
2306 if function.name == "glBegin":
2307- print ' if (currentContext) {'
2308- print ' currentContext->insideBeginEnd = true;'
2309- print ' }'
2310+ print(' if (currentContext) {')
2311+ print(' currentContext->insideBeginEnd = true;')
2312+ print(' }')
2313
2314 if function.name == "glTexDirectVIV":
2315- print '#if defined(HAVE_VIVANTE_G2D)'
2316- print ' int32_t ysize = 0;'
2317- print ' int32_t usize = 0;'
2318- print ' int32_t vsize = 0;'
2319- print ' switch(format){'
2320- print ' case GL_VIV_YV12:'
2321- print ' case GL_VIV_I420:'
2322- print ' ysize=width * height;'
2323- print ' usize=ysize/4;'
2324- print ' vsize=usize;'
2325- print ' break;'
2326- print ' case GL_VIV_NV12:'
2327- print ' case GL_VIV_NV21:'
2328- print ' ysize=width * height;'
2329- print ' usize=ysize/2;'
2330- print ' vsize=0;'
2331- print ' break;'
2332- print ' case GL_RGBA:'
2333- print ' case GL_BGRA_EXT:'
2334- print ' ysize=width * height *4;'
2335- print ' usize=0;'
2336- print ' vsize=0;'
2337- print ' break;'
2338- print ' case GL_RGB:'
2339- print ' ysize=width * height *3;'
2340- print ' usize=0;'
2341- print ' vsize=0;'
2342- print ' break;'
2343- print ' case GL_VIV_YUY2:'
2344- print ' case GL_VIV_UYVY:'
2345- print ' case GL_RGB565_OES:'
2346- print ' ysize=width * height *2;'
2347- print ' usize=0;'
2348- print ' vsize=0;'
2349- print ' break;'
2350- print ' default:'
2351- print ' break;'
2352- print ' }'
2353- print ' const trace::Array * arrayGLvoid = (call.arg(4)).toArray();'
2354- print ' if(ysize > 0)'
2355- print ' retrace::addRegion(call,(*arrayGLvoid->values[0]).toUInt(),(GLvoid*)pixels[0], ysize);'
2356- print ' if(usize > 0)'
2357- print ' retrace::addRegion(call,(*arrayGLvoid->values[1]).toUInt(),(GLvoid*)pixels[1], usize);'
2358- print ' if(vsize > 0)'
2359- print ' retrace::addRegion(call,(*arrayGLvoid->values[2]).toUInt(),(GLvoid*)pixels[2], vsize);'
2360- print '#endif /* HAVE_VIVANTE_G2D */'
2361-
2362- print r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {'
2363+ print('#if defined(HAVE_VIVANTE_G2D)')
2364+ print(' int32_t ysize = 0;')
2365+ print(' int32_t usize = 0;')
2366+ print(' int32_t vsize = 0;')
2367+ print(' switch(format){')
2368+ print(' case GL_VIV_YV12:')
2369+ print(' case GL_VIV_I420:')
2370+ print(' ysize=width * height;')
2371+ print(' usize=ysize/4;')
2372+ print(' vsize=usize;')
2373+ print(' break;')
2374+ print(' case GL_VIV_NV12:')
2375+ print(' case GL_VIV_NV21:')
2376+ print(' ysize=width * height;')
2377+ print(' usize=ysize/2;')
2378+ print(' vsize=0;')
2379+ print(' break;')
2380+ print(' case GL_RGBA:')
2381+ print(' case GL_BGRA_EXT:')
2382+ print(' ysize=width * height *4;')
2383+ print(' usize=0;')
2384+ print(' vsize=0;')
2385+ print(' break;')
2386+ print(' case GL_RGB:')
2387+ print(' ysize=width * height *3;')
2388+ print(' usize=0;')
2389+ print(' vsize=0;')
2390+ print(' break;')
2391+ print(' case GL_VIV_YUY2:')
2392+ print(' case GL_VIV_UYVY:')
2393+ print(' case GL_RGB565_OES:')
2394+ print(' ysize=width * height *2;')
2395+ print(' usize=0;')
2396+ print(' vsize=0;')
2397+ print(' break;')
2398+ print(' default:')
2399+ print(' break;')
2400+ print(' }')
2401+ print(' const trace::Array * arrayGLvoid = (call.arg(4)).toArray();')
2402+ print(' if(ysize > 0)')
2403+ print(' retrace::addRegion(call,(*arrayGLvoid->values[0]).toUInt(),(GLvoid*)pixels[0], ysize);')
2404+ print(' if(usize > 0)')
2405+ print(' retrace::addRegion(call,(*arrayGLvoid->values[1]).toUInt(),(GLvoid*)pixels[1], usize);')
2406+ print(' if(vsize > 0)')
2407+ print(' retrace::addRegion(call,(*arrayGLvoid->values[2]).toUInt(),(GLvoid*)pixels[2], vsize);')
2408+ print('#endif /* HAVE_VIVANTE_G2D */')
2409+
2410+ print(r' if (currentContext && !currentContext->insideList && !currentContext->insideBeginEnd && retrace::profiling) {')
2411 if profileDraw:
2412- print r' glretrace::endProfile(call, true);'
2413+ print(r' glretrace::endProfile(call, true);')
2414 else:
2415- print r' glretrace::endProfile(call, false);'
2416- print r' }'
2417+ print(r' glretrace::endProfile(call, false);')
2418+ print(r' }')
2419
2420 # Error checking
2421 if function.name.startswith('gl'):
2422 # glGetError is not allowed inside glBegin/glEnd
2423- print ' if (retrace::debug && currentContext && !currentContext->insideBeginEnd) {'
2424- print ' glretrace::checkGlError(call);'
2425+ print(' if (retrace::debug && currentContext && !currentContext->insideBeginEnd) {')
2426+ print(' glretrace::checkGlError(call);')
2427 if function.name in ('glProgramStringARB', 'glLoadProgramNV'):
2428- print r' GLint error_position = -1;'
2429- print r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);'
2430- print r' if (error_position != -1) {'
2431- print r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);'
2432- print r' retrace::warning(call) << "error in position " << error_position << ": " << error_string << "\n";'
2433- print r' }'
2434+ print(r' GLint error_position = -1;')
2435+ print(r' glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &error_position);')
2436+ print(r' if (error_position != -1) {')
2437+ print(r' const char *error_string = (const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB);')
2438+ print(r' retrace::warning(call) << "error in position " << error_position << ": " << error_string << "\n";')
2439+ print(r' }')
2440 if function.name == 'glCompileShader':
2441- print r' GLint compile_status = 0;'
2442- print r' glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);'
2443- print r' if (!compile_status) {'
2444- print r' retrace::warning(call) << "compilation failed\n";'
2445- print r' }'
2446- print r' GLint info_log_length = 0;'
2447- print r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);'
2448- print r' if (info_log_length > 1) {'
2449- print r' GLchar *infoLog = new GLchar[info_log_length];'
2450- print r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);'
2451- print r' retrace::warning(call) << infoLog << "\n";'
2452- print r' delete [] infoLog;'
2453- print r' }'
2454+ print(r' GLint compile_status = 0;')
2455+ print(r' glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);')
2456+ print(r' if (!compile_status) {')
2457+ print(r' retrace::warning(call) << "compilation failed\n";')
2458+ print(r' }')
2459+ print(r' GLint info_log_length = 0;')
2460+ print(r' glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length);')
2461+ print(r' if (info_log_length > 1) {')
2462+ print(r' GLchar *infoLog = new GLchar[info_log_length];')
2463+ print(r' glGetShaderInfoLog(shader, info_log_length, NULL, infoLog);')
2464+ print(r' retrace::warning(call) << infoLog << "\n";')
2465+ print(r' delete [] infoLog;')
2466+ print(r' }')
2467 if function.name in ('glLinkProgram', 'glCreateShaderProgramv', 'glCreateShaderProgramEXT', 'glCreateShaderProgramvEXT', 'glProgramBinary', 'glProgramBinaryOES'):
2468 if function.name.startswith('glCreateShaderProgram'):
2469- print r' GLuint program = _result;'
2470- print r' GLint link_status = 0;'
2471- print r' glGetProgramiv(program, GL_LINK_STATUS, &link_status);'
2472- print r' if (!link_status) {'
2473- print r' retrace::warning(call) << "link failed\n";'
2474- print r' }'
2475- print r' GLint info_log_length = 0;'
2476- print r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);'
2477- print r' if (info_log_length > 1) {'
2478- print r' GLchar *infoLog = new GLchar[info_log_length];'
2479- print r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);'
2480- print r' retrace::warning(call) << infoLog << "\n";'
2481- print r' delete [] infoLog;'
2482- print r' }'
2483+ print(r' GLuint program = _result;')
2484+ print(r' GLint link_status = 0;')
2485+ print(r' glGetProgramiv(program, GL_LINK_STATUS, &link_status);')
2486+ print(r' if (!link_status) {')
2487+ print(r' retrace::warning(call) << "link failed\n";')
2488+ print(r' }')
2489+ print(r' GLint info_log_length = 0;')
2490+ print(r' glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length);')
2491+ print(r' if (info_log_length > 1) {')
2492+ print(r' GLchar *infoLog = new GLchar[info_log_length];')
2493+ print(r' glGetProgramInfoLog(program, info_log_length, NULL, infoLog);')
2494+ print(r' retrace::warning(call) << infoLog << "\n";')
2495+ print(r' delete [] infoLog;')
2496+ print(r' }')
2497 if function.name == 'glCompileShaderARB':
2498- print r' GLint compile_status = 0;'
2499- print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);'
2500- print r' if (!compile_status) {'
2501- print r' retrace::warning(call) << "compilation failed\n";'
2502- print r' }'
2503- print r' GLint info_log_length = 0;'
2504- print r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);'
2505- print r' if (info_log_length > 1) {'
2506- print r' GLchar *infoLog = new GLchar[info_log_length];'
2507- print r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);'
2508- print r' retrace::warning(call) << infoLog << "\n";'
2509- print r' delete [] infoLog;'
2510- print r' }'
2511+ print(r' GLint compile_status = 0;')
2512+ print(r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);')
2513+ print(r' if (!compile_status) {')
2514+ print(r' retrace::warning(call) << "compilation failed\n";')
2515+ print(r' }')
2516+ print(r' GLint info_log_length = 0;')
2517+ print(r' glGetObjectParameterivARB(shaderObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);')
2518+ print(r' if (info_log_length > 1) {')
2519+ print(r' GLchar *infoLog = new GLchar[info_log_length];')
2520+ print(r' glGetInfoLogARB(shaderObj, info_log_length, NULL, infoLog);')
2521+ print(r' retrace::warning(call) << infoLog << "\n";')
2522+ print(r' delete [] infoLog;')
2523+ print(r' }')
2524 if function.name == 'glLinkProgramARB':
2525- print r' GLint link_status = 0;'
2526- print r' glGetObjectParameterivARB(programObj, GL_OBJECT_LINK_STATUS_ARB, &link_status);'
2527- print r' if (!link_status) {'
2528- print r' retrace::warning(call) << "link failed\n";'
2529- print r' }'
2530- print r' GLint info_log_length = 0;'
2531- print r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);'
2532- print r' if (info_log_length > 1) {'
2533- print r' GLchar *infoLog = new GLchar[info_log_length];'
2534- print r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);'
2535- print r' retrace::warning(call) << infoLog << "\n";'
2536- print r' delete [] infoLog;'
2537- print r' }'
2538+ print(r' GLint link_status = 0;')
2539+ print(r' glGetObjectParameterivARB(programObj, GL_OBJECT_LINK_STATUS_ARB, &link_status);')
2540+ print(r' if (!link_status) {')
2541+ print(r' retrace::warning(call) << "link failed\n";')
2542+ print(r' }')
2543+ print(r' GLint info_log_length = 0;')
2544+ print(r' glGetObjectParameterivARB(programObj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_log_length);')
2545+ print(r' if (info_log_length > 1) {')
2546+ print(r' GLchar *infoLog = new GLchar[info_log_length];')
2547+ print(r' glGetInfoLogARB(programObj, info_log_length, NULL, infoLog);')
2548+ print(r' retrace::warning(call) << infoLog << "\n";')
2549+ print(r' delete [] infoLog;')
2550+ print(r' }')
2551 if self.map_function_regex.match(function.name):
2552- print r' if (!_result) {'
2553- print r' retrace::warning(call) << "failed to map buffer\n";'
2554- print r' }'
2555+ print(r' if (!_result) {')
2556+ print(r' retrace::warning(call) << "failed to map buffer\n";')
2557+ print(r' }')
2558 if self.unmap_function_regex.match(function.name) and function.type is not stdapi.Void:
2559- print r' if (!_result) {'
2560- print r' retrace::warning(call) << "failed to unmap buffer\n";'
2561- print r' }'
2562+ print(r' if (!_result) {')
2563+ print(r' retrace::warning(call) << "failed to unmap buffer\n";')
2564+ print(r' }')
2565 if function.name in ('glGetAttribLocation', 'glGetAttribLocationARB'):
2566- print r' GLint _origResult = call.ret->toSInt();'
2567- print r' if (_result != _origResult) {'
2568- print r' retrace::warning(call) << "vertex attrib location mismatch " << _origResult << " -> " << _result << "\n";'
2569- print r' }'
2570+ print(r' GLint _origResult = call.ret->toSInt();')
2571+ print(r' if (_result != _origResult) {')
2572+ print(r' retrace::warning(call) << "vertex attrib location mismatch " << _origResult << " -> " << _result << "\n";')
2573+ print(r' }')
2574 if function.name in ('glCheckFramebufferStatus', 'glCheckFramebufferStatusEXT', 'glCheckNamedFramebufferStatus', 'glCheckNamedFramebufferStatusEXT'):
2575- print r' GLint _origResult = call.ret->toSInt();'
2576- print r' if (_origResult == GL_FRAMEBUFFER_COMPLETE &&'
2577- print r' _result != GL_FRAMEBUFFER_COMPLETE) {'
2578- print r' retrace::warning(call) << "incomplete framebuffer (" << glstate::enumToString(_result) << ")\n";'
2579- print r' }'
2580- print ' }'
2581+ print(r' GLint _origResult = call.ret->toSInt();')
2582+ print(r' if (_origResult == GL_FRAMEBUFFER_COMPLETE &&')
2583+ print(r' _result != GL_FRAMEBUFFER_COMPLETE) {')
2584+ print(r' retrace::warning(call) << "incomplete framebuffer (" << glstate::enumToString(_result) << ")\n";')
2585+ print(r' }')
2586+ print(' }')
2587
2588 # Query the buffer length for whole buffer mappings
2589 if self.map_function_regex.match(function.name):
2590@@ -566,23 +566,23 @@ class GlRetracer(Retracer):
2591 assert 'BufferRange' in function.name
2592 else:
2593 assert 'BufferRange' not in function.name
2594- print r' GLint length = 0;'
2595+ print(r' GLint length = 0;')
2596 if function.name in ('glMapBuffer', 'glMapBufferOES'):
2597- print r' glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);'
2598+ print(r' glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);')
2599 elif function.name == 'glMapBufferARB':
2600- print r' glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, &length);'
2601+ print(r' glGetBufferParameterivARB(target, GL_BUFFER_SIZE_ARB, &length);')
2602 elif function.name == 'glMapNamedBuffer':
2603- print r' glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &length);'
2604+ print(r' glGetNamedBufferParameteriv(buffer, GL_BUFFER_SIZE, &length);')
2605 elif function.name == 'glMapNamedBufferEXT':
2606- print r' glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_SIZE, &length);'
2607+ print(r' glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_SIZE, &length);')
2608 elif function.name == 'glMapObjectBufferATI':
2609- print r' glGetObjectBufferivATI(buffer, GL_OBJECT_BUFFER_SIZE_ATI, &length);'
2610+ print(r' glGetObjectBufferivATI(buffer, GL_OBJECT_BUFFER_SIZE_ATI, &length);')
2611 else:
2612 assert False
2613
2614 def extractArg(self, function, arg, arg_type, lvalue, rvalue):
2615 if function.name in self.array_pointer_function_names and arg.name == 'pointer':
2616- print ' %s = static_cast<%s>(retrace::toPointer(%s, true));' % (lvalue, arg_type, rvalue)
2617+ print(' %s = static_cast<%s>(retrace::toPointer(%s, true));' % (lvalue, arg_type, rvalue))
2618 return
2619
2620 if self.draw_elements_function_regex.match(function.name) and arg.name == 'indices' or\
2621@@ -594,18 +594,18 @@ class GlRetracer(Retracer):
2622 # object.
2623 if self.pack_function_regex.match(function.name) and arg.output:
2624 assert isinstance(arg_type, (stdapi.Pointer, stdapi.Array, stdapi.Blob, stdapi.Opaque))
2625- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, arg_type, rvalue)
2626+ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, arg_type, rvalue))
2627 return
2628
2629 if (arg.type.depends(glapi.GLlocation) or \
2630 arg.type.depends(glapi.GLsubroutine)) \
2631 and 'program' not in function.argNames():
2632 # Determine the active program for uniforms swizzling
2633- print ' GLint program = _getActiveProgram();'
2634+ print(' GLint program = _getActiveProgram();')
2635
2636 if arg.type is glapi.GLlocationARB \
2637 and 'programObj' not in function.argNames():
2638- print ' GLhandleARB programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);'
2639+ print(' GLhandleARB programObj = glGetHandleARB(GL_PROGRAM_OBJECT_ARB);')
2640
2641 Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
2642
2643@@ -613,28 +613,28 @@ class GlRetracer(Retracer):
2644 if arg.name == 'samples':
2645 if function.name == 'glRasterSamplesEXT':
2646 assert arg.type is glapi.GLuint
2647- print ' GLint max_samples = 0;'
2648- print ' glGetIntegerv(GL_MAX_RASTER_SAMPLES_EXT, &max_samples);'
2649- print ' if (samples > static_cast<GLuint>(max_samples)) {'
2650- print ' samples = static_cast<GLuint>(max_samples);'
2651- print ' }'
2652+ print(' GLint max_samples = 0;')
2653+ print(' glGetIntegerv(GL_MAX_RASTER_SAMPLES_EXT, &max_samples);')
2654+ print(' if (samples > static_cast<GLuint>(max_samples)) {')
2655+ print(' samples = static_cast<GLuint>(max_samples);')
2656+ print(' }')
2657 else:
2658 assert arg.type is glapi.GLsizei
2659- print ' GLint max_samples = 0;'
2660- print ' glGetIntegerv(GL_MAX_SAMPLES, &max_samples);'
2661- print ' if (samples > max_samples) {'
2662- print ' samples = max_samples;'
2663- print ' }'
2664+ print(' GLint max_samples = 0;')
2665+ print(' glGetIntegerv(GL_MAX_SAMPLES, &max_samples);')
2666+ print(' if (samples > max_samples) {')
2667+ print(' samples = max_samples;')
2668+ print(' }')
2669
2670 # These parameters are referred beyond the call life-time
2671 # TODO: Replace ad-hoc solution for bindable parameters with general one
2672 if function.name in ('glFeedbackBuffer', 'glSelectBuffer') and arg.output:
2673- print ' _allocator.bind(%s);' % arg.name
2674+ print(' _allocator.bind(%s);' % arg.name)
2675
2676
2677
2678 if __name__ == '__main__':
2679- print r'''
2680+ print(r'''
2681 #include <string.h>
2682
2683 #include "glproc.hpp"
2684@@ -692,13 +692,13 @@ static void free_dma_buffer(void *buf)
2685
2686 #endif /* HAVE_VIVANTE_G2D */
2687
2688-'''
2689+''')
2690 api = stdapi.API()
2691 api.addModule(glapi.glapi)
2692 retracer = GlRetracer()
2693 retracer.retraceApi(api)
2694
2695- print r'''
2696+ print(r'''
2697 static GLint
2698 _getActiveProgram(void)
2699 {
2700@@ -771,4 +771,4 @@ _validateActiveProgram(trace::Call &call)
2701 }
2702 }
2703
2704-'''
2705+''')
2706diff --git a/retrace/glstate_params.py b/retrace/glstate_params.py
2707index fb49ff9a..bc90f66b 100755
2708--- a/retrace/glstate_params.py
2709+++ b/retrace/glstate_params.py
2710@@ -134,17 +134,17 @@ class StateGetter(Visitor):
2711 elem_type = self.inflector.reduced_type(type)
2712 inflection = self.inflector.inflect(type)
2713 if inflection.endswith('v' + self.inflector.suffix):
2714- print ' %s %s = 0;' % (elem_type, temp_name)
2715- print ' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name)
2716+ print(' %s %s = 0;' % (elem_type, temp_name))
2717+ print(' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name))
2718 else:
2719- print ' %s %s = %s(%s);' % (elem_type, temp_name, inflection, ', '.join(args))
2720+ print(' %s %s = %s(%s);' % (elem_type, temp_name, inflection, ', '.join(args)))
2721 return temp_name
2722
2723 def visitString(self, string, args):
2724 temp_name = self.temp_name(args)
2725 inflection = self.inflector.inflect(string)
2726 assert not inflection.endswith('v' + self.inflector.suffix)
2727- print ' %s %s = (%s)%s(%s);' % (string, temp_name, string, inflection, ', '.join(args))
2728+ print(' %s %s = (%s)%s(%s);' % (string, temp_name, string, inflection, ', '.join(args)))
2729 return temp_name
2730
2731 def visitAlias(self, alias, args):
2732@@ -166,28 +166,28 @@ class StateGetter(Visitor):
2733 array_length = array.length
2734 if isinstance(array_length, int):
2735 # Static integer length
2736- print ' %s %s[%s + 1];' % (elem_type, temp_name, array_length)
2737+ print(' %s %s[%s + 1];' % (elem_type, temp_name, array_length))
2738 else:
2739 # Put the length in a variable to avoid recomputing it every time
2740- print ' size_t _%s_length = %s;' % (temp_name, array_length)
2741+ print(' size_t _%s_length = %s;' % (temp_name, array_length))
2742 array_length = '_%s_length' % temp_name
2743 # Allocate a dynamic sized array
2744- print ' %s *%s = _allocator.alloc<%s>(%s + 1);' % (elem_type, temp_name, elem_type, array_length)
2745- print ' memset(%s, 0, %s * sizeof *%s);' % (temp_name, array_length, temp_name)
2746- print ' %s[%s] = (%s)0xdeadc0de;' % (temp_name, array_length, elem_type)
2747- print ' if (%s) {' % array_length
2748- print ' %s(%s, %s);' % (inflection, ', '.join(args), temp_name)
2749- print ' }'
2750+ print(' %s *%s = _allocator.alloc<%s>(%s + 1);' % (elem_type, temp_name, elem_type, array_length))
2751+ print(' memset(%s, 0, %s * sizeof *%s);' % (temp_name, array_length, temp_name))
2752+ print(' %s[%s] = (%s)0xdeadc0de;' % (temp_name, array_length, elem_type))
2753+ print(' if (%s) {' % array_length)
2754+ print(' %s(%s, %s);' % (inflection, ', '.join(args), temp_name))
2755+ print(' }')
2756 # Simple buffer overflow detection
2757- print ' assert(%s[%s] == (%s)0xdeadc0de);' % (temp_name, array_length, elem_type)
2758+ print(' assert(%s[%s] == (%s)0xdeadc0de);' % (temp_name, array_length, elem_type))
2759 return temp_name
2760
2761 def visitOpaque(self, pointer, args):
2762 temp_name = self.temp_name(args)
2763 inflection = self.inflector.inflect(pointer)
2764 assert inflection.endswith('v' + self.inflector.suffix)
2765- print ' GLvoid *%s;' % temp_name
2766- print ' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name)
2767+ print(' GLvoid *%s;' % temp_name)
2768+ print(' %s(%s, &%s);' % (inflection, ', '.join(args), temp_name))
2769 return temp_name
2770
2771
2772@@ -236,26 +236,26 @@ class JsonWriter(Visitor):
2773
2774 def visitLiteral(self, literal, instance):
2775 if literal.kind == 'Bool':
2776- print ' writer.writeBool(%s);' % instance
2777+ print(' writer.writeBool(%s);' % instance)
2778 elif literal.kind in ('SInt', 'Uint'):
2779- print ' writer.writeInt(%s);' % instance
2780+ print(' writer.writeInt(%s);' % instance)
2781 elif literal.kind in ('Float', 'Double'):
2782- print ' writer.writeFloat(%s);' % instance
2783+ print(' writer.writeFloat(%s);' % instance)
2784 else:
2785 raise NotImplementedError
2786
2787 def visitString(self, string, instance):
2788 assert string.length is None
2789- print ' writer.writeString((const char *)%s);' % instance
2790+ print(' writer.writeString((const char *)%s);' % instance)
2791
2792 def visitEnum(self, enum, instance):
2793 if enum is GLboolean:
2794- print ' dumpBoolean(writer, %s);' % instance
2795+ print(' dumpBoolean(writer, %s);' % instance)
2796 elif enum is GLenum:
2797- print ' dumpEnum(writer, %s);' % instance
2798+ print(' dumpEnum(writer, %s);' % instance)
2799 else:
2800 assert False
2801- print ' writer.writeInt(%s);' % instance
2802+ print(' writer.writeInt(%s);' % instance)
2803
2804 def visitBitmask(self, bitmask, instance):
2805 raise NotImplementedError
2806@@ -264,18 +264,18 @@ class JsonWriter(Visitor):
2807 self.visit(alias.type, instance)
2808
2809 def visitOpaque(self, opaque, instance):
2810- print ' writer.writeInt((size_t)%s);' % instance
2811+ print(' writer.writeInt((size_t)%s);' % instance)
2812
2813 __index = 0
2814
2815 def visitArray(self, array, instance):
2816 index = '_i%u' % JsonWriter.__index
2817 JsonWriter.__index += 1
2818- print ' writer.beginArray();'
2819- print ' for (unsigned %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index)
2820+ print(' writer.beginArray();')
2821+ print(' for (unsigned %s = 0; %s < %s; ++%s) {' % (index, index, array.length, index))
2822 self.visit(array.type, '%s[%s]' % (instance, index))
2823- print ' }'
2824- print ' writer.endArray();'
2825+ print(' }')
2826+ print(' writer.endArray();')
2827
2828
2829
2830@@ -287,75 +287,75 @@ class StateDumper:
2831 pass
2832
2833 def dump(self):
2834- print '#include <assert.h>'
2835- print '#include <string.h>'
2836- print
2837- print '#include "state_writer.hpp"'
2838- print '#include "scoped_allocator.hpp"'
2839- print '#include "glproc.hpp"'
2840- print '#include "glsize.hpp"'
2841- print '#include "glstate.hpp"'
2842- print '#include "glstate_internal.hpp"'
2843- print
2844- print 'namespace glstate {'
2845- print
2846-
2847- print 'const char *'
2848- print 'enumToString(GLenum pname)'
2849- print '{'
2850- print ' switch (pname) {'
2851+ print('#include <assert.h>')
2852+ print('#include <string.h>')
2853+ print()
2854+ print('#include "state_writer.hpp"')
2855+ print('#include "scoped_allocator.hpp"')
2856+ print('#include "glproc.hpp"')
2857+ print('#include "glsize.hpp"')
2858+ print('#include "glstate.hpp"')
2859+ print('#include "glstate_internal.hpp"')
2860+ print()
2861+ print('namespace glstate {')
2862+ print()
2863+
2864+ print('const char *')
2865+ print('enumToString(GLenum pname)')
2866+ print('{')
2867+ print(' switch (pname) {')
2868 for name in GLenum.values:
2869- print ' case %s:' % name
2870- print ' return "%s";' % name
2871- print ' default:'
2872- print ' return NULL;'
2873- print ' }'
2874- print '}'
2875- print
2876-
2877- print 'static void'
2878- print 'dumpTextureTargetParameters(StateWriter &writer, Context &context, GLenum target, GLuint texture)'
2879- print '{'
2880- print ' writer.beginMember(enumToString(target));'
2881- print ' writer.beginObject();'
2882- print ' dumpObjectLabel(writer, context, GL_TEXTURE, texture, "GL_TEXTURE_LABEL");'
2883+ print(' case %s:' % name)
2884+ print(' return "%s";' % name)
2885+ print(' default:')
2886+ print(' return NULL;')
2887+ print(' }')
2888+ print('}')
2889+ print()
2890+
2891+ print('static void')
2892+ print('dumpTextureTargetParameters(StateWriter &writer, Context &context, GLenum target, GLuint texture)')
2893+ print('{')
2894+ print(' writer.beginMember(enumToString(target));')
2895+ print(' writer.beginObject();')
2896+ print(' dumpObjectLabel(writer, context, GL_TEXTURE, texture, "GL_TEXTURE_LABEL");')
2897 # ARB_texture_buffer forbids glGetTexParameter and
2898 # glGetTexLevelParameter for TEXTURE_BUFFER, but
2899 # ARB_texture_buffer_range introduced parameters which can be queries
2900 # with glGetTexLevelParameter...
2901- print ' if (target != GL_TEXTURE_BUFFER) {'
2902+ print(' if (target != GL_TEXTURE_BUFFER) {')
2903 self.dump_atoms(glGetTexParameter, 'target')
2904- print ' }'
2905- print ' if (!context.ES) {'
2906- print ' GLenum levelTarget;'
2907- print ' if (target == GL_TEXTURE_CUBE_MAP ||'
2908- print ' target == GL_TEXTURE_CUBE_MAP_ARRAY) {'
2909- print ' // Must pick a face'
2910- print ' levelTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;'
2911- print ' } else {'
2912- print ' levelTarget = target;'
2913- print ' }'
2914+ print(' }')
2915+ print(' if (!context.ES) {')
2916+ print(' GLenum levelTarget;')
2917+ print(' if (target == GL_TEXTURE_CUBE_MAP ||')
2918+ print(' target == GL_TEXTURE_CUBE_MAP_ARRAY) {')
2919+ print(' // Must pick a face')
2920+ print(' levelTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;')
2921+ print(' } else {')
2922+ print(' levelTarget = target;')
2923+ print(' }')
2924 self.dump_atoms(glGetTexLevelParameter, 'levelTarget', '0')
2925- print ' }'
2926- print ' writer.endObject();'
2927- print ' writer.endMember(); // target'
2928- print '}'
2929- print
2930-
2931- print 'static void'
2932- print 'dumpFramebufferAttachementParameters(StateWriter &writer, Context &context, GLenum target, GLenum attachment)'
2933- print '{'
2934+ print(' }')
2935+ print(' writer.endObject();')
2936+ print(' writer.endMember(); // target')
2937+ print('}')
2938+ print()
2939+
2940+ print('static void')
2941+ print('dumpFramebufferAttachementParameters(StateWriter &writer, Context &context, GLenum target, GLenum attachment)')
2942+ print('{')
2943 self.dump_attachment_parameters('target', 'attachment')
2944- print '}'
2945- print
2946-
2947- print 'void dumpParameters(StateWriter &writer, Context &context)'
2948- print '{'
2949- print ' ScopedAllocator _allocator;'
2950- print ' (void)_allocator;'
2951- print
2952- print ' writer.beginMember("parameters");'
2953- print ' writer.beginObject();'
2954+ print('}')
2955+ print()
2956+
2957+ print('void dumpParameters(StateWriter &writer, Context &context)')
2958+ print('{')
2959+ print(' ScopedAllocator _allocator;')
2960+ print(' (void)_allocator;')
2961+ print()
2962+ print(' writer.beginMember("parameters");')
2963+ print(' writer.beginObject();')
2964
2965 self.dump_atoms(glGet)
2966
2967@@ -368,58 +368,58 @@ class StateDumper:
2968 self.dump_framebuffer_parameters()
2969 self.dump_labels()
2970
2971- print ' writer.endObject();'
2972- print ' writer.endMember(); // parameters'
2973- print '}'
2974- print
2975+ print(' writer.endObject();')
2976+ print(' writer.endMember(); // parameters')
2977+ print('}')
2978+ print()
2979
2980- print '} /*namespace glstate */'
2981+ print('} /*namespace glstate */')
2982
2983 def dump_material_params(self):
2984- print ' if (!context.ES) {'
2985+ print(' if (!context.ES) {')
2986 for face in ['GL_FRONT', 'GL_BACK']:
2987- print ' writer.beginMember("%s");' % face
2988- print ' writer.beginObject();'
2989+ print(' writer.beginMember("%s");' % face)
2990+ print(' writer.beginObject();')
2991 self.dump_atoms(glGetMaterial, face)
2992- print ' writer.endObject();'
2993- print ' }'
2994- print
2995+ print(' writer.endObject();')
2996+ print(' }')
2997+ print()
2998
2999 def dump_light_params(self):
3000- print ' GLint max_lights = 0;'
3001- print ' _glGetIntegerv(GL_MAX_LIGHTS, &max_lights);'
3002- print ' for (GLint index = 0; index < max_lights; ++index) {'
3003- print ' GLenum light = GL_LIGHT0 + index;'
3004- print ' if (glIsEnabled(light)) {'
3005- print ' char name[32];'
3006- print ' snprintf(name, sizeof name, "GL_LIGHT%i", index);'
3007- print ' writer.beginMember(name);'
3008- print ' writer.beginObject();'
3009+ print(' GLint max_lights = 0;')
3010+ print(' _glGetIntegerv(GL_MAX_LIGHTS, &max_lights);')
3011+ print(' for (GLint index = 0; index < max_lights; ++index) {')
3012+ print(' GLenum light = GL_LIGHT0 + index;')
3013+ print(' if (glIsEnabled(light)) {')
3014+ print(' char name[32];')
3015+ print(' snprintf(name, sizeof name, "GL_LIGHT%i", index);')
3016+ print(' writer.beginMember(name);')
3017+ print(' writer.beginObject();')
3018 self.dump_atoms(glGetLight, ' GL_LIGHT0 + index')
3019- print ' writer.endObject();'
3020- print ' writer.endMember(); // GL_LIGHTi'
3021- print ' }'
3022- print ' }'
3023- print
3024+ print(' writer.endObject();')
3025+ print(' writer.endMember(); // GL_LIGHTi')
3026+ print(' }')
3027+ print(' }')
3028+ print()
3029
3030 def dump_sampler_params(self):
3031- print ' // GL_SAMPLER_BINDING'
3032- print ' if (context.ARB_sampler_objects) {'
3033- print ' GLint sampler_binding = 0;'
3034- print ' glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);'
3035- print ' writer.beginMember("GL_SAMPLER_BINDING");'
3036- print ' writer.writeInt(sampler_binding);'
3037- print ' writer.endMember();'
3038- print ' if (sampler_binding) {'
3039- print ' writer.beginMember("GL_SAMPLER");'
3040- print ' writer.beginObject();'
3041- print ' dumpObjectLabel(writer, context, GL_SAMPLER, sampler_binding, "GL_SAMPLER_LABEL");'
3042+ print(' // GL_SAMPLER_BINDING')
3043+ print(' if (context.ARB_sampler_objects) {')
3044+ print(' GLint sampler_binding = 0;')
3045+ print(' glGetIntegerv(GL_SAMPLER_BINDING, &sampler_binding);')
3046+ print(' writer.beginMember("GL_SAMPLER_BINDING");')
3047+ print(' writer.writeInt(sampler_binding);')
3048+ print(' writer.endMember();')
3049+ print(' if (sampler_binding) {')
3050+ print(' writer.beginMember("GL_SAMPLER");')
3051+ print(' writer.beginObject();')
3052+ print(' dumpObjectLabel(writer, context, GL_SAMPLER, sampler_binding, "GL_SAMPLER_LABEL");')
3053 for _, _, name in glGetSamplerParameter.iter():
3054 self.dump_atom(glGetSamplerParameter, 'sampler_binding', name)
3055- print ' writer.endObject();'
3056- print ' writer.endMember(); // GL_SAMPLER'
3057- print ' }'
3058- print ' }'
3059+ print(' writer.endObject();')
3060+ print(' writer.endMember(); // GL_SAMPLER')
3061+ print(' }')
3062+ print(' }')
3063
3064 def texenv_param_target(self, name):
3065 if name == 'GL_TEXTURE_LOD_BIAS':
3066@@ -431,34 +431,34 @@ class StateDumper:
3067
3068 def dump_texenv_params(self):
3069 for target in ['GL_TEXTURE_ENV', 'GL_TEXTURE_FILTER_CONTROL', 'GL_POINT_SPRITE']:
3070- print ' if (!context.ES) {'
3071- print ' writer.beginMember("%s");' % target
3072- print ' writer.beginObject();'
3073+ print(' if (!context.ES) {')
3074+ print(' writer.beginMember("%s");' % target)
3075+ print(' writer.beginObject();')
3076 for _, _, name in glGetTexEnv.iter():
3077 if self.texenv_param_target(name) == target:
3078 self.dump_atom(glGetTexEnv, target, name)
3079- print ' writer.endObject();'
3080- print ' }'
3081+ print(' writer.endObject();')
3082+ print(' }')
3083
3084 def dump_vertex_attribs(self):
3085- print ' GLint max_vertex_attribs = 0;'
3086- print ' _glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs);'
3087- print ' for (GLint index = 0; index < max_vertex_attribs; ++index) {'
3088- print ' char name[32];'
3089- print ' snprintf(name, sizeof name, "GL_VERTEX_ATTRIB_ARRAY%i", index);'
3090- print ' writer.beginMember(name);'
3091- print ' writer.beginObject();'
3092+ print(' GLint max_vertex_attribs = 0;')
3093+ print(' _glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs);')
3094+ print(' for (GLint index = 0; index < max_vertex_attribs; ++index) {')
3095+ print(' char name[32];')
3096+ print(' snprintf(name, sizeof name, "GL_VERTEX_ATTRIB_ARRAY%i", index);')
3097+ print(' writer.beginMember(name);')
3098+ print(' writer.beginObject();')
3099 self.dump_atoms(glGetVertexAttrib, 'index')
3100
3101 # Dump vertex attrib buffer label
3102- print ' GLint buffer_binding = 0;'
3103- print ' glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_binding);'
3104- print ' dumpObjectLabel(writer, context, GL_BUFFER, buffer_binding, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_LABEL");'
3105+ print(' GLint buffer_binding = 0;')
3106+ print(' glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_binding);')
3107+ print(' dumpObjectLabel(writer, context, GL_BUFFER, buffer_binding, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_LABEL");')
3108
3109- print ' writer.endObject();'
3110- print ' writer.endMember(); // GL_VERTEX_ATTRIB_ARRAYi'
3111- print ' }'
3112- print
3113+ print(' writer.endObject();')
3114+ print(' writer.endMember(); // GL_VERTEX_ATTRIB_ARRAYi')
3115+ print(' }')
3116+ print()
3117
3118 object_bindings = [
3119 ('GL_BUFFER', 'GL_ARRAY_BUFFER_BINDING'),
3120@@ -488,11 +488,11 @@ class StateDumper:
3121 member_name = object_binding.replace('BINDING', 'LABEL')
3122 if member_name == object_binding:
3123 member_name += '_LABEL'
3124- print ' {'
3125- print ' GLint binding = 0;'
3126- print ' glGetIntegerv(%s, &binding);' % object_binding
3127- print ' dumpObjectLabel(writer, context, %s, binding, "%s");' % (object_type, member_name)
3128- print ' }'
3129+ print(' {')
3130+ print(' GLint binding = 0;')
3131+ print(' glGetIntegerv(%s, &binding);' % object_binding)
3132+ print(' dumpObjectLabel(writer, context, %s, binding, "%s");' % (object_type, member_name))
3133+ print(' }')
3134
3135 program_targets = [
3136 'GL_FRAGMENT_PROGRAM_ARB',
3137@@ -501,12 +501,12 @@ class StateDumper:
3138
3139 def dump_program_params(self):
3140 for target in self.program_targets:
3141- print ' if (glIsEnabled(%s)) {' % target
3142- print ' writer.beginMember("%s");' % target
3143- print ' writer.beginObject();'
3144+ print(' if (glIsEnabled(%s)) {' % target)
3145+ print(' writer.beginMember("%s");' % target)
3146+ print(' writer.beginObject();')
3147 self.dump_atoms(glGetProgramARB, target)
3148- print ' writer.endObject();'
3149- print ' }'
3150+ print(' writer.endObject();')
3151+ print(' }')
3152
3153 buffer_targets = [
3154 ('GL_ARRAY_BUFFER', 'GL_ARRAY_BUFFER_BINDING', None),
3155@@ -529,135 +529,135 @@ class StateDumper:
3156 def dump_buffer_parameters(self):
3157 # general binding points
3158 for target, binding, max_bindings in self.buffer_targets:
3159- print ' // %s' % target
3160- print ' {'
3161- print ' writer.beginMember("%s");' % target
3162- print ' writer.beginObject();'
3163- print ' GLint buffer = 0;'
3164- print ' glGetIntegerv(%s, &buffer);' % binding
3165- print ' if (buffer) {'
3166+ print(' // %s' % target)
3167+ print(' {')
3168+ print(' writer.beginMember("%s");' % target)
3169+ print(' writer.beginObject();')
3170+ print(' GLint buffer = 0;')
3171+ print(' glGetIntegerv(%s, &buffer);' % binding)
3172+ print(' if (buffer) {')
3173 self.dump_atoms(glGetBufferParameter, target)
3174- print ' }'
3175+ print(' }')
3176 if max_bindings is not None:
3177 # indexed binding points
3178 start = target + '_START'
3179 size = target + '_SIZE'
3180- print ' GLint max_bindings = 0;'
3181- print ' glGetIntegerv(%s, &max_bindings);' % max_bindings
3182- print ' if (max_bindings) {'
3183- print ' writer.beginMember("i");'
3184- print ' writer.beginArray();'
3185- print ' for (GLint i = 0; i < max_bindings; ++i) {'
3186- print ' writer.beginObject();'
3187+ print(' GLint max_bindings = 0;')
3188+ print(' glGetIntegerv(%s, &max_bindings);' % max_bindings)
3189+ print(' if (max_bindings) {')
3190+ print(' writer.beginMember("i");')
3191+ print(' writer.beginArray();')
3192+ print(' for (GLint i = 0; i < max_bindings; ++i) {')
3193+ print(' writer.beginObject();')
3194 for pname in [binding, start, size]:
3195 self.dump_atom(glGet_i, pname, 'i')
3196- print ' writer.endObject();'
3197- print ' }'
3198- print ' writer.endArray();'
3199- print ' writer.endMember();'
3200- print ' }'
3201+ print(' writer.endObject();')
3202+ print(' }')
3203+ print(' writer.endArray();')
3204+ print(' writer.endMember();')
3205+ print(' }')
3206
3207- print ' writer.endObject();'
3208- print ' writer.endMember();'
3209- print ' }'
3210- print
3211+ print(' writer.endObject();')
3212+ print(' writer.endMember();')
3213+ print(' }')
3214+ print()
3215
3216 def dump_texture_parameters(self):
3217- print ' {'
3218- print ' GLint active_texture = GL_TEXTURE0;'
3219- print ' glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);'
3220- print ' GLint max_texture_coords = 0;'
3221- print ' if (!context.core) {'
3222- print ' glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);'
3223- print ' }'
3224- print ' GLint max_combined_texture_image_units = 0;'
3225- print ' glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);'
3226- print ' max_combined_texture_image_units = std::max(max_combined_texture_image_units, 2);'
3227- print ' GLint max_units = std::max(max_combined_texture_image_units, max_texture_coords);'
3228- print ' for (GLint unit = 0; unit < max_units; ++unit) {'
3229- print ' char name[32];'
3230- print ' snprintf(name, sizeof name, "GL_TEXTURE%i", unit);'
3231- print ' writer.beginMember(name);'
3232- print ' glActiveTexture(GL_TEXTURE0 + unit);'
3233- print ' writer.beginObject();'
3234- print
3235+ print(' {')
3236+ print(' GLint active_texture = GL_TEXTURE0;')
3237+ print(' glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);')
3238+ print(' GLint max_texture_coords = 0;')
3239+ print(' if (!context.core) {')
3240+ print(' glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_texture_coords);')
3241+ print(' }')
3242+ print(' GLint max_combined_texture_image_units = 0;')
3243+ print(' glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_combined_texture_image_units);')
3244+ print(' max_combined_texture_image_units = std::max(max_combined_texture_image_units, 2);')
3245+ print(' GLint max_units = std::max(max_combined_texture_image_units, max_texture_coords);')
3246+ print(' for (GLint unit = 0; unit < max_units; ++unit) {')
3247+ print(' char name[32];')
3248+ print(' snprintf(name, sizeof name, "GL_TEXTURE%i", unit);')
3249+ print(' writer.beginMember(name);')
3250+ print(' glActiveTexture(GL_TEXTURE0 + unit);')
3251+ print(' writer.beginObject();')
3252+ print()
3253 self.dump_atoms(glGet_texture)
3254- print
3255- print ' for (unsigned i = 0; i < numTextureTargets; ++i) {'
3256- print ' GLenum target = textureTargets[i];'
3257- print ' GLboolean enabled = GL_FALSE;'
3258- print ' if (unit < max_texture_coords &&'
3259- print ' (target == GL_TEXTURE_1D ||'
3260- print ' target == GL_TEXTURE_2D ||'
3261- print ' target == GL_TEXTURE_3D ||'
3262- print ' target == GL_TEXTURE_CUBE_MAP ||'
3263- print ' target == GL_TEXTURE_RECTANGLE)) {'
3264- print ' glGetBooleanv(target, &enabled);'
3265- print ' writer.beginMember(enumToString(target));'
3266- print ' dumpBoolean(writer, enabled);'
3267- print ' writer.endMember();'
3268- print ' }'
3269- print ' GLint texture = 0;'
3270- print ' GLenum binding = getTextureBinding(target);'
3271- print ' glGetIntegerv(binding, &texture);'
3272- print ' if (enabled || texture) {'
3273- print ' dumpTextureTargetParameters(writer, context, target, texture);'
3274- print ' }'
3275- print ' }'
3276- print
3277+ print()
3278+ print(' for (unsigned i = 0; i < numTextureTargets; ++i) {')
3279+ print(' GLenum target = textureTargets[i];')
3280+ print(' GLboolean enabled = GL_FALSE;')
3281+ print(' if (unit < max_texture_coords &&')
3282+ print(' (target == GL_TEXTURE_1D ||')
3283+ print(' target == GL_TEXTURE_2D ||')
3284+ print(' target == GL_TEXTURE_3D ||')
3285+ print(' target == GL_TEXTURE_CUBE_MAP ||')
3286+ print(' target == GL_TEXTURE_RECTANGLE)) {')
3287+ print(' glGetBooleanv(target, &enabled);')
3288+ print(' writer.beginMember(enumToString(target));')
3289+ print(' dumpBoolean(writer, enabled);')
3290+ print(' writer.endMember();')
3291+ print(' }')
3292+ print(' GLint texture = 0;')
3293+ print(' GLenum binding = getTextureBinding(target);')
3294+ print(' glGetIntegerv(binding, &texture);')
3295+ print(' if (enabled || texture) {')
3296+ print(' dumpTextureTargetParameters(writer, context, target, texture);')
3297+ print(' }')
3298+ print(' }')
3299+ print()
3300 self.dump_sampler_params()
3301- print
3302- print ' if (unit < max_texture_coords) {'
3303+ print()
3304+ print(' if (unit < max_texture_coords) {')
3305 self.dump_texenv_params()
3306- print ' }'
3307- print ' writer.endObject();'
3308- print ' writer.endMember(); // GL_TEXTUREi'
3309- print ' }'
3310- print ' glActiveTexture(active_texture);'
3311- print ' }'
3312- print
3313+ print(' }')
3314+ print(' writer.endObject();')
3315+ print(' writer.endMember(); // GL_TEXTUREi')
3316+ print(' }')
3317+ print(' glActiveTexture(active_texture);')
3318+ print(' }')
3319+ print()
3320
3321 def dump_framebuffer_parameters(self):
3322- print ' {'
3323- print ' GLint max_color_attachments = 0;'
3324- print ' glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &max_color_attachments);'
3325- print ' GLint framebuffer;'
3326+ print(' {')
3327+ print(' GLint max_color_attachments = 0;')
3328+ print(' glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &max_color_attachments);')
3329+ print(' GLint framebuffer;')
3330 for target, binding in framebuffer_targets:
3331- print ' // %s' % target
3332- print ' framebuffer = 0;'
3333- print ' glGetIntegerv(%s, &framebuffer);' % binding
3334- print ' if (framebuffer) {'
3335- print ' writer.beginMember("%s");' % target
3336- print ' writer.beginObject();'
3337- print ' dumpObjectLabel(writer, context, GL_FRAMEBUFFER, framebuffer, "GL_FRAMEBUFFER_LABEL");'
3338- print ' for (GLint i = 0; i < max_color_attachments; ++i) {'
3339- print ' GLint color_attachment = GL_COLOR_ATTACHMENT0 + i;'
3340- print ' dumpFramebufferAttachementParameters(writer, context, %s, color_attachment);' % target
3341- print ' }'
3342- print ' dumpFramebufferAttachementParameters(writer, context, %s, GL_DEPTH_ATTACHMENT);' % target
3343- print ' dumpFramebufferAttachementParameters(writer, context, %s, GL_STENCIL_ATTACHMENT);' % target
3344- print ' writer.endObject();'
3345- print ' writer.endMember(); // %s' % target
3346- print ' }'
3347- print
3348- print ' }'
3349- print
3350+ print(' // %s' % target)
3351+ print(' framebuffer = 0;')
3352+ print(' glGetIntegerv(%s, &framebuffer);' % binding)
3353+ print(' if (framebuffer) {')
3354+ print(' writer.beginMember("%s");' % target)
3355+ print(' writer.beginObject();')
3356+ print(' dumpObjectLabel(writer, context, GL_FRAMEBUFFER, framebuffer, "GL_FRAMEBUFFER_LABEL");')
3357+ print(' for (GLint i = 0; i < max_color_attachments; ++i) {')
3358+ print(' GLint color_attachment = GL_COLOR_ATTACHMENT0 + i;')
3359+ print(' dumpFramebufferAttachementParameters(writer, context, %s, color_attachment);' % target)
3360+ print(' }')
3361+ print(' dumpFramebufferAttachementParameters(writer, context, %s, GL_DEPTH_ATTACHMENT);' % target)
3362+ print(' dumpFramebufferAttachementParameters(writer, context, %s, GL_STENCIL_ATTACHMENT);' % target)
3363+ print(' writer.endObject();')
3364+ print(' writer.endMember(); // %s' % target)
3365+ print(' }')
3366+ print()
3367+ print(' }')
3368+ print()
3369
3370 def dump_attachment_parameters(self, target, attachment):
3371- print ' {'
3372- print ' GLint object_type = GL_NONE;'
3373- print ' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &object_type);' % (target, attachment)
3374- print ' if (object_type != GL_NONE) {'
3375- print ' writer.beginMember(enumToString(%s));' % attachment
3376- print ' writer.beginObject();'
3377+ print(' {')
3378+ print(' GLint object_type = GL_NONE;')
3379+ print(' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &object_type);' % (target, attachment))
3380+ print(' if (object_type != GL_NONE) {')
3381+ print(' writer.beginMember(enumToString(%s));' % attachment)
3382+ print(' writer.beginObject();')
3383 self.dump_atoms(glGetFramebufferAttachmentParameter, target, attachment)
3384- print ' GLint object_name = 0;'
3385- print ' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &object_name);' % (target, attachment)
3386- print ' dumpObjectLabel(writer, context, object_type, object_name, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_LABEL");'
3387- print ' writer.endObject();'
3388- print ' writer.endMember(); // GL_x_ATTACHMENT'
3389- print ' }'
3390- print ' }'
3391+ print(' GLint object_name = 0;')
3392+ print(' glGetFramebufferAttachmentParameteriv(%s, %s, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &object_name);' % (target, attachment))
3393+ print(' dumpObjectLabel(writer, context, object_type, object_name, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_LABEL");')
3394+ print(' writer.endObject();')
3395+ print(' writer.endMember(); // GL_x_ATTACHMENT')
3396+ print(' }')
3397+ print(' }')
3398
3399 def dump_atoms(self, getter, *args):
3400 for _, _, name in getter.iter():
3401@@ -666,20 +666,20 @@ class StateDumper:
3402 def dump_atom(self, getter, *args):
3403 name = args[getter.pnameIdx]
3404
3405- print ' // %s' % name
3406- print ' {'
3407- print ' flushErrors();'
3408+ print(' // %s' % name)
3409+ print(' {')
3410+ print(' flushErrors();')
3411 type, value = getter(*args)
3412- print ' if (glGetError() != GL_NO_ERROR) {'
3413+ print(' if (glGetError() != GL_NO_ERROR) {')
3414 #print ' std::cerr << "warning: %s(%s) failed\\n";' % (inflection, name)
3415- print ' flushErrors();'
3416- print ' } else {'
3417- print ' writer.beginMember("%s");' % name
3418+ print(' flushErrors();')
3419+ print(' } else {')
3420+ print(' writer.beginMember("%s");' % name)
3421 JsonWriter().visit(type, value)
3422- print ' writer.endMember();'
3423- print ' }'
3424- print ' }'
3425- print
3426+ print(' writer.endMember();')
3427+ print(' }')
3428+ print(' }')
3429+ print()
3430
3431
3432 if __name__ == '__main__':
3433diff --git a/retrace/retrace.py b/retrace/retrace.py
3434index 164944ed..0149817c 100644
3435--- a/retrace/retrace.py
3436+++ b/retrace/retrace.py
3437@@ -69,10 +69,10 @@ class ValueAllocator(stdapi.Visitor):
3438 pass
3439
3440 def visitArray(self, array, lvalue, rvalue):
3441- print ' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue)
3442+ print(' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue))
3443
3444 def visitPointer(self, pointer, lvalue, rvalue):
3445- print ' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, pointer.type, rvalue)
3446+ print(' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, pointer.type, rvalue))
3447
3448 def visitIntPointer(self, pointer, lvalue, rvalue):
3449 pass
3450@@ -109,7 +109,7 @@ class ValueAllocator(stdapi.Visitor):
3451 class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3452
3453 def visitLiteral(self, literal, lvalue, rvalue):
3454- print ' %s = (%s).to%s();' % (lvalue, rvalue, literal.kind)
3455+ print(' %s = (%s).to%s();' % (lvalue, rvalue, literal.kind))
3456
3457 def visitConst(self, const, lvalue, rvalue):
3458 self.visit(const.type, lvalue, rvalue)
3459@@ -118,7 +118,7 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3460 self.visit(alias.type, lvalue, rvalue)
3461
3462 def visitEnum(self, enum, lvalue, rvalue):
3463- print ' %s = static_cast<%s>((%s).toSInt());' % (lvalue, enum, rvalue)
3464+ print(' %s = static_cast<%s>((%s).toSInt());' % (lvalue, enum, rvalue))
3465
3466 def visitBitmask(self, bitmask, lvalue, rvalue):
3467 self.visit(bitmask.type, lvalue, rvalue)
3468@@ -127,50 +127,50 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3469 tmp = '_a_' + array.tag + '_' + str(self.seq)
3470 self.seq += 1
3471
3472- print ' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue)
3473- print ' if (%s) {' % (tmp,)
3474+ print(' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue))
3475+ print(' if (%s) {' % (tmp,))
3476
3477 length = '%s->values.size()' % (tmp,)
3478 if self.insideStruct:
3479 if isinstance(array.length, int):
3480 # Member is an array
3481- print r' static_assert( std::is_array< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be an array" );' % lvalue
3482- print r' static_assert( std::extent< std::remove_reference< decltype( %s ) >::type >::value == %s, "array size mismatch" );' % (lvalue, array.length)
3483- print r' assert( %s );' % (tmp,)
3484- print r' assert( %s->size() == %s );' % (tmp, array.length)
3485+ print(r' static_assert( std::is_array< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be an array" );' % lvalue)
3486+ print(r' static_assert( std::extent< std::remove_reference< decltype( %s ) >::type >::value == %s, "array size mismatch" );' % (lvalue, array.length))
3487+ print(r' assert( %s );' % (tmp,))
3488+ print(r' assert( %s->size() == %s );' % (tmp, array.length))
3489 length = str(array.length)
3490 else:
3491 # Member is a pointer to an array, hence must be allocated
3492- print r' static_assert( std::is_pointer< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be a pointer" );' % lvalue
3493- print r' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue)
3494+ print(r' static_assert( std::is_pointer< std::remove_reference< decltype( %s ) >::type >::value , "lvalue must be a pointer" );' % lvalue)
3495+ print(r' %s = _allocator.allocArray<%s>(&%s);' % (lvalue, array.type, rvalue))
3496
3497 index = '_j' + array.tag
3498- print ' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
3499+ print(' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length))
3500 try:
3501 self.visit(array.type, '%s[%s]' % (lvalue, index), '*%s->values[%s]' % (tmp, index))
3502 finally:
3503- print ' }'
3504- print ' }'
3505+ print(' }')
3506+ print(' }')
3507
3508 def visitPointer(self, pointer, lvalue, rvalue):
3509 tmp = '_a_' + pointer.tag + '_' + str(self.seq)
3510 self.seq += 1
3511
3512- print ' if (%s) {' % (lvalue,)
3513- print ' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue)
3514+ print(' if (%s) {' % (lvalue,))
3515+ print(' const trace::Array *%s = (%s).toArray();' % (tmp, rvalue))
3516 try:
3517 self.visit(pointer.type, '%s[0]' % (lvalue,), '*%s->values[0]' % (tmp,))
3518 finally:
3519- print ' }'
3520+ print(' }')
3521
3522 def visitIntPointer(self, pointer, lvalue, rvalue):
3523- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue)
3524+ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue))
3525
3526 def visitObjPointer(self, pointer, lvalue, rvalue):
3527- print ' %s = retrace::asObjPointer<%s>(call, %s);' % (lvalue, pointer.type, rvalue)
3528+ print(' %s = retrace::asObjPointer<%s>(call, %s);' % (lvalue, pointer.type, rvalue))
3529
3530 def visitLinearPointer(self, pointer, lvalue, rvalue):
3531- print ' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, pointer, rvalue)
3532+ print(' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, pointer, rvalue))
3533
3534 def visitReference(self, reference, lvalue, rvalue):
3535 self.visit(reference.type, lvalue, rvalue);
3536@@ -179,23 +179,23 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3537 #OpaqueValueDeserializer().visit(handle.type, lvalue, rvalue);
3538 self.visit(handle.type, lvalue, rvalue);
3539 new_lvalue = lookupHandle(handle, lvalue)
3540- print ' if (retrace::verbosity >= 2) {'
3541- print ' std::cout << "%s " << size_t(%s) << " <- " << size_t(%s) << "\\n";' % (handle.name, lvalue, new_lvalue)
3542- print ' }'
3543+ print(' if (retrace::verbosity >= 2) {')
3544+ print(' std::cout << "%s " << size_t(%s) << " <- " << size_t(%s) << "\\n";' % (handle.name, lvalue, new_lvalue))
3545+ print(' }')
3546 if (new_lvalue.startswith('_program_map') or new_lvalue.startswith('_shader_map')):
3547- print 'if (glretrace::supportsARBShaderObjects) {'
3548- print ' %s = _handleARB_map[%s];' % (lvalue, lvalue)
3549- print '} else {'
3550- print ' %s = %s;' % (lvalue, new_lvalue)
3551- print '}'
3552+ print('if (glretrace::supportsARBShaderObjects) {')
3553+ print(' %s = _handleARB_map[%s];' % (lvalue, lvalue))
3554+ print('} else {')
3555+ print(' %s = %s;' % (lvalue, new_lvalue))
3556+ print('}')
3557 else:
3558- print ' %s = %s;' % (lvalue, new_lvalue)
3559+ print(' %s = %s;' % (lvalue, new_lvalue))
3560
3561 def visitBlob(self, blob, lvalue, rvalue):
3562- print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, blob, rvalue)
3563+ print(' %s = static_cast<%s>((%s).toPointer());' % (lvalue, blob, rvalue))
3564
3565 def visitString(self, string, lvalue, rvalue):
3566- print ' %s = (%s)((%s).toString());' % (lvalue, string.expr, rvalue)
3567+ print(' %s = (%s)((%s).toString());' % (lvalue, string.expr, rvalue))
3568
3569 seq = 0
3570
3571@@ -207,8 +207,8 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3572
3573 self.insideStruct += 1
3574
3575- print ' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue)
3576- print ' assert(%s);' % (tmp)
3577+ print(' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue))
3578+ print(' assert(%s);' % (tmp))
3579 for i in range(len(struct.members)):
3580 member = struct.members[i]
3581 self.visitMember(member, lvalue, '*%s->members[%s]' % (tmp, i))
3582@@ -218,24 +218,24 @@ class ValueDeserializer(stdapi.Visitor, stdapi.ExpanderMixin):
3583 def visitPolymorphic(self, polymorphic, lvalue, rvalue):
3584 if polymorphic.defaultType is None:
3585 switchExpr = self.expand(polymorphic.switchExpr)
3586- print r' switch (%s) {' % switchExpr
3587+ print(r' switch (%s) {' % switchExpr)
3588 for cases, type in polymorphic.iterSwitch():
3589 for case in cases:
3590- print r' %s:' % case
3591+ print(r' %s:' % case)
3592 caseLvalue = lvalue
3593 if type.expr is not None:
3594 caseLvalue = 'static_cast<%s>(%s)' % (type, caseLvalue)
3595- print r' {'
3596+ print(r' {')
3597 try:
3598 self.visit(type, caseLvalue, rvalue)
3599 finally:
3600- print r' }'
3601- print r' break;'
3602+ print(r' }')
3603+ print(r' break;')
3604 if polymorphic.defaultType is None:
3605- print r' default:'
3606- print r' retrace::warning(call) << "unexpected polymorphic case" << %s << "\n";' % (switchExpr,)
3607- print r' break;'
3608- print r' }'
3609+ print(r' default:')
3610+ print(r' retrace::warning(call) << "unexpected polymorphic case" << %s << "\n";' % (switchExpr,))
3611+ print(r' break;')
3612+ print(r' }')
3613 else:
3614 self.visit(polymorphic.defaultType, lvalue, rvalue)
3615
3616@@ -250,7 +250,7 @@ class OpaqueValueDeserializer(ValueDeserializer):
3617 in the context of handles.'''
3618
3619 def visitOpaque(self, opaque, lvalue, rvalue):
3620- print ' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, opaque, rvalue)
3621+ print(' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, opaque, rvalue))
3622
3623
3624 class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin):
3625@@ -270,67 +270,67 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin):
3626 pass
3627
3628 def visitArray(self, array, lvalue, rvalue):
3629- print ' const trace::Array *_a%s = (%s).toArray();' % (array.tag, rvalue)
3630- print ' if (_a%s) {' % (array.tag)
3631+ print(' const trace::Array *_a%s = (%s).toArray();' % (array.tag, rvalue))
3632+ print(' if (_a%s) {' % (array.tag))
3633 length = '_a%s->values.size()' % array.tag
3634 index = '_j' + array.tag
3635- print ' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length)
3636+ print(' for (size_t {i} = 0; {i} < {length}; ++{i}) {{'.format(i = index, length = length))
3637 try:
3638 self.visit(array.type, '%s[%s]' % (lvalue, index), '*_a%s->values[%s]' % (array.tag, index))
3639 finally:
3640- print ' }'
3641- print ' }'
3642+ print(' }')
3643+ print(' }')
3644
3645 def visitPointer(self, pointer, lvalue, rvalue):
3646- print ' const trace::Array *_a%s = (%s).toArray();' % (pointer.tag, rvalue)
3647- print ' if (_a%s) {' % (pointer.tag)
3648+ print(' const trace::Array *_a%s = (%s).toArray();' % (pointer.tag, rvalue))
3649+ print(' if (_a%s) {' % (pointer.tag))
3650 try:
3651 self.visit(pointer.type, '%s[0]' % (lvalue,), '*_a%s->values[0]' % (pointer.tag,))
3652 finally:
3653- print ' }'
3654+ print(' }')
3655
3656 def visitIntPointer(self, pointer, lvalue, rvalue):
3657 pass
3658
3659 def visitObjPointer(self, pointer, lvalue, rvalue):
3660- print r' retrace::addObj(call, %s, %s);' % (rvalue, lvalue)
3661+ print(r' retrace::addObj(call, %s, %s);' % (rvalue, lvalue))
3662
3663 def visitLinearPointer(self, pointer, lvalue, rvalue):
3664 assert pointer.size is not None
3665 if pointer.size is not None:
3666- print r' retrace::addRegion(call, (%s).toUIntPtr(), %s, %s);' % (rvalue, lvalue, pointer.size)
3667+ print(r' retrace::addRegion(call, (%s).toUIntPtr(), %s, %s);' % (rvalue, lvalue, pointer.size))
3668
3669 def visitReference(self, reference, lvalue, rvalue):
3670 pass
3671
3672 def visitHandle(self, handle, lvalue, rvalue):
3673- print ' %s _origResult;' % handle.type
3674+ print(' %s _origResult;' % handle.type)
3675 OpaqueValueDeserializer().visit(handle.type, '_origResult', rvalue);
3676 if handle.range is None:
3677 rvalue = "_origResult"
3678 entry = lookupHandle(handle, rvalue, True)
3679 if (entry.startswith('_program_map') or entry.startswith('_shader_map')):
3680- print 'if (glretrace::supportsARBShaderObjects) {'
3681- print ' _handleARB_map[%s] = %s;' % (rvalue, lvalue)
3682- print '} else {'
3683- print ' %s = %s;' % (entry, lvalue)
3684- print '}'
3685+ print('if (glretrace::supportsARBShaderObjects) {')
3686+ print(' _handleARB_map[%s] = %s;' % (rvalue, lvalue))
3687+ print('} else {')
3688+ print(' %s = %s;' % (entry, lvalue))
3689+ print('}')
3690 else:
3691- print " %s = %s;" % (entry, lvalue)
3692- print ' if (retrace::verbosity >= 2) {'
3693- print ' std::cout << "{handle.name} " << {rvalue} << " -> " << {lvalue} << "\\n";'.format(**locals())
3694- print ' }'
3695+ print(" %s = %s;" % (entry, lvalue))
3696+ print(' if (retrace::verbosity >= 2) {')
3697+ print(' std::cout << "{handle.name} " << {rvalue} << " -> " << {lvalue} << "\\n";'.format(**locals()))
3698+ print(' }')
3699 else:
3700 i = '_h' + handle.tag
3701 lvalue = "%s + %s" % (lvalue, i)
3702 rvalue = "_origResult + %s" % (i,)
3703 entry = lookupHandle(handle, rvalue)
3704- print ' for ({handle.type} {i} = 0; {i} < {handle.range}; ++{i}) {{'.format(**locals())
3705- print ' {entry} = {lvalue};'.format(**locals())
3706- print ' if (retrace::verbosity >= 2) {'
3707- print ' std::cout << "{handle.name} " << ({rvalue}) << " -> " << ({lvalue}) << "\\n";'.format(**locals())
3708- print ' }'
3709- print ' }'
3710+ print(' for ({handle.type} {i} = 0; {i} < {handle.range}; ++{i}) {{'.format(**locals()))
3711+ print(' {entry} = {lvalue};'.format(**locals()))
3712+ print(' if (retrace::verbosity >= 2) {')
3713+ print(' std::cout << "{handle.name} " << ({rvalue}) << " -> " << ({lvalue}) << "\\n";'.format(**locals()))
3714+ print(' }')
3715+ print(' }')
3716
3717 def visitBlob(self, blob, lvalue, rvalue):
3718 pass
3719@@ -344,9 +344,9 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin):
3720 tmp = '_s_' + struct.tag + '_' + str(self.seq)
3721 self.seq += 1
3722
3723- print ' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue)
3724- print ' assert(%s);' % (tmp,)
3725- print ' (void)%s;' % (tmp,)
3726+ print(' const trace::Struct *%s = (%s).toStruct();' % (tmp, rvalue))
3727+ print(' assert(%s);' % (tmp,))
3728+ print(' (void)%s;' % (tmp,))
3729 for i in range(len(struct.members)):
3730 member = struct.members[i]
3731 self.visitMember(member, lvalue, '*%s->members[%s]' % (tmp, i))
3732@@ -362,16 +362,16 @@ class SwizzledValueRegistrator(stdapi.Visitor, stdapi.ExpanderMixin):
3733 class Retracer:
3734
3735 def retraceFunction(self, function):
3736- print 'static void retrace_%s(trace::Call &call) {' % function.name
3737+ print('static void retrace_%s(trace::Call &call) {' % function.name)
3738 self.retraceFunctionBody(function)
3739- print '}'
3740- print
3741+ print('}')
3742+ print()
3743
3744 def retraceInterfaceMethod(self, interface, method):
3745- print 'static void retrace_%s__%s(trace::Call &call) {' % (interface.name, method.name)
3746+ print('static void retrace_%s__%s(trace::Call &call) {' % (interface.name, method.name))
3747 self.retraceInterfaceMethodBody(interface, method)
3748- print '}'
3749- print
3750+ print('}')
3751+ print()
3752
3753 def retraceFunctionBody(self, function):
3754 assert function.sideeffects
3755@@ -409,38 +409,38 @@ class Retracer:
3756 assert function.type is not stdapi.Void
3757
3758 if str(function.type) == 'HRESULT':
3759- print r' if (call.ret && FAILED(call.ret->toSInt())) {'
3760- print r' return;'
3761- print r' }'
3762+ print(r' if (call.ret && FAILED(call.ret->toSInt())) {')
3763+ print(r' return;')
3764+ print(r' }')
3765
3766 def deserializeThisPointer(self, interface):
3767- print r' %s *_this;' % (interface.name,)
3768- print r' _this = retrace::asObjPointer<%s>(call, call.arg(0));' % (interface.name,)
3769- print r' if (!_this) {'
3770- print r' return;'
3771- print r' }'
3772+ print(r' %s *_this;' % (interface.name,))
3773+ print(r' _this = retrace::asObjPointer<%s>(call, call.arg(0));' % (interface.name,))
3774+ print(r' if (!_this) {')
3775+ print(r' return;')
3776+ print(r' }')
3777
3778 def deserializeArgs(self, function):
3779- print ' retrace::ScopedAllocator _allocator;'
3780- print ' (void)_allocator;'
3781+ print(' retrace::ScopedAllocator _allocator;')
3782+ print(' (void)_allocator;')
3783 success = True
3784 for arg in function.args:
3785 arg_type = arg.type.mutable()
3786- print ' %s %s;' % (arg_type, arg.name)
3787+ print(' %s %s;' % (arg_type, arg.name))
3788 rvalue = 'call.arg(%u)' % (arg.index,)
3789 lvalue = arg.name
3790 try:
3791 self.extractArg(function, arg, arg_type, lvalue, rvalue)
3792 except UnsupportedType:
3793 success = False
3794- print ' memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name)
3795- print
3796+ print(' memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name))
3797+ print()
3798
3799 if not success:
3800- print ' if (1) {'
3801+ print(' if (1) {')
3802 self.failFunction(function)
3803 sys.stderr.write('warning: unsupported %s call\n' % function.name)
3804- print ' }'
3805+ print(' }')
3806
3807 def swizzleValues(self, function):
3808 for arg in function.args:
3809@@ -451,7 +451,7 @@ class Retracer:
3810 try:
3811 self.regiterSwizzledValue(arg_type, lvalue, rvalue)
3812 except UnsupportedType:
3813- print ' // XXX: %s' % arg.name
3814+ print(' // XXX: %s' % arg.name)
3815 if function.type is not stdapi.Void:
3816 rvalue = '*call.ret'
3817 lvalue = '_result'
3818@@ -459,15 +459,15 @@ class Retracer:
3819 self.regiterSwizzledValue(function.type, lvalue, rvalue)
3820 except UnsupportedType:
3821 raise
3822- print ' // XXX: result'
3823+ print(' // XXX: result')
3824
3825 def failFunction(self, function):
3826- print ' if (retrace::verbosity >= 0) {'
3827- print ' retrace::unsupported(call);'
3828- print ' }'
3829+ print(' if (retrace::verbosity >= 0) {')
3830+ print(' retrace::unsupported(call);')
3831+ print(' }')
3832 # MGS-469: GPU hangs when retracing OGLESParticles on mx6sx
3833 # Workaround: do not `return`
3834- #print ' return;'
3835+ #print(' return;')
3836
3837 def extractArg(self, function, arg, arg_type, lvalue, rvalue):
3838 ValueAllocator().visit(arg_type, lvalue, rvalue)
3839@@ -487,22 +487,22 @@ class Retracer:
3840
3841 def declareRet(self, function):
3842 if function.type is not stdapi.Void:
3843- print ' %s _result;' % (function.type)
3844+ print(' %s _result;' % (function.type))
3845
3846 def invokeFunction(self, function):
3847 arg_names = ", ".join(function.argNames())
3848 if function.type is not stdapi.Void:
3849- print ' _result = %s(%s);' % (function.name, arg_names)
3850+ print(' _result = %s(%s);' % (function.name, arg_names))
3851 self.checkResult(None, function)
3852 else:
3853- print ' %s(%s);' % (function.name, arg_names)
3854+ print(' %s(%s);' % (function.name, arg_names))
3855
3856 def invokeInterfaceMethod(self, interface, method):
3857 arg_names = ", ".join(method.argNames())
3858 if method.type is not stdapi.Void:
3859- print ' _result = _this->%s(%s);' % (method.name, arg_names)
3860+ print(' _result = _this->%s(%s);' % (method.name, arg_names))
3861 else:
3862- print ' _this->%s(%s);' % (method.name, arg_names)
3863+ print(' _this->%s(%s);' % (method.name, arg_names))
3864
3865 # Adjust reference count when QueryInterface fails. This is
3866 # particularly useful when replaying traces on older Direct3D runtimes
3867@@ -511,12 +511,12 @@ class Retracer:
3868 #
3869 # TODO: Generalize to other methods that return interfaces
3870 if method.name == 'QueryInterface':
3871- print r' if (FAILED(_result)) {'
3872- print r' IUnknown *pObj = retrace::asObjPointer<IUnknown>(call, *call.arg(2).toArray()->values[0]);'
3873- print r' if (pObj) {'
3874- print r' pObj->AddRef();'
3875- print r' }'
3876- print r' }'
3877+ print(r' if (FAILED(_result)) {')
3878+ print(r' IUnknown *pObj = retrace::asObjPointer<IUnknown>(call, *call.arg(2).toArray()->values[0]);')
3879+ print(r' if (pObj) {')
3880+ print(r' pObj->AddRef();')
3881+ print(r' }')
3882+ print(r' }')
3883
3884 if method.type is not stdapi.Void:
3885 self.checkResult(interface, method)
3886@@ -524,28 +524,28 @@ class Retracer:
3887 # Debug COM reference counting. Disabled by default as reported
3888 # reference counts depend on internal implementation details.
3889 if method.name in ('AddRef', 'Release'):
3890- print r' if (0) retrace::checkMismatch(call, "cRef", call.ret, _result);'
3891+ print(r' if (0) retrace::checkMismatch(call, "cRef", call.ret, _result);')
3892
3893 # On release our reference when we reach Release() == 0 call in the
3894 # trace.
3895 if method.name == 'Release':
3896- print r' ULONG _orig_result = call.ret->toUInt();'
3897- print r' if (_orig_result == 0 || _result == 0) {'
3898- print r' if (_orig_result != 0) {'
3899- print r' retrace::warning(call) << "unexpected object destruction\n";'
3900- print r' }'
3901- print r' retrace::delObj(call.arg(0));'
3902- print r' }'
3903+ print(r' ULONG _orig_result = call.ret->toUInt();')
3904+ print(r' if (_orig_result == 0 || _result == 0) {')
3905+ print(r' if (_orig_result != 0) {')
3906+ print(r' retrace::warning(call) << "unexpected object destruction\n";')
3907+ print(r' }')
3908+ print(r' retrace::delObj(call.arg(0));')
3909+ print(r' }')
3910
3911 def checkResult(self, interface, methodOrFunction):
3912 assert methodOrFunction.type is not stdapi.Void
3913 if str(methodOrFunction.type) == 'HRESULT':
3914- print r' if (FAILED(_result)) {'
3915- print r' retrace::failed(call, _result);'
3916- print r' return;'
3917- print r' }'
3918+ print(r' if (FAILED(_result)) {')
3919+ print(r' retrace::failed(call, _result);')
3920+ print(r' return;')
3921+ print(r' }')
3922 else:
3923- print r' (void)_result;'
3924+ print(r' (void)_result;')
3925
3926 def checkPitchMismatch(self, method):
3927 # Warn for mismatches in 2D/3D mappings.
3928@@ -554,19 +554,19 @@ class Retracer:
3929 if outArg.output \
3930 and isinstance(outArg.type, stdapi.Pointer) \
3931 and isinstance(outArg.type.type, stdapi.Struct):
3932- print r' const trace::Array *_%s = call.arg(%u).toArray();' % (outArg.name, outArg.index)
3933- print r' if (%s) {' % outArg.name
3934- print r' const trace::Struct *_struct = _%s->values[0]->toStruct();' % (outArg.name)
3935- print r' if (_struct) {'
3936+ print(r' const trace::Array *_%s = call.arg(%u).toArray();' % (outArg.name, outArg.index))
3937+ print(r' if (%s) {' % outArg.name)
3938+ print(r' const trace::Struct *_struct = _%s->values[0]->toStruct();' % (outArg.name))
3939+ print(r' if (_struct) {')
3940 struct = outArg.type.type
3941 for memberIndex in range(len(struct.members)):
3942 memberType, memberName = struct.members[memberIndex]
3943 if memberName.endswith('Pitch'):
3944- print r' if (%s->%s) {' % (outArg.name, memberName)
3945- print r' retrace::checkMismatch(call, "%s", _struct->members[%u], %s->%s);' % (memberName, memberIndex, outArg.name, memberName)
3946- print r' }'
3947- print r' }'
3948- print r' }'
3949+ print(r' if (%s->%s) {' % (outArg.name, memberName))
3950+ print(r' retrace::checkMismatch(call, "%s", _struct->members[%u], %s->%s);' % (memberName, memberIndex, outArg.name, memberName))
3951+ print(r' }')
3952+ print(r' }')
3953+ print(r' }')
3954
3955 def filterFunction(self, function):
3956 return True
3957@@ -575,11 +575,11 @@ class Retracer:
3958
3959 def retraceApi(self, api):
3960
3961- print '#include "os_time.hpp"'
3962- print '#include "trace_parser.hpp"'
3963- print '#include "retrace.hpp"'
3964- print '#include "retrace_swizzle.hpp"'
3965- print
3966+ print('#include "os_time.hpp"')
3967+ print('#include "trace_parser.hpp"')
3968+ print('#include "retrace.hpp"')
3969+ print('#include "retrace_swizzle.hpp"')
3970+ print()
3971
3972 types = api.getAllTypes()
3973 handles = [type for type in types if isinstance(type, stdapi.Handle)]
3974@@ -587,14 +587,14 @@ class Retracer:
3975 for handle in handles:
3976 if handle.name not in handle_names:
3977 if handle.key is None:
3978- print 'static retrace::map<%s> _%s_map;' % (handle.type, handle.name)
3979+ print('static retrace::map<%s> _%s_map;' % (handle.type, handle.name))
3980 else:
3981 key_name, key_type = handle.key
3982- print 'static std::map<%s, retrace::map<%s> > _%s_map;' % (key_type, handle.type, handle.name)
3983+ print('static std::map<%s, retrace::map<%s> > _%s_map;' % (key_type, handle.type, handle.name))
3984 handle_names.add(handle.name)
3985- print
3986+ print()
3987
3988- functions = filter(self.filterFunction, api.getAllFunctions())
3989+ functions = list(filter(self.filterFunction, api.getAllFunctions()))
3990 for function in functions:
3991 if function.sideeffects and not function.internal:
3992 self.retraceFunction(function)
3993@@ -604,20 +604,20 @@ class Retracer:
3994 if method.sideeffects and not method.internal:
3995 self.retraceInterfaceMethod(interface, method)
3996
3997- print 'const retrace::Entry %s[] = {' % self.table_name
3998+ print('const retrace::Entry %s[] = {' % self.table_name)
3999 for function in functions:
4000 if not function.internal:
4001 if function.sideeffects:
4002- print ' {"%s", &retrace_%s},' % (function.name, function.name)
4003+ print(' {"%s", &retrace_%s},' % (function.name, function.name))
4004 else:
4005- print ' {"%s", &retrace::ignore},' % (function.name,)
4006+ print(' {"%s", &retrace::ignore},' % (function.name,))
4007 for interface in interfaces:
4008 for base, method in interface.iterBaseMethods():
4009 if method.sideeffects:
4010- print ' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, base.name, method.name)
4011+ print(' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, base.name, method.name))
4012 else:
4013- print ' {"%s::%s", &retrace::ignore},' % (interface.name, method.name)
4014- print ' {NULL, NULL}'
4015- print '};'
4016- print
4017+ print(' {"%s::%s", &retrace::ignore},' % (interface.name, method.name))
4018+ print(' {NULL, NULL}')
4019+ print('};')
4020+ print()
4021
4022diff --git a/scripts/convert.py b/scripts/convert.py
4023index 5f338d80..83df70ce 100755
4024--- a/scripts/convert.py
4025+++ b/scripts/convert.py
4026@@ -100,9 +100,9 @@ def detectApiFromCsv(inCsv):
4027 import csv
4028 csvReader = csv.reader(open(inCsv, 'rt'), )
4029 for row in csvReader:
4030- print row
4031+ print(row)
4032 event = row[2]
4033- print event
4034+ print(event)
4035 if event.startswith("Direct3DCreate9"):
4036 return "d3d9"
4037 if event.startswith("CreateDXGIFactory"):
4038diff --git a/scripts/jsondiff.py b/scripts/jsondiff.py
4039index 3b1f9110..25c4840e 100755
4040--- a/scripts/jsondiff.py
4041+++ b/scripts/jsondiff.py
4042@@ -36,7 +36,7 @@ import sys
4043 def strip_object_hook(obj):
4044 if '__class__' in obj:
4045 return None
4046- for name in obj.keys():
4047+ for name in list(obj.keys()):
4048 if name.startswith('__') and name.endswith('__'):
4049 del obj[name]
4050 return obj
4051@@ -80,7 +80,7 @@ class Dumper(Visitor):
4052 def visitObject(self, node):
4053 self.enter_object()
4054
4055- members = node.keys()
4056+ members = list(node.keys())
4057 members.sort()
4058 for i in range(len(members)):
4059 name = members[i]
4060@@ -148,8 +148,8 @@ class Comparer(Visitor):
4061 return False
4062 if len(a) != len(b) and not self.ignore_added:
4063 return False
4064- ak = a.keys()
4065- bk = b.keys()
4066+ ak = list(a.keys())
4067+ bk = list(b.keys())
4068 ak.sort()
4069 bk.sort()
4070 if ak != bk and not self.ignore_added:
4071@@ -175,8 +175,8 @@ class Comparer(Visitor):
4072 return True
4073
4074 def visitValue(self, a, b):
4075- if isinstance(a, float) and isinstance(b, (int, long, float)) or \
4076- isinstance(b, float) and isinstance(a, (int, long, float)):
4077+ if isinstance(a, float) and isinstance(b, (int, float)) or \
4078+ isinstance(b, float) and isinstance(a, (int, float)):
4079 if a is b:
4080 # NaNs take this path
4081 return True
4082@@ -208,7 +208,7 @@ class Differ(Visitor):
4083 self.dumper.enter_object()
4084 names = set(a.keys())
4085 if not self.comparer.ignore_added:
4086- names.update(b.keys())
4087+ names.update(list(b.keys()))
4088 names = list(names)
4089 names.sort()
4090
4091@@ -284,7 +284,7 @@ class Differ(Visitor):
4092 self.dumper.visit(b)
4093
4094 def isMultilineString(self, value):
4095- return isinstance(value, basestring) and '\n' in value
4096+ return isinstance(value, str) and '\n' in value
4097
4098
4099 #
4100diff --git a/scripts/jsonextractimages.py b/scripts/jsonextractimages.py
4101index ea1c927d..917ee7e4 100755
4102--- a/scripts/jsonextractimages.py
4103+++ b/scripts/jsonextractimages.py
4104@@ -38,7 +38,7 @@ pngSignature = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"
4105
4106
4107 def dumpSurfaces(state, memberName):
4108- for name, imageObj in state[memberName].iteritems():
4109+ for name, imageObj in state[memberName].items():
4110 data = imageObj['__data__']
4111 data = base64.b64decode(data)
4112
4113diff --git a/scripts/leaks.py b/scripts/leaks.py
4114new file mode 100755
4115index 00000000..325af1e2
4116--- /dev/null
4117+++ b/scripts/leaks.py
4118@@ -0,0 +1,163 @@
4119+#!/usr/bin/env python
4120+##########################################################################
4121+#
4122+# Copyright 2014-2016 VMware, Inc.
4123+# All Rights Reserved.
4124+#
4125+# Permission is hereby granted, free of charge, to any person obtaining a copy
4126+# of this software and associated documentation files (the "Software"), to deal
4127+# in the Software without restriction, including without limitation the rights
4128+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
4129+# copies of the Software, and to permit persons to whom the Software is
4130+# furnished to do so, subject to the following conditions:
4131+#
4132+# The above copyright notice and this permission notice shall be included in
4133+# all copies or substantial portions of the Software.
4134+#
4135+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4136+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4137+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4138+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4139+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
4140+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
4141+# THE SOFTWARE.
4142+#
4143+##########################################################################/
4144+
4145+
4146+import subprocess
4147+import sys
4148+import os.path
4149+import optparse
4150+import re
4151+
4152+import unpickle
4153+
4154+
4155+class LeakDetector(unpickle.Unpickler):
4156+
4157+ def __init__(self, apitrace, trace):
4158+
4159+ cmd = [apitrace, 'pickle', '--symbolic', trace]
4160+ p = subprocess.Popen(args = cmd, stdout = subprocess.PIPE)
4161+
4162+ unpickle.Unpickler.__init__(self, p.stdout)
4163+
4164+ self.numContexts = 0
4165+
4166+ # a map of maps
4167+ self.objectDicts = {}
4168+
4169+ def parse(self):
4170+ unpickle.Unpickler.parse(self)
4171+
4172+ # Reached the end of the trace -- dump any live objects
4173+ self.dumpLeaks("<EOF>")
4174+
4175+ genDelRegExp = re.compile('^gl(Gen|Delete)(Buffers|Textures|FrameBuffers|RenderBuffers)[A-Z]*$')
4176+
4177+ def handleCall(self, call):
4178+ # Ignore calls without side effects
4179+ if call.flags & unpickle.CALL_FLAG_NO_SIDE_EFFECTS:
4180+ return
4181+
4182+ # Dump call for debugging:
4183+ if 0:
4184+ sys.stderr.write('%s\n' % call)
4185+
4186+ mo = self.genDelRegExp.match(call.functionName)
4187+ if mo:
4188+ verb = mo.group(1)
4189+ subject = mo.group(2)
4190+
4191+ subject = subject.lower().rstrip('s')
4192+ objectDict = self.objectDicts.setdefault(subject, {})
4193+
4194+ if verb == 'Gen':
4195+ self.handleGenerate(call, objectDict)
4196+ elif verb == 'Delete':
4197+ self.handleDelete(call, objectDict)
4198+ else:
4199+ assert 0
4200+
4201+ # TODO: Track labels via glObjectLabel* calls
4202+
4203+ if call.functionName in [
4204+ 'CGLCreateContext',
4205+ 'eglCreateContext',
4206+ 'glXCreateContext',
4207+ 'glXCreateNewContext',
4208+ 'glXCreateContextAttribsARB',
4209+ 'glXCreateContextWithConfigSGIX',
4210+ 'wglCreateContext',
4211+ 'wglCreateContextAttribsARB',
4212+ ]:
4213+ # FIXME: Ignore failing context creation calls
4214+ self.numContexts += 1
4215+
4216+ if call.functionName in [
4217+ 'CGLDestroyContext',
4218+ 'glXDestroyContext',
4219+ 'eglDestroyContext',
4220+ 'wglDeleteContext',
4221+ ]:
4222+ assert self.numContexts > 0
4223+ self.numContexts -= 1
4224+ if self.numContexts == 0:
4225+ self.dumpLeaks(call.no)
4226+
4227+ def handleGenerate(self, call, objectDict):
4228+ n, names = call.argValues()
4229+ for i in range(n):
4230+ name = names[i]
4231+ objectDict[name] = call.no
4232+ # TODO: Keep track of call stack backtrace too
4233+
4234+ def handleDelete(self, call, objectDict):
4235+ n, names = call.argValues()
4236+ for i in range(n):
4237+ name = names[i]
4238+ try:
4239+ del objectDict[name]
4240+ except KeyError:
4241+ # Ignore if texture name was never generated
4242+ pass
4243+
4244+ def dumpLeaks(self, currentCallNo):
4245+ for kind, objectDict in self.objectDicts.items():
4246+ self.dumpNamespaceLeaks(currentCallNo, objectDict, kind)
4247+
4248+ def dumpNamespaceLeaks(self, currentCallNo, objectDict, kind):
4249+ for name, creationCallNo in (sorted(iter(objectDict.items()),key=lambda t: t[1])):
4250+ sys.stderr.write('%u: error: %s %u was not destroyed until %s\n' % (creationCallNo, kind, name, currentCallNo))
4251+ objectDict.clear()
4252+
4253+
4254+def main():
4255+ '''Main program.
4256+ '''
4257+
4258+ # Parse command line options
4259+ optparser = optparse.OptionParser(
4260+ usage='\n\t%prog [options] TRACE',
4261+ version='%%prog')
4262+ optparser.add_option(
4263+ '-a', '--apitrace', metavar='PROGRAM',
4264+ type='string', dest='apitrace', default='apitrace',
4265+ help='apitrace command [default: %default]')
4266+
4267+ options, args = optparser.parse_args(sys.argv[1:])
4268+ if len(args) != 1:
4269+ optparser.error("incorrect number of arguments")
4270+
4271+ inTrace = args[0]
4272+ if not os.path.isfile(inTrace):
4273+ sys.stderr.write("error: `%s` does not exist\n" % inTrace)
4274+ sys.exit(1)
4275+
4276+ detector = LeakDetector(options.apitrace, inTrace)
4277+ detector.parse()
4278+
4279+
4280+if __name__ == '__main__':
4281+ main()
4282diff --git a/scripts/profileshader.py b/scripts/profileshader.py
4283index 3c490a0e..5c2a58fb 100755
4284--- a/scripts/profileshader.py
4285+++ b/scripts/profileshader.py
4286@@ -58,13 +58,13 @@ def process(stream, groupField):
4287 continue
4288
4289 if fields[callCol] == 'call':
4290- callId = long(fields[callIdCol])
4291- duration = long(fields[gpuDuraCol])
4292+ callId = int(fields[callIdCol])
4293+ duration = int(fields[gpuDuraCol])
4294 group = fields[groupCol]
4295
4296 maxGroupLen = max(maxGroupLen, len(group))
4297
4298- if times.has_key(group):
4299+ if group in times:
4300 times[group]['draws'] += 1
4301 times[group]['duration'] += duration
4302
4303@@ -74,7 +74,7 @@ def process(stream, groupField):
4304 else:
4305 times[group] = {'draws': 1, 'duration': duration, 'longest': callId, 'longestDuration': duration}
4306
4307- times = sorted(times.items(), key=lambda x: x[1]['duration'], reverse=True)
4308+ times = sorted(list(times.items()), key=lambda x: x[1]['duration'], reverse=True)
4309
4310 if groupField == 'program':
4311 groupTitle = 'Shader[id]'
4312@@ -84,9 +84,9 @@ def process(stream, groupField):
4313 groupTitle = groupField.center(maxGroupLen)
4314 groupLine = '-' * maxGroupLen
4315
4316- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine
4317- print '| %s | Draws [#] | Duration [ns] v | Per Call[ns] | Longest[id] |' % groupTitle
4318- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine
4319+ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine)
4320+ print('| %s | Draws [#] | Duration [ns] v | Per Call[ns] | Longest[id] |' % groupTitle)
4321+ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine)
4322
4323 for group in times:
4324 id = str(group[0]).rjust(maxGroupLen)
4325@@ -94,9 +94,9 @@ def process(stream, groupField):
4326 dura = str(group[1]['duration']).rjust(18)
4327 perCall = str(group[1]['duration'] / group[1]['draws']).rjust(12)
4328 longest = str(group[1]['longest']).rjust(11)
4329- print "| %s | %s | %s | %s | %s |" % (id, draw, dura, perCall, longest)
4330+ print("| %s | %s | %s | %s | %s |" % (id, draw, dura, perCall, longest))
4331
4332- print '+-%s-+--------------+--------------------+--------------+-------------+' % groupLine
4333+ print('+-%s-+--------------+--------------------+--------------+-------------+' % groupLine)
4334
4335
4336 def main():
4337diff --git a/scripts/retracediff.py b/scripts/retracediff.py
4338index bb5aa7f5..8105f536 100755
4339--- a/scripts/retracediff.py
4340+++ b/scripts/retracediff.py
4341@@ -83,12 +83,12 @@ class Retracer:
4342 self.retraceExe,
4343 ] + args + self.args
4344 if self.env:
4345- for name, value in self.env.iteritems():
4346+ for name, value in self.env.items():
4347 sys.stderr.write('%s=%s ' % (name, value))
4348 sys.stderr.write(' '.join(cmd) + '\n')
4349 try:
4350 return subprocess.Popen(cmd, env=self.env, stdout=stdout, stderr=NULL)
4351- except OSError, ex:
4352+ except OSError as ex:
4353 sys.stderr.write('error: failed to execute %s: %s\n' % (cmd[0], ex.strerror))
4354 sys.exit(1)
4355
4356@@ -160,7 +160,7 @@ def read_pnm(stream):
4357 while line.startswith('#'):
4358 comment += line[1:]
4359 line = stream.readline()
4360- width, height = map(int, line.strip().split())
4361+ width, height = list(map(int, line.strip().split()))
4362 maximum = int(stream.readline().strip())
4363 if bytesPerChannel == 1:
4364 assert maximum == 255
4365diff --git a/scripts/snapdiff.py b/scripts/snapdiff.py
4366index 59ec870e..b0d5f757 100755
4367--- a/scripts/snapdiff.py
4368+++ b/scripts/snapdiff.py
4369@@ -40,6 +40,7 @@ from PIL import Image
4370 from PIL import ImageChops
4371 from PIL import ImageEnhance
4372 from PIL import ImageFilter
4373+from functools import reduce
4374
4375
4376 thumbSize = 320
4377@@ -50,12 +51,12 @@ class Comparer:
4378 '''Image comparer.'''
4379
4380 def __init__(self, ref_image, src_image, alpha = False):
4381- if isinstance(ref_image, basestring):
4382+ if isinstance(ref_image, str):
4383 self.ref_im = Image.open(ref_image)
4384 else:
4385 self.ref_im = ref_image
4386
4387- if isinstance(src_image, basestring):
4388+ if isinstance(src_image, str):
4389 self.src_im = Image.open(src_image)
4390 else:
4391 self.src_im = src_image
4392@@ -106,7 +107,7 @@ class Comparer:
4393 # Compute absolute error
4394
4395 if self.size_mismatch():
4396- return sys.maxint
4397+ return sys.maxsize
4398
4399 # TODO: this is approximate due to the grayscale conversion
4400 h = self.diff.convert('L').histogram()
4401diff --git a/scripts/tracediff.py b/scripts/tracediff.py
4402index f111322a..0cd9c8c6 100755
4403--- a/scripts/tracediff.py
4404+++ b/scripts/tracediff.py
4405@@ -237,7 +237,7 @@ class BlobReplacer(Rebuilder):
4406 return Blob(len(obj), hash(str(obj)))
4407
4408 def visitCall(self, call):
4409- call.args = map(self.visit, call.args)
4410+ call.args = list(map(self.visit, call.args))
4411 call.ret = self.visit(call.ret)
4412
4413
4414@@ -312,7 +312,7 @@ class PythonDiffer(Differ):
4415 elif tag == 'equal':
4416 self.equal(alo, ahi, blo, bhi)
4417 else:
4418- raise ValueError, 'unknown tag %s' % (tag,)
4419+ raise ValueError('unknown tag %s' % (tag,))
4420
4421 def isjunk(self, call):
4422 return call.functionName == 'glGetError' and call.ret in ('GL_NO_ERROR', 0)
4423@@ -338,12 +338,12 @@ class PythonDiffer(Differ):
4424 elif tag == 'equal':
4425 self.replace_similar(_alo, _ahi, _blo, _bhi)
4426 else:
4427- raise ValueError, 'unknown tag %s' % (tag,)
4428+ raise ValueError('unknown tag %s' % (tag,))
4429
4430 def replace_similar(self, alo, ahi, blo, bhi):
4431 assert alo < ahi and blo < bhi
4432 assert ahi - alo == bhi - blo
4433- for i in xrange(0, bhi - blo):
4434+ for i in range(0, bhi - blo):
4435 self.highlighter.write('| ')
4436 a_call = self.a[alo + i]
4437 b_call = self.b[blo + i]
4438@@ -355,7 +355,7 @@ class PythonDiffer(Differ):
4439 self.highlighter.write('(')
4440 sep = ''
4441 numArgs = max(len(a_call.args), len(b_call.args))
4442- for j in xrange(numArgs):
4443+ for j in range(numArgs):
4444 self.highlighter.write(sep)
4445 try:
4446 a_argName, a_argVal = a_call.args[j]
4447@@ -402,7 +402,7 @@ class PythonDiffer(Differ):
4448 def delete(self, alo, ahi, blo, bhi):
4449 assert alo < ahi
4450 assert blo == bhi
4451- for i in xrange(alo, ahi):
4452+ for i in range(alo, ahi):
4453 call = self.a[i]
4454 self.highlighter.write('- ')
4455 self.dumpCallNos(call.no, None)
4456@@ -413,7 +413,7 @@ class PythonDiffer(Differ):
4457 def insert(self, alo, ahi, blo, bhi):
4458 assert alo == ahi
4459 assert blo < bhi
4460- for i in xrange(blo, bhi):
4461+ for i in range(blo, bhi):
4462 call = self.b[i]
4463 self.highlighter.write('+ ')
4464 self.dumpCallNos(None, call.no)
4465@@ -425,7 +425,7 @@ class PythonDiffer(Differ):
4466 return
4467 assert alo < ahi and blo < bhi
4468 assert ahi - alo == bhi - blo
4469- for i in xrange(0, bhi - blo):
4470+ for i in range(0, bhi - blo):
4471 self.highlighter.write(' ')
4472 a_call = self.a[alo + i]
4473 b_call = self.b[blo + i]
4474diff --git a/scripts/unpickle.py b/scripts/unpickle.py
4475index 334c1a01..86891d29 100755
4476--- a/scripts/unpickle.py
4477+++ b/scripts/unpickle.py
4478@@ -38,7 +38,7 @@ import optparse
4479 import sys
4480 import time
4481 import re
4482-import cPickle as pickle
4483+import pickle as pickle
4484
4485
4486 # Same as trace_model.hpp's call flags
4487@@ -58,7 +58,7 @@ CALL_FLAG_MARKER_POP = (1 << 10)
4488 class Pointer(long):
4489
4490 def __str__(self):
4491- if self == 0L:
4492+ if self == 0:
4493 return 'NULL'
4494 else:
4495 return hex(self).rstrip('L')
4496@@ -73,7 +73,7 @@ class Visitor:
4497 self.dispatch[type(None)] = self.visitNone
4498 self.dispatch[bool] = self.visitBool
4499 self.dispatch[int] = self.visitInt
4500- self.dispatch[long] = self.visitInt
4501+ self.dispatch[int] = self.visitInt
4502 self.dispatch[float] = self.visitFloat
4503 self.dispatch[str] = self.visitStr
4504 self.dispatch[tuple] = self.visitTuple
4505@@ -140,18 +140,18 @@ class Dumper(Visitor):
4506 return repr(obj)
4507
4508 def visitTuple(self, obj):
4509- return '(' + ', '.join(itertools.imap(self.visit, obj)) + ')'
4510+ return '(' + ', '.join(map(self.visit, obj)) + ')'
4511
4512 def visitList(self, obj):
4513 if len(obj) == 1:
4514 return '&' + self.visit(obj[0])
4515- return '{' + ', '.join(itertools.imap(self.visit, obj)) + '}'
4516+ return '{' + ', '.join(map(self.visit, obj)) + '}'
4517
4518 def visitItems(self, items):
4519 return ', '.join(['%s = %s' % (name, self.visit(value)) for name, value in items])
4520
4521 def visitDict(self, obj):
4522- return '{' + self.visitItems(obj.iteritems()) + '}'
4523+ return '{' + self.visitItems(iter(obj.items())) + '}'
4524
4525 def visitByteArray(self, obj):
4526 return 'blob(%u)' % len(obj)
4527@@ -167,7 +167,7 @@ class Hasher(Visitor):
4528 return obj
4529
4530 def visitIterable(self, obj):
4531- return tuple(itertools.imap(self.visit, obj))
4532+ return tuple(map(self.visit, obj))
4533
4534 def visitByteArray(self, obj):
4535 return str(obj)
4536@@ -268,7 +268,7 @@ class Counter(Unpickler):
4537 def parse(self):
4538 Unpickler.parse(self)
4539
4540- functionFrequencies = self.functionFrequencies.items()
4541+ functionFrequencies = list(self.functionFrequencies.items())
4542 functionFrequencies.sort(lambda (name1, freq1), (name2, freq2): cmp(freq1, freq2))
4543 for name, frequency in functionFrequencies:
4544 sys.stdout.write('%8u %s\n' % (frequency, name))
4545diff --git a/specs/cglapi.py b/specs/cglapi.py
4546index 69faeeb4..5d61886f 100644
4547--- a/specs/cglapi.py
4548+++ b/specs/cglapi.py
4549@@ -29,9 +29,9 @@ http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/
4550 """
4551
4552
4553-from stdapi import *
4554-from glapi import *
4555-from glapi import glapi
4556+from .stdapi import *
4557+from .glapi import *
4558+from .glapi import glapi
4559
4560 IOSurfaceRef = Opaque("IOSurfaceRef")
4561 CGLContextObj = Opaque("CGLContextObj")
4562diff --git a/specs/d2d1.py b/specs/d2d1.py
4563index dacbea69..9bae43c5 100644
4564--- a/specs/d2d1.py
4565+++ b/specs/d2d1.py
4566@@ -25,9 +25,9 @@
4567 ##########################################################################/
4568
4569
4570-from winapi import *
4571-from dxgi import DXGI_FORMAT, IDXGISurface
4572-from dwrite import *
4573+from .winapi import *
4574+from .dxgi import DXGI_FORMAT, IDXGISurface
4575+from .dwrite import *
4576
4577
4578
4579diff --git a/specs/d3d.py b/specs/d3d.py
4580index 0dde09f4..4b7244b2 100644
4581--- a/specs/d3d.py
4582+++ b/specs/d3d.py
4583@@ -25,10 +25,10 @@
4584
4585 """d3d.h"""
4586
4587-from winapi import *
4588-from ddraw import *
4589-from d3dtypes import *
4590-from d3dcaps import *
4591+from .winapi import *
4592+from .ddraw import *
4593+from .d3dtypes import *
4594+from .d3dcaps import *
4595
4596 d3dnextFlags = Flags(DWORD, [
4597 "D3DNEXT_NEXT",
4598diff --git a/specs/d3d10.py b/specs/d3d10.py
4599index 2161a5fd..e22bc230 100644
4600--- a/specs/d3d10.py
4601+++ b/specs/d3d10.py
4602@@ -24,8 +24,8 @@
4603 ##########################################################################/
4604
4605
4606-from dxgi import *
4607-from d3d10sdklayers import *
4608+from .dxgi import *
4609+from .d3d10sdklayers import *
4610
4611
4612 HRESULT = MAKE_HRESULT([
4613diff --git a/specs/d3d10sdklayers.py b/specs/d3d10sdklayers.py
4614index aad53f04..82beb721 100644
4615--- a/specs/d3d10sdklayers.py
4616+++ b/specs/d3d10sdklayers.py
4617@@ -24,7 +24,7 @@
4618 ##########################################################################/
4619
4620
4621-from dxgi import *
4622+from .dxgi import *
4623
4624
4625 D3D10_DEBUG_FEATURE = Flags(UINT, [
4626diff --git a/specs/d3d11.py b/specs/d3d11.py
4627index f704b062..0a28caa3 100644
4628--- a/specs/d3d11.py
4629+++ b/specs/d3d11.py
4630@@ -24,8 +24,8 @@
4631 ##########################################################################/
4632
4633
4634-from dxgi import *
4635-from d3d11sdklayers import *
4636+from .dxgi import *
4637+from .d3d11sdklayers import *
4638
4639
4640 HRESULT = MAKE_HRESULT([
4641diff --git a/specs/d3d11sdklayers.py b/specs/d3d11sdklayers.py
4642index 907c4b09..97d07750 100644
4643--- a/specs/d3d11sdklayers.py
4644+++ b/specs/d3d11sdklayers.py
4645@@ -24,7 +24,7 @@
4646 ##########################################################################/
4647
4648
4649-from dxgi import *
4650+from .dxgi import *
4651
4652
4653 ID3D11DeviceChild = Interface("ID3D11DeviceChild", IUnknown)
4654diff --git a/specs/d3d8.py b/specs/d3d8.py
4655index 2dbf1140..400af498 100644
4656--- a/specs/d3d8.py
4657+++ b/specs/d3d8.py
4658@@ -25,9 +25,9 @@
4659
4660 """d3d8.h"""
4661
4662-from winapi import *
4663-from d3d8types import *
4664-from d3d8caps import *
4665+from .winapi import *
4666+from .d3d8types import *
4667+from .d3d8caps import *
4668
4669
4670 D3DSHADER8 = Blob(Const(DWORD), "_shaderSize(pFunction)")
4671diff --git a/specs/d3d8caps.py b/specs/d3d8caps.py
4672index 1af1a19f..b7ee5873 100644
4673--- a/specs/d3d8caps.py
4674+++ b/specs/d3d8caps.py
4675@@ -25,8 +25,8 @@
4676
4677 """d3d8caps.h"""
4678
4679-from winapi import *
4680-from d3d8types import *
4681+from .winapi import *
4682+from .d3d8types import *
4683
4684 D3DCAPS = Flags(DWORD, [
4685 "D3DCAPS_READ_SCANLINE",
4686diff --git a/specs/d3d8types.py b/specs/d3d8types.py
4687index fe58a0cd..a2482328 100644
4688--- a/specs/d3d8types.py
4689+++ b/specs/d3d8types.py
4690@@ -25,7 +25,7 @@
4691
4692 """d3d8types.h"""
4693
4694-from winapi import *
4695+from .winapi import *
4696
4697 D3DCOLOR = Alias("D3DCOLOR", DWORD)
4698
4699diff --git a/specs/d3d9.py b/specs/d3d9.py
4700index 21015149..68dcaca2 100644
4701--- a/specs/d3d9.py
4702+++ b/specs/d3d9.py
4703@@ -25,9 +25,9 @@
4704
4705 """d3d9.h"""
4706
4707-from winapi import *
4708-from d3d9types import *
4709-from d3d9caps import *
4710+from .winapi import *
4711+from .d3d9types import *
4712+from .d3d9caps import *
4713
4714
4715 D3DSHADER9 = Blob(Const(DWORD), "_shaderSize(pFunction)")
4716diff --git a/specs/d3d9caps.py b/specs/d3d9caps.py
4717index b3582879..541263b6 100644
4718--- a/specs/d3d9caps.py
4719+++ b/specs/d3d9caps.py
4720@@ -25,8 +25,8 @@
4721
4722 """d3d9caps.h"""
4723
4724-from winapi import *
4725-from d3d9types import *
4726+from .winapi import *
4727+from .d3d9types import *
4728
4729 D3DVS20CAPS = Flags(DWORD, [
4730 "D3DVS20CAPS_PREDICATION",
4731diff --git a/specs/d3d9types.py b/specs/d3d9types.py
4732index 2545a767..c9847030 100644
4733--- a/specs/d3d9types.py
4734+++ b/specs/d3d9types.py
4735@@ -26,7 +26,7 @@
4736
4737 """d3d9types.h"""
4738
4739-from winapi import *
4740+from .winapi import *
4741
4742 D3DCOLOR = Alias("D3DCOLOR", DWORD)
4743
4744diff --git a/specs/d3dcaps.py b/specs/d3dcaps.py
4745index 0fa9f1cc..88725067 100644
4746--- a/specs/d3dcaps.py
4747+++ b/specs/d3dcaps.py
4748@@ -25,8 +25,8 @@
4749
4750 """d3dcaps.h"""
4751
4752-from winapi import *
4753-from d3dtypes import *
4754+from .winapi import *
4755+from .d3dtypes import *
4756
4757 D3DTRANSFORMCAPS = Flags(DWORD, [
4758 "D3DTRANSFORMCAPS_CLIP",
4759diff --git a/specs/d3dtypes.py b/specs/d3dtypes.py
4760index e1507975..ba460022 100644
4761--- a/specs/d3dtypes.py
4762+++ b/specs/d3dtypes.py
4763@@ -25,7 +25,7 @@
4764
4765 """d3dtypes.h"""
4766
4767-from winapi import *
4768+from .winapi import *
4769
4770 D3DVALUE = Float
4771 LPD3DVALUE = Pointer(D3DVALUE)
4772diff --git a/specs/dcommon.py b/specs/dcommon.py
4773index 21659a5e..6324db3a 100644
4774--- a/specs/dcommon.py
4775+++ b/specs/dcommon.py
4776@@ -24,7 +24,7 @@
4777 ##########################################################################/
4778
4779
4780-from winapi import *
4781+from .winapi import *
4782
4783
4784 DWRITE_MEASURING_MODE = Enum("DWRITE_MEASURING_MODE", [
4785diff --git a/specs/dcomp.py b/specs/dcomp.py
4786new file mode 100644
4787index 00000000..b139a89e
4788--- /dev/null
4789+++ b/specs/dcomp.py
4790@@ -0,0 +1,303 @@
4791+##########################################################################
4792+#
4793+# Copyright 2009-2016 VMware, Inc.
4794+# All Rights Reserved.
4795+#
4796+# Permission is hereby granted, free of charge, to any person obtaining a copy
4797+# of this software and associated documentation files (the "Software"), to deal
4798+# in the Software without restriction, including without limitation the rights
4799+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
4800+# copies of the Software, and to permit persons to whom the Software is
4801+# furnished to do so, subject to the following conditions:
4802+#
4803+# The above copyright notice and this permission notice shall be included in
4804+# all copies or substantial portions of the Software.
4805+#
4806+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4807+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4808+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4809+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4810+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
4811+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
4812+# THE SOFTWARE.
4813+#
4814+##########################################################################/
4815+
4816+
4817+from .dxgi import *
4818+from .d2d1 import D2D_MATRIX_3X2_F, D2D_RECT_F
4819+from .d3d9types import D3DMATRIX
4820+from .d2d1 import D2D1_COMPOSITE_MODE
4821+
4822+DCOMPOSITION_BITMAP_INTERPOLATION_MODE = Enum('DCOMPOSITION_BITMAP_INTERPOLATION_MODE', [
4823+ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR',
4824+ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_LINEAR',
4825+ 'DCOMPOSITION_BITMAP_INTERPOLATION_MODE_INHERIT',
4826+])
4827+
4828+DCOMPOSITION_BORDER_MODE = Enum('DCOMPOSITION_BORDER_MODE', [
4829+ 'DCOMPOSITION_BORDER_MODE_SOFT',
4830+ 'DCOMPOSITION_BORDER_MODE_HARD',
4831+ 'DCOMPOSITION_BORDER_MODE_INHERIT',
4832+])
4833+
4834+DCOMPOSITION_COMPOSITE_MODE = Enum('DCOMPOSITION_COMPOSITE_MODE', [
4835+ 'DCOMPOSITION_COMPOSITE_MODE_SOURCE_OVER',
4836+ 'DCOMPOSITION_COMPOSITE_MODE_DESTINATION_INVERT',
4837+ 'DCOMPOSITION_COMPOSITE_MODE_INHERIT',
4838+])
4839+
4840+DCOMPOSITION_FRAME_STATISTICS = Struct('DCOMPOSITION_FRAME_STATISTICS', [
4841+ (LARGE_INTEGER, 'lastFrameTime'),
4842+ (DXGI_RATIONAL, 'currentCompositionRate'),
4843+ (LARGE_INTEGER, 'currentTime'),
4844+ (LARGE_INTEGER, 'timeFrequency'),
4845+ (LARGE_INTEGER, 'nextEstimatedFrameTime'),
4846+])
4847+
4848+COMPOSITIONOBJECT = Flags(DWORD, [
4849+ 'COMPOSITIONOBJECT_ALL_ACCESS', # 0x0003
4850+ 'COMPOSITIONOBJECT_READ', # 0x0001
4851+ 'COMPOSITIONOBJECT_WRITE', # 0x0002
4852+])
4853+
4854+IDCompositionAnimation = Interface('IDCompositionAnimation', IUnknown)
4855+IDCompositionDevice = Interface('IDCompositionDevice', IUnknown)
4856+IDCompositionTarget = Interface('IDCompositionTarget', IUnknown)
4857+IDCompositionVisual = Interface('IDCompositionVisual', IUnknown)
4858+IDCompositionEffect = Interface('IDCompositionEffect', IUnknown)
4859+IDCompositionEffectGroup = Interface('IDCompositionEffectGroup', IDCompositionEffect)
4860+IDCompositionTransform3D = Interface('IDCompositionTransform3D', IDCompositionEffect)
4861+IDCompositionTransform = Interface('IDCompositionTransform', IDCompositionTransform3D)
4862+IDCompositionTranslateTransform = Interface('IDCompositionTranslateTransform', IDCompositionTransform)
4863+IDCompositionTranslateTransform3D = Interface('IDCompositionTranslateTransform3D', IDCompositionTransform3D)
4864+IDCompositionScaleTransform = Interface('IDCompositionScaleTransform', IDCompositionTransform)
4865+IDCompositionScaleTransform3D = Interface('IDCompositionScaleTransform3D', IDCompositionTransform3D)
4866+IDCompositionRotateTransform = Interface('IDCompositionRotateTransform', IDCompositionTransform)
4867+IDCompositionRotateTransform3D = Interface('IDCompositionRotateTransform3D', IDCompositionTransform3D)
4868+IDCompositionSkewTransform = Interface('IDCompositionSkewTransform', IDCompositionTransform)
4869+IDCompositionMatrixTransform = Interface('IDCompositionMatrixTransform', IDCompositionTransform)
4870+IDCompositionMatrixTransform3D = Interface('IDCompositionMatrixTransform3D', IDCompositionTransform3D)
4871+IDCompositionClip = Interface('IDCompositionClip', IUnknown)
4872+IDCompositionRectangleClip = Interface('IDCompositionRectangleClip', IDCompositionClip)
4873+IDCompositionSurface = Interface('IDCompositionSurface', IUnknown)
4874+IDCompositionVirtualSurface = Interface('IDCompositionVirtualSurface', IDCompositionSurface)
4875+
4876+IDCompositionAnimation.methods += [
4877+ StdMethod(HRESULT, 'Reset', []),
4878+ StdMethod(HRESULT, 'SetAbsoluteBeginTime', [(LARGE_INTEGER, 'beginTime')]),
4879+ StdMethod(HRESULT, 'AddCubic', [(Double, 'beginOffset'), (Float, 'constantCoefficient'), (Float, 'linearCoefficient'), (Float, 'quadraticCoefficient'), (Float, 'cubicCoefficient')]),
4880+ StdMethod(HRESULT, 'AddSinusoidal', [(Double, 'beginOffset'), (Float, 'bias'), (Float, 'amplitude'), (Float, 'frequency'), (Float, 'phase')]),
4881+ StdMethod(HRESULT, 'AddRepeat', [(Double, 'beginOffset'), (Double, 'durationToRepeat')]),
4882+ StdMethod(HRESULT, 'End', [(Double, 'endOffset'), (Float, 'endValue')]),
4883+]
4884+
4885+IDCompositionDevice.methods += [
4886+ StdMethod(HRESULT, 'Commit', []),
4887+ StdMethod(HRESULT, 'WaitForCommitCompletion', []),
4888+ StdMethod(HRESULT, 'GetFrameStatistics', [Out(Pointer(DCOMPOSITION_FRAME_STATISTICS), 'statistics')]),
4889+ StdMethod(HRESULT, 'CreateTargetForHwnd', [(HWND, 'hwnd'), (BOOL, 'topmost'), Out(Pointer(ObjPointer(IDCompositionTarget)), 'target')]),
4890+ StdMethod(HRESULT, 'CreateVisual', [Out(Pointer(ObjPointer(IDCompositionVisual)), 'visual')]),
4891+ StdMethod(HRESULT, 'CreateSurface', [(UINT, 'width'), (UINT, 'height'), (DXGI_FORMAT, 'pixelFormat'), (DXGI_ALPHA_MODE, 'alphaMode'), Out(Pointer(ObjPointer(IDCompositionSurface)), 'surface')]),
4892+ StdMethod(HRESULT, 'CreateVirtualSurface', [(UINT, 'initialWidth'), (UINT, 'initialHeight'), (DXGI_FORMAT, 'pixelFormat'), (DXGI_ALPHA_MODE, 'alphaMode'), Out(Pointer(ObjPointer(IDCompositionVirtualSurface)), 'virtualSurface')]),
4893+ StdMethod(HRESULT, 'CreateSurfaceFromHandle', [(HANDLE, 'handle'), Out(Pointer(ObjPointer(IUnknown)), 'surface')]),
4894+ StdMethod(HRESULT, 'CreateSurfaceFromHwnd', [(HWND, 'hwnd'), Out(Pointer(ObjPointer(IUnknown)), 'surface')]),
4895+ StdMethod(HRESULT, 'CreateTranslateTransform', [Out(Pointer(ObjPointer(IDCompositionTranslateTransform)), 'translateTransform')]),
4896+ StdMethod(HRESULT, 'CreateScaleTransform', [Out(Pointer(ObjPointer(IDCompositionScaleTransform)), 'scaleTransform')]),
4897+ StdMethod(HRESULT, 'CreateRotateTransform', [Out(Pointer(ObjPointer(IDCompositionRotateTransform)), 'rotateTransform')]),
4898+ StdMethod(HRESULT, 'CreateSkewTransform', [Out(Pointer(ObjPointer(IDCompositionSkewTransform)), 'skewTransform')]),
4899+ StdMethod(HRESULT, 'CreateMatrixTransform', [Out(Pointer(ObjPointer(IDCompositionMatrixTransform)), 'matrixTransform')]),
4900+ StdMethod(HRESULT, 'CreateTransformGroup', [(Array(ObjPointer(IDCompositionTransform), 'elements'), 'transforms'), (UINT, 'elements'), Out(Pointer(ObjPointer(IDCompositionTransform)), 'transformGroup')]),
4901+ StdMethod(HRESULT, 'CreateTranslateTransform3D', [Out(Pointer(ObjPointer(IDCompositionTranslateTransform3D)), 'translateTransform3D')]),
4902+ StdMethod(HRESULT, 'CreateScaleTransform3D', [Out(Pointer(ObjPointer(IDCompositionScaleTransform3D)), 'scaleTransform3D')]),
4903+ StdMethod(HRESULT, 'CreateRotateTransform3D', [Out(Pointer(ObjPointer(IDCompositionRotateTransform3D)), 'rotateTransform3D')]),
4904+ StdMethod(HRESULT, 'CreateMatrixTransform3D', [Out(Pointer(ObjPointer(IDCompositionMatrixTransform3D)), 'matrixTransform3D')]),
4905+ StdMethod(HRESULT, 'CreateTransform3DGroup', [(Array(ObjPointer(IDCompositionTransform3D), 'elements'), 'transforms3D'), (UINT, 'elements'), Out(Pointer(ObjPointer(IDCompositionTransform3D)), 'transform3DGroup')]),
4906+ StdMethod(HRESULT, 'CreateEffectGroup', [Out(Pointer(ObjPointer(IDCompositionEffectGroup)), 'effectGroup')]),
4907+ StdMethod(HRESULT, 'CreateRectangleClip', [Out(Pointer(ObjPointer(IDCompositionRectangleClip)), 'clip')]),
4908+ StdMethod(HRESULT, 'CreateAnimation', [Out(Pointer(ObjPointer(IDCompositionAnimation)), 'animation')]),
4909+ StdMethod(HRESULT, 'CheckDeviceState', [Out(Pointer(BOOL), 'pfValid')]),
4910+]
4911+
4912+IDCompositionTarget.methods += [
4913+ StdMethod(HRESULT, 'SetRoot', [(ObjPointer(IDCompositionVisual), 'visual')]),
4914+]
4915+
4916+IDCompositionVisual.methods += [
4917+ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True),
4918+ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4919+ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True),
4920+ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4921+ StdMethod(HRESULT, 'SetTransform', [(Reference(Const(D2D_MATRIX_3X2_F)), 'matrix')], overloaded=True),
4922+ StdMethod(HRESULT, 'SetTransform', [(ObjPointer(IDCompositionTransform), 'transform')], overloaded=True),
4923+ StdMethod(HRESULT, 'SetTransformParent', [(ObjPointer(IDCompositionVisual), 'visual')]),
4924+ StdMethod(HRESULT, 'SetEffect', [(ObjPointer(IDCompositionEffect), 'effect')]),
4925+ StdMethod(HRESULT, 'SetBitmapInterpolationMode', [(DCOMPOSITION_BITMAP_INTERPOLATION_MODE, 'interpolationMode')]),
4926+ StdMethod(HRESULT, 'SetBorderMode', [(DCOMPOSITION_BORDER_MODE, 'borderMode')]),
4927+ StdMethod(HRESULT, 'SetClip', [(Reference(Const(D2D_RECT_F)), 'rect')], overloaded=True),
4928+ StdMethod(HRESULT, 'SetClip', [(ObjPointer(IDCompositionClip), 'clip')], overloaded=True),
4929+ StdMethod(HRESULT, 'SetContent', [(ObjPointer(IUnknown), 'content')]),
4930+ StdMethod(HRESULT, 'AddVisual', [(ObjPointer(IDCompositionVisual), 'visual'), (BOOL, 'insertAbove'), (ObjPointer(IDCompositionVisual), 'referenceVisual')]),
4931+ StdMethod(HRESULT, 'RemoveVisual', [(ObjPointer(IDCompositionVisual), 'visual')]),
4932+ StdMethod(HRESULT, 'RemoveAllVisuals', []),
4933+ StdMethod(HRESULT, 'SetCompositeMode', [(DCOMPOSITION_COMPOSITE_MODE, 'compositeMode')]),
4934+]
4935+
4936+IDCompositionTransform.methods += [
4937+]
4938+
4939+IDCompositionTransform3D.methods += [
4940+]
4941+
4942+IDCompositionTranslateTransform.methods += [
4943+ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True),
4944+ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4945+ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True),
4946+ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4947+]
4948+
4949+IDCompositionTranslateTransform3D.methods += [
4950+ StdMethod(HRESULT, 'SetOffsetX', [(Float, 'offsetX')], overloaded=True),
4951+ StdMethod(HRESULT, 'SetOffsetX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4952+ StdMethod(HRESULT, 'SetOffsetY', [(Float, 'offsetY')], overloaded=True),
4953+ StdMethod(HRESULT, 'SetOffsetY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4954+ StdMethod(HRESULT, 'SetOffsetZ', [(Float, 'offsetZ')], overloaded=True),
4955+ StdMethod(HRESULT, 'SetOffsetZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4956+]
4957+
4958+IDCompositionScaleTransform.methods += [
4959+ StdMethod(HRESULT, 'SetScaleX', [(Float, 'scaleX')], overloaded=True),
4960+ StdMethod(HRESULT, 'SetScaleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4961+ StdMethod(HRESULT, 'SetScaleY', [(Float, 'scaleY')], overloaded=True),
4962+ StdMethod(HRESULT, 'SetScaleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4963+ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True),
4964+ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4965+ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True),
4966+ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4967+]
4968+
4969+IDCompositionScaleTransform3D.methods += [
4970+ StdMethod(HRESULT, 'SetScaleX', [(Float, 'scaleX')], overloaded=True),
4971+ StdMethod(HRESULT, 'SetScaleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4972+ StdMethod(HRESULT, 'SetScaleY', [(Float, 'scaleY')], overloaded=True),
4973+ StdMethod(HRESULT, 'SetScaleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4974+ StdMethod(HRESULT, 'SetScaleZ', [(Float, 'scaleZ')], overloaded=True),
4975+ StdMethod(HRESULT, 'SetScaleZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4976+ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True),
4977+ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4978+ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True),
4979+ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4980+ StdMethod(HRESULT, 'SetCenterZ', [(Float, 'centerZ')], overloaded=True),
4981+ StdMethod(HRESULT, 'SetCenterZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4982+]
4983+
4984+IDCompositionRotateTransform.methods += [
4985+ StdMethod(HRESULT, 'SetAngle', [(Float, 'angle')], overloaded=True),
4986+ StdMethod(HRESULT, 'SetAngle', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4987+ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True),
4988+ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4989+ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True),
4990+ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4991+]
4992+
4993+IDCompositionRotateTransform3D.methods += [
4994+ StdMethod(HRESULT, 'SetAngle', [(Float, 'angle')], overloaded=True),
4995+ StdMethod(HRESULT, 'SetAngle', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4996+ StdMethod(HRESULT, 'SetAxisX', [(Float, 'axisX')], overloaded=True),
4997+ StdMethod(HRESULT, 'SetAxisX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
4998+ StdMethod(HRESULT, 'SetAxisY', [(Float, 'axisY')], overloaded=True),
4999+ StdMethod(HRESULT, 'SetAxisY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5000+ StdMethod(HRESULT, 'SetAxisZ', [(Float, 'axisZ')], overloaded=True),
5001+ StdMethod(HRESULT, 'SetAxisZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5002+ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True),
5003+ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5004+ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True),
5005+ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5006+ StdMethod(HRESULT, 'SetCenterZ', [(Float, 'centerZ')], overloaded=True),
5007+ StdMethod(HRESULT, 'SetCenterZ', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5008+]
5009+
5010+IDCompositionSkewTransform.methods += [
5011+ StdMethod(HRESULT, 'SetAngleX', [(Float, 'angleX')], overloaded=True),
5012+ StdMethod(HRESULT, 'SetAngleX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5013+ StdMethod(HRESULT, 'SetAngleY', [(Float, 'angleY')], overloaded=True),
5014+ StdMethod(HRESULT, 'SetAngleY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5015+ StdMethod(HRESULT, 'SetCenterX', [(Float, 'centerX')], overloaded=True),
5016+ StdMethod(HRESULT, 'SetCenterX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5017+ StdMethod(HRESULT, 'SetCenterY', [(Float, 'centerY')], overloaded=True),
5018+ StdMethod(HRESULT, 'SetCenterY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5019+]
5020+
5021+IDCompositionMatrixTransform.methods += [
5022+ StdMethod(HRESULT, 'SetMatrix', [(Reference(Const(D2D_MATRIX_3X2_F)), 'matrix')]),
5023+ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (Float, 'value')], overloaded=True),
5024+ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5025+]
5026+
5027+IDCompositionMatrixTransform3D.methods += [
5028+ StdMethod(HRESULT, 'SetMatrix', [(Reference(Const(D3DMATRIX)), 'matrix')]),
5029+ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (Float, 'value')], overloaded=True),
5030+ StdMethod(HRESULT, 'SetMatrixElement', [(Int, 'row'), (Int, 'column'), (ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5031+]
5032+
5033+IDCompositionEffect.methods += [
5034+]
5035+
5036+IDCompositionEffectGroup.methods += [
5037+ StdMethod(HRESULT, 'SetOpacity', [(Float, 'opacity')], overloaded=True),
5038+ StdMethod(HRESULT, 'SetOpacity', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5039+ StdMethod(HRESULT, 'SetTransform3D', [(ObjPointer(IDCompositionTransform3D), 'transform3D')]),
5040+]
5041+
5042+IDCompositionClip.methods += [
5043+]
5044+
5045+IDCompositionRectangleClip.methods += [
5046+ StdMethod(HRESULT, 'SetLeft', [(Float, 'left')], overloaded=True),
5047+ StdMethod(HRESULT, 'SetLeft', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5048+ StdMethod(HRESULT, 'SetTop', [(Float, 'top')], overloaded=True),
5049+ StdMethod(HRESULT, 'SetTop', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5050+ StdMethod(HRESULT, 'SetRight', [(Float, 'right')], overloaded=True),
5051+ StdMethod(HRESULT, 'SetRight', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5052+ StdMethod(HRESULT, 'SetBottom', [(Float, 'bottom')], overloaded=True),
5053+ StdMethod(HRESULT, 'SetBottom', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5054+ StdMethod(HRESULT, 'SetTopLeftRadiusX', [(Float, 'radius')], overloaded=True),
5055+ StdMethod(HRESULT, 'SetTopLeftRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5056+ StdMethod(HRESULT, 'SetTopLeftRadiusY', [(Float, 'radius')], overloaded=True),
5057+ StdMethod(HRESULT, 'SetTopLeftRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5058+ StdMethod(HRESULT, 'SetTopRightRadiusX', [(Float, 'radius')], overloaded=True),
5059+ StdMethod(HRESULT, 'SetTopRightRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5060+ StdMethod(HRESULT, 'SetTopRightRadiusY', [(Float, 'radius')], overloaded=True),
5061+ StdMethod(HRESULT, 'SetTopRightRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5062+ StdMethod(HRESULT, 'SetBottomLeftRadiusX', [(Float, 'radius')], overloaded=True),
5063+ StdMethod(HRESULT, 'SetBottomLeftRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5064+ StdMethod(HRESULT, 'SetBottomLeftRadiusY', [(Float, 'radius')], overloaded=True),
5065+ StdMethod(HRESULT, 'SetBottomLeftRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5066+ StdMethod(HRESULT, 'SetBottomRightRadiusX', [(Float, 'radius')], overloaded=True),
5067+ StdMethod(HRESULT, 'SetBottomRightRadiusX', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5068+ StdMethod(HRESULT, 'SetBottomRightRadiusY', [(Float, 'radius')], overloaded=True),
5069+ StdMethod(HRESULT, 'SetBottomRightRadiusY', [(ObjPointer(IDCompositionAnimation), 'animation')], overloaded=True),
5070+]
5071+
5072+IDCompositionSurface.methods += [
5073+ # XXX: riid might be ID2D1DeviceContext
5074+ StdMethod(HRESULT, 'BeginDraw', [(Pointer(Const(RECT)), 'updateRect'), (REFIID, 'iid'), Out(Pointer(ObjPointer(Void)), 'updateObject'), Out(Pointer(POINT), 'updateOffset')]),
5075+ StdMethod(HRESULT, 'EndDraw', []),
5076+ StdMethod(HRESULT, 'SuspendDraw', []),
5077+ StdMethod(HRESULT, 'ResumeDraw', []),
5078+ StdMethod(HRESULT, 'Scroll', [(Pointer(Const(RECT)), 'scrollRect'), (Pointer(Const(RECT)), 'clipRect'), (Int, 'offsetX'), (Int, 'offsetY')]),
5079+]
5080+
5081+IDCompositionVirtualSurface.methods += [
5082+ StdMethod(HRESULT, 'Resize', [(UINT, 'width'), (UINT, 'height')]),
5083+ StdMethod(HRESULT, 'Trim', [(Array(Const(RECT), 'count'), 'rectangles'), (UINT, 'count')]),
5084+]
5085+
5086+dcomp = Module('dcomp')
5087+dcomp.addFunctions([
5088+ StdFunction(HRESULT, 'DCompositionCreateDevice', [(ObjPointer(IDXGIDevice), 'dxgiDevice'), (REFIID, 'iid'), Out(Pointer(ObjPointer(Void)), 'dcompositionDevice')]),
5089+ StdFunction(HRESULT, 'DCompositionCreateSurfaceHandle', [(COMPOSITIONOBJECT, 'desiredAccess'), (Pointer(SECURITY_ATTRIBUTES), 'securityAttributes'), Out(Pointer(HANDLE), 'surfaceHandle')]),
5090+])
5091+dcomp.addInterfaces([
5092+ IDCompositionDevice,
5093+])
5094diff --git a/specs/ddraw.py b/specs/ddraw.py
5095index 99f542fe..5df48be0 100644
5096--- a/specs/ddraw.py
5097+++ b/specs/ddraw.py
5098@@ -25,7 +25,7 @@
5099
5100 """ddraw.h"""
5101
5102-from winapi import *
5103+from .winapi import *
5104
5105 DirectDrawOptSurfaceDescFlags = Flags(DWORD, [
5106 "DDOSD_GUID",
5107diff --git a/specs/debug.py b/specs/debug.py
5108index 0a004741..6ef80f64 100644
5109--- a/specs/debug.py
5110+++ b/specs/debug.py
5111@@ -49,7 +49,7 @@ def excepthook(type, value, tb):
5112 import traceback, pdb
5113 # we are NOT in interactive mode, print the exception...
5114 traceback.print_exception(type, value, tb)
5115- print
5116+ print()
5117 # ...then start the debugger in post-mortem mode.
5118 pdb.pm()
5119
5120diff --git a/specs/dwrite.py b/specs/dwrite.py
5121index 60e5034c..be273f81 100644
5122--- a/specs/dwrite.py
5123+++ b/specs/dwrite.py
5124@@ -24,8 +24,8 @@
5125 ##########################################################################/
5126
5127
5128-from winapi import *
5129-from dcommon import *
5130+from .winapi import *
5131+from .dcommon import *
5132
5133
5134 ID2D1SimplifiedGeometrySink = Interface("ID2D1SimplifiedGeometrySink", IUnknown)
5135diff --git a/specs/dxgi.py b/specs/dxgi.py
5136index 0e880548..040f3bc4 100644
5137--- a/specs/dxgi.py
5138+++ b/specs/dxgi.py
5139@@ -25,7 +25,7 @@
5140 ##########################################################################/
5141
5142
5143-from winapi import *
5144+from .winapi import *
5145
5146
5147 DXGI_FORMAT = Enum("DXGI_FORMAT", [
5148diff --git a/specs/dxva2.py b/specs/dxva2.py
5149index 3936afac..65f5f0c0 100644
5150--- a/specs/dxva2.py
5151+++ b/specs/dxva2.py
5152@@ -24,7 +24,7 @@
5153 ##########################################################################/
5154
5155
5156-from d3d9 import *
5157+from .d3d9 import *
5158
5159
5160 HRESULT = MAKE_HRESULT(errors = [
5161diff --git a/specs/eglapi.py b/specs/eglapi.py
5162index 8379e45e..e1edff06 100644
5163--- a/specs/eglapi.py
5164+++ b/specs/eglapi.py
5165@@ -26,9 +26,9 @@
5166 """EGL API description."""
5167
5168
5169-from stdapi import *
5170-from gltypes import *
5171-from eglenum import *
5172+from .stdapi import *
5173+from .gltypes import *
5174+from .eglenum import *
5175
5176 EGLNativeDisplayType = Opaque("EGLNativeDisplayType")
5177 EGLNativeWindowType = Opaque("EGLNativeWindowType")
5178diff --git a/specs/eglenum.py b/specs/eglenum.py
5179index 8b10868d..e6290fb2 100644
5180--- a/specs/eglenum.py
5181+++ b/specs/eglenum.py
5182@@ -28,7 +28,7 @@
5183 """EGL enum description"""
5184
5185
5186-from stdapi import *
5187+from .stdapi import *
5188
5189 # Most of the following content was produced in a semi-automated fashion by
5190 # the scripts/eglenum.sed sed script.
5191diff --git a/specs/glapi.py b/specs/glapi.py
5192index c0e92b3c..8d20052e 100644
5193--- a/specs/glapi.py
5194+++ b/specs/glapi.py
5195@@ -34,9 +34,9 @@ corner cases correctly.
5196 """
5197
5198
5199-from stdapi import *
5200-from gltypes import *
5201-import glparams
5202+from .stdapi import *
5203+from .gltypes import *
5204+from . import glparams
5205
5206
5207 def GlFunction(*args, **kwargs):
5208diff --git a/specs/glparams.py b/specs/glparams.py
5209index 1bed8a6b..5a036975 100644
5210--- a/specs/glparams.py
5211+++ b/specs/glparams.py
5212@@ -27,9 +27,9 @@
5213 '''Describe GL parameters.'''
5214
5215
5216-from stdapi import *
5217+from .stdapi import *
5218
5219-from gltypes import *
5220+from .gltypes import *
5221
5222
5223 # Shorthands for the types
5224diff --git a/specs/gltypes.py b/specs/gltypes.py
5225index a9ffc4a1..631eb868 100644
5226--- a/specs/gltypes.py
5227+++ b/specs/gltypes.py
5228@@ -29,7 +29,7 @@
5229
5230 import platform
5231
5232-from stdapi import *
5233+from .stdapi import *
5234
5235
5236 GLboolean = Enum("GLboolean", [
5237diff --git a/specs/glxapi.py b/specs/glxapi.py
5238index 0d3cd969..f4182799 100644
5239--- a/specs/glxapi.py
5240+++ b/specs/glxapi.py
5241@@ -26,8 +26,8 @@
5242 """GLX API description."""
5243
5244
5245-from stdapi import *
5246-from glapi import *
5247+from .stdapi import *
5248+from .glapi import *
5249
5250 VisualID = Alias("VisualID", UInt32)
5251 Display = Opaque("Display *")
5252diff --git a/specs/scripts/c2api.py b/specs/scripts/c2api.py
5253index 7deb2955..b8aaa81d 100755
5254--- a/specs/scripts/c2api.py
5255+++ b/specs/scripts/c2api.py
5256@@ -122,7 +122,7 @@ class DeclParser:
5257 self.consume()
5258 type = 'Pointer(%s)' % type
5259 name = self.consume()
5260- print '%s = Alias("%s", %s)' % (name, name, type)
5261+ print('%s = Alias("%s", %s)' % (name, name, type))
5262 if self.match(','):
5263 self.consume()
5264 else:
5265@@ -136,7 +136,7 @@ class DeclParser:
5266 name = self.consume()
5267 self.consume('{')
5268
5269- print '%s = Enum("%s", [' % (name, name)
5270+ print('%s = Enum("%s", [' % (name, name))
5271
5272 #value = 0
5273 while self.lookahead() != '}':
5274@@ -148,12 +148,12 @@ class DeclParser:
5275 self.consume(',')
5276 tags = self.parse_tags()
5277 #print ' "%s",\t# %s' % (name, value)
5278- print ' "%s",' % (name,)
5279+ print(' "%s",' % (name,))
5280 #value += 1
5281 self.consume('}')
5282
5283- print '])'
5284- print
5285+ print('])')
5286+ print()
5287
5288 def parse_value(self, ref_token, constructor):
5289 self.consume(ref_token)
5290@@ -161,14 +161,14 @@ class DeclParser:
5291 name = self.consume()
5292 self.consume('{')
5293
5294- print '%s = %s(%s, [' % (name, constructor, type)
5295+ print('%s = %s(%s, [' % (name, constructor, type))
5296
5297 while self.lookahead() != '}':
5298 name, value = self.parse_define()
5299 self.consume('}')
5300
5301- print '])'
5302- print
5303+ print('])')
5304+ print()
5305
5306 def parse_define(self):
5307 self.consume('#')
5308@@ -176,18 +176,18 @@ class DeclParser:
5309 name = self.consume()
5310 value = self.consume()
5311 #print ' "%s",\t# %s' % (name, value)
5312- print ' "%s",' % (name,)
5313+ print(' "%s",' % (name,))
5314 return name, value
5315
5316 def parse_struct(self):
5317 self.consume('struct')
5318 name = self.consume()
5319
5320- print '%s = Struct("%s", [' % (name, name)
5321+ print('%s = Struct("%s", [' % (name, name))
5322 for type, name in self.parse_members():
5323- print ' (%s, "%s"),' % (type, name)
5324- print '])'
5325- print
5326+ print(' (%s, "%s"),' % (type, name))
5327+ print('])')
5328+ print()
5329
5330 def parse_union(self):
5331 self.consume('union')
5332@@ -226,8 +226,8 @@ class DeclParser:
5333 base = self.consume()
5334 self.consume('{')
5335
5336- print '%s = Interface("%s", %s)' % (name, name, base)
5337- print '%s.methods += [' % (name,)
5338+ print('%s = Interface("%s", %s)' % (name, name, base))
5339+ print('%s.methods += [' % (name,))
5340
5341 while self.lookahead() != '}':
5342 if self.lookahead() in ('public', 'private'):
5343@@ -238,8 +238,8 @@ class DeclParser:
5344 self.consume(';')
5345 self.consume('}')
5346
5347- print ']'
5348- print
5349+ print(']')
5350+ print()
5351
5352 def parse_prototype(self, creator = 'Function'):
5353 if self.match('extern', 'virtual'):
5354@@ -275,7 +275,7 @@ class DeclParser:
5355 self.consume()
5356 self.consume('0')
5357
5358- print ' %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra)
5359+ print(' %s(%s, "%s", [%s]%s),' % (creator, ret, name, ', '.join(args), extra))
5360
5361 def parse_arg(self):
5362 tags = self.parse_tags()
5363@@ -404,8 +404,8 @@ class DeclParser:
5364 type = 'S' + type
5365 elif short:
5366 type = 'Short'
5367- elif long:
5368- type = 'Long' * long
5369+ elif int:
5370+ type = 'Long' * int
5371 else:
5372 type = 'Int'
5373 if unsigned:
5374diff --git a/specs/scripts/cxx2api.py b/specs/scripts/cxx2api.py
5375new file mode 100755
5376index 00000000..9720615d
5377--- /dev/null
5378+++ b/specs/scripts/cxx2api.py
5379@@ -0,0 +1,488 @@
5380+#!/usr/bin/env python
5381+
5382+
5383+
5384+copyright = '''
5385+##########################################################################
5386+#
5387+# Copyright 2009-2016 VMware, Inc.
5388+# All Rights Reserved.
5389+#
5390+# Permission is hereby granted, free of charge, to any person obtaining a copy
5391+# of this software and associated documentation files (the "Software"), to deal
5392+# in the Software without restriction, including without limitation the rights
5393+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
5394+# copies of the Software, and to permit persons to whom the Software is
5395+# furnished to do so, subject to the following conditions:
5396+#
5397+# The above copyright notice and this permission notice shall be included in
5398+# all copies or substantial portions of the Software.
5399+#
5400+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5401+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5402+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5403+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5404+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5405+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
5406+# THE SOFTWARE.
5407+#
5408+##########################################################################/
5409+'''
5410+
5411+
5412+#
5413+# Generates API specs from headers using castxml/pygccxml.
5414+#
5415+# Usage:
5416+#
5417+# sudo apt-get install castxml mingw-w64-i686-dev
5418+# pip install 'pygccxml==1.9.1'
5419+# python specs/scripts/cxx2api.py -Idxsdk/Include -DD2D_USE_C_DEFINITIONS dcomp.h dcomptypes.h dcompanimation.h
5420+#
5421+# See also:
5422+# - http://pygccxml.readthedocs.org/en/develop/index.html
5423+# - https://github.com/CastXML/CastXML/blob/master/doc/manual/castxml.1.rst
5424+#
5425+
5426+import os.path
5427+import sys
5428+import io as StringIO
5429+import subprocess
5430+
5431+from pygccxml import utils
5432+from pygccxml import parser
5433+from pygccxml import declarations
5434+
5435+from pygccxml.declarations import algorithm
5436+from pygccxml.declarations import decl_visitor
5437+from pygccxml.declarations import type_traits
5438+from pygccxml.declarations import type_visitor
5439+
5440+
5441+class decl_dumper_t(decl_visitor.decl_visitor_t):
5442+
5443+ def __init__(self, decl = None):
5444+ decl_visitor.decl_visitor_t.__init__(self)
5445+ self.decl = decl
5446+ self.result = None
5447+
5448+ def clone(self):
5449+ return decl_dumper_t(self.decl)
5450+
5451+ def visit_class(self):
5452+ class_ = self.decl
5453+ assert class_.class_type in ('struct', 'union')
5454+ self.result = class_.name
5455+
5456+ def visit_class_declaration(self):
5457+ class_ = self.decl
5458+ self.result = class_.name
5459+
5460+ def visit_typedef(self):
5461+ typedef = self.decl
5462+ self.result = typedef.name
5463+
5464+ def visit_enumeration(self):
5465+ self.result = self.decl.name
5466+
5467+
5468+def dump_decl(decl):
5469+ visitor = decl_dumper_t(decl)
5470+ algorithm.apply_visitor(visitor, decl)
5471+ return visitor.result
5472+
5473+
5474+class type_dumper_t(type_visitor.type_visitor_t):
5475+
5476+ def __init__(self, type):
5477+ type_visitor.type_visitor_t.__init__(self)
5478+ self.type = type
5479+ self.result = None
5480+
5481+ def clone(self):
5482+ return type_dumper_t(self.type)
5483+
5484+ def visit_void(self):
5485+ self.result = 'Void'
5486+
5487+ def visit_char(self):
5488+ self.result = 'Char'
5489+
5490+ def visit_unsigned_char(self):
5491+ self.result = 'UChar'
5492+
5493+ def visit_signed_char(self):
5494+ self.result = 'SChar'
5495+
5496+ def visit_wchar(self):
5497+ raise NotImplementedError
5498+
5499+ def visit_short_int(self):
5500+ self.result = 'Short'
5501+
5502+ def visit_short_unsigned_int(self):
5503+ self.result = 'UShort'
5504+
5505+ def visit_bool(self):
5506+ raise NotImplementedError
5507+
5508+ def visit_int(self):
5509+ self.result = 'Int'
5510+
5511+ def visit_unsigned_int(self):
5512+ self.result = 'UInt'
5513+
5514+ def visit_long_int(self):
5515+ self.result = 'Long'
5516+
5517+ def visit_long_unsigned_int(self):
5518+ self.result = 'ULong'
5519+
5520+ def visit_long_long_int(self):
5521+ self.result = 'LongLong'
5522+
5523+ def visit_long_long_unsigned_int(self):
5524+ self.result = 'ULongLong'
5525+
5526+ def visit_float(self):
5527+ self.result = "Float"
5528+
5529+ def visit_double(self):
5530+ self.result = "Double"
5531+
5532+ def visit_array(self):
5533+ base_type = dump_type(self.type.base)
5534+ length = self.type.size
5535+ try:
5536+ int(length)
5537+ except ValueError:
5538+ length = '"%s"' % length
5539+ self.result = 'Array(%s, %s)' % (base_type, length)
5540+
5541+ def visit_pointer(self):
5542+ base_type = dump_type(self.type.base)
5543+ # TODO: Use ObjPointer where appropriate
5544+ #if isinstance(self.type.base, declarations.cpptypes.declarated_t):
5545+ # decl = self.type.base.declaration
5546+ # if isinstance(decl, declarations.typedef.typedef_t):
5547+ # print(decl.type, type(decl.type))
5548+ # if isinstance(decl, declarations.class_declaration.class_t):
5549+ # if decl.public_members:
5550+ # self.result = 'ObjPointer(%s)' % decl.name
5551+ # return
5552+ # if isinstance(decl, declarations.class_declaration.class_declaration_t):
5553+ # if decl.public_members:
5554+ # self.result = 'ObjPointer(%s)' % decl.name
5555+ # return
5556+ if base_type.startswith('IDComposition') or \
5557+ base_type.startswith('IDXGI') or \
5558+ base_type == 'IUnknown':
5559+ self.result = 'ObjPointer(%s)' % base_type
5560+ return
5561+ self.result = 'Pointer(%s)' % base_type
5562+
5563+ def visit_reference(self):
5564+ base_type = dump_type(self.type.base)
5565+ if base_type == 'Const(IID)':
5566+ self.result = 'REFIID'
5567+ elif base_type == 'Const(GUID)':
5568+ self.result = 'REFGUID'
5569+ else:
5570+ self.result = 'Reference(%s)' % base_type
5571+
5572+ def visit_const(self):
5573+ self.result = 'Const(%s)' % dump_type(self.type.base)
5574+
5575+ def visit_declarated(self):
5576+ decl = self.type.declaration
5577+ self.result = dump_decl(decl)
5578+
5579+ def visit_free_function_type(self):
5580+ self.result = 'Opaque("%s")' % self.type
5581+
5582+
5583+def dump_type(type):
5584+ visitor = type_dumper_t(type)
5585+ algorithm.apply_visitor(visitor, type)
5586+ # XXX: RECT becomes tagRECT somehow
5587+ if visitor.result == 'tagRECT':
5588+ return 'RECT'
5589+ return visitor.result
5590+
5591+
5592+def is_interface(class_):
5593+ if not class_.name.startswith('I'):
5594+ return
5595+ if len(class_.bases) != 1:
5596+ return False
5597+ # TODO: Ensure interface derives from IUnknown
5598+ return True
5599+
5600+
5601+class decl2_dumper_t(decl_visitor.decl_visitor_t):
5602+
5603+ def __init__(self, name):
5604+ decl_visitor.decl_visitor_t.__init__(self)
5605+
5606+ self.name = name
5607+
5608+ # The current declaration
5609+ self.decl = None
5610+
5611+ self.interfaces = StringIO.StringIO()
5612+ self.methods = StringIO.StringIO()
5613+ self.functions = StringIO.StringIO()
5614+
5615+ def start(self):
5616+ print(copyright.strip())
5617+ print()
5618+ print()
5619+ print(r'from winapi import *')
5620+ print()
5621+
5622+ def finish(self):
5623+ sys.stdout.write(self.interfaces.getvalue())
5624+ sys.stdout.write('\n')
5625+ sys.stdout.write(self.methods.getvalue())
5626+
5627+ name = self.name
5628+ sys.stdout.write('%s = Module(%r)\n' % (name, name))
5629+ sys.stdout.write('%s.addFunctions([\n' % (name,))
5630+ sys.stdout.write(self.functions.getvalue())
5631+ sys.stdout.write('])\n\n')
5632+
5633+ def clone(self):
5634+ return decl_dumper_t(self.decl)
5635+
5636+ def visit_class(self):
5637+ class_ = self.decl
5638+ assert class_.class_type in ('struct', 'union')
5639+
5640+ if is_interface(class_):
5641+ self.visit_interface()
5642+ elif class_.name != '':
5643+ self.visit_struct(class_.name, class_)
5644+
5645+ def visit_struct(self, decl_name, decl):
5646+ struct = decl
5647+ print(r'%s = Struct(%r, [' % (decl_name, decl_name))
5648+ for variable in struct.variables(allow_empty=True):
5649+ var_type = dump_type(variable.decl_type)
5650+ print(r' (%s, %r),' % (var_type, variable.name))
5651+ print(r'])')
5652+ print()
5653+
5654+ def visit_interface(self):
5655+ class_ = self.decl
5656+ assert len(class_.bases) == 1
5657+ base = class_.bases[0]
5658+
5659+ s = self.interfaces
5660+ s.write('%s = Interface(%r, %s)\n' % (class_.name, class_.name, base.related_class.name))
5661+
5662+ s = self.methods
5663+ s.write('%s.methods += [\n' % (class_.name,))
5664+ for member in class_.public_members:
5665+ if member.virtuality != 'pure virtual':
5666+ continue
5667+ ret_type = dump_type(member.return_type)
5668+ arg_types = self.convert_args(member.arguments)
5669+ s.write(' StdMethod(%s, %r, [%s]),\n' % (ret_type, member.name, arg_types))
5670+ s.write(']\n\n')
5671+
5672+ def convert_args(self, args):
5673+ # TODO: use __attribute__ ((annotate ("out")))
5674+ # See also:
5675+ # - https://github.com/CastXML/CastXML/issues/25
5676+ # XXX: Requires a castxml version newer than the one in Ubuntu 15.10
5677+ arg_types = []
5678+ for arg in args:
5679+ if arg.attributes is not None:
5680+ sys.stderr.write('warning: found %s attribute %r\n' % (arg.name, arg.attributes))
5681+ res_arg_type = dump_type(arg.decl_type)
5682+ res_arg = '(%s, %r)' % (res_arg_type, arg.name)
5683+
5684+ # Infer output arguments
5685+ if res_arg_type.startswith('Pointer(') and \
5686+ not res_arg_type.startswith('Pointer(Const('):
5687+ res_arg = 'Out' + res_arg
5688+
5689+ arg_types.append(res_arg)
5690+
5691+ arg_types = ', '.join(arg_types)
5692+ return arg_types
5693+
5694+ def visit_class_declaration(self):
5695+ pass
5696+
5697+ def visit_typedef(self):
5698+ typedef = self.decl
5699+ base_type = dump_type(typedef.decl_type)
5700+ if base_type == typedef.name:
5701+ # Ignore `typedef struct Foo Foo;`
5702+ return
5703+ if base_type == '':
5704+ if isinstance(typedef.decl_type, declarations.cpptypes.declarated_t):
5705+ base_decl = typedef.decl_type.declaration
5706+ self.visit_struct(typedef.name, base_decl)
5707+ return
5708+ print(r'%s = Alias(%r, %s)' % (typedef.name, typedef.name, base_type))
5709+ print()
5710+
5711+ def visit_enumeration(self):
5712+ enum = self.decl
5713+ print(r'%s = Enum(%r, [' % (enum.name, enum.name))
5714+ for name, value in enum.values:
5715+ print(r' %r,' % (name,))
5716+ print(r'])')
5717+ print()
5718+
5719+ def visit_variable(self):
5720+ pass
5721+
5722+ def visit_free_function(self):
5723+ function = self.decl
5724+ if function.has_inline:
5725+ return
5726+
5727+ s = self.functions
5728+ ret_type = dump_type(function.return_type)
5729+ arg_types = self.convert_args(function.arguments)
5730+ s.write(' StdFunction(%s, %r, [%s]),\n' % (ret_type, function.name, arg_types))
5731+
5732+ def visit_free_operator(self):
5733+ pass
5734+
5735+
5736+def main():
5737+ defines = []
5738+ includes = []
5739+ cxxflags = [
5740+ '-Wno-unknown-attributes',
5741+ '-Wno-unused-value',
5742+ '-Wno-macro-redefined',
5743+ ]
5744+ compiler = 'g++'
5745+
5746+ args = sys.argv[1:]
5747+ while args and args[0].startswith('-'):
5748+ arg = args.pop(0)
5749+ if arg.startswith('-I'):
5750+ include = arg[2:]
5751+ includes.append(include)
5752+ elif arg.startswith('-D'):
5753+ define = arg[2:]
5754+ defines.append(define)
5755+ else:
5756+ sys.stderr.write('error: unknown option %r\n' % arg)
5757+ sys.exit(1)
5758+
5759+ winsdk = True
5760+ if winsdk:
5761+ # Set up Clang compiler flags to use MinGW runtime
5762+ # http://stackoverflow.com/a/19839946
5763+ p = subprocess.Popen(
5764+ ["x86_64-w64-mingw32-g++", "-x", "c++", "-E", "-Wp,-v", '-', '-fsyntax-only'],
5765+ stdin=open(os.devnull, 'rt'),
5766+ stdout=open(os.devnull, 'wt'),
5767+ stderr=subprocess.PIPE)
5768+ includes.append('/usr/share/castxml/clang/include')
5769+ for line in p.stderr:
5770+ if line.startswith(' '):
5771+ include = line.strip()
5772+ if os.path.isdir(include):
5773+ if os.path.exists(os.path.join(include, 'ia32intrin.h')):
5774+ # XXX: We must use Clang's intrinsic headers
5775+ continue
5776+ includes.append(os.path.normpath(include))
5777+
5778+ winver = 0x0602
5779+
5780+ defines += [
5781+ # emulate MinGW
5782+ '__MINGW32__',
5783+ '_WIN32',
5784+ '_WIN64',
5785+ '__declspec(x)=',
5786+ # Avoid namespace pollution when including windows.h
5787+ # http://support.microsoft.com/kb/166474
5788+ 'WIN32_LEAN_AND_MEAN',
5789+ # Set Windows version to 8.1
5790+ '_WIN32_WINNT=0x%04X' % winver,
5791+ 'WINVER=0x%04X' % winver,
5792+ 'NTDDI_VERSION=0x%04X0000' % winver,
5793+ # Prevent headers from requiring a rpcndr.h version beyond MinGW's
5794+ '__REQUIRED_RPCNDR_H_VERSION__=475',
5795+ # Avoid C++ helper classes
5796+ 'D3D10_NO_HELPERS',
5797+ 'D3D11_NO_HELPERS',
5798+ 'D3D11_VIDEO_NO_HELPERS',
5799+ ]
5800+
5801+ # XXX: Change compiler?
5802+ #compiler = 'cl'
5803+
5804+ # XXX: This doesn't seem to work well
5805+ cxxflags += [
5806+ #'-m32',
5807+ #'-target', 'x86_64-pc-mingw32',
5808+ ]
5809+
5810+ sys.stderr.write('Include path:\n')
5811+ for include in includes:
5812+ sys.stderr.write(' %s\n' % include)
5813+ sys.stderr.write('Definitions:\n')
5814+ for define in defines:
5815+ sys.stderr.write(' %s\n' % define)
5816+
5817+ import logging
5818+ utils.loggers.set_level(logging.DEBUG)
5819+
5820+ # Find the location of the xml generator (castxml or gccxml)
5821+ generator_path, generator_name = utils.find_xml_generator("castxml")
5822+
5823+ # Configure the xml generator
5824+ config = parser.xml_generator_configuration_t(
5825+ xml_generator_path=generator_path,
5826+ xml_generator=generator_name,
5827+ define_symbols = defines,
5828+ include_paths = includes,
5829+ cflags = ' '.join(cxxflags),
5830+ compiler = compiler,
5831+ #keep_xml = True,
5832+ )
5833+
5834+ script_dir = os.path.dirname(__file__)
5835+ headers = [
5836+ os.path.join(script_dir, '..', '..', 'compat', 'winsdk_compat.h'),
5837+ os.path.join(script_dir, 'cxx2api.h'),
5838+ ]
5839+ main_header = args[0]
5840+ headers.append(main_header)
5841+
5842+ decls = parser.parse(headers, config, parser.COMPILATION_MODE.ALL_AT_ONCE)
5843+ global_ns = declarations.get_global_namespace(decls)
5844+
5845+ def decl_filter(decl):
5846+ location = decl.location
5847+ if location is None:
5848+ return False
5849+ return os.path.basename(location.file_name) in list(map(os.path.basename, args))
5850+
5851+ module, _ = os.path.splitext(main_header)
5852+ visitor = decl2_dumper_t(module)
5853+ visitor.start()
5854+ for decl in global_ns.declarations:
5855+ if not decl_filter(decl):
5856+ continue
5857+
5858+ if sys.stdout.isatty():
5859+ print('# ' + str(decl))
5860+
5861+ visitor.decl = decl
5862+ algorithm.apply_visitor(visitor, decl)
5863+ visitor.finish()
5864+
5865+
5866+if __name__ == '__main__':
5867+ main()
5868diff --git a/specs/scripts/spec2api.py b/specs/scripts/spec2api.py
5869index f21b08d5..7fb395a4 100755
5870--- a/specs/scripts/spec2api.py
5871+++ b/specs/scripts/spec2api.py
5872@@ -181,8 +181,8 @@ class SpecParser(LineParser):
5873 category = self.prefix.upper() + '_' + category
5874 if category != self.category:
5875 if self.category is not None:
5876- print
5877- print ' # %s' % category
5878+ print()
5879+ print(' # %s' % category)
5880 self.category = category
5881
5882 if self.prefix == 'wgl':
5883@@ -190,7 +190,7 @@ class SpecParser(LineParser):
5884 else:
5885 constructor = 'GlFunction'
5886
5887- print ' %s(%s, "%s", [%s]%s),' % (constructor, ret_type, function_name, ', '.join(args), extra)
5888+ print(' %s(%s, "%s", [%s]%s),' % (constructor, ret_type, function_name, ', '.join(args), extra))
5889
5890 array_re = re.compile(r'^array\s+\[(.*)\]$')
5891
5892diff --git a/specs/scripts/txt2api.py b/specs/scripts/txt2api.py
5893index 6cd99dd9..e9469d3c 100755
5894--- a/specs/scripts/txt2api.py
5895+++ b/specs/scripts/txt2api.py
5896@@ -31,7 +31,7 @@
5897 import sys
5898 import re
5899 import optparse
5900-from urllib2 import urlopen
5901+from urllib.request import urlopen
5902
5903
5904 def stderr(x):
5905@@ -116,7 +116,7 @@ class TxtParser(LineParser):
5906 self.consume()
5907 line = self.consume()
5908 self.parse_section(line)
5909- print
5910+ print()
5911
5912 def parse_section(self, name):
5913 if name == 'Name Strings':
5914@@ -136,7 +136,7 @@ class TxtParser(LineParser):
5915 name = line.strip()
5916 if name.startswith('EGL_'):
5917 self.prefix = ''
5918- print ' # %s' % name
5919+ print(' # %s' % name)
5920
5921 def skip_c_comments(self):
5922 while not self.eof():
5923@@ -192,7 +192,7 @@ class TxtParser(LineParser):
5924 args.append(arg)
5925 if self.tokens[0] == ',':
5926 self.tokens.pop(0)
5927- print ' GlFunction(%s, "%s", [%s]%s),' % (ret, name, ', '.join(args), extra)
5928+ print(' GlFunction(%s, "%s", [%s]%s),' % (ret, name, ', '.join(args), extra))
5929
5930 def parse_arg(self):
5931 type = self.parse_type()
5932diff --git a/specs/scripts/xml2api.py b/specs/scripts/xml2api.py
5933index e3820e09..f09fe0bf 100755
5934--- a/specs/scripts/xml2api.py
5935+++ b/specs/scripts/xml2api.py
5936@@ -126,7 +126,7 @@ def processRequire(node, filterName):
5937
5938
5939 def printPrototypes(prototypes, extensionName, functionNames, skip=set()):
5940- print ' # %s' % extensionName
5941+ print(' # %s' % extensionName)
5942
5943 if extensionName == 'GL_EXT_direct_state_access':
5944 functionNames.sort()
5945@@ -134,9 +134,9 @@ def printPrototypes(prototypes, extensionName, functionNames, skip=set()):
5946 for functionName in functionNames:
5947 if functionName not in skip:
5948 prototype = prototypes[functionName]
5949- print ' %s,' % prototype
5950+ print(' %s,' % prototype)
5951
5952- print
5953+ print()
5954
5955
5956 def main():
5957diff --git a/specs/scripts/xml2enum.py b/specs/scripts/xml2enum.py
5958index 6d49e11c..cb2c4ae9 100755
5959--- a/specs/scripts/xml2enum.py
5960+++ b/specs/scripts/xml2enum.py
5961@@ -58,8 +58,8 @@ for arg in sys.argv[1:]:
5962 params.setdefault(value, name)
5963
5964
5965- values = params.keys()
5966+ values = list(params.keys())
5967 values.sort()
5968 for value in values:
5969 name = params[value]
5970- print ' "%s",\t\t# 0x%04X' % (name, value)
5971+ print(' "%s",\t\t# 0x%04X' % (name, value))
5972diff --git a/specs/scripts/xml2glparams.py b/specs/scripts/xml2glparams.py
5973index 7e2bc351..805aac86 100755
5974--- a/specs/scripts/xml2glparams.py
5975+++ b/specs/scripts/xml2glparams.py
5976@@ -58,8 +58,8 @@ for arg in sys.argv[1:]:
5977 params.setdefault(value, name)
5978
5979
5980- values = params.keys()
5981+ values = list(params.keys())
5982 values.sort()
5983 for value in values:
5984 name = params[value]
5985- print ' ("",\tX,\t1,\t"%s"),\t# 0x%04X' % (name, value)
5986+ print(' ("",\tX,\t1,\t"%s"),\t# 0x%04X' % (name, value))
5987diff --git a/specs/stdapi.py b/specs/stdapi.py
5988index c72c264b..487b6c1e 100644
5989--- a/specs/stdapi.py
5990+++ b/specs/stdapi.py
5991@@ -26,7 +26,9 @@
5992 """C basic types"""
5993
5994
5995-import debug
5996+import sys
5997+
5998+from . import debug
5999
6000
6001 class Type:
6002@@ -266,6 +268,10 @@ class Bitmask(Type):
6003 Flags = Bitmask
6004
6005
6006+def EnumFlags(name, values):
6007+ return Flags(Alias(name, UInt), values)
6008+
6009+
6010 class Array(Type):
6011
6012 def __init__(self, type_, length):
6013@@ -273,7 +279,7 @@ class Array(Type):
6014 self.type = type_
6015 self.length = length
6016 if not isinstance(length, int):
6017- assert isinstance(length, basestring)
6018+ assert isinstance(length, str)
6019 # Check if length is actually a valid constant expression
6020 try:
6021 eval(length, {}, {})
6022@@ -329,6 +335,10 @@ class Struct(Type):
6023 def visit(self, visitor, *args, **kwargs):
6024 return visitor.visitStruct(self, *args, **kwargs)
6025
6026+ def getMemberByName(self, name):
6027+ memberNames = [memberName for memberType, memberName in self.members]
6028+ return memberNames.index(name)
6029+
6030
6031 def Union(kindExpr, kindTypes, contextLess=True):
6032 switchTypes = []
6033@@ -372,7 +382,7 @@ def InOut(type, name):
6034
6035 class Function:
6036
6037- def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False):
6038+ def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False, overloaded=False):
6039 self.type = type
6040 self.name = name
6041
6042@@ -394,6 +404,7 @@ class Function:
6043 self.fail = fail
6044 self.sideeffects = sideeffects
6045 self.internal = internal
6046+ self.overloaded = overloaded
6047
6048 def prototype(self, name=None):
6049 if name is not None:
6050@@ -414,6 +425,17 @@ class Function:
6051 s += ")"
6052 return s
6053
6054+ def sigName(self):
6055+ name = self.name
6056+ if self.overloaded:
6057+ # suffix used to make overloaded functions/methods unique
6058+ suffix = ','.join([str(arg.type) for arg in self.args])
6059+ suffix = suffix.replace(' *', '*')
6060+ suffix = suffix.replace(' &', '&')
6061+ suffix = '(' + suffix + ')'
6062+ name += suffix
6063+ return name
6064+
6065 def argNames(self):
6066 return [arg.name for arg in self.args]
6067
6068@@ -463,14 +485,12 @@ class Interface(Type):
6069 yield method
6070 for method in self.methods:
6071 yield method
6072- raise StopIteration
6073
6074 def iterBases(self):
6075 iface = self
6076 while iface is not None:
6077 yield iface
6078 iface = iface.base
6079- raise StopIteration
6080
6081 def hasBase(self, *bases):
6082 for iface in self.iterBases():
6083@@ -484,14 +504,13 @@ class Interface(Type):
6084 yield iface, method
6085 for method in self.methods:
6086 yield self, method
6087- raise StopIteration
6088
6089
6090 class Method(Function):
6091
6092- def __init__(self, type, name, args, call = '', const=False, sideeffects=True):
6093+ def __init__(self, type, name, args, call = '', const=False, sideeffects=True, overloaded=False):
6094 assert call == '__stdcall'
6095- Function.__init__(self, type, name, args, call = call, sideeffects=sideeffects)
6096+ Function.__init__(self, type, name, args, call = call, sideeffects=sideeffects, overloaded=overloaded)
6097 for index in range(len(self.args)):
6098 self.args[index].index = index + 1
6099 self.const = const
6100@@ -576,7 +595,7 @@ class Polymorphic(Type):
6101 else:
6102 cases[i].append(case)
6103
6104- return zip(cases, types)
6105+ return list(zip(cases, types))
6106
6107
6108 def EnumPolymorphic(enumName, switchExpr, switchTypes, defaultType, contextLess=True):
6109@@ -734,7 +753,7 @@ class Rebuilder(Visitor):
6110 if pointer_type is pointer.type:
6111 return pointer
6112 else:
6113- return LinearPointer(pointer_type)
6114+ return LinearPointer(pointer_type, self.size)
6115
6116 def visitReference(self, reference):
6117 reference_type = self.visit(reference.type)
6118@@ -792,7 +811,7 @@ class MutableRebuilder(Rebuilder):
6119
6120 def visitReference(self, reference):
6121 # Strip out references
6122- return reference.type
6123+ return self.visit(reference.type)
6124
6125
6126 class Traverser(Visitor):
6127@@ -894,7 +913,7 @@ class ExpanderMixin:
6128
6129 def expand(self, expr):
6130 # Expand a C expression, replacing certain variables
6131- if not isinstance(expr, basestring):
6132+ if not isinstance(expr, str):
6133 return expr
6134 variables = {}
6135
6136diff --git a/specs/wglapi.py b/specs/wglapi.py
6137index f24a8d21..563f0269 100644
6138--- a/specs/wglapi.py
6139+++ b/specs/wglapi.py
6140@@ -27,9 +27,9 @@
6141 """WGL API description"""
6142
6143
6144-from glapi import *
6145-from winapi import *
6146-from wglenum import *
6147+from .glapi import *
6148+from .winapi import *
6149+from .wglenum import *
6150
6151
6152 wglapi = Module("WGL")
6153diff --git a/specs/wglenum.py b/specs/wglenum.py
6154index ad9bbccf..6bc4e74d 100644
6155--- a/specs/wglenum.py
6156+++ b/specs/wglenum.py
6157@@ -27,7 +27,7 @@
6158 """WGL enum description"""
6159
6160
6161-from stdapi import *
6162+from .stdapi import *
6163
6164 WGLenum = FakeEnum(Int, [
6165 "WGL_GPU_VENDOR_AMD", # 0x1F00
6166diff --git a/specs/winapi.py b/specs/winapi.py
6167index 445039ff..e66d063a 100644
6168--- a/specs/winapi.py
6169+++ b/specs/winapi.py
6170@@ -26,7 +26,7 @@
6171 """Win32 API type description."""
6172
6173
6174-from stdapi import *
6175+from .stdapi import *
6176
6177
6178 SHORT = Alias("SHORT", Short)
6179diff --git a/wrappers/CMakeLists.txt b/wrappers/CMakeLists.txt
6180index 2ceac332..7a452ed4 100644
6181--- a/wrappers/CMakeLists.txt
6182+++ b/wrappers/CMakeLists.txt
6183@@ -79,7 +79,7 @@ if (WIN32)
6184 include_directories (BEFORE SYSTEM ${DirectX_D3D_INCLUDE_DIR})
6185 add_custom_command (
6186 OUTPUT ddrawtrace.cpp
6187- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/ddrawtrace.cpp
6188+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ddrawtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/ddrawtrace.cpp
6189 DEPENDS
6190 ddrawtrace.py
6191 dlltrace.py
6192@@ -109,7 +109,7 @@ if (WIN32)
6193 include_directories (BEFORE SYSTEM ${DirectX_D3D9_INCLUDE_DIR} ${DirectX_D3D8_INCLUDE_DIR})
6194 add_custom_command (
6195 OUTPUT d3d8trace.cpp
6196- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d8trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d8trace.cpp
6197+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d8trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d8trace.cpp
6198 DEPENDS
6199 d3d8trace.py
6200 dlltrace.py
6201@@ -143,7 +143,7 @@ if (WIN32)
6202 include_directories (BEFORE SYSTEM ${DirectX_D3D9_INCLUDE_DIR})
6203 add_custom_command (
6204 OUTPUT d3d9trace.cpp
6205- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d9trace.cpp
6206+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3d9trace.cpp
6207 DEPENDS
6208 d3d9trace.py
6209 dlltrace.py
6210@@ -179,7 +179,7 @@ if (WIN32)
6211
6212 add_custom_command (
6213 OUTPUT dxgitrace.cpp
6214- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgitrace.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgitrace.cpp
6215+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dxgitrace.py > ${CMAKE_CURRENT_BINARY_DIR}/dxgitrace.cpp
6216 DEPENDS
6217 dxgitrace.py
6218 dlltrace.py
6219@@ -216,7 +216,7 @@ if (WIN32)
6220
6221 add_custom_command (
6222 OUTPUT d2d1trace.cpp
6223- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d2d1trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d2d1trace.cpp
6224+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d2d1trace.py > ${CMAKE_CURRENT_BINARY_DIR}/d2d1trace.cpp
6225 DEPENDS
6226 d2d1trace.py
6227 trace.py
6228@@ -241,7 +241,7 @@ if (WIN32)
6229 # opengl32.dll
6230 add_custom_command (
6231 OUTPUT wgltrace.cpp
6232- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp
6233+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp
6234 DEPENDS
6235 wgltrace.py
6236 gltrace.py
6237@@ -278,7 +278,7 @@ elseif (APPLE)
6238 # OpenGL framework
6239 add_custom_command (
6240 OUTPUT cgltrace.cpp
6241- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/cgltrace.cpp
6242+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/cgltrace.cpp
6243 DEPENDS
6244 cgltrace.py
6245 gltrace.py
6246@@ -322,7 +322,7 @@ elseif (X11_FOUND)
6247 # libGL.so
6248 add_custom_command (
6249 OUTPUT glxtrace.cpp
6250- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glxtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glxtrace.cpp
6251+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glxtrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glxtrace.cpp
6252 DEPENDS
6253 glxtrace.py
6254 gltrace.py
6255@@ -372,7 +372,7 @@ if (ENABLE_EGL AND NOT WIN32 AND NOT APPLE)
6256 # libEGL.so/libGL.so
6257 add_custom_command (
6258 OUTPUT egltrace.cpp
6259- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/egltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/egltrace.cpp
6260+ COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/egltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/egltrace.cpp
6261 DEPENDS
6262 egltrace.py
6263 gltrace.py
6264diff --git a/wrappers/cgltrace.py b/wrappers/cgltrace.py
6265index 6c72f696..02b3c518 100644
6266--- a/wrappers/cgltrace.py
6267+++ b/wrappers/cgltrace.py
6268@@ -43,55 +43,55 @@ class CglTracer(GlTracer):
6269 if function.name == 'CGLReleaseContext':
6270 # Unlike other GL APIs like EGL or GLX, CGL will make the context
6271 # not current if it's the current context.
6272- print ' if (_CGLGetContextRetainCount(ctx) == 1) {'
6273- print ' if (gltrace::releaseContext((uintptr_t)ctx)) {'
6274- print ' if (_CGLGetCurrentContext() == ctx) {'
6275- print ' gltrace::clearContext();'
6276- print ' }'
6277- print ' }'
6278- print ' }'
6279+ print(' if (_CGLGetContextRetainCount(ctx) == 1) {')
6280+ print(' if (gltrace::releaseContext((uintptr_t)ctx)) {')
6281+ print(' if (_CGLGetCurrentContext() == ctx) {')
6282+ print(' gltrace::clearContext();')
6283+ print(' }')
6284+ print(' }')
6285+ print(' }')
6286
6287 if function.name == 'CGLDestroyContext':
6288 # The same rule applies here about the as for CGLReleaseContext.
6289- print ' if (gltrace::releaseContext((uintptr_t)ctx)) {'
6290- print ' if (_CGLGetCurrentContext() == ctx) {'
6291- print ' gltrace::clearContext();'
6292- print ' }'
6293- print ' }'
6294+ print(' if (gltrace::releaseContext((uintptr_t)ctx)) {')
6295+ print(' if (_CGLGetCurrentContext() == ctx) {')
6296+ print(' gltrace::clearContext();')
6297+ print(' }')
6298+ print(' }')
6299
6300 GlTracer.traceFunctionImplBody(self, function)
6301
6302 if function.name == 'CGLCreateContext':
6303- print ' if (_result == kCGLNoError) {'
6304- print ' gltrace::createContext((uintptr_t)*ctx);'
6305- print ' }'
6306+ print(' if (_result == kCGLNoError) {')
6307+ print(' gltrace::createContext((uintptr_t)*ctx);')
6308+ print(' }')
6309
6310 if function.name == 'CGLSetCurrentContext':
6311- print ' if (_result == kCGLNoError) {'
6312- print ' if (ctx != NULL) {'
6313- print ' gltrace::setContext((uintptr_t)ctx);'
6314- print ' } else {'
6315- print ' gltrace::clearContext();'
6316- print ' }'
6317- print ' }'
6318+ print(' if (_result == kCGLNoError) {')
6319+ print(' if (ctx != NULL) {')
6320+ print(' gltrace::setContext((uintptr_t)ctx);')
6321+ print(' } else {')
6322+ print(' gltrace::clearContext();')
6323+ print(' }')
6324+ print(' }')
6325
6326 if function.name == 'CGLRetainContext':
6327- print ' gltrace::retainContext((uintptr_t)ctx);'
6328+ print(' gltrace::retainContext((uintptr_t)ctx);')
6329
6330
6331 if __name__ == '__main__':
6332- print
6333- print '#include <stdlib.h>'
6334- print '#include <string.h>'
6335- print
6336- print '#include "trace_writer_local.hpp"'
6337- print
6338- print '// To validate our prototypes'
6339- print '#define GL_GLEXT_PROTOTYPES'
6340- print
6341- print '#include "glproc.hpp"'
6342- print '#include "glsize.hpp"'
6343- print
6344+ print()
6345+ print('#include <stdlib.h>')
6346+ print('#include <string.h>')
6347+ print()
6348+ print('#include "trace_writer_local.hpp"')
6349+ print()
6350+ print('// To validate our prototypes')
6351+ print('#define GL_GLEXT_PROTOTYPES')
6352+ print()
6353+ print('#include "glproc.hpp"')
6354+ print('#include "glsize.hpp"')
6355+ print()
6356
6357 module = Module()
6358 module.mergeModule(cglapi)
6359@@ -101,7 +101,7 @@ if __name__ == '__main__':
6360 tracer = CglTracer()
6361 tracer.traceApi(api)
6362
6363- print r'''
6364+ print(r'''
6365
6366 PUBLIC
6367 void * gll_noop = 0;
6368@@ -130,4 +130,4 @@ _init(void) {
6369 setenv("SDL_OPENGL_LIBRARY", "/System/Library/Frameworks/OpenGL.framework/OpenGL", 1);
6370 }
6371
6372-'''
6373+''')
6374diff --git a/wrappers/d2d1trace.py b/wrappers/d2d1trace.py
6375index 26223005..2176341f 100644
6376--- a/wrappers/d2d1trace.py
6377+++ b/wrappers/d2d1trace.py
6378@@ -31,15 +31,15 @@ from specs.d2d1 import d2d1
6379
6380
6381 if __name__ == '__main__':
6382- print '#include "guids_defs.hpp"'
6383- print
6384- print '#include "trace_writer_local.hpp"'
6385- print '#include "os.hpp"'
6386- print
6387- print '#define DWRITE_EXPORT WINAPI'
6388- print
6389- print '#include "d2dimports.hpp"'
6390- print
6391+ print('#include "guids_defs.hpp"')
6392+ print()
6393+ print('#include "trace_writer_local.hpp"')
6394+ print('#include "os.hpp"')
6395+ print()
6396+ print('#define DWRITE_EXPORT WINAPI')
6397+ print()
6398+ print('#include "d2dimports.hpp"')
6399+ print()
6400
6401 api = API()
6402 api.addModule(d2d1)
6403diff --git a/wrappers/d3d8trace.py b/wrappers/d3d8trace.py
6404index 2903c48f..11afbca5 100644
6405--- a/wrappers/d3d8trace.py
6406+++ b/wrappers/d3d8trace.py
6407@@ -34,7 +34,7 @@ class D3D8Tracer(DllTracer):
6408 def serializeArgValue(self, function, arg):
6409 # Dump shaders as strings
6410 if arg.type is D3DSHADER8:
6411- print ' DumpShader(trace::localWriter, %s);' % (arg.name)
6412+ print(' DumpShader(trace::localWriter, %s);' % (arg.name))
6413 return
6414
6415 DllTracer.serializeArgValue(self, function, arg)
6416@@ -55,32 +55,32 @@ class D3D8Tracer(DllTracer):
6417
6418 def implementWrapperInterfaceMethodBody(self, interface, base, method):
6419 if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
6420- print ' if (_MappedSize && m_pbData) {'
6421+ print(' if (_MappedSize && m_pbData) {')
6422 self.emit_memcpy('(LPBYTE)m_pbData', '_MappedSize')
6423- print ' }'
6424+ print(' }')
6425
6426 DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
6427
6428 if method.name in ('Lock', 'LockRect', 'LockBox'):
6429 # FIXME: handle recursive locks
6430- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
6431- print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
6432- print ' } else {'
6433- print ' m_pbData = NULL;'
6434- print ' _MappedSize = 0;'
6435- print ' }'
6436+ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {')
6437+ print(' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]))
6438+ print(' } else {')
6439+ print(' m_pbData = NULL;')
6440+ print(' _MappedSize = 0;')
6441+ print(' }')
6442
6443
6444 if __name__ == '__main__':
6445- print '#define INITGUID'
6446- print
6447- print '#include "trace_writer_local.hpp"'
6448- print '#include "os.hpp"'
6449- print
6450- print '#include "d3d8imports.hpp"'
6451- print '#include "d3d8size.hpp"'
6452- print '#include "d3d9shader.hpp"'
6453- print
6454+ print('#define INITGUID')
6455+ print()
6456+ print('#include "trace_writer_local.hpp"')
6457+ print('#include "os.hpp"')
6458+ print()
6459+ print('#include "d3d8imports.hpp"')
6460+ print('#include "d3d8size.hpp"')
6461+ print('#include "d3d9shader.hpp"')
6462+ print()
6463
6464 api = API()
6465 api.addModule(d3d8)
6466diff --git a/wrappers/d3d9trace.py b/wrappers/d3d9trace.py
6467index 0850ba3e..53d5152f 100644
6468--- a/wrappers/d3d9trace.py
6469+++ b/wrappers/d3d9trace.py
6470@@ -35,7 +35,7 @@ class D3D9Tracer(DllTracer):
6471 def serializeArgValue(self, function, arg):
6472 # Dump shaders as strings
6473 if arg.type is D3DSHADER9:
6474- print ' DumpShader(trace::localWriter, %s);' % (arg.name)
6475+ print(' DumpShader(trace::localWriter, %s);' % (arg.name))
6476 return
6477
6478 DllTracer.serializeArgValue(self, function, arg)
6479@@ -72,49 +72,49 @@ class D3D9Tracer(DllTracer):
6480 def implementWrapperInterfaceMethodBody(self, interface, base, method):
6481 if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
6482 if interface.name in ['IDirect3DTexture9']:
6483- print ' std::map<UINT, std::pair<size_t, VOID *> >::iterator it = _MappedData.find(Level);'
6484- print ' if (it != _MappedData.end()) {'
6485+ print(' std::map<UINT, std::pair<size_t, VOID *> >::iterator it = _MappedData.find(Level);')
6486+ print(' if (it != _MappedData.end()) {')
6487 self.emit_memcpy('(LPBYTE)it->second.second', 'it->second.first')
6488- print ' _MappedData.erase(it);'
6489- print ' }'
6490+ print(' _MappedData.erase(it);')
6491+ print(' }')
6492 else:
6493- print ' if (_MappedSize && m_pbData) {'
6494+ print(' if (_MappedSize && m_pbData) {')
6495 self.emit_memcpy('(LPBYTE)m_pbData', '_MappedSize')
6496- print ' }'
6497+ print(' }')
6498
6499 DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
6500
6501 if method.name in ('Lock', 'LockRect', 'LockBox'):
6502 if interface.name in ['IDirect3DTexture9']:
6503- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
6504- print ' size_t mappedSize;'
6505- print ' VOID * pbData;'
6506- print ' _getMapInfo(_this, %s, pbData, mappedSize);' % ', '.join(method.argNames()[:-1])
6507- print ' _MappedData[Level] = std::make_pair(mappedSize, pbData);'
6508- print ' } else {'
6509- print ' _MappedData.erase(Level);'
6510- print ' }'
6511+ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {')
6512+ print(' size_t mappedSize;')
6513+ print(' VOID * pbData;')
6514+ print(' _getMapInfo(_this, %s, pbData, mappedSize);' % ', '.join(method.argNames()[:-1]))
6515+ print(' _MappedData[Level] = std::make_pair(mappedSize, pbData);')
6516+ print(' } else {')
6517+ print(' _MappedData.erase(Level);')
6518+ print(' }')
6519 else:
6520 # FIXME: handle recursive locks
6521- print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
6522- print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
6523- print ' } else {'
6524- print ' m_pbData = NULL;'
6525- print ' _MappedSize = 0;'
6526- print ' }'
6527+ print(' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {')
6528+ print(' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]))
6529+ print(' } else {')
6530+ print(' m_pbData = NULL;')
6531+ print(' _MappedSize = 0;')
6532+ print(' }')
6533
6534
6535 if __name__ == '__main__':
6536- print '#define INITGUID'
6537- print
6538- print '#include "trace_writer_local.hpp"'
6539- print '#include "os.hpp"'
6540- print
6541- print '#include "d3d9imports.hpp"'
6542- print '#include "d3d9size.hpp"'
6543- print '#include "d3d9shader.hpp"'
6544- print '#include "dxva2imports.hpp"'
6545- print
6546+ print('#define INITGUID')
6547+ print()
6548+ print('#include "trace_writer_local.hpp"')
6549+ print('#include "os.hpp"')
6550+ print()
6551+ print('#include "d3d9imports.hpp"')
6552+ print('#include "d3d9size.hpp"')
6553+ print('#include "d3d9shader.hpp"')
6554+ print('#include "dxva2imports.hpp"')
6555+ print()
6556
6557 d3d9.mergeModule(d3dperf)
6558
6559diff --git a/wrappers/ddrawtrace.py b/wrappers/ddrawtrace.py
6560index 96602d21..da7ffbe7 100644
6561--- a/wrappers/ddrawtrace.py
6562+++ b/wrappers/ddrawtrace.py
6563@@ -41,12 +41,12 @@ class DDrawTracer(DllTracer):
6564
6565
6566 if __name__ == '__main__':
6567- print '#define INITGUID'
6568- print '#include "d3dimports.hpp"'
6569- print '#include "trace_writer_local.hpp"'
6570- print '#include "d3d7size.hpp"'
6571- print '#include "os.hpp"'
6572- print
6573+ print('#define INITGUID')
6574+ print('#include "d3dimports.hpp"')
6575+ print('#include "trace_writer_local.hpp"')
6576+ print('#include "d3d7size.hpp"')
6577+ print('#include "os.hpp"')
6578+ print()
6579
6580 api = API()
6581 api.addModule(ddraw)
6582diff --git a/wrappers/dlltrace.py b/wrappers/dlltrace.py
6583index 26962216..8ac18b0c 100644
6584--- a/wrappers/dlltrace.py
6585+++ b/wrappers/dlltrace.py
6586@@ -37,24 +37,24 @@ class DllDispatcher(Dispatcher):
6587
6588 def dispatchModule(self, module):
6589 tag = module.name.upper()
6590- print r'HMODULE g_h%sModule = NULL;' % (tag,)
6591- print r''
6592- print r'static PROC'
6593- print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
6594- print r' if (!g_h%sModule) {' % tag
6595- print r' char szDll[MAX_PATH] = {0};'
6596- print r' if (!GetSystemDirectoryA(szDll, MAX_PATH)) {'
6597- print r' return NULL;'
6598- print r' }'
6599- print r' strcat(szDll, "\\%s.dll");' % module.name
6600- print r' g_h%sModule = LoadLibraryA(szDll);' % tag
6601- print r' if (!g_h%sModule) {' % tag
6602- print r' return NULL;'
6603- print r' }'
6604- print r' }'
6605- print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag
6606- print r'}'
6607- print r''
6608+ print(r'HMODULE g_h%sModule = NULL;' % (tag,))
6609+ print(r'')
6610+ print(r'static PROC')
6611+ print(r'_get%sProcAddress(LPCSTR lpProcName) {' % tag)
6612+ print(r' if (!g_h%sModule) {' % tag)
6613+ print(r' char szDll[MAX_PATH] = {0};')
6614+ print(r' if (!GetSystemDirectoryA(szDll, MAX_PATH)) {')
6615+ print(r' return NULL;')
6616+ print(r' }')
6617+ print(r' strcat(szDll, "\\%s.dll");' % module.name)
6618+ print(r' g_h%sModule = LoadLibraryA(szDll);' % tag)
6619+ print(r' if (!g_h%sModule) {' % tag)
6620+ print(r' return NULL;')
6621+ print(r' }')
6622+ print(r' }')
6623+ print(r' return GetProcAddress(g_h%sModule, lpProcName);' % tag)
6624+ print(r'}')
6625+ print(r'')
6626
6627 Dispatcher.dispatchModule(self, module)
6628
6629diff --git a/wrappers/dxgitrace.py b/wrappers/dxgitrace.py
6630index 3edda2c2..134f45d7 100644
6631--- a/wrappers/dxgitrace.py
6632+++ b/wrappers/dxgitrace.py
6633@@ -40,47 +40,47 @@ class D3DCommonTracer(DllTracer):
6634 def serializeArgValue(self, function, arg):
6635 # Dump shaders as strings
6636 if isinstance(arg.type, stdapi.Blob) and arg.name.startswith('pShaderBytecode'):
6637- print ' DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size)
6638+ print(' DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size))
6639 return
6640
6641 # Serialize the swapchain dimensions
6642 if function.name == 'CreateSwapChain' and arg.name == 'pDesc' \
6643 or arg.name == 'pSwapChainDesc':
6644- print r' DXGI_SWAP_CHAIN_DESC *_pSwapChainDesc = NULL;'
6645- print r' DXGI_SWAP_CHAIN_DESC _SwapChainDesc;'
6646- print r' if (%s) {' % arg.name
6647- print r' _SwapChainDesc = *%s;' % arg.name
6648+ print(r' DXGI_SWAP_CHAIN_DESC *_pSwapChainDesc = NULL;')
6649+ print(r' DXGI_SWAP_CHAIN_DESC _SwapChainDesc;')
6650+ print(r' if (%s) {' % arg.name)
6651+ print(r' _SwapChainDesc = *%s;' % arg.name)
6652 if function.name != 'CreateSwapChain' or not self.interface.name.endswith('DWM'):
6653 # Obtain size from the window
6654- print r' RECT _rect;'
6655- print r' if (GetClientRect(%s->OutputWindow, &_rect)) {' % arg.name
6656- print r' if (%s->BufferDesc.Width == 0) {' % arg.name
6657- print r' _SwapChainDesc.BufferDesc.Width = _rect.right - _rect.left;'
6658- print r' }'
6659- print r' if (%s->BufferDesc.Height == 0) {' % arg.name
6660- print r' _SwapChainDesc.BufferDesc.Height = _rect.bottom - _rect.top;'
6661- print r' }'
6662- print r' }'
6663+ print(r' RECT _rect;')
6664+ print(r' if (GetClientRect(%s->OutputWindow, &_rect)) {' % arg.name)
6665+ print(r' if (%s->BufferDesc.Width == 0) {' % arg.name)
6666+ print(r' _SwapChainDesc.BufferDesc.Width = _rect.right - _rect.left;')
6667+ print(r' }')
6668+ print(r' if (%s->BufferDesc.Height == 0) {' % arg.name)
6669+ print(r' _SwapChainDesc.BufferDesc.Height = _rect.bottom - _rect.top;')
6670+ print(r' }')
6671+ print(r' }')
6672 else:
6673 # Obtain size from the output
6674- print r' DXGI_OUTPUT_DESC _OutputDesc;'
6675- print r' if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {'
6676- print r' _SwapChainDesc.BufferDesc.Width = _OutputDesc.DesktopCoordinates.right - _OutputDesc.DesktopCoordinates.left;'
6677- print r' _SwapChainDesc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;'
6678- print r' }'
6679- print r' _pSwapChainDesc = &_SwapChainDesc;'
6680- print r' }'
6681+ print(r' DXGI_OUTPUT_DESC _OutputDesc;')
6682+ print(r' if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {')
6683+ print(r' _SwapChainDesc.BufferDesc.Width = _OutputDesc.DesktopCoordinates.right - _OutputDesc.DesktopCoordinates.left;')
6684+ print(r' _SwapChainDesc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;')
6685+ print(r' }')
6686+ print(r' _pSwapChainDesc = &_SwapChainDesc;')
6687+ print(r' }')
6688 self.serializeValue(arg.type, '_pSwapChainDesc')
6689 return
6690
6691 # Serialize object names
6692 if function.name == 'SetPrivateData' and arg.name == 'pData':
6693 iid = function.args[0].name
6694- print r' if (%s == WKPDID_D3DDebugObjectName) {' % iid
6695- print r' trace::localWriter.writeString(static_cast<const char *>(pData), DataSize);'
6696- print r' } else {'
6697+ print(r' if (%s == WKPDID_D3DDebugObjectName) {' % iid)
6698+ print(r' trace::localWriter.writeString(static_cast<const char *>(pData), DataSize);')
6699+ print(r' } else {')
6700 DllTracer.serializeArgValue(self, function, arg)
6701- print r' }'
6702+ print(r' }')
6703 return
6704
6705 DllTracer.serializeArgValue(self, function, arg)
6706@@ -110,47 +110,47 @@ class D3DCommonTracer(DllTracer):
6707 if method.getArgByName('pInitialData'):
6708 pDesc1 = method.getArgByName('pDesc1')
6709 if pDesc1 is not None:
6710- print r' %s pDesc = pDesc1;' % (pDesc1.type,)
6711+ print(r' %s pDesc = pDesc1;' % (pDesc1.type,))
6712
6713 if method.name in ('Map', 'Unmap'):
6714 # On D3D11 Map/Unmap is not a resource method, but a context method instead.
6715 resourceArg = method.getArgByName('pResource')
6716 if resourceArg is None:
6717- print ' _MAP_DESC & _MapDesc = m_MapDesc;'
6718+ print(' _MAP_DESC & _MapDesc = m_MapDesc;')
6719 else:
6720- print ' _MAP_DESC & _MapDesc = m_MapDescs[std::pair<%s, UINT>(pResource, Subresource)];' % resourceArg.type
6721+ print(' _MAP_DESC & _MapDesc = m_MapDescs[std::pair<%s, UINT>(pResource, Subresource)];' % resourceArg.type)
6722
6723 if method.name == 'Unmap':
6724- print ' if (_MapDesc.Size && _MapDesc.pData) {'
6725+ print(' if (_MapDesc.Size && _MapDesc.pData) {')
6726 self.emit_memcpy('_MapDesc.pData', '_MapDesc.Size')
6727- print ' }'
6728+ print(' }')
6729
6730 DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
6731
6732 if method.name == 'Map':
6733 # NOTE: recursive locks are explicitely forbidden
6734- print ' if (SUCCEEDED(_result)) {'
6735- print ' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames())
6736- print ' } else {'
6737- print ' _MapDesc.pData = NULL;'
6738- print ' _MapDesc.Size = 0;'
6739- print ' }'
6740+ print(' if (SUCCEEDED(_result)) {')
6741+ print(' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames()))
6742+ print(' } else {')
6743+ print(' _MapDesc.pData = NULL;')
6744+ print(' _MapDesc.Size = 0;')
6745+ print(' }')
6746
6747
6748 if __name__ == '__main__':
6749- print r'#define INITGUID'
6750- print
6751- print r'#include "trace_writer_local.hpp"'
6752- print r'#include "os.hpp"'
6753- print
6754- print r'#include "d3dcommonshader.hpp"'
6755- print
6756- print r'#include "d3d10imports.hpp"'
6757- print r'#include "d3d10size.hpp"'
6758- print r'#include "d3d11imports.hpp"'
6759- print r'#include "d3d11size.hpp"'
6760- print r'#include "d3d9imports.hpp" // D3DPERF_*'
6761- print
6762+ print(r'#define INITGUID')
6763+ print()
6764+ print(r'#include "trace_writer_local.hpp"')
6765+ print(r'#include "os.hpp"')
6766+ print()
6767+ print(r'#include "d3dcommonshader.hpp"')
6768+ print()
6769+ print(r'#include "d3d10imports.hpp"')
6770+ print(r'#include "d3d10size.hpp"')
6771+ print(r'#include "d3d11imports.hpp"')
6772+ print(r'#include "d3d11size.hpp"')
6773+ print(r'#include "d3d9imports.hpp" // D3DPERF_*')
6774+ print()
6775
6776 api = API()
6777 api.addModule(dxgi.dxgi)
6778diff --git a/wrappers/egltrace.py b/wrappers/egltrace.py
6779index 1fcb0fd6..f5b61c0c 100644
6780--- a/wrappers/egltrace.py
6781+++ b/wrappers/egltrace.py
6782@@ -50,239 +50,239 @@ class EglTracer(GlTracer):
6783
6784 def traceFunctionImplBody(self, function):
6785 if function.name == 'glTexDirectMapVIV':
6786- print ' // prevent loop call'
6787- print ' glTexDirectVIVMap(target, width, height, format, Logical, Physical);'
6788+ print(' // prevent loop call')
6789+ print(' glTexDirectVIVMap(target, width, height, format, Logical, Physical);')
6790 return
6791
6792 if function.name == 'glTexDirectInvalidateVIV':
6793- print ' // get current texture'
6794- print ' GLint tex = 0;'
6795- print ' int32_t size = 0;'
6796- print ' int32_t ysize = 0;'
6797- print ' int32_t usize = 0;'
6798- print ' int32_t vsize = 0;'
6799- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);'
6800- print ' if(tex == 0)'
6801- print ' {'
6802- print ' return;'
6803- print ' }'
6804- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];'
6805- print ' switch(data.format){'
6806- print ' case GL_VIV_YV12:'
6807- print ' case GL_VIV_I420:'
6808- print ' ysize=data.width * data.height;'
6809- print ' usize=ysize/4;'
6810- print ' vsize=usize;'
6811- print ' break;'
6812- print ' case GL_VIV_NV12:'
6813- print ' case GL_VIV_NV21:'
6814- print ' ysize=data.width * data.height;'
6815- print ' usize=ysize/2;'
6816- print ' vsize=0;'
6817- print ' break;'
6818- print ' case GL_RGBA:'
6819- print ' case GL_BGRA_EXT:'
6820- print ' ysize=data.width * data.height *4;'
6821- print ' usize=0;'
6822- print ' vsize=0;'
6823- print ' break;'
6824- print ' case GL_RGB:'
6825- print ' ysize=data.width * data.height *3;'
6826- print ' usize=0;'
6827- print ' vsize=0;'
6828- print ' break;'
6829- print ' case GL_VIV_YUY2:'
6830- print ' case GL_VIV_UYVY:'
6831- print ' case GL_RGB565_OES:'
6832- print ' case GL_LUMINANCE8_ALPHA8_EXT:'
6833- print ' ysize=data.width * data.height *2;'
6834- print ' usize=0;'
6835- print ' vsize=0;'
6836- print ' break;'
6837- print ' case GL_ALPHA:'
6838- print ' ysize=data.width * data.height;'
6839- print ' usize=0;'
6840- print ' vsize=0;'
6841- print ' break;'
6842- print ' default:'
6843- print ' return;'
6844- print ' }'
6845- print ' if (NULL==(GLvoid*)data.logical) {'
6846- print ' if (ysize > 0) {'
6847+ print(' // get current texture')
6848+ print(' GLint tex = 0;')
6849+ print(' int32_t size = 0;')
6850+ print(' int32_t ysize = 0;')
6851+ print(' int32_t usize = 0;')
6852+ print(' int32_t vsize = 0;')
6853+ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);')
6854+ print(' if(tex == 0)')
6855+ print(' {')
6856+ print(' return;')
6857+ print(' }')
6858+ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];')
6859+ print(' switch(data.format){')
6860+ print(' case GL_VIV_YV12:')
6861+ print(' case GL_VIV_I420:')
6862+ print(' ysize=data.width * data.height;')
6863+ print(' usize=ysize/4;')
6864+ print(' vsize=usize;')
6865+ print(' break;')
6866+ print(' case GL_VIV_NV12:')
6867+ print(' case GL_VIV_NV21:')
6868+ print(' ysize=data.width * data.height;')
6869+ print(' usize=ysize/2;')
6870+ print(' vsize=0;')
6871+ print(' break;')
6872+ print(' case GL_RGBA:')
6873+ print(' case GL_BGRA_EXT:')
6874+ print(' ysize=data.width * data.height *4;')
6875+ print(' usize=0;')
6876+ print(' vsize=0;')
6877+ print(' break;')
6878+ print(' case GL_RGB:')
6879+ print(' ysize=data.width * data.height *3;')
6880+ print(' usize=0;')
6881+ print(' vsize=0;')
6882+ print(' break;')
6883+ print(' case GL_VIV_YUY2:')
6884+ print(' case GL_VIV_UYVY:')
6885+ print(' case GL_RGB565_OES:')
6886+ print(' case GL_LUMINANCE8_ALPHA8_EXT:')
6887+ print(' ysize=data.width * data.height *2;')
6888+ print(' usize=0;')
6889+ print(' vsize=0;')
6890+ print(' break;')
6891+ print(' case GL_ALPHA:')
6892+ print(' ysize=data.width * data.height;')
6893+ print(' usize=0;')
6894+ print(' vsize=0;')
6895+ print(' break;')
6896+ print(' default:')
6897+ print(' return;')
6898+ print(' }')
6899+ print(' if (NULL==(GLvoid*)data.logical) {')
6900+ print(' if (ysize > 0) {')
6901 self.emit_memcpy_opt('(GLvoid*)data.planes[0]', 'ysize')
6902- print ' }'
6903- print ' if (usize > 0) {'
6904+ print(' }')
6905+ print(' if (usize > 0) {')
6906 self.emit_memcpy_opt('(GLvoid*)data.planes[1]', 'usize')
6907- print ' }'
6908- print ' if (vsize > 0) {'
6909+ print(' }')
6910+ print(' if (vsize > 0) {')
6911 self.emit_memcpy_opt('(GLvoid*)data.planes[2]', 'vsize')
6912- print ' }'
6913- print ' } else {'
6914- print ' size = ysize + usize + vsize;'
6915- print ' if (size > 0) {'
6916+ print(' }')
6917+ print(' } else {')
6918+ print(' size = ysize + usize + vsize;')
6919+ print(' if (size > 0) {')
6920 self.emit_memcpy_opt('(GLvoid*)data.logical', 'size')
6921- print ' }'
6922- print ' }'
6923+ print(' }')
6924+ print(' }')
6925
6926 if function.name == 'eglGetProcAddress':
6927- print ' procname = __get_alias_func_name(procname);'
6928+ print(' procname = __get_alias_func_name(procname);')
6929
6930 GlTracer.traceFunctionImplBody(self, function)
6931
6932 if function.name == 'glTexDirectVIV':
6933- print ' // get current texture'
6934- print ' GLint tex = 0;'
6935- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);'
6936- print ' if(tex != 0)'
6937- print ' {'
6938- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];'
6939- print ' data.width = width;'
6940- print ' data.height = height;'
6941- print ' data.format = format;'
6942- print ' data.planes[0] = pixels[0];'
6943- print ' data.planes[1] = pixels[1];'
6944- print ' data.planes[2] = pixels[2];'
6945- print ' }'
6946+ print(' // get current texture')
6947+ print(' GLint tex = 0;')
6948+ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);')
6949+ print(' if(tex != 0)')
6950+ print(' {')
6951+ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];')
6952+ print(' data.width = width;')
6953+ print(' data.height = height;')
6954+ print(' data.format = format;')
6955+ print(' data.planes[0] = pixels[0];')
6956+ print(' data.planes[1] = pixels[1];')
6957+ print(' data.planes[2] = pixels[2];')
6958+ print(' }')
6959
6960 if function.name == 'glTexDirectVIVMap' or function.name == 'glTexDirectTiledMapVIV':
6961- print ' // get current texture'
6962- print ' GLint tex = 0;'
6963- print ' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);'
6964- print ' if(tex != 0)'
6965- print ' {'
6966- print ' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];'
6967- print ' data.width = width;'
6968- print ' data.height = height;'
6969- print ' data.format = format;'
6970- print ' data.logical = *Logical; // Logical != NULL'
6971- print ' data.physical = *Physical;'
6972- print ' }'
6973+ print(' // get current texture')
6974+ print(' GLint tex = 0;')
6975+ print(' _glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);')
6976+ print(' if(tex != 0)')
6977+ print(' {')
6978+ print(' TEXDIRECTVIVDATA &data = _directTextureDataMap[tex];')
6979+ print(' data.width = width;')
6980+ print(' data.height = height;')
6981+ print(' data.format = format;')
6982+ print(' data.logical = *Logical; // Logical != NULL')
6983+ print(' data.physical = *Physical;')
6984+ print(' }')
6985
6986 if function.name == 'eglCreateContext':
6987- print ' if (_result != EGL_NO_CONTEXT)'
6988- print ' gltrace::createContext((uintptr_t)_result);'
6989+ print(' if (_result != EGL_NO_CONTEXT)')
6990+ print(' gltrace::createContext((uintptr_t)_result);')
6991
6992 if function.name == 'eglMakeCurrent':
6993- print r' if (_result) {'
6994- print r' // update the profile'
6995- print r' if (ctx != EGL_NO_CONTEXT) {'
6996- print r' gltrace::setContext((uintptr_t)ctx);'
6997- print r' gltrace::Context *tr = gltrace::getContext();'
6998- print r' EGLint api = EGL_OPENGL_ES_API;'
6999- print r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);'
7000- print r' if (api == EGL_OPENGL_API) {'
7001- print r' assert(tr->profile.api == glprofile::API_GL);'
7002- print r' } else if (api == EGL_OPENGL_ES_API) {'
7003- print r' EGLint client_version = 1;'
7004- print r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &client_version);'
7005- print r' if (tr->profile.api != glprofile::API_GLES ||'
7006- print r' tr->profile.major < client_version) {'
7007- print r' std::string version = tr->profile.str();'
7008- print r' os::log("apitrace: warning: eglMakeCurrent: expected OpenGL ES %i.x context, but got %s\n",'
7009- print r' client_version, version.c_str());'
7010- print r' }'
7011- print r' } else {'
7012- print r' assert(0);'
7013- print r' }'
7014- print r' } else {'
7015- print r' gltrace::clearContext();'
7016- print r' }'
7017- print r' }'
7018+ print(r' if (_result) {')
7019+ print(r' // update the profile')
7020+ print(r' if (ctx != EGL_NO_CONTEXT) {')
7021+ print(r' gltrace::setContext((uintptr_t)ctx);')
7022+ print(r' gltrace::Context *tr = gltrace::getContext();')
7023+ print(r' EGLint api = EGL_OPENGL_ES_API;')
7024+ print(r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_TYPE, &api);')
7025+ print(r' if (api == EGL_OPENGL_API) {')
7026+ print(r' assert(tr->profile.api == glprofile::API_GL);')
7027+ print(r' } else if (api == EGL_OPENGL_ES_API) {')
7028+ print(r' EGLint client_version = 1;')
7029+ print(r' _eglQueryContext(dpy, ctx, EGL_CONTEXT_CLIENT_VERSION, &client_version);')
7030+ print(r' if (tr->profile.api != glprofile::API_GLES ||')
7031+ print(r' tr->profile.major < client_version) {')
7032+ print(r' std::string version = tr->profile.str();')
7033+ print(r' os::log("apitrace: warning: eglMakeCurrent: expected OpenGL ES %i.x context, but got %s\n",')
7034+ print(r' client_version, version.c_str());')
7035+ print(r' }')
7036+ print(r' } else {')
7037+ print(r' assert(0);')
7038+ print(r' }')
7039+ print(r' } else {')
7040+ print(r' gltrace::clearContext();')
7041+ print(r' }')
7042+ print(r' }')
7043
7044 if function.name == 'eglDestroyContext':
7045- print ' if (_result) {'
7046- print ' gltrace::releaseContext((uintptr_t)ctx);'
7047- print ' }'
7048+ print(' if (_result) {')
7049+ print(' gltrace::releaseContext((uintptr_t)ctx);')
7050+ print(' }')
7051
7052 if function.name == 'glEGLImageTargetTexture2DOES':
7053- print ' image_info *info = _EGLImageKHR_get_image_info(target, image);'
7054- print ' if (info) {'
7055- print ' GLint level = 0;'
7056- print ' GLint internalformat = info->internalformat;'
7057- print ' GLsizei width = info->width;'
7058- print ' GLsizei height = info->height;'
7059- print ' GLint border = 0;'
7060- print ' GLenum format = info->format;'
7061- print ' GLenum type = info->type;'
7062- print ' const GLvoid * pixels = info->pixels;'
7063+ print(' image_info *info = _EGLImageKHR_get_image_info(target, image);')
7064+ print(' if (info) {')
7065+ print(' GLint level = 0;')
7066+ print(' GLint internalformat = info->internalformat;')
7067+ print(' GLsizei width = info->width;')
7068+ print(' GLsizei height = info->height;')
7069+ print(' GLint border = 0;')
7070+ print(' GLenum format = info->format;')
7071+ print(' GLenum type = info->type;')
7072+ print(' const GLvoid * pixels = info->pixels;')
7073 self.emitFakeTexture2D()
7074- print ' _EGLImageKHR_free_image_info(info);'
7075- print ' }'
7076+ print(' _EGLImageKHR_free_image_info(info);')
7077+ print(' }')
7078
7079
7080 if __name__ == '__main__':
7081- print '#include <stdlib.h>'
7082- print '#include <string.h>'
7083- print
7084- print '#include "trace_writer_local.hpp"'
7085- print
7086- print '// To validate our prototypes'
7087- print '#define GL_GLEXT_PROTOTYPES'
7088- print '#define EGL_EGLEXT_PROTOTYPES'
7089- print
7090- print '#include "dlopen.hpp"'
7091- print '#include "glproc.hpp"'
7092- print '#include "glsize.hpp"'
7093- print '#include "eglsize.hpp"'
7094- print
7095- print 'static const char *__get_alias_func_name(const char *origFunName)'
7096- print '{'
7097- print ' /* Vivante driver uses alias name for following OES/EXT functions, that means dlsym for thoese functions will fail */'
7098- print ' static const char * __glExtProcAlias[][2] ='
7099- print ' {'
7100- print ' /* Extension API alias for GL_OES_texture_3D */'
7101- print ' {"glTexImage3DOES", "glTexImage3D"},'
7102- print ' {"glTexSubImage3DOES", "glTexSubImage3D"},'
7103- print ' {"glCopyTexSubImage3DOES", "glCopyTexSubImage3D"},'
7104- print ' {"glCompressedTexImage3DOES", "glCompressedTexImage3D"},'
7105- print ' {"glCompressedTexSubImage3DOES", "glCompressedTexSubImage3D"},'
7106- print
7107- print ' /* Extension API alias for GL_OES_get_program_binary */'
7108- print ' {"glGetProgramBinaryOES", "glGetProgramBinary"},'
7109- print ' {"glProgramBinaryOES", "glProgramBinary"},'
7110- print
7111- print ' /* Extension API alias for GL_OES_vertex_array_object */'
7112- print ' {"glBindVertexArrayOES", "glBindVertexArray"},'
7113- print ' {"glDeleteVertexArraysOES", "glDeleteVertexArrays"},'
7114- print ' {"glGenVertexArraysOES", "glGenVertexArrays"},'
7115- print ' {"glIsVertexArrayOES", "glIsVertexArray"},'
7116- print
7117- print ' /* Extension API alias for GL_OES_blend_minmax */'
7118- print ' {"glBlendEquationEXT", "glBlendEquation"}'
7119- print ' };'
7120- print
7121- print ' int count = sizeof(__glExtProcAlias) / sizeof(__glExtProcAlias[0]);'
7122- print ' int i;'
7123- print
7124- print ' for(i=0; i<count; i++)'
7125- print ' {'
7126- print ' if(strcmp(__glExtProcAlias[i][0], origFunName) == 0)'
7127- print ' return __glExtProcAlias[i][1];'
7128- print ' }'
7129- print
7130- print ' return origFunName;'
7131- print '}'
7132-
7133- print
7134- print 'typedef struct TexDirectVivData'
7135- print '{'
7136- print ' int width;'
7137- print ' int height;'
7138- print ' GLenum format;'
7139- print ' GLvoid*planes[3]; // used for glTexDirectVIV'
7140- print ' GLvoid*logical; // used for glTexDirectVIVMap/glTexDirectMapVIV/glTexDirectTiledMapVIV'
7141- print ' GLuint physical;'
7142- print '}TEXDIRECTVIVDATA;'
7143- print
7144- print 'static std::map<GLint, TEXDIRECTVIVDATA> _directTextureDataMap;'
7145- print
7146- print '#define GL_VIV_YV12 0x8FC0'
7147- print '#define GL_VIV_NV12 0x8FC1'
7148- print '#define GL_VIV_YUY2 0x8FC2'
7149- print '#define GL_VIV_UYVY 0x8FC3'
7150- print '#define GL_VIV_NV21 0x8FC4'
7151- print '#define GL_VIV_I420 0x8FC5'
7152- print
7153+ print('#include <stdlib.h>')
7154+ print('#include <string.h>')
7155+ print()
7156+ print('#include "trace_writer_local.hpp"')
7157+ print()
7158+ print('// To validate our prototypes')
7159+ print('#define GL_GLEXT_PROTOTYPES')
7160+ print('#define EGL_EGLEXT_PROTOTYPES')
7161+ print()
7162+ print('#include "dlopen.hpp"')
7163+ print('#include "glproc.hpp"')
7164+ print('#include "glsize.hpp"')
7165+ print('#include "eglsize.hpp"')
7166+ print()
7167+ print('static const char *__get_alias_func_name(const char *origFunName)')
7168+ print('{')
7169+ print(' /* Vivante driver uses alias name for following OES/EXT functions, that means dlsym for thoese functions will fail */')
7170+ print(' static const char * __glExtProcAlias[][2] =')
7171+ print(' {')
7172+ print(' /* Extension API alias for GL_OES_texture_3D */')
7173+ print(' {"glTexImage3DOES", "glTexImage3D"},')
7174+ print(' {"glTexSubImage3DOES", "glTexSubImage3D"},')
7175+ print(' {"glCopyTexSubImage3DOES", "glCopyTexSubImage3D"},')
7176+ print(' {"glCompressedTexImage3DOES", "glCompressedTexImage3D"},')
7177+ print(' {"glCompressedTexSubImage3DOES", "glCompressedTexSubImage3D"},')
7178+ print()
7179+ print(' /* Extension API alias for GL_OES_get_program_binary */')
7180+ print(' {"glGetProgramBinaryOES", "glGetProgramBinary"},')
7181+ print(' {"glProgramBinaryOES", "glProgramBinary"},')
7182+ print()
7183+ print(' /* Extension API alias for GL_OES_vertex_array_object */')
7184+ print(' {"glBindVertexArrayOES", "glBindVertexArray"},')
7185+ print(' {"glDeleteVertexArraysOES", "glDeleteVertexArrays"},')
7186+ print(' {"glGenVertexArraysOES", "glGenVertexArrays"},')
7187+ print(' {"glIsVertexArrayOES", "glIsVertexArray"},')
7188+ print()
7189+ print(' /* Extension API alias for GL_OES_blend_minmax */')
7190+ print(' {"glBlendEquationEXT", "glBlendEquation"}')
7191+ print(' };')
7192+ print()
7193+ print(' int count = sizeof(__glExtProcAlias) / sizeof(__glExtProcAlias[0]);')
7194+ print(' int i;')
7195+ print()
7196+ print(' for(i=0; i<count; i++)')
7197+ print(' {')
7198+ print(' if(strcmp(__glExtProcAlias[i][0], origFunName) == 0)')
7199+ print(' return __glExtProcAlias[i][1];')
7200+ print(' }')
7201+ print()
7202+ print(' return origFunName;')
7203+ print('}')
7204+
7205+ print()
7206+ print('typedef struct TexDirectVivData')
7207+ print('{')
7208+ print(' int width;')
7209+ print(' int height;')
7210+ print(' GLenum format;')
7211+ print(' GLvoid*planes[3]; // used for glTexDirectVIV')
7212+ print(' GLvoid*logical; // used for glTexDirectVIVMap/glTexDirectMapVIV/glTexDirectTiledMapVIV')
7213+ print(' GLuint physical;')
7214+ print('}TEXDIRECTVIVDATA;')
7215+ print()
7216+ print('static std::map<GLint, TEXDIRECTVIVDATA> _directTextureDataMap;')
7217+ print()
7218+ print('#define GL_VIV_YV12 0x8FC0')
7219+ print('#define GL_VIV_NV12 0x8FC1')
7220+ print('#define GL_VIV_YUY2 0x8FC2')
7221+ print('#define GL_VIV_UYVY 0x8FC3')
7222+ print('#define GL_VIV_NV21 0x8FC4')
7223+ print('#define GL_VIV_I420 0x8FC5')
7224+ print()
7225
7226 module = Module()
7227 module.mergeModule(eglapi)
7228@@ -292,7 +292,7 @@ if __name__ == '__main__':
7229 tracer = EglTracer()
7230 tracer.traceApi(api)
7231
7232- print r'''
7233+ print(r'''
7234
7235
7236
7237@@ -453,8 +453,8 @@ void APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, GLsizei stride,
7238 #endif /* ANDROID */
7239
7240
7241-'''
7242- print r'''
7243+''')
7244+ print(r'''
7245 /*
7246 * let the GPU driver know that we are in apitrace
7247 */
7248@@ -464,4 +464,4 @@ int APIENTRY ApiTraceEnabled(void) {
7249 return 1;
7250 }
7251
7252-'''
7253+''')
7254diff --git a/wrappers/gltrace.py b/wrappers/gltrace.py
7255index cf13ae18..02504148 100644
7256--- a/wrappers/gltrace.py
7257+++ b/wrappers/gltrace.py
7258@@ -79,7 +79,7 @@ class TypeGetter(stdapi.Visitor):
7259 suffix = 'iv'
7260 arg_type = 'GLint'
7261 else:
7262- print alias.expr
7263+ print(alias.expr)
7264 assert False
7265 function_name = self.prefix + suffix + self.ext_suffix
7266 return function_name, arg_type
7267@@ -114,48 +114,48 @@ class GlTracer(Tracer):
7268 def header(self, api):
7269 Tracer.header(self, api)
7270
7271- print '#include <algorithm>'
7272- print
7273- print '#include "gltrace.hpp"'
7274- print
7275+ print('#include <algorithm>')
7276+ print()
7277+ print('#include "gltrace.hpp"')
7278+ print()
7279
7280 # Which glVertexAttrib* variant to use
7281- print 'enum vertex_attrib {'
7282- print ' VERTEX_ATTRIB,'
7283- print ' VERTEX_ATTRIB_NV,'
7284- print '};'
7285- print
7286- print 'static vertex_attrib _get_vertex_attrib(void) {'
7287- print ' gltrace::Context *ctx = gltrace::getContext();'
7288- print ' if (ctx->user_arrays_nv) {'
7289- print ' GLboolean _vertex_program = GL_FALSE;'
7290- print ' _glGetBooleanv(GL_VERTEX_PROGRAM_ARB, &_vertex_program);'
7291- print ' if (_vertex_program) {'
7292- print ' if (ctx->user_arrays_nv) {'
7293- print ' GLint _vertex_program_binding_nv = _glGetInteger(GL_VERTEX_PROGRAM_BINDING_NV);'
7294- print ' if (_vertex_program_binding_nv) {'
7295- print ' return VERTEX_ATTRIB_NV;'
7296- print ' }'
7297- print ' }'
7298- print ' }'
7299- print ' }'
7300- print ' return VERTEX_ATTRIB;'
7301- print '}'
7302- print
7303+ print('enum vertex_attrib {')
7304+ print(' VERTEX_ATTRIB,')
7305+ print(' VERTEX_ATTRIB_NV,')
7306+ print('};')
7307+ print()
7308+ print('static vertex_attrib _get_vertex_attrib(void) {')
7309+ print(' gltrace::Context *ctx = gltrace::getContext();')
7310+ print(' if (ctx->user_arrays_nv) {')
7311+ print(' GLboolean _vertex_program = GL_FALSE;')
7312+ print(' _glGetBooleanv(GL_VERTEX_PROGRAM_ARB, &_vertex_program);')
7313+ print(' if (_vertex_program) {')
7314+ print(' if (ctx->user_arrays_nv) {')
7315+ print(' GLint _vertex_program_binding_nv = _glGetInteger(GL_VERTEX_PROGRAM_BINDING_NV);')
7316+ print(' if (_vertex_program_binding_nv) {')
7317+ print(' return VERTEX_ATTRIB_NV;')
7318+ print(' }')
7319+ print(' }')
7320+ print(' }')
7321+ print(' }')
7322+ print(' return VERTEX_ATTRIB;')
7323+ print('}')
7324+ print()
7325
7326 self.defineShadowBufferHelper()
7327
7328 # Whether we need user arrays
7329- print 'static inline bool _need_user_arrays(void)'
7330- print '{'
7331- print ' gltrace::Context *ctx = gltrace::getContext();'
7332- print ' if (!ctx->user_arrays) {'
7333- print ' return false;'
7334- print ' }'
7335- print
7336- print ' glprofile::Profile profile = ctx->profile;'
7337- print ' bool es1 = profile.es() && profile.major == 1;'
7338- print
7339+ print('static inline bool _need_user_arrays(void)')
7340+ print('{')
7341+ print(' gltrace::Context *ctx = gltrace::getContext();')
7342+ print(' if (!ctx->user_arrays) {')
7343+ print(' return false;')
7344+ print(' }')
7345+ print()
7346+ print(' glprofile::Profile profile = ctx->profile;')
7347+ print(' bool es1 = profile.es() && profile.major == 1;')
7348+ print()
7349
7350 for camelcase_name, uppercase_name in self.arrays:
7351 # in which profile is the array available?
7352@@ -166,120 +166,120 @@ class GlTracer(Tracer):
7353 function_name = 'gl%sPointer' % camelcase_name
7354 enable_name = 'GL_%s_ARRAY' % uppercase_name
7355 binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name
7356- print ' // %s' % function_name
7357- print ' if (%s) {' % profile_check
7358+ print(' // %s' % function_name)
7359+ print(' if (%s) {' % profile_check)
7360 self.array_prolog(api, uppercase_name)
7361- print ' if (_glIsEnabled(%s) &&' % enable_name
7362- print ' _glGetInteger(%s) == 0) {' % binding_name
7363+ print(' if (_glIsEnabled(%s) &&' % enable_name)
7364+ print(' _glGetInteger(%s) == 0) {' % binding_name)
7365 self.array_cleanup(api, uppercase_name)
7366- print ' return true;'
7367- print ' }'
7368+ print(' return true;')
7369+ print(' }')
7370 self.array_epilog(api, uppercase_name)
7371- print ' }'
7372- print
7373-
7374- print ' // ES1 does not support generic vertex attributes'
7375- print ' if (es1)'
7376- print ' return false;'
7377- print
7378- print ' vertex_attrib _vertex_attrib = _get_vertex_attrib();'
7379- print
7380- print ' // glVertexAttribPointer'
7381- print ' if (_vertex_attrib == VERTEX_ATTRIB) {'
7382- print ' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);'
7383- print ' for (GLint index = 0; index < _max_vertex_attribs; ++index) {'
7384- print ' if (_glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED) &&'
7385- print ' _glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) == 0) {'
7386- print ' return true;'
7387- print ' }'
7388- print ' }'
7389- print ' }'
7390- print
7391- print ' // glVertexAttribPointerNV'
7392- print ' if (_vertex_attrib == VERTEX_ATTRIB_NV) {'
7393- print ' for (GLint index = 0; index < 16; ++index) {'
7394- print ' if (_glIsEnabled(GL_VERTEX_ATTRIB_ARRAY0_NV + index)) {'
7395- print ' return true;'
7396- print ' }'
7397- print ' }'
7398- print ' }'
7399- print
7400-
7401- print ' return false;'
7402- print '}'
7403- print
7404-
7405- print 'static void _trace_user_arrays(GLuint count);'
7406- print
7407-
7408- print '// whether glLockArraysEXT() has ever been called'
7409- print 'static bool _checkLockArraysEXT = false;'
7410- print
7411+ print(' }')
7412+ print()
7413+
7414+ print(' // ES1 does not support generic vertex attributes')
7415+ print(' if (es1)')
7416+ print(' return false;')
7417+ print()
7418+ print(' vertex_attrib _vertex_attrib = _get_vertex_attrib();')
7419+ print()
7420+ print(' // glVertexAttribPointer')
7421+ print(' if (_vertex_attrib == VERTEX_ATTRIB) {')
7422+ print(' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);')
7423+ print(' for (GLint index = 0; index < _max_vertex_attribs; ++index) {')
7424+ print(' if (_glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED) &&')
7425+ print(' _glGetVertexAttribi(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) == 0) {')
7426+ print(' return true;')
7427+ print(' }')
7428+ print(' }')
7429+ print(' }')
7430+ print()
7431+ print(' // glVertexAttribPointerNV')
7432+ print(' if (_vertex_attrib == VERTEX_ATTRIB_NV) {')
7433+ print(' for (GLint index = 0; index < 16; ++index) {')
7434+ print(' if (_glIsEnabled(GL_VERTEX_ATTRIB_ARRAY0_NV + index)) {')
7435+ print(' return true;')
7436+ print(' }')
7437+ print(' }')
7438+ print(' }')
7439+ print()
7440+
7441+ print(' return false;')
7442+ print('}')
7443+ print()
7444+
7445+ print('static void _trace_user_arrays(GLuint count);')
7446+ print()
7447+
7448+ print('// whether glLockArraysEXT() has ever been called')
7449+ print('static bool _checkLockArraysEXT = false;')
7450+ print()
7451
7452 # Buffer mappings
7453- print '// whether glMapBufferRange(GL_MAP_WRITE_BIT) has ever been called'
7454- print 'static bool _checkBufferMapRange = false;'
7455- print
7456- print '// whether glBufferParameteriAPPLE(GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE) has ever been called'
7457- print 'static bool _checkBufferFlushingUnmapAPPLE = false;'
7458- print
7459+ print('// whether glMapBufferRange(GL_MAP_WRITE_BIT) has ever been called')
7460+ print('static bool _checkBufferMapRange = false;')
7461+ print()
7462+ print('// whether glBufferParameteriAPPLE(GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE) has ever been called')
7463+ print('static bool _checkBufferFlushingUnmapAPPLE = false;')
7464+ print()
7465
7466 # Generate a helper function to determine whether a parameter name
7467 # refers to a symbolic value or not
7468- print 'static bool'
7469- print 'is_symbolic_pname(GLenum pname) {'
7470- print ' switch (pname) {'
7471+ print('static bool')
7472+ print('is_symbolic_pname(GLenum pname) {')
7473+ print(' switch (pname) {')
7474 for function, type, count, name in glparams.parameters:
7475 if type is glapi.GLenum:
7476- print ' case %s:' % name
7477- print ' return true;'
7478- print ' default:'
7479- print ' return false;'
7480- print ' }'
7481- print '}'
7482- print
7483+ print(' case %s:' % name)
7484+ print(' return true;')
7485+ print(' default:')
7486+ print(' return false;')
7487+ print(' }')
7488+ print('}')
7489+ print()
7490
7491 # Generate a helper function to determine whether a parameter value is
7492 # potentially symbolic or not; i.e., if the value can be represented in
7493 # an enum or not
7494- print 'template<class T>'
7495- print 'static inline bool'
7496- print 'is_symbolic_param(T param) {'
7497- print ' return static_cast<T>(static_cast<GLenum>(param)) == param;'
7498- print '}'
7499- print
7500+ print('template<class T>')
7501+ print('static inline bool')
7502+ print('is_symbolic_param(T param) {')
7503+ print(' return static_cast<T>(static_cast<GLenum>(param)) == param;')
7504+ print('}')
7505+ print()
7506
7507 # Generate a helper function to know how many elements a parameter has
7508- print 'static size_t'
7509- print '_gl_param_size(GLenum pname) {'
7510- print ' switch (pname) {'
7511+ print('static size_t')
7512+ print('_gl_param_size(GLenum pname) {')
7513+ print(' switch (pname) {')
7514 for function, type, count, name in glparams.parameters:
7515 if name == 'GL_PROGRAM_BINARY_FORMATS':
7516 count = 0
7517 if type is not None:
7518- print ' case %s: return %s;' % (name, count)
7519- print ' default:'
7520- print r' os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);'
7521- print ' return 1;'
7522- print ' }'
7523- print '}'
7524- print
7525+ print(' case %s: return %s;' % (name, count))
7526+ print(' default:')
7527+ print(r' os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);')
7528+ print(' return 1;')
7529+ print(' }')
7530+ print('}')
7531+ print()
7532
7533 # states such as GL_UNPACK_ROW_LENGTH are not available in GLES
7534- print 'static inline bool'
7535- print 'can_unpack_subimage(void) {'
7536- print ' gltrace::Context *ctx = gltrace::getContext();'
7537- print ' return ctx->profile.desktop();'
7538- print '}'
7539- print
7540+ print('static inline bool')
7541+ print('can_unpack_subimage(void) {')
7542+ print(' gltrace::Context *ctx = gltrace::getContext();')
7543+ print(' return ctx->profile.desktop();')
7544+ print('}')
7545+ print()
7546
7547 # VMWX_map_buffer_debug
7548- print r'extern "C" PUBLIC'
7549- print r'void APIENTRY'
7550- print r'glNotifyMappedBufferRangeVMWX(const void * start, GLsizeiptr length) {'
7551+ print(r'extern "C" PUBLIC')
7552+ print(r'void APIENTRY')
7553+ print(r'glNotifyMappedBufferRangeVMWX(const void * start, GLsizeiptr length) {')
7554 self.emit_memcpy('start', 'length')
7555- print r'}'
7556- print
7557+ print(r'}')
7558+ print()
7559
7560 getProcAddressFunctionNames = []
7561
7562@@ -290,70 +290,70 @@ class GlTracer(Tracer):
7563 argType = getProcAddressFunction.args[0].type
7564 retType = getProcAddressFunction.type
7565
7566- print 'static %s _wrapProcAddress(%s procName, %s procPtr);' % (retType, argType, retType)
7567- print
7568+ print('static %s _wrapProcAddress(%s procName, %s procPtr);' % (retType, argType, retType))
7569+ print()
7570
7571 Tracer.traceApi(self, api)
7572
7573- print 'static %s _wrapProcAddress(%s procName, %s procPtr) {' % (retType, argType, retType)
7574+ print('static %s _wrapProcAddress(%s procName, %s procPtr) {' % (retType, argType, retType))
7575
7576 # Provide fallback functions to missing debug functions
7577- print ' if (!procPtr) {'
7578+ print(' if (!procPtr) {')
7579 else_ = ''
7580 for function_name in self.debug_functions:
7581 if self.api.getFunctionByName(function_name):
7582- print ' %sif (strcmp("%s", (const char *)procName) == 0) {' % (else_, function_name)
7583- print ' return (%s)&%s;' % (retType, function_name)
7584- print ' }'
7585+ print(' %sif (strcmp("%s", (const char *)procName) == 0) {' % (else_, function_name))
7586+ print(' return (%s)&%s;' % (retType, function_name))
7587+ print(' }')
7588 else_ = 'else '
7589- print ' %s{' % else_
7590- print ' return NULL;'
7591- print ' }'
7592- print ' }'
7593+ print(' %s{' % else_)
7594+ print(' return NULL;')
7595+ print(' }')
7596+ print(' }')
7597
7598 for function in api.getAllFunctions():
7599 ptype = function_pointer_type(function)
7600 pvalue = function_pointer_value(function)
7601- print ' if (strcmp("%s", (const char *)procName) == 0) {' % function.name
7602- print ' assert(procPtr != (%s)&%s);' % (retType, function.name)
7603- print ' %s = (%s)procPtr;' % (pvalue, ptype)
7604- print ' return (%s)&%s;' % (retType, function.name,)
7605- print ' }'
7606- print ' os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);'
7607- print ' return procPtr;'
7608- print '}'
7609- print
7610+ print(' if (strcmp("%s", (const char *)procName) == 0) {' % function.name)
7611+ print(' assert(procPtr != (%s)&%s);' % (retType, function.name))
7612+ print(' %s = (%s)procPtr;' % (pvalue, ptype))
7613+ print(' return (%s)&%s;' % (retType, function.name,))
7614+ print(' }')
7615+ print(' os::log("apitrace: warning: unknown function \\"%s\\"\\n", (const char *)procName);')
7616+ print(' return procPtr;')
7617+ print('}')
7618+ print()
7619 else:
7620 Tracer.traceApi(self, api)
7621
7622 def defineShadowBufferHelper(self):
7623- print 'void _shadow_glGetBufferSubData(GLenum target, GLintptr offset,'
7624- print ' GLsizeiptr size, GLvoid *data)'
7625- print '{'
7626- print ' gltrace::Context *ctx = gltrace::getContext();'
7627- print ' if (!ctx->needsShadowBuffers() || target != GL_ELEMENT_ARRAY_BUFFER) {'
7628- print ' _glGetBufferSubData(target, offset, size, data);'
7629- print ' return;'
7630- print ' }'
7631- print
7632- print ' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);'
7633- print ' if (buffer_binding > 0) {'
7634- print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];'
7635- print ' buf.getSubData(offset, size, data);'
7636- print ' }'
7637- print '}'
7638+ print('void _shadow_glGetBufferSubData(GLenum target, GLintptr offset,')
7639+ print(' GLsizeiptr size, GLvoid *data)')
7640+ print('{')
7641+ print(' gltrace::Context *ctx = gltrace::getContext();')
7642+ print(' if (!ctx->needsShadowBuffers() || target != GL_ELEMENT_ARRAY_BUFFER) {')
7643+ print(' _glGetBufferSubData(target, offset, size, data);')
7644+ print(' return;')
7645+ print(' }')
7646+ print()
7647+ print(' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);')
7648+ print(' if (buffer_binding > 0) {')
7649+ print(' gltrace::Buffer & buf = ctx->buffers[buffer_binding];')
7650+ print(' buf.getSubData(offset, size, data);')
7651+ print(' }')
7652+ print('}')
7653
7654 def shadowBufferMethod(self, method):
7655 # Emit code to fetch the shadow buffer, and invoke a method
7656- print ' gltrace::Context *ctx = gltrace::getContext();'
7657- print ' if (ctx->needsShadowBuffers() && target == GL_ELEMENT_ARRAY_BUFFER) {'
7658- print ' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);'
7659- print ' if (buffer_binding > 0) {'
7660- print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];'
7661- print ' buf.' + method + ';'
7662- print ' }'
7663- print ' }'
7664- print
7665+ print(' gltrace::Context *ctx = gltrace::getContext();')
7666+ print(' if (ctx->needsShadowBuffers() && target == GL_ELEMENT_ARRAY_BUFFER) {')
7667+ print(' GLint buffer_binding = _glGetInteger(GL_ELEMENT_ARRAY_BUFFER_BINDING);')
7668+ print(' if (buffer_binding > 0) {')
7669+ print(' gltrace::Buffer & buf = ctx->buffers[buffer_binding];')
7670+ print(' buf.' + method + ';')
7671+ print(' }')
7672+ print(' }')
7673+ print()
7674
7675 def shadowBufferProlog(self, function):
7676 if function.name == 'glBufferData':
7677@@ -363,12 +363,12 @@ class GlTracer(Tracer):
7678 self.shadowBufferMethod('bufferSubData(offset, size, data)')
7679
7680 if function.name == 'glDeleteBuffers':
7681- print ' gltrace::Context *ctx = gltrace::getContext();'
7682- print ' if (ctx->needsShadowBuffers()) {'
7683- print ' for (GLsizei i = 0; i < n; i++) {'
7684- print ' ctx->buffers.erase(buffer[i]);'
7685- print ' }'
7686- print ' }'
7687+ print(' gltrace::Context *ctx = gltrace::getContext();')
7688+ print(' if (ctx->needsShadowBuffers()) {')
7689+ print(' for (GLsizei i = 0; i < n; i++) {')
7690+ print(' ctx->buffers.erase(buffer[i]);')
7691+ print(' }')
7692+ print(' }')
7693
7694 array_pointer_function_names = set((
7695 "glVertexPointer",
7696@@ -426,42 +426,42 @@ class GlTracer(Tracer):
7697 def traceFunctionImplBody(self, function):
7698 # Defer tracing of user array pointers...
7699 if function.name in self.array_pointer_function_names:
7700- print ' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);'
7701- print ' if (!_array_buffer) {'
7702- print ' static bool warned = false;'
7703- print ' if (!warned) {'
7704- print ' warned = true;'
7705- 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__);'
7706- print ' }'
7707- print ' gltrace::Context *ctx = gltrace::getContext();'
7708- print ' ctx->user_arrays = true;'
7709+ print(' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);')
7710+ print(' if (!_array_buffer) {')
7711+ print(' static bool warned = false;')
7712+ print(' if (!warned) {')
7713+ print(' warned = true;')
7714+ 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__);')
7715+ print(' }')
7716+ print(' gltrace::Context *ctx = gltrace::getContext();')
7717+ print(' ctx->user_arrays = true;')
7718 if function.name == "glVertexAttribPointerNV":
7719- print ' ctx->user_arrays_nv = true;'
7720+ print(' ctx->user_arrays_nv = true;')
7721 self.invokeFunction(function)
7722
7723 # And also break down glInterleavedArrays into the individual calls
7724 if function.name == 'glInterleavedArrays':
7725- print
7726+ print()
7727
7728 # Initialize the enable flags
7729 for camelcase_name, uppercase_name in self.arrays:
7730 flag_name = '_' + uppercase_name.lower()
7731- print ' GLboolean %s = GL_FALSE;' % flag_name
7732- print
7733+ print(' GLboolean %s = GL_FALSE;' % flag_name)
7734+ print()
7735
7736 # Switch for the interleaved formats
7737- print ' switch (format) {'
7738+ print(' switch (format) {')
7739 for format in self.interleaved_formats:
7740- print ' case %s:' % format
7741+ print(' case %s:' % format)
7742 for camelcase_name, uppercase_name in self.arrays:
7743 flag_name = '_' + uppercase_name.lower()
7744 if format.find('_' + uppercase_name[0]) >= 0:
7745- print ' %s = GL_TRUE;' % flag_name
7746- print ' break;'
7747- print ' default:'
7748- print ' return;'
7749- print ' }'
7750- print
7751+ print(' %s = GL_TRUE;' % flag_name)
7752+ print(' break;')
7753+ print(' default:')
7754+ print(' return;')
7755+ print(' }')
7756+ print()
7757
7758 # Emit fake glEnableClientState/glDisableClientState flags
7759 for camelcase_name, uppercase_name in self.arrays:
7760@@ -469,16 +469,16 @@ class GlTracer(Tracer):
7761 enable_name = 'GL_%s_ARRAY' % uppercase_name
7762
7763 # Emit a fake function
7764- print ' {'
7765- print ' static const trace::FunctionSig &_sig = %s ? _glEnableClientState_sig : _glDisableClientState_sig;' % flag_name
7766- print ' unsigned _call = trace::localWriter.beginEnter(&_sig, true);'
7767- print ' trace::localWriter.beginArg(0);'
7768+ print(' {')
7769+ print(' static const trace::FunctionSig &_sig = %s ? _glEnableClientState_sig : _glDisableClientState_sig;' % flag_name)
7770+ print(' unsigned _call = trace::localWriter.beginEnter(&_sig, true);')
7771+ print(' trace::localWriter.beginArg(0);')
7772 self.serializeValue(glapi.GLenum, enable_name)
7773- print ' trace::localWriter.endArg();'
7774- print ' trace::localWriter.endEnter();'
7775- print ' trace::localWriter.beginLeave(_call);'
7776- print ' trace::localWriter.endLeave();'
7777- print ' }'
7778+ print(' trace::localWriter.endArg();')
7779+ print(' trace::localWriter.endEnter();')
7780+ print(' trace::localWriter.beginLeave(_call);')
7781+ print(' trace::localWriter.endLeave();')
7782+ print(' }')
7783
7784 # Warn about buggy glGet(GL_*ARRAY_SIZE) not returning GL_BGRA
7785 buggyFunctions = {
7786@@ -489,224 +489,224 @@ class GlTracer(Tracer):
7787 }
7788 if function.name in buggyFunctions:
7789 getter, extraArg, pname = buggyFunctions[function.name]
7790- print r' static bool _checked = false;'
7791- print r' if (!_checked && size == GL_BGRA) {'
7792- print r' GLint _size = 0;'
7793- print r' _%s(%s%s, &_size);' % (getter, extraArg, pname)
7794- print r' if (_size != GL_BGRA) {'
7795- 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)
7796- print r' }'
7797- print r' _checked = true;'
7798- print r' }'
7799-
7800- print ' return;'
7801- print ' }'
7802+ print(r' static bool _checked = false;')
7803+ print(r' if (!_checked && size == GL_BGRA) {')
7804+ print(r' GLint _size = 0;')
7805+ print(r' _%s(%s%s, &_size);' % (getter, extraArg, pname))
7806+ print(r' if (_size != GL_BGRA) {')
7807+ 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))
7808+ print(r' }')
7809+ print(r' _checked = true;')
7810+ print(r' }')
7811+
7812+ print(' return;')
7813+ print(' }')
7814
7815 # ... to the draw calls
7816 if self.draw_function_regex.match(function.name):
7817 if not self.multi_draw_function_regex.match(function.name):
7818- print ' if (trace::localWriter.isIgnored()) {'
7819+ print(' if (trace::localWriter.isIgnored()) {')
7820 self.invokeFunction(function)
7821- print ' return;'
7822- print ' }'
7823- print ' if (_need_user_arrays()) {'
7824+ print(' return;')
7825+ print(' }')
7826+ print(' if (_need_user_arrays()) {')
7827 if 'Indirect' in function.name:
7828- print r' os::log("apitrace: warning: %s: indirect user arrays not supported\n");' % (function.name,)
7829+ print(r' os::log("apitrace: warning: %s: indirect user arrays not supported\n");' % (function.name,))
7830 else:
7831 arg_names = ', '.join([arg.name for arg in function.args[1:]])
7832- print ' GLuint _count = _%s_count(%s);' % (function.name, arg_names)
7833+ print(' GLuint _count = _%s_count(%s);' % (function.name, arg_names))
7834 # Some apps, in particular Quake3, can tell the driver to lock more
7835 # vertices than those actually required for the draw call.
7836- print ' if (_checkLockArraysEXT) {'
7837- print ' GLuint _locked_count = _glGetInteger(GL_ARRAY_ELEMENT_LOCK_FIRST_EXT)'
7838- print ' + _glGetInteger(GL_ARRAY_ELEMENT_LOCK_COUNT_EXT);'
7839- print ' _count = std::max(_count, _locked_count);'
7840- print ' }'
7841- print ' _trace_user_arrays(_count);'
7842- print ' }'
7843+ print(' if (_checkLockArraysEXT) {')
7844+ print(' GLuint _locked_count = _glGetInteger(GL_ARRAY_ELEMENT_LOCK_FIRST_EXT)')
7845+ print(' + _glGetInteger(GL_ARRAY_ELEMENT_LOCK_COUNT_EXT);')
7846+ print(' _count = std::max(_count, _locked_count);')
7847+ print(' }')
7848+ print(' _trace_user_arrays(_count);')
7849+ print(' }')
7850 if function.name == 'glLockArraysEXT':
7851- print ' _checkLockArraysEXT = true;'
7852+ print(' _checkLockArraysEXT = true;')
7853
7854 # Warn if user arrays are used with glBegin/glArrayElement/glEnd.
7855 if function.name == 'glBegin':
7856- print r' gltrace::Context *ctx = gltrace::getContext();'
7857- print r' ctx->userArraysOnBegin = _need_user_arrays();'
7858+ print(r' gltrace::Context *ctx = gltrace::getContext();')
7859+ print(r' ctx->userArraysOnBegin = _need_user_arrays();')
7860 if function.name.startswith('glArrayElement'):
7861- print r' gltrace::Context *ctx = gltrace::getContext();'
7862- print r' if (ctx->userArraysOnBegin) {'
7863- print r' os::log("apitrace: warning: user arrays with glArrayElement not supported (https://github.com/apitrace/apitrace/issues/276)\n");'
7864- print r' ctx->userArraysOnBegin = false;'
7865- print r' }'
7866+ print(r' gltrace::Context *ctx = gltrace::getContext();')
7867+ print(r' if (ctx->userArraysOnBegin) {')
7868+ print(r' os::log("apitrace: warning: user arrays with glArrayElement not supported (https://github.com/apitrace/apitrace/issues/276)\n");')
7869+ print(r' ctx->userArraysOnBegin = false;')
7870+ print(r' }')
7871
7872 # Emit a fake memcpy on buffer uploads
7873 if function.name == 'glBufferParameteriAPPLE':
7874- print ' if (pname == GL_BUFFER_FLUSHING_UNMAP_APPLE && param == GL_FALSE) {'
7875- print ' _checkBufferFlushingUnmapAPPLE = true;'
7876- print ' }'
7877+ print(' if (pname == GL_BUFFER_FLUSHING_UNMAP_APPLE && param == GL_FALSE) {')
7878+ print(' _checkBufferFlushingUnmapAPPLE = true;')
7879+ print(' }')
7880 if function.name in ('glUnmapBuffer', 'glUnmapBufferARB'):
7881 if function.name.endswith('ARB'):
7882 suffix = 'ARB'
7883 else:
7884 suffix = ''
7885- print ' GLint access_flags = 0;'
7886- print ' GLint access = 0;'
7887- print ' bool flush;'
7888- print ' // GLES3 does not have GL_BUFFER_ACCESS;'
7889- print ' if (_checkBufferMapRange) {'
7890- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);' % suffix
7891- print ' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));'
7892- print ' } else {'
7893- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS, &access);' % suffix
7894- print ' flush = access != GL_READ_ONLY;'
7895- print ' }'
7896- print ' if (flush) {'
7897- print ' GLvoid *map = NULL;'
7898- print ' _glGetBufferPointerv%s(target, GL_BUFFER_MAP_POINTER, &map);' % suffix
7899- print ' if (map) {'
7900- print ' GLint length = -1;'
7901- print ' if (_checkBufferMapRange) {'
7902- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_MAP_LENGTH, &length);' % suffix
7903- print ' if (length == -1) {'
7904- print ' // Mesa drivers refuse GL_BUFFER_MAP_LENGTH without GL 3.0 up-to'
7905- print ' // http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffee498fb848b253a7833373fe5430f8c7ca0c5f'
7906- print ' static bool warned = false;'
7907- print ' if (!warned) {'
7908- print ' os::log("apitrace: warning: glGetBufferParameteriv%s(GL_BUFFER_MAP_LENGTH) failed\\n");' % suffix
7909- print ' warned = true;'
7910- print ' }'
7911- print ' }'
7912- print ' } else {'
7913- print ' length = 0;'
7914- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_SIZE, &length);' % suffix
7915- print ' }'
7916- print ' if (_checkBufferFlushingUnmapAPPLE) {'
7917- print ' GLint flushing_unmap = GL_TRUE;'
7918- print ' _glGetBufferParameteriv%s(target, GL_BUFFER_FLUSHING_UNMAP_APPLE, &flushing_unmap);' % suffix
7919- print ' flush = flush && flushing_unmap;'
7920- print ' }'
7921- print ' if (flush && length > 0) {'
7922+ print(' GLint access_flags = 0;')
7923+ print(' GLint access = 0;')
7924+ print(' bool flush;')
7925+ print(' // GLES3 does not have GL_BUFFER_ACCESS;')
7926+ print(' if (_checkBufferMapRange) {')
7927+ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);' % suffix)
7928+ print(' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));')
7929+ print(' } else {')
7930+ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_ACCESS, &access);' % suffix)
7931+ print(' flush = access != GL_READ_ONLY;')
7932+ print(' }')
7933+ print(' if (flush) {')
7934+ print(' GLvoid *map = NULL;')
7935+ print(' _glGetBufferPointerv%s(target, GL_BUFFER_MAP_POINTER, &map);' % suffix)
7936+ print(' if (map) {')
7937+ print(' GLint length = -1;')
7938+ print(' if (_checkBufferMapRange) {')
7939+ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_MAP_LENGTH, &length);' % suffix)
7940+ print(' if (length == -1) {')
7941+ print(' // Mesa drivers refuse GL_BUFFER_MAP_LENGTH without GL 3.0 up-to')
7942+ print(' // http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffee498fb848b253a7833373fe5430f8c7ca0c5f')
7943+ print(' static bool warned = false;')
7944+ print(' if (!warned) {')
7945+ print(' os::log("apitrace: warning: glGetBufferParameteriv%s(GL_BUFFER_MAP_LENGTH) failed\\n");' % suffix)
7946+ print(' warned = true;')
7947+ print(' }')
7948+ print(' }')
7949+ print(' } else {')
7950+ print(' length = 0;')
7951+ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_SIZE, &length);' % suffix)
7952+ print(' }')
7953+ print(' if (_checkBufferFlushingUnmapAPPLE) {')
7954+ print(' GLint flushing_unmap = GL_TRUE;')
7955+ print(' _glGetBufferParameteriv%s(target, GL_BUFFER_FLUSHING_UNMAP_APPLE, &flushing_unmap);' % suffix)
7956+ print(' flush = flush && flushing_unmap;')
7957+ print(' }')
7958+ print(' if (flush && length > 0) {')
7959 self.emit_memcpy('map', 'length')
7960- print ' }'
7961- print ' }'
7962- print ' }'
7963+ print(' }')
7964+ print(' }')
7965+ print(' }')
7966 if function.name == 'glUnmapBufferOES':
7967- print ' GLint access_flags = 0;'
7968- print ' GLint access = 0;'
7969- print ' bool flush;'
7970- print ' // GLES3 does not have GL_BUFFER_ACCESS;'
7971- print ' if (_checkBufferMapRange) {'
7972- print ' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);'
7973- print ' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));'
7974- print ' } else {'
7975- print ' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS, &access);'
7976- print ' flush = access != GL_READ_ONLY;'
7977- print ' }'
7978- print ' if (flush) {'
7979- print ' GLvoid *map = NULL;'
7980- print ' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER, &map);'
7981- print ' if (map) {'
7982- print ' GLint length = 0;'
7983- print ' GLint offset = 0;'
7984- print ' if (_checkBufferMapRange) {'
7985- print ' _glGetBufferParameteriv(target, GL_BUFFER_MAP_LENGTH, &length);'
7986- print ' _glGetBufferParameteriv(target, GL_BUFFER_MAP_OFFSET, &offset);'
7987- print ' } else {'
7988- print ' _glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);'
7989- print ' }'
7990- print ' if (flush && length > 0) {'
7991+ print(' GLint access_flags = 0;')
7992+ print(' GLint access = 0;')
7993+ print(' bool flush;')
7994+ print(' // GLES3 does not have GL_BUFFER_ACCESS;')
7995+ print(' if (_checkBufferMapRange) {')
7996+ print(' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS_FLAGS, &access_flags);')
7997+ print(' flush = (access_flags & GL_MAP_WRITE_BIT) && !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT));')
7998+ print(' } else {')
7999+ print(' _glGetBufferParameteriv(target, GL_BUFFER_ACCESS, &access);')
8000+ print(' flush = access != GL_READ_ONLY;')
8001+ print(' }')
8002+ print(' if (flush) {')
8003+ print(' GLvoid *map = NULL;')
8004+ print(' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER, &map);')
8005+ print(' if (map) {')
8006+ print(' GLint length = 0;')
8007+ print(' GLint offset = 0;')
8008+ print(' if (_checkBufferMapRange) {')
8009+ print(' _glGetBufferParameteriv(target, GL_BUFFER_MAP_LENGTH, &length);')
8010+ print(' _glGetBufferParameteriv(target, GL_BUFFER_MAP_OFFSET, &offset);')
8011+ print(' } else {')
8012+ print(' _glGetBufferParameteriv(target, GL_BUFFER_SIZE, &length);')
8013+ print(' }')
8014+ print(' if (flush && length > 0) {')
8015 self.emit_memcpy('map', 'length')
8016 self.shadowBufferMethod('bufferSubData(offset, length, map)')
8017- print ' }'
8018- print ' }'
8019- print ' }'
8020+ print(' }')
8021+ print(' }')
8022+ print(' }')
8023 if function.name == 'glUnmapNamedBuffer':
8024- print ' GLint access_flags = 0;'
8025- print ' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);'
8026- print ' if ((access_flags & GL_MAP_WRITE_BIT) &&'
8027- print ' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {'
8028- print ' GLvoid *map = NULL;'
8029- print ' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);'
8030- print ' GLint length = 0;'
8031- print ' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_MAP_LENGTH, &length);'
8032- print ' if (map && length > 0) {'
8033+ print(' GLint access_flags = 0;')
8034+ print(' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);')
8035+ print(' if ((access_flags & GL_MAP_WRITE_BIT) &&')
8036+ print(' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {')
8037+ print(' GLvoid *map = NULL;')
8038+ print(' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);')
8039+ print(' GLint length = 0;')
8040+ print(' _glGetNamedBufferParameteriv(buffer, GL_BUFFER_MAP_LENGTH, &length);')
8041+ print(' if (map && length > 0) {')
8042 self.emit_memcpy('map', 'length')
8043- print ' }'
8044- print ' }'
8045+ print(' }')
8046+ print(' }')
8047 if function.name == 'glUnmapNamedBufferEXT':
8048- print ' GLint access_flags = 0;'
8049- print ' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);'
8050- print ' if ((access_flags & GL_MAP_WRITE_BIT) &&'
8051- print ' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {'
8052- print ' GLvoid *map = NULL;'
8053- print ' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);'
8054- print ' GLint length = 0;'
8055- print ' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_MAP_LENGTH, &length);'
8056- print ' if (map && length > 0) {'
8057+ print(' GLint access_flags = 0;')
8058+ print(' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_ACCESS_FLAGS, &access_flags);')
8059+ print(' if ((access_flags & GL_MAP_WRITE_BIT) &&')
8060+ print(' !(access_flags & (GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_PERSISTENT_BIT))) {')
8061+ print(' GLvoid *map = NULL;')
8062+ print(' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);')
8063+ print(' GLint length = 0;')
8064+ print(' _glGetNamedBufferParameterivEXT(buffer, GL_BUFFER_MAP_LENGTH, &length);')
8065+ print(' if (map && length > 0) {')
8066 self.emit_memcpy('map', 'length')
8067- print ' }'
8068- print ' }'
8069+ print(' }')
8070+ print(' }')
8071 if function.name == 'glFlushMappedBufferRange':
8072- print ' GLvoid *map = NULL;'
8073- print ' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);'
8074- print ' if (map && length > 0) {'
8075+ print(' GLvoid *map = NULL;')
8076+ print(' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);')
8077+ print(' if (map && length > 0) {')
8078 self.emit_memcpy('(const char *)map + offset', 'length')
8079- print ' }'
8080+ print(' }')
8081 if function.name == 'glFlushMappedBufferRangeEXT':
8082- print ' GLvoid *map = NULL;'
8083- print ' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &map);'
8084- print ' if (map && length > 0) {'
8085+ print(' GLvoid *map = NULL;')
8086+ print(' _glGetBufferPointervOES(target, GL_BUFFER_MAP_POINTER_OES, &map);')
8087+ print(' if (map && length > 0) {')
8088 self.emit_memcpy('(const char *)map + offset', 'length')
8089- print ' }'
8090+ print(' }')
8091 if function.name == 'glFlushMappedBufferRangeAPPLE':
8092- print ' GLvoid *map = NULL;'
8093- print ' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);'
8094- print ' if (map && size > 0) {'
8095+ print(' GLvoid *map = NULL;')
8096+ print(' _glGetBufferPointerv(target, GL_BUFFER_MAP_POINTER, &map);')
8097+ print(' if (map && size > 0) {')
8098 self.emit_memcpy('(const char *)map + offset', 'size')
8099- print ' }'
8100+ print(' }')
8101 if function.name == 'glFlushMappedNamedBufferRange':
8102- print ' GLvoid *map = NULL;'
8103- print ' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);'
8104- print ' if (map && length > 0) {'
8105+ print(' GLvoid *map = NULL;')
8106+ print(' _glGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &map);')
8107+ print(' if (map && length > 0) {')
8108 self.emit_memcpy('(const char *)map + offset', 'length')
8109- print ' }'
8110+ print(' }')
8111 if function.name == 'glFlushMappedNamedBufferRangeEXT':
8112- print ' GLvoid *map = NULL;'
8113- print ' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);'
8114- print ' if (map && length > 0) {'
8115+ print(' GLvoid *map = NULL;')
8116+ print(' _glGetNamedBufferPointervEXT(buffer, GL_BUFFER_MAP_POINTER, &map);')
8117+ print(' if (map && length > 0) {')
8118 self.emit_memcpy('(const char *)map + offset', 'length')
8119- print ' }'
8120+ print(' }')
8121
8122 # FIXME: We don't support coherent/pinned memory mappings
8123 if function.name in ('glBufferStorage', 'glNamedBufferStorage', 'glNamedBufferStorageEXT'):
8124- print r' if (!(flags & GL_MAP_PERSISTENT_BIT)) {'
8125- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);'
8126- print r' }'
8127- print r' flags &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;'
8128+ print(r' if (!(flags & GL_MAP_PERSISTENT_BIT)) {')
8129+ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);')
8130+ print(r' }')
8131+ print(r' flags &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;')
8132 if function.name in ('glMapBufferRange', 'glMapBufferRangeEXT', 'glMapNamedBufferRange', 'glMapNamedBufferRangeEXT'):
8133- print r' if (access & GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX) {'
8134- print r' if (!(access & GL_MAP_PERSISTENT_BIT)) {'
8135- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);'
8136- print r' }'
8137- print r' if (access & GL_MAP_FLUSH_EXPLICIT_BIT) {'
8138- print r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/ MAP_FLUSH_EXPLICIT_BIT\n", __FUNCTION__);'
8139- print r' }'
8140- print r' access &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;'
8141- print r' } else if (access & GL_MAP_COHERENT_BIT) {'
8142- print r' os::log("apitrace: warning: %s: MAP_COHERENT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);'
8143- print r' } else if ((access & GL_MAP_PERSISTENT_BIT) &&'
8144- print r' !(access & GL_MAP_FLUSH_EXPLICIT_BIT)) {'
8145- 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__);'
8146- print r' }'
8147+ print(r' if (access & GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX) {')
8148+ print(r' if (!(access & GL_MAP_PERSISTENT_BIT)) {')
8149+ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/o MAP_PERSISTENT_BIT\n", __FUNCTION__);')
8150+ print(r' }')
8151+ print(r' if (access & GL_MAP_FLUSH_EXPLICIT_BIT) {')
8152+ print(r' os::log("apitrace: warning: %s: MAP_NOTIFY_EXPLICIT_BIT_VMWX set w/ MAP_FLUSH_EXPLICIT_BIT\n", __FUNCTION__);')
8153+ print(r' }')
8154+ print(r' access &= ~GL_MAP_NOTIFY_EXPLICIT_BIT_VMWX;')
8155+ print(r' } else if (access & GL_MAP_COHERENT_BIT) {')
8156+ print(r' os::log("apitrace: warning: %s: MAP_COHERENT_BIT unsupported (https://github.com/apitrace/apitrace/issues/232)\n", __FUNCTION__);')
8157+ print(r' } else if ((access & GL_MAP_PERSISTENT_BIT) &&')
8158+ print(r' !(access & GL_MAP_FLUSH_EXPLICIT_BIT)) {')
8159+ 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__);')
8160+ print(r' }')
8161 if function.name in ('glBufferData', 'glBufferDataARB'):
8162- print r' if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {'
8163- print r' os::log("apitrace: warning: GL_AMD_pinned_memory not fully supported\n");'
8164- print r' }'
8165+ print(r' if (target == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD) {')
8166+ print(r' os::log("apitrace: warning: GL_AMD_pinned_memory not fully supported\n");')
8167+ print(r' }')
8168
8169 # TODO: We don't track GL_INTEL_map_texture mappings
8170 if function.name == 'glMapTexture2DINTEL':
8171- print r' if (access & GL_MAP_WRITE_BIT) {'
8172- print r' os::log("apitrace: warning: GL_INTEL_map_texture not fully supported\n");'
8173- print r' }'
8174+ print(r' if (access & GL_MAP_WRITE_BIT) {')
8175+ print(r' os::log("apitrace: warning: GL_INTEL_map_texture not fully supported\n");')
8176+ print(r' }')
8177
8178 # Don't leave vertex attrib locations to chance. Instead emit fake
8179 # glBindAttribLocation calls to ensure that the same locations will be
8180@@ -715,40 +715,40 @@ class GlTracer(Tracer):
8181 # many entry-points, including non-shader related ones.
8182 if function.name == 'glLinkProgram':
8183 Tracer.invokeFunction(self, function)
8184- print ' GLint active_attributes = 0;'
8185- print ' _glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attributes);'
8186- print ' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {'
8187- print ' GLint size = 0;'
8188- print ' GLenum type = 0;'
8189- print ' GLchar name[256];'
8190+ print(' GLint active_attributes = 0;')
8191+ print(' _glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attributes);')
8192+ print(' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {')
8193+ print(' GLint size = 0;')
8194+ print(' GLenum type = 0;')
8195+ print(' GLchar name[256];')
8196 # TODO: Use ACTIVE_ATTRIBUTE_MAX_LENGTH instead of 256
8197- print ' _glGetActiveAttrib(program, attrib, sizeof name, NULL, &size, &type, name);'
8198- print " if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {"
8199- print ' GLint location = _glGetAttribLocation(program, name);'
8200- print ' if (location >= 0) {'
8201+ print(' _glGetActiveAttrib(program, attrib, sizeof name, NULL, &size, &type, name);')
8202+ print(" if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {")
8203+ print(' GLint location = _glGetAttribLocation(program, name);')
8204+ print(' if (location >= 0) {')
8205 bind_function = glapi.glapi.getFunctionByName('glBindAttribLocation')
8206 self.fake_call(bind_function, ['program', 'location', 'name'])
8207- print ' }'
8208- print ' }'
8209- print ' }'
8210+ print(' }')
8211+ print(' }')
8212+ print(' }')
8213 if function.name == 'glLinkProgramARB':
8214 Tracer.invokeFunction(self, function)
8215- print ' GLint active_attributes = 0;'
8216- print ' _glGetObjectParameterivARB(programObj, GL_OBJECT_ACTIVE_ATTRIBUTES_ARB, &active_attributes);'
8217- print ' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {'
8218- print ' GLint size = 0;'
8219- print ' GLenum type = 0;'
8220- print ' GLcharARB name[256];'
8221+ print(' GLint active_attributes = 0;')
8222+ print(' _glGetObjectParameterivARB(programObj, GL_OBJECT_ACTIVE_ATTRIBUTES_ARB, &active_attributes);')
8223+ print(' for (GLint attrib = 0; attrib < active_attributes; ++attrib) {')
8224+ print(' GLint size = 0;')
8225+ print(' GLenum type = 0;')
8226+ print(' GLcharARB name[256];')
8227 # TODO: Use ACTIVE_ATTRIBUTE_MAX_LENGTH instead of 256
8228- print ' _glGetActiveAttribARB(programObj, attrib, sizeof name, NULL, &size, &type, name);'
8229- print " if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {"
8230- print ' GLint location = _glGetAttribLocationARB(programObj, name);'
8231- print ' if (location >= 0) {'
8232+ print(' _glGetActiveAttribARB(programObj, attrib, sizeof name, NULL, &size, &type, name);')
8233+ print(" if (name[0] != 'g' || name[1] != 'l' || name[2] != '_') {")
8234+ print(' GLint location = _glGetAttribLocationARB(programObj, name);')
8235+ print(' if (location >= 0) {')
8236 bind_function = glapi.glapi.getFunctionByName('glBindAttribLocationARB')
8237 self.fake_call(bind_function, ['programObj', 'location', 'name'])
8238- print ' }'
8239- print ' }'
8240- print ' }'
8241+ print(' }')
8242+ print(' }')
8243+ print(' }')
8244
8245 self.shadowBufferProlog(function)
8246
8247@@ -815,9 +815,9 @@ class GlTracer(Tracer):
8248 # Force glProgramBinary to fail. Per ARB_get_program_binary this
8249 # should signal the app that it needs to recompile.
8250 if function.name in ('glProgramBinary', 'glProgramBinaryOES'):
8251- print r' binaryFormat = 0xDEADDEAD;'
8252- print r' binary = &binaryFormat;'
8253- print r' length = sizeof binaryFormat;'
8254+ print(r' binaryFormat = 0xDEADDEAD;')
8255+ print(r' binary = &binaryFormat;')
8256+ print(r' length = sizeof binaryFormat;')
8257
8258 Tracer.invokeFunction(self, function)
8259
8260@@ -838,25 +838,25 @@ class GlTracer(Tracer):
8261 # We may be faking KHR_debug, so ensure the pointer queries result is
8262 # always zeroed to prevent dereference of unitialized pointers
8263 if function.name == 'glGetPointerv':
8264- print ' if (params &&'
8265- print ' (pname == GL_DEBUG_CALLBACK_FUNCTION ||'
8266- print ' pname == GL_DEBUG_CALLBACK_USER_PARAM)) {'
8267- print ' *params = NULL;'
8268- print ' }'
8269+ print(' if (params &&')
8270+ print(' (pname == GL_DEBUG_CALLBACK_FUNCTION ||')
8271+ print(' pname == GL_DEBUG_CALLBACK_USER_PARAM)) {')
8272+ print(' *params = NULL;')
8273+ print(' }')
8274
8275 if function.name in self.getProcAddressFunctionNames:
8276 nameArg = function.args[0].name
8277- print ' if (strcmp("glNotifyMappedBufferRangeVMWX", (const char *)%s) == 0) {' % (nameArg,)
8278- print ' _result = (%s)&glNotifyMappedBufferRangeVMWX;' % (function.type,)
8279- print ' } else if (strcmp("glTexDirectVIV", (const char *)%s) == 0) {' % (nameArg,)
8280- print ' _result = (%s)&glTexDirectVIV;' % (function.type,)
8281- print ' } else if (strcmp("glTexDirectInvalidateVIV", (const char *)%s) == 0) {' % (nameArg,)
8282- print ' _result = (%s)&glTexDirectInvalidateVIV;' % (function.type,)
8283+ print(' if (strcmp("glNotifyMappedBufferRangeVMWX", (const char *)%s) == 0) {' % (nameArg,))
8284+ print(' _result = (%s)&glNotifyMappedBufferRangeVMWX;' % (function.type,))
8285+ print(' } else if (strcmp("glTexDirectVIV", (const char *)%s) == 0) {' % (nameArg,))
8286+ print(' _result = (%s)&glTexDirectVIV;' % (function.type,))
8287+ print(' } else if (strcmp("glTexDirectInvalidateVIV", (const char *)%s) == 0) {' % (nameArg,))
8288+ print(' _result = (%s)&glTexDirectInvalidateVIV;' % (function.type,))
8289 for marker_function in self.marker_functions:
8290 if self.api.getFunctionByName(marker_function):
8291- print ' } else if (strcmp("%s", (const char *)%s) == 0) {' % (marker_function, nameArg)
8292- print ' _result = (%s)&%s;' % (function.type, marker_function)
8293- print ' } else {'
8294+ print(' } else if (strcmp("%s", (const char *)%s) == 0) {' % (marker_function, nameArg))
8295+ print(' _result = (%s)&%s;' % (function.type, marker_function))
8296+ print(' } else {')
8297 Tracer.doInvokeFunction(self, function)
8298
8299 # Replace function addresses with ours
8300@@ -864,24 +864,24 @@ class GlTracer(Tracer):
8301 # contain the addresses of the wrapper functions, and not the real
8302 # functions, but in practice this should make no difference.
8303 if function.name in self.getProcAddressFunctionNames:
8304- print ' _result = _wrapProcAddress(%s, _result);' % (nameArg,)
8305+ print(' _result = _wrapProcAddress(%s, _result);' % (nameArg,))
8306
8307- print ' }'
8308+ print(' }')
8309 return
8310
8311 if function.name in ('glGetProgramBinary', 'glGetProgramBinaryOES'):
8312- print r' bufSize = 0;'
8313+ print(r' bufSize = 0;')
8314
8315 Tracer.doInvokeFunction(self, function)
8316
8317 if function.name == 'glGetProgramiv':
8318- print r' if (params && pname == GL_PROGRAM_BINARY_LENGTH) {'
8319- print r' *params = 0;'
8320- print r' }'
8321+ print(r' if (params && pname == GL_PROGRAM_BINARY_LENGTH) {')
8322+ print(r' *params = 0;')
8323+ print(r' }')
8324 if function.name in ('glGetProgramBinary', 'glGetProgramBinaryOES'):
8325- print r' if (length) {'
8326- print r' *length = 0;'
8327- print r' }'
8328+ print(r' if (length) {')
8329+ print(r' *length = 0;')
8330+ print(r' }')
8331
8332 buffer_targets = [
8333 'ARRAY_BUFFER',
8334@@ -902,9 +902,9 @@ class GlTracer(Tracer):
8335
8336 # Keep track of buffer mappings
8337 if function.name in ('glMapBufferRange', 'glMapBufferRangeEXT'):
8338- print ' if (access & GL_MAP_WRITE_BIT) {'
8339- print ' _checkBufferMapRange = true;'
8340- print ' }'
8341+ print(' if (access & GL_MAP_WRITE_BIT) {')
8342+ print(' _checkBufferMapRange = true;')
8343+ print(' }')
8344
8345 boolean_names = [
8346 'GL_FALSE',
8347@@ -932,17 +932,17 @@ class GlTracer(Tracer):
8348 and (isinstance(arg.type, stdapi.Blob) \
8349 or (isinstance(arg.type, stdapi.Const) \
8350 and isinstance(arg.type.type, stdapi.Blob))):
8351- print ' {'
8352- print ' gltrace::Context *ctx = gltrace::getContext();'
8353- print ' GLint _unpack_buffer = 0;'
8354- print ' if (ctx->profile.desktop())'
8355- print ' _glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &_unpack_buffer);'
8356- print ' if (_unpack_buffer) {'
8357- print ' trace::localWriter.writePointer((uintptr_t)%s);' % arg.name
8358- print ' } else {'
8359+ print(' {')
8360+ print(' gltrace::Context *ctx = gltrace::getContext();')
8361+ print(' GLint _unpack_buffer = 0;')
8362+ print(' if (ctx->profile.desktop())')
8363+ print(' _glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &_unpack_buffer);')
8364+ print(' if (_unpack_buffer) {')
8365+ print(' trace::localWriter.writePointer((uintptr_t)%s);' % arg.name)
8366+ print(' } else {')
8367 Tracer.serializeArgValue(self, function, arg)
8368- print ' }'
8369- print ' }'
8370+ print(' }')
8371+ print(' }')
8372 return
8373
8374 # Several GL state functions take GLenum symbolic names as
8375@@ -953,11 +953,11 @@ class GlTracer(Tracer):
8376 assert arg.index > 0
8377 assert function.args[arg.index - 1].name == 'pname'
8378 assert function.args[arg.index - 1].type == glapi.GLenum
8379- print ' if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name
8380+ print(' if (is_symbolic_pname(pname) && is_symbolic_param(%s)) {' % arg.name)
8381 self.serializeValue(glapi.GLenum, arg.name)
8382- print ' } else {'
8383+ print(' } else {')
8384 Tracer.serializeArgValue(self, function, arg)
8385- print ' }'
8386+ print(' }')
8387 return
8388
8389 Tracer.serializeArgValue(self, function, arg)
8390@@ -967,20 +967,20 @@ class GlTracer(Tracer):
8391
8392 # A simple state tracker to track the pointer values
8393 # update the state
8394- print 'static void _trace_user_arrays(GLuint count)'
8395- print '{'
8396- print ' gltrace::Context *ctx = gltrace::getContext();'
8397- print
8398- print ' glprofile::Profile profile = ctx->profile;'
8399- print ' bool es1 = profile.es() && profile.major == 1;'
8400- print
8401+ print('static void _trace_user_arrays(GLuint count)')
8402+ print('{')
8403+ print(' gltrace::Context *ctx = gltrace::getContext();')
8404+ print()
8405+ print(' glprofile::Profile profile = ctx->profile;')
8406+ print(' bool es1 = profile.es() && profile.major == 1;')
8407+ print()
8408
8409 # Temporarily unbind the array buffer
8410- print ' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);'
8411- print ' if (_array_buffer) {'
8412+ print(' GLint _array_buffer = _glGetInteger(GL_ARRAY_BUFFER_BINDING);')
8413+ print(' if (_array_buffer) {')
8414 self.fake_glBindBuffer(api, 'GL_ARRAY_BUFFER', '0')
8415- print ' }'
8416- print
8417+ print(' }')
8418+ print()
8419
8420 for camelcase_name, uppercase_name in self.arrays:
8421 # in which profile is the array available?
8422@@ -993,45 +993,45 @@ class GlTracer(Tracer):
8423 binding_name = 'GL_%s_ARRAY_BUFFER_BINDING' % uppercase_name
8424 function = api.getFunctionByName(function_name)
8425
8426- print ' // %s' % function.prototype()
8427- print ' if (%s) {' % profile_check
8428+ print(' // %s' % function.prototype())
8429+ print(' if (%s) {' % profile_check)
8430 self.array_trace_prolog(api, uppercase_name)
8431 self.array_prolog(api, uppercase_name)
8432- print ' if (_glIsEnabled(%s)) {' % enable_name
8433- print ' GLint _binding = _glGetInteger(%s);' % binding_name
8434- print ' if (!_binding) {'
8435+ print(' if (_glIsEnabled(%s)) {' % enable_name)
8436+ print(' GLint _binding = _glGetInteger(%s);' % binding_name)
8437+ print(' if (!_binding) {')
8438
8439 # Get the arguments via glGet*
8440 for arg in function.args:
8441 arg_get_enum = 'GL_%s_ARRAY_%s' % (uppercase_name, arg.name.upper())
8442 arg_get_function, arg_type = TypeGetter().visit(arg.type)
8443- print ' %s %s = 0;' % (arg_type, arg.name)
8444- print ' _%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name)
8445+ print(' %s %s = 0;' % (arg_type, arg.name))
8446+ print(' _%s(%s, &%s);' % (arg_get_function, arg_get_enum, arg.name))
8447
8448 arg_names = ', '.join([arg.name for arg in function.args[:-1]])
8449- print ' size_t _size = _%s_size(%s, count);' % (function.name, arg_names)
8450+ print(' size_t _size = _%s_size(%s, count);' % (function.name, arg_names))
8451
8452 # Emit a fake function
8453 self.array_trace_intermezzo(api, uppercase_name)
8454- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)
8455+ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,))
8456 for arg in function.args:
8457 assert not arg.output
8458- print ' trace::localWriter.beginArg(%u);' % (arg.index,)
8459+ print(' trace::localWriter.beginArg(%u);' % (arg.index,))
8460 if arg.name != 'pointer':
8461 self.serializeValue(arg.type, arg.name)
8462 else:
8463- print ' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name)
8464- print ' trace::localWriter.endArg();'
8465+ print(' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name))
8466+ print(' trace::localWriter.endArg();')
8467
8468- print ' trace::localWriter.endEnter();'
8469- print ' trace::localWriter.beginLeave(_call);'
8470- print ' trace::localWriter.endLeave();'
8471- print ' }'
8472- print ' }'
8473+ print(' trace::localWriter.endEnter();')
8474+ print(' trace::localWriter.beginLeave(_call);')
8475+ print(' trace::localWriter.endLeave();')
8476+ print(' }')
8477+ print(' }')
8478 self.array_epilog(api, uppercase_name)
8479 self.array_trace_epilog(api, uppercase_name)
8480- print ' }'
8481- print
8482+ print(' }')
8483+ print()
8484
8485 # Samething, but for glVertexAttribPointer*
8486 #
8487@@ -1043,12 +1043,12 @@ class GlTracer(Tracer):
8488 # This means that the implementations of these functions do not always
8489 # alias, and they need to be considered independently.
8490 #
8491- print ' // ES1 does not support generic vertex attributes'
8492- print ' if (es1)'
8493- print ' return;'
8494- print
8495- print ' vertex_attrib _vertex_attrib = _get_vertex_attrib();'
8496- print
8497+ print(' // ES1 does not support generic vertex attributes')
8498+ print(' if (es1)')
8499+ print(' return;')
8500+ print()
8501+ print(' vertex_attrib _vertex_attrib = _get_vertex_attrib();')
8502+ print()
8503 for suffix in ['', 'NV']:
8504 if suffix:
8505 SUFFIX = '_' + suffix
8506@@ -1057,24 +1057,24 @@ class GlTracer(Tracer):
8507 function_name = 'glVertexAttribPointer' + suffix
8508 function = api.getFunctionByName(function_name)
8509
8510- print ' // %s' % function.prototype()
8511- print ' if (_vertex_attrib == VERTEX_ATTRIB%s) {' % SUFFIX
8512+ print(' // %s' % function.prototype())
8513+ print(' if (_vertex_attrib == VERTEX_ATTRIB%s) {' % SUFFIX)
8514 if suffix == 'NV':
8515- print ' GLint _max_vertex_attribs = 16;'
8516+ print(' GLint _max_vertex_attribs = 16;')
8517 else:
8518- print ' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);'
8519- print ' for (GLint index = 0; index < _max_vertex_attribs; ++index) {'
8520- print ' GLint _enabled = 0;'
8521+ print(' GLint _max_vertex_attribs = _glGetInteger(GL_MAX_VERTEX_ATTRIBS);')
8522+ print(' for (GLint index = 0; index < _max_vertex_attribs; ++index) {')
8523+ print(' GLint _enabled = 0;')
8524 if suffix == 'NV':
8525- print ' _glGetIntegerv(GL_VERTEX_ATTRIB_ARRAY0_NV + index, &_enabled);'
8526+ print(' _glGetIntegerv(GL_VERTEX_ATTRIB_ARRAY0_NV + index, &_enabled);')
8527 else:
8528- print ' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED%s, &_enabled);' % (suffix, SUFFIX)
8529- print ' if (_enabled) {'
8530- print ' GLint _binding = 0;'
8531+ print(' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED%s, &_enabled);' % (suffix, SUFFIX))
8532+ print(' if (_enabled) {')
8533+ print(' GLint _binding = 0;')
8534 if suffix != 'NV':
8535 # It doesn't seem possible to use VBOs with NV_vertex_program.
8536- print ' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING%s, &_binding);' % (suffix, SUFFIX)
8537- print ' if (!_binding) {'
8538+ print(' _glGetVertexAttribiv%s(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING%s, &_binding);' % (suffix, SUFFIX))
8539+ print(' if (!_binding) {')
8540
8541 # Get the arguments via glGet*
8542 for arg in function.args[1:]:
8543@@ -1083,40 +1083,40 @@ class GlTracer(Tracer):
8544 else:
8545 arg_get_enum = 'GL_VERTEX_ATTRIB_ARRAY_%s%s' % (arg.name.upper(), SUFFIX)
8546 arg_get_function, arg_type = TypeGetter('glGetVertexAttrib', False, suffix).visit(arg.type)
8547- print ' %s %s = 0;' % (arg_type, arg.name)
8548- print ' _%s(index, %s, &%s);' % (arg_get_function, arg_get_enum, arg.name)
8549+ print(' %s %s = 0;' % (arg_type, arg.name))
8550+ print(' _%s(index, %s, &%s);' % (arg_get_function, arg_get_enum, arg.name))
8551
8552 arg_names = ', '.join([arg.name for arg in function.args[1:-1]])
8553- print ' size_t _size = _%s_size(%s, count);' % (function.name, arg_names)
8554+ print(' size_t _size = _%s_size(%s, count);' % (function.name, arg_names))
8555
8556 # Emit a fake function
8557- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)
8558+ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,))
8559 for arg in function.args:
8560 assert not arg.output
8561- print ' trace::localWriter.beginArg(%u);' % (arg.index,)
8562+ print(' trace::localWriter.beginArg(%u);' % (arg.index,))
8563 if arg.name != 'pointer':
8564 self.serializeValue(arg.type, arg.name)
8565 else:
8566- print ' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name)
8567- print ' trace::localWriter.endArg();'
8568+ print(' trace::localWriter.writeBlob((const void *)%s, _size);' % (arg.name))
8569+ print(' trace::localWriter.endArg();')
8570
8571- print ' trace::localWriter.endEnter();'
8572- print ' trace::localWriter.beginLeave(_call);'
8573- print ' trace::localWriter.endLeave();'
8574- print ' }'
8575- print ' }'
8576- print ' }'
8577- print ' }'
8578- print
8579+ print(' trace::localWriter.endEnter();')
8580+ print(' trace::localWriter.beginLeave(_call);')
8581+ print(' trace::localWriter.endLeave();')
8582+ print(' }')
8583+ print(' }')
8584+ print(' }')
8585+ print(' }')
8586+ print()
8587
8588 # Restore the original array_buffer
8589- print ' if (_array_buffer) {'
8590+ print(' if (_array_buffer) {')
8591 self.fake_glBindBuffer(api, 'GL_ARRAY_BUFFER', '_array_buffer')
8592- print ' }'
8593- print
8594+ print(' }')
8595+ print()
8596
8597- print '}'
8598- print
8599+ print('}')
8600+ print()
8601
8602 #
8603 # Hooks for glTexCoordPointer, which is identical to the other array
8604@@ -1125,49 +1125,49 @@ class GlTracer(Tracer):
8605
8606 def array_prolog(self, api, uppercase_name):
8607 if uppercase_name == 'TEXTURE_COORD':
8608- print ' GLint max_units = 0;'
8609- print ' if (ctx->profile.desktop())'
8610- print ' _glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_units);'
8611- print ' else'
8612- print ' _glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_units);'
8613- print ' GLint client_active_texture = GL_TEXTURE0;'
8614- print ' if (max_units > 0) {'
8615- print ' _glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &client_active_texture);'
8616- print ' }'
8617- print ' GLint unit = 0;'
8618- print ' do {'
8619- print ' GLint texture = GL_TEXTURE0 + unit;'
8620- print ' if (max_units > 0) {'
8621- print ' _glClientActiveTexture(texture);'
8622- print ' }'
8623+ print(' GLint max_units = 0;')
8624+ print(' if (ctx->profile.desktop())')
8625+ print(' _glGetIntegerv(GL_MAX_TEXTURE_COORDS, &max_units);')
8626+ print(' else')
8627+ print(' _glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_units);')
8628+ print(' GLint client_active_texture = GL_TEXTURE0;')
8629+ print(' if (max_units > 0) {')
8630+ print(' _glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE, &client_active_texture);')
8631+ print(' }')
8632+ print(' GLint unit = 0;')
8633+ print(' do {')
8634+ print(' GLint texture = GL_TEXTURE0 + unit;')
8635+ print(' if (max_units > 0) {')
8636+ print(' _glClientActiveTexture(texture);')
8637+ print(' }')
8638
8639 def array_trace_prolog(self, api, uppercase_name):
8640 if uppercase_name == 'TEXTURE_COORD':
8641- print ' bool client_active_texture_dirty = false;'
8642+ print(' bool client_active_texture_dirty = false;')
8643
8644 def array_epilog(self, api, uppercase_name):
8645 if uppercase_name == 'TEXTURE_COORD':
8646- print ' } while (++unit < max_units);'
8647+ print(' } while (++unit < max_units);')
8648 self.array_cleanup(api, uppercase_name)
8649
8650 def array_cleanup(self, api, uppercase_name):
8651 if uppercase_name == 'TEXTURE_COORD':
8652- print ' if (max_units > 0) {'
8653- print ' _glClientActiveTexture(client_active_texture);'
8654- print ' }'
8655+ print(' if (max_units > 0) {')
8656+ print(' _glClientActiveTexture(client_active_texture);')
8657+ print(' }')
8658
8659 def array_trace_intermezzo(self, api, uppercase_name):
8660 if uppercase_name == 'TEXTURE_COORD':
8661- print ' if (texture != client_active_texture || client_active_texture_dirty) {'
8662- print ' client_active_texture_dirty = true;'
8663+ print(' if (texture != client_active_texture || client_active_texture_dirty) {')
8664+ print(' client_active_texture_dirty = true;')
8665 self.fake_glClientActiveTexture_call(api, "texture");
8666- print ' }'
8667+ print(' }')
8668
8669 def array_trace_epilog(self, api, uppercase_name):
8670 if uppercase_name == 'TEXTURE_COORD':
8671- print ' if (client_active_texture_dirty) {'
8672+ print(' if (client_active_texture_dirty) {')
8673 self.fake_glClientActiveTexture_call(api, "client_active_texture");
8674- print ' }'
8675+ print(' }')
8676
8677 def fake_glBindBuffer(self, api, target, buffer):
8678 function = api.getFunctionByName('glBindBuffer')
8679@@ -1180,13 +1180,13 @@ class GlTracer(Tracer):
8680 def emitFakeTexture2D(self):
8681 function = glapi.glapi.getFunctionByName('glTexImage2D')
8682 instances = function.argNames()
8683- print ' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)
8684+ print(' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,))
8685 for arg in function.args:
8686 assert not arg.output
8687 self.serializeArg(function, arg)
8688- print ' trace::localWriter.endEnter();'
8689- print ' trace::localWriter.beginLeave(_fake_call);'
8690- print ' trace::localWriter.endLeave();'
8691+ print(' trace::localWriter.endEnter();')
8692+ print(' trace::localWriter.beginLeave(_fake_call);')
8693+ print(' trace::localWriter.endLeave();')
8694
8695
8696
8697diff --git a/wrappers/glxtrace.py b/wrappers/glxtrace.py
8698index f35d1fe9..b05028e2 100644
8699--- a/wrappers/glxtrace.py
8700+++ b/wrappers/glxtrace.py
8701@@ -64,7 +64,7 @@ class GlxTracer(GlTracer):
8702
8703 def traceFunctionImplBody(self, function):
8704 if function.name in self.destroyContextFunctionNames:
8705- print ' gltrace::releaseContext((uintptr_t)ctx);'
8706+ print(' gltrace::releaseContext((uintptr_t)ctx);')
8707
8708 if function.name == 'glXGetCurrentDisplay':
8709 print ' if(_glXGetCurrentDisplay == &glXGetCurrentDisplay ){'
8710@@ -74,16 +74,16 @@ class GlxTracer(GlTracer):
8711 GlTracer.traceFunctionImplBody(self, function)
8712
8713 if function.name in self.createContextFunctionNames:
8714- print ' if (_result != NULL)'
8715- print ' gltrace::createContext((uintptr_t)_result);'
8716+ print(' if (_result != NULL)')
8717+ print(' gltrace::createContext((uintptr_t)_result);')
8718
8719 if function.name in self.makeCurrentFunctionNames:
8720- print ' if (_result) {'
8721- print ' if (ctx != NULL)'
8722- print ' gltrace::setContext((uintptr_t)ctx);'
8723- print ' else'
8724- print ' gltrace::clearContext();'
8725- print ' }'
8726+ print(' if (_result) {')
8727+ print(' if (ctx != NULL)')
8728+ print(' gltrace::setContext((uintptr_t)ctx);')
8729+ print(' else')
8730+ print(' gltrace::clearContext();')
8731+ print(' }')
8732
8733 if function.name == 'glXBindTexImageEXT':
8734 # FIXME: glXBindTexImageEXT gets called frequently, so we should
8735@@ -92,7 +92,7 @@ class GlxTracer(GlTracer):
8736 # emit emitFakeTexture2D when it changes
8737 # - keep a global hash of the pixels
8738 # FIXME: Handle mipmaps
8739- print r'''
8740+ print(r'''
8741 unsigned glx_target = 0;
8742 _glXQueryDrawable(display, drawable, GLX_TEXTURE_TARGET_EXT, &glx_target);
8743 GLenum target;
8744@@ -152,29 +152,29 @@ class GlxTracer(GlTracer):
8745 GLint row_stride = _align(width * 4, alignment);
8746 GLvoid * pixels = malloc(height * row_stride);
8747 _glGetTexImage(target, level, format, type, pixels);
8748- '''
8749+ ''')
8750 self.emitFakeTexture2D()
8751- print r'''
8752+ print(r'''
8753 free(pixels);
8754 }
8755- '''
8756+ ''')
8757
8758
8759 if __name__ == '__main__':
8760- print
8761- print '#include <stdlib.h>'
8762- print '#include <string.h>'
8763- print
8764- print '#include "trace_writer_local.hpp"'
8765- print
8766- print '// To validate our prototypes'
8767- print '#define GL_GLEXT_PROTOTYPES'
8768- print '#define GLX_GLXEXT_PROTOTYPES'
8769- print
8770- print '#include "dlopen.hpp"'
8771- print '#include "glproc.hpp"'
8772- print '#include "glsize.hpp"'
8773- print
8774+ print()
8775+ print('#include <stdlib.h>')
8776+ print('#include <string.h>')
8777+ print()
8778+ print('#include "trace_writer_local.hpp"')
8779+ print()
8780+ print('// To validate our prototypes')
8781+ print('#define GL_GLEXT_PROTOTYPES')
8782+ print('#define GLX_GLXEXT_PROTOTYPES')
8783+ print()
8784+ print('#include "dlopen.hpp"')
8785+ print('#include "glproc.hpp"')
8786+ print('#include "glsize.hpp"')
8787+ print()
8788
8789 module = Module()
8790 module.mergeModule(glxapi)
8791diff --git a/wrappers/trace.py b/wrappers/trace.py
8792index 7d1baa10..318f0990 100644
8793--- a/wrappers/trace.py
8794+++ b/wrappers/trace.py
8795@@ -69,21 +69,21 @@ class ComplexValueSerializer(stdapi.OnceVisitor):
8796
8797 def visitStruct(self, struct):
8798 # Ensure member array has nonzero length to avoid MSVC error C2466
8799- print 'static const char * _struct%s_members[%u] = {' % (struct.tag, max(len(struct.members), 1))
8800+ print('static const char * _struct%s_members[%u] = {' % (struct.tag, max(len(struct.members), 1)))
8801 for type, name, in struct.members:
8802 if name is None:
8803- print ' "",'
8804+ print(' "",')
8805 else:
8806- print ' "%s",' % (name,)
8807- print '};'
8808- print 'static const trace::StructSig _struct%s_sig = {' % (struct.tag,)
8809+ print(' "%s",' % (name,))
8810+ print('};')
8811+ print('static const trace::StructSig _struct%s_sig = {' % (struct.tag,))
8812 if struct.name is None:
8813 structName = '""'
8814 else:
8815 structName = '"%s"' % struct.name
8816- print ' %u, %s, %u, _struct%s_members' % (struct.id, structName, len(struct.members), struct.tag)
8817- print '};'
8818- print
8819+ print(' %u, %s, %u, _struct%s_members' % (struct.id, structName, len(struct.members), struct.tag))
8820+ print('};')
8821+ print()
8822
8823 def visitArray(self, array):
8824 self.visit(array.type)
8825@@ -95,26 +95,26 @@ class ComplexValueSerializer(stdapi.OnceVisitor):
8826 pass
8827
8828 def visitEnum(self, enum):
8829- print 'static const trace::EnumValue _enum%s_values[] = {' % (enum.tag)
8830+ print('static const trace::EnumValue _enum%s_values[] = {' % (enum.tag))
8831 for value in enum.values:
8832- print ' {"%s", %s},' % (value, value)
8833- print '};'
8834- print
8835- print 'static const trace::EnumSig _enum%s_sig = {' % (enum.tag)
8836- print ' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag)
8837- print '};'
8838- print
8839+ print(' {"%s", %s},' % (value, value))
8840+ print('};')
8841+ print()
8842+ print('static const trace::EnumSig _enum%s_sig = {' % (enum.tag))
8843+ print(' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag))
8844+ print('};')
8845+ print()
8846
8847 def visitBitmask(self, bitmask):
8848- print 'static const trace::BitmaskFlag _bitmask%s_flags[] = {' % (bitmask.tag)
8849+ print('static const trace::BitmaskFlag _bitmask%s_flags[] = {' % (bitmask.tag))
8850 for value in bitmask.values:
8851- print ' {"%s", %s},' % (value, value)
8852- print '};'
8853- print
8854- print 'static const trace::BitmaskSig _bitmask%s_sig = {' % (bitmask.tag)
8855- print ' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag)
8856- print '};'
8857- print
8858+ print(' {"%s", %s},' % (value, value))
8859+ print('};')
8860+ print()
8861+ print('static const trace::BitmaskSig _bitmask%s_sig = {' % (bitmask.tag))
8862+ print(' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag))
8863+ print('};')
8864+ print()
8865
8866 def visitPointer(self, pointer):
8867 self.visit(pointer.type)
8868@@ -146,16 +146,16 @@ class ComplexValueSerializer(stdapi.OnceVisitor):
8869 def visitPolymorphic(self, polymorphic):
8870 if not polymorphic.contextLess:
8871 return
8872- print 'static void _write__%s(int selector, %s const & value) {' % (polymorphic.tag, polymorphic.expr)
8873- print ' switch (selector) {'
8874+ print('static void _write__%s(int selector, %s const & value) {' % (polymorphic.tag, polymorphic.expr))
8875+ print(' switch (selector) {')
8876 for cases, type in polymorphic.iterSwitch():
8877 for case in cases:
8878- print ' %s:' % case
8879+ print(' %s:' % case)
8880 self.serializer.visit(type, '(%s)(value)' % (type,))
8881- print ' break;'
8882- print ' }'
8883- print '}'
8884- print
8885+ print(' break;')
8886+ print(' }')
8887+ print('}')
8888+ print()
8889
8890
8891 class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin):
8892@@ -167,7 +167,7 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin):
8893 '''
8894
8895 def visitLiteral(self, literal, instance):
8896- print ' trace::localWriter.write%s(%s);' % (literal.kind, instance)
8897+ print(' trace::localWriter.write%s(%s);' % (literal.kind, instance))
8898
8899 def visitString(self, string, instance):
8900 if not string.wide:
8901@@ -183,33 +183,33 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin):
8902 length = ', %s' % self.expand(string.length)
8903 else:
8904 length = ''
8905- print ' trace::localWriter.write%s(%s%s);' % (suffix, instance, length)
8906+ print(' trace::localWriter.write%s(%s%s);' % (suffix, instance, length))
8907
8908 def visitConst(self, const, instance):
8909 self.visit(const.type, instance)
8910
8911 def visitStruct(self, struct, instance):
8912- print ' trace::localWriter.beginStruct(&_struct%s_sig);' % (struct.tag,)
8913+ print(' trace::localWriter.beginStruct(&_struct%s_sig);' % (struct.tag,))
8914 for member in struct.members:
8915 self.visitMember(member, instance)
8916- print ' trace::localWriter.endStruct();'
8917+ print(' trace::localWriter.endStruct();')
8918
8919 def visitArray(self, array, instance):
8920 length = '_c' + array.type.tag
8921 index = '_i' + array.type.tag
8922 array_length = self.expand(array.length)
8923- print ' if (%s) {' % instance
8924- print ' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length)
8925- print ' trace::localWriter.beginArray(%s);' % length
8926- print ' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index)
8927- print ' trace::localWriter.beginElement();'
8928+ print(' if (%s) {' % instance)
8929+ print(' size_t %s = %s > 0 ? %s : 0;' % (length, array_length, array_length))
8930+ print(' trace::localWriter.beginArray(%s);' % length)
8931+ print(' for (size_t %s = 0; %s < %s; ++%s) {' % (index, index, length, index))
8932+ print(' trace::localWriter.beginElement();')
8933 self.visitElement(index, array.type, '(%s)[%s]' % (instance, index))
8934- print ' trace::localWriter.endElement();'
8935- print ' }'
8936- print ' trace::localWriter.endArray();'
8937- print ' } else {'
8938- print ' trace::localWriter.writeNull();'
8939- print ' }'
8940+ print(' trace::localWriter.endElement();')
8941+ print(' }')
8942+ print(' trace::localWriter.endArray();')
8943+ print(' } else {')
8944+ print(' trace::localWriter.writeNull();')
8945+ print(' }')
8946
8947 def visitAttribArray(self, array, instance):
8948 # For each element, decide if it is a key or a value (which depends on the previous key).
8949@@ -218,90 +218,90 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin):
8950
8951 # determine the array length which must be passed to writeArray() up front
8952 count = '_c' + array.baseType.tag
8953- print ' {'
8954- print ' int %s;' % count
8955- print ' for (%(c)s = 0; %(array)s && %(array)s[%(c)s] != %(terminator)s; %(c)s += 2) {' \
8956- % {'c': count, 'array': instance, 'terminator': array.terminator}
8957+ print(' {')
8958+ print(' int %s;' % count)
8959+ print(' for (%(c)s = 0; %(array)s && %(array)s[%(c)s] != %(terminator)s; %(c)s += 2) {' \
8960+ % {'c': count, 'array': instance, 'terminator': array.terminator})
8961 if array.hasKeysWithoutValues:
8962- print ' switch (int(%(array)s[%(c)s])) {' % {'array': instance, 'c': count}
8963+ print(' switch (int(%(array)s[%(c)s])) {' % {'array': instance, 'c': count})
8964 for key, valueType in array.valueTypes:
8965 if valueType is None:
8966- print ' case %s:' % key
8967- print ' %s--;' % count # the next value is a key again and checked if it's the terminator
8968- print ' break;'
8969- print ' }'
8970- print ' }'
8971- print ' %(c)s += %(array)s ? 1 : 0;' % {'c': count, 'array': instance}
8972- print ' trace::localWriter.beginArray(%s);' % count
8973+ print(' case %s:' % key)
8974+ print(' %s--;' % count) # the next value is a key again and checked if it's the terminator
8975+ print(' break;')
8976+ print(' }')
8977+ print(' }')
8978+ print(' %(c)s += %(array)s ? 1 : 0;' % {'c': count, 'array': instance})
8979+ print(' trace::localWriter.beginArray(%s);' % count)
8980
8981 # for each key / key-value pair write the key and the value, if the key requires one
8982
8983 index = '_i' + array.baseType.tag
8984- print ' for (int %(i)s = 0; %(i)s < %(count)s; %(i)s++) {' % {'i': index, 'count': count}
8985- print ' trace::localWriter.beginElement();'
8986+ print(' for (int %(i)s = 0; %(i)s < %(count)s; %(i)s++) {' % {'i': index, 'count': count})
8987+ print(' trace::localWriter.beginElement();')
8988 self.visit(array.baseType, "%(array)s[%(i)s]" % {'array': instance, 'i': index})
8989- print ' trace::localWriter.endElement();'
8990- print ' if (%(i)s + 1 >= %(count)s) {' % {'i': index, 'count': count}
8991- print ' break;'
8992- print ' }'
8993- print ' switch (int(%(array)s[%(i)s++])) {' % {'array': instance, 'i': index}
8994+ print(' trace::localWriter.endElement();')
8995+ print(' if (%(i)s + 1 >= %(count)s) {' % {'i': index, 'count': count})
8996+ print(' break;')
8997+ print(' }')
8998+ print(' switch (int(%(array)s[%(i)s++])) {' % {'array': instance, 'i': index})
8999 # write generic value the usual way
9000 for key, valueType in array.valueTypes:
9001 if valueType is not None:
9002- print ' case %s:' % key
9003- print ' trace::localWriter.beginElement();'
9004+ print(' case %s:' % key)
9005+ print(' trace::localWriter.beginElement();')
9006 self.visitElement(index, valueType, '(%(array)s)[%(i)s]' % {'array': instance, 'i': index})
9007- print ' trace::localWriter.endElement();'
9008- print ' break;'
9009+ print(' trace::localWriter.endElement();')
9010+ print(' break;')
9011 # known key with no value, just decrease the index so we treat the next value as a key
9012 if array.hasKeysWithoutValues:
9013 for key, valueType in array.valueTypes:
9014 if valueType is None:
9015- print ' case %s:' % key
9016- print ' %s--;' % index
9017- print ' break;'
9018+ print(' case %s:' % key)
9019+ print(' %s--;' % index)
9020+ print(' break;')
9021 # unknown key, write an int value
9022- print ' default:'
9023- print ' trace::localWriter.beginElement();'
9024- print ' os::log("apitrace: warning: %s: unknown key 0x%04X, interpreting value as int\\n", ' + \
9025- '__FUNCTION__, int(%(array)s[%(i)s - 1]));' % {'array': instance, 'i': index}
9026- print ' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index}
9027- print ' trace::localWriter.endElement();'
9028- print ' break;'
9029- print ' }'
9030- print ' }'
9031- print ' trace::localWriter.endArray();'
9032- print ' }'
9033+ print(' default:')
9034+ print(' trace::localWriter.beginElement();')
9035+ print(' os::log("apitrace: warning: %s: unknown key 0x%04X, interpreting value as int\\n", ' + \
9036+ '__FUNCTION__, int(%(array)s[%(i)s - 1]));' % {'array': instance, 'i': index})
9037+ print(' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index})
9038+ print(' trace::localWriter.endElement();')
9039+ print(' break;')
9040+ print(' }')
9041+ print(' }')
9042+ print(' trace::localWriter.endArray();')
9043+ print(' }')
9044
9045
9046 def visitBlob(self, blob, instance):
9047- print ' trace::localWriter.writeBlob(%s, %s);' % (instance, self.expand(blob.size))
9048+ print(' trace::localWriter.writeBlob(%s, %s);' % (instance, self.expand(blob.size)))
9049
9050 def visitEnum(self, enum, instance):
9051- print ' trace::localWriter.writeEnum(&_enum%s_sig, %s);' % (enum.tag, instance)
9052+ print(' trace::localWriter.writeEnum(&_enum%s_sig, %s);' % (enum.tag, instance))
9053
9054 def visitBitmask(self, bitmask, instance):
9055- print ' trace::localWriter.writeBitmask(&_bitmask%s_sig, %s);' % (bitmask.tag, instance)
9056+ print(' trace::localWriter.writeBitmask(&_bitmask%s_sig, %s);' % (bitmask.tag, instance))
9057
9058 def visitPointer(self, pointer, instance):
9059- print ' if (%s) {' % instance
9060- print ' trace::localWriter.beginArray(1);'
9061- print ' trace::localWriter.beginElement();'
9062+ print(' if (%s) {' % instance)
9063+ print(' trace::localWriter.beginArray(1);')
9064+ print(' trace::localWriter.beginElement();')
9065 self.visit(pointer.type, "*" + instance)
9066- print ' trace::localWriter.endElement();'
9067- print ' trace::localWriter.endArray();'
9068- print ' } else {'
9069- print ' trace::localWriter.writeNull();'
9070- print ' }'
9071+ print(' trace::localWriter.endElement();')
9072+ print(' trace::localWriter.endArray();')
9073+ print(' } else {')
9074+ print(' trace::localWriter.writeNull();')
9075+ print(' }')
9076
9077 def visitIntPointer(self, pointer, instance):
9078- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance
9079+ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance)
9080
9081 def visitObjPointer(self, pointer, instance):
9082- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance
9083+ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance)
9084
9085 def visitLinearPointer(self, pointer, instance):
9086- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance
9087+ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance)
9088
9089 def visitReference(self, reference, instance):
9090 self.visit(reference.type, instance)
9091@@ -313,31 +313,31 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin):
9092 self.visit(alias.type, instance)
9093
9094 def visitOpaque(self, opaque, instance):
9095- print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance
9096+ print(' trace::localWriter.writePointer((uintptr_t)%s);' % instance)
9097
9098 def visitInterface(self, interface, instance):
9099 assert False
9100
9101 def visitPolymorphic(self, polymorphic, instance):
9102 if polymorphic.contextLess:
9103- print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance)
9104+ print(' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance))
9105 else:
9106 switchExpr = self.expand(polymorphic.switchExpr)
9107- print ' switch (%s) {' % switchExpr
9108+ print(' switch (%s) {' % switchExpr)
9109 for cases, type in polymorphic.iterSwitch():
9110 for case in cases:
9111- print ' %s:' % case
9112+ print(' %s:' % case)
9113 caseInstance = instance
9114 if type.expr is not None:
9115 caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance)
9116 self.visit(type, caseInstance)
9117- print ' break;'
9118+ print(' break;')
9119 if polymorphic.defaultType is None:
9120- print r' default:'
9121- print r' os::log("apitrace: warning: %%s: unexpected polymorphic case %%i\n", __FUNCTION__, (int)%s);' % (switchExpr,)
9122- print r' trace::localWriter.writeNull();'
9123- print r' break;'
9124- print ' }'
9125+ print(r' default:')
9126+ print(r' os::log("apitrace: warning: %%s: unexpected polymorphic case %%i\n", __FUNCTION__, (int)%s);' % (switchExpr,))
9127+ print(r' trace::localWriter.writeNull();')
9128+ print(r' break;')
9129+ print(' }')
9130
9131
9132 class WrapDecider(stdapi.Traverser):
9133@@ -369,16 +369,16 @@ class ValueWrapper(stdapi.Traverser, stdapi.ExpanderMixin):
9134
9135 def visitArray(self, array, instance):
9136 array_length = self.expand(array.length)
9137- print " if (%s) {" % instance
9138- print " for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length
9139+ print(" if (%s) {" % instance)
9140+ print(" for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length)
9141 self.visitElement('_i', array.type, instance + "[_i]")
9142- print " }"
9143- print " }"
9144+ print(" }")
9145+ print(" }")
9146
9147 def visitPointer(self, pointer, instance):
9148- print " if (%s) {" % instance
9149+ print(" if (%s) {" % instance)
9150 self.visit(pointer.type, "*" + instance)
9151- print " }"
9152+ print(" }")
9153
9154 def visitObjPointer(self, pointer, instance):
9155 elem_type = pointer.type.mutable()
9156@@ -388,13 +388,13 @@ class ValueWrapper(stdapi.Traverser, stdapi.ExpanderMixin):
9157 self.visitInterfacePointer(elem_type.type, instance)
9158 else:
9159 # All interfaces should at least implement IUnknown
9160- print " WrapIUnknown::_wrap(__FUNCTION__, (IUnknown **) &%s);" % (instance,)
9161+ print(" WrapIUnknown::_wrap(__FUNCTION__, (IUnknown **) &%s);" % (instance,))
9162
9163 def visitInterface(self, interface, instance):
9164 raise NotImplementedError
9165
9166 def visitInterfacePointer(self, interface, instance):
9167- print " Wrap%s::_wrap(__FUNCTION__, &%s);" % (interface.name, instance)
9168+ print(" Wrap%s::_wrap(__FUNCTION__, &%s);" % (interface.name, instance))
9169
9170 def visitPolymorphic(self, type, instance):
9171 # XXX: There might be polymorphic values that need wrapping in the future
9172@@ -409,17 +409,17 @@ class ValueUnwrapper(ValueWrapper):
9173 def visitStruct(self, struct, instance):
9174 if not self.allocated:
9175 # Argument is constant. We need to create a non const
9176- print ' {'
9177- print " %s * _t = static_cast<%s *>(alloca(sizeof *_t));" % (struct, struct)
9178- print ' *_t = %s;' % (instance,)
9179+ print(' {')
9180+ print(" %s * _t = static_cast<%s *>(alloca(sizeof *_t));" % (struct, struct))
9181+ print(' *_t = %s;' % (instance,))
9182 assert instance.startswith('*')
9183- print ' %s = _t;' % (instance[1:],)
9184+ print(' %s = _t;' % (instance[1:],))
9185 instance = '*_t'
9186 self.allocated = True
9187 try:
9188 return ValueWrapper.visitStruct(self, struct, instance)
9189 finally:
9190- print ' }'
9191+ print(' }')
9192 else:
9193 return ValueWrapper.visitStruct(self, struct, instance)
9194
9195@@ -428,18 +428,18 @@ class ValueUnwrapper(ValueWrapper):
9196 return ValueWrapper.visitArray(self, array, instance)
9197 array_length = self.expand(array.length)
9198 elem_type = array.type.mutable()
9199- print " if (%s && %s) {" % (instance, array_length)
9200- print " %s * _t = static_cast<%s *>(alloca(%s * sizeof *_t));" % (elem_type, elem_type, array_length)
9201- print " for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length
9202- print " _t[_i] = %s[_i];" % instance
9203+ print(" if (%s && %s) {" % (instance, array_length))
9204+ print(" %s * _t = static_cast<%s *>(alloca(%s * sizeof *_t));" % (elem_type, elem_type, array_length))
9205+ print(" for (size_t _i = 0, _s = %s; _i < _s; ++_i) {" % array_length)
9206+ print(" _t[_i] = %s[_i];" % instance)
9207 self.allocated = True
9208 self.visit(array.type, "_t[_i]")
9209- print " }"
9210- print " %s = _t;" % instance
9211- print " }"
9212+ print(" }")
9213+ print(" %s = _t;" % instance)
9214+ print(" }")
9215
9216 def visitInterfacePointer(self, interface, instance):
9217- print r' Wrap%s::_unwrap(__FUNCTION__, &%s);' % (interface.name, instance)
9218+ print(r' Wrap%s::_unwrap(__FUNCTION__, &%s);' % (interface.name, instance))
9219
9220
9221 def _getInterfaceHierarchy(allIfaces, baseIface, result):
9222@@ -479,14 +479,17 @@ class Tracer:
9223 # Includes
9224 for module in api.modules:
9225 for header in module.headers:
9226- print header
9227- print
9228+ print(header)
9229+ print()
9230
9231 # Generate the serializer functions
9232 types = api.getAllTypes()
9233 visitor = ComplexValueSerializer(self.serializerFactory())
9234- map(visitor.visit, types)
9235- print
9236+
9237+ for tp in types:
9238+ visitor.visit(tp)
9239+
9240+ print()
9241
9242 # Interfaces wrapers
9243 self.traceInterfaces(api)
9244@@ -498,22 +501,22 @@ class Tracer:
9245 self.traceFunctionDecl(function)
9246 for function in api.getAllFunctions():
9247 self.traceFunctionImpl(function)
9248- print
9249+ print()
9250
9251 self.footer(api)
9252
9253 def header(self, api):
9254- print '#ifdef _WIN32'
9255- print '# include <malloc.h> // alloca'
9256- print '# ifndef alloca'
9257- print '# define alloca _alloca'
9258- print '# endif'
9259- print '#else'
9260- print '# include <alloca.h> // alloca'
9261- print '#endif'
9262- print
9263- print
9264- print 'static std::map<void *, void *> g_WrappedObjects;'
9265+ print('#ifdef _WIN32')
9266+ print('# include <malloc.h> // alloca')
9267+ print('# ifndef alloca')
9268+ print('# define alloca _alloca')
9269+ print('# endif')
9270+ print('#else')
9271+ print('# include <alloca.h> // alloca')
9272+ print('#endif')
9273+ print()
9274+ print()
9275+ print('static std::map<void *, void *> g_WrappedObjects;')
9276
9277 def footer(self, api):
9278 pass
9279@@ -523,11 +526,11 @@ class Tracer:
9280
9281 if not function.internal:
9282 if function.args:
9283- print 'static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args]))
9284+ print('static const char * _%s_args[%u] = {%s};' % (function.name, len(function.args), ', '.join(['"%s"' % arg.name for arg in function.args])))
9285 else:
9286- print 'static const char ** _%s_args = NULL;' % (function.name,)
9287- print 'static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, self.getFunctionSigId(), function.name, len(function.args), function.name)
9288- print
9289+ print('static const char ** _%s_args = NULL;' % (function.name,))
9290+ print('static const trace::FunctionSig _%s_sig = {%u, "%s", %u, _%s_args};' % (function.name, self.getFunctionSigId(), function.sigName(), len(function.args), function.name))
9291+ print()
9292
9293 def getFunctionSigId(self):
9294 id = Tracer.__id
9295@@ -539,12 +542,12 @@ class Tracer:
9296
9297 def traceFunctionImpl(self, function):
9298 if self.isFunctionPublic(function):
9299- print 'extern "C" PUBLIC'
9300+ print('extern "C" PUBLIC')
9301 else:
9302- print 'extern "C" PRIVATE'
9303- print function.prototype() + ' {'
9304+ print('extern "C" PRIVATE')
9305+ print(function.prototype() + ' {')
9306 if function.type is not stdapi.Void:
9307- print ' %s _result;' % function.type
9308+ print(' %s _result;' % function.type)
9309
9310 for arg in function.args:
9311 if not arg.output:
9312@@ -555,43 +558,43 @@ class Tracer:
9313 # XXX: wrapping should go here, but before we can do that we'll need to protect g_WrappedObjects with its own mutex
9314
9315 if function.type is not stdapi.Void:
9316- print ' return _result;'
9317+ print(' return _result;')
9318
9319- print '}'
9320- print
9321+ print('}')
9322+ print()
9323
9324 def traceFunctionImplBody(self, function):
9325 multi_draw_function_regex = re.compile(r'^glMultiDraw(Arrays|Elements)([A-Z][a-zA-Z]*)?$' )
9326 if not function.internal:
9327- print ' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,)
9328+ print(' unsigned _call = trace::localWriter.beginEnter(&_%s_sig);' % (function.name,))
9329 for arg in function.args:
9330 if not arg.output:
9331 self.serializeArg(function, arg)
9332- print ' trace::localWriter.endEnter();'
9333+ print(' trace::localWriter.endEnter();')
9334
9335 if self.multi_draw_function_regex.match(function.name):
9336- print ' trace::localWriter.beginIgnore();'
9337- print ' trace::localWriter.endIgnore();'
9338+ print(' trace::localWriter.beginIgnore();')
9339+ print(' trace::localWriter.endEnter();')
9340
9341 self.invokeFunction(function)
9342
9343 if self.multi_draw_function_regex.match(function.name):
9344- print ' trace::localWriter.beginTrace();'
9345- print ' trace::localWriter.endTrace();'
9346+ print(' trace::localWriter.beginTrace();')
9347+ print(' trace::localWriter.endTrace();')
9348
9349 if not function.internal:
9350- print ' trace::localWriter.beginLeave(_call);'
9351- print ' if (%s) {' % self.wasFunctionSuccessful(function)
9352+ print(' trace::localWriter.beginLeave(_call);')
9353+ print(' if (%s) {' % self.wasFunctionSuccessful(function))
9354 for arg in function.args:
9355 if arg.output:
9356 self.serializeArg(function, arg)
9357 self.wrapArg(function, arg)
9358- print ' }'
9359+ print(' }')
9360 if function.type is not stdapi.Void:
9361 self.serializeRet(function, "_result")
9362 if function.type is not stdapi.Void:
9363 self.wrapRet(function, "_result")
9364- print ' trace::localWriter.endLeave();'
9365+ print(' trace::localWriter.endLeave();')
9366
9367 def invokeFunction(self, function):
9368 self.doInvokeFunction(function)
9369@@ -603,7 +606,7 @@ class Tracer:
9370 else:
9371 result = '_result = '
9372 dispatch = prefix + function.name + suffix
9373- print ' %s%s(%s);' % (result, dispatch, ', '.join([str(arg.name) for arg in function.args]))
9374+ print(' %s%s(%s);' % (result, dispatch, ', '.join([str(arg.name) for arg in function.args])))
9375
9376 def wasFunctionSuccessful(self, function):
9377 if function.type is stdapi.Void:
9378@@ -613,9 +616,9 @@ class Tracer:
9379 return 'true'
9380
9381 def serializeArg(self, function, arg):
9382- print ' trace::localWriter.beginArg(%u);' % (arg.index,)
9383+ print(' trace::localWriter.beginArg(%u);' % (arg.index,))
9384 self.serializeArgValue(function, arg)
9385- print ' trace::localWriter.endArg();'
9386+ print(' trace::localWriter.endArg();')
9387
9388 def serializeArgValue(self, function, arg):
9389 self.serializeValue(arg.type, arg.name)
9390@@ -641,9 +644,9 @@ class Tracer:
9391 self.unwrapValue(arg.type, arg.name)
9392
9393 def serializeRet(self, function, instance):
9394- print ' trace::localWriter.beginReturn();'
9395+ print(' trace::localWriter.beginReturn();')
9396 self.serializeValue(function.type, instance)
9397- print ' trace::localWriter.endReturn();'
9398+ print(' trace::localWriter.endReturn();')
9399
9400 def serializeValue(self, type, instance):
9401 serializer = self.serializerFactory()
9402@@ -672,70 +675,72 @@ class Tracer:
9403 if not interfaces:
9404 return
9405
9406- print r'#include "guids.hpp"'
9407- print
9408+ print(r'#include "guids.hpp"')
9409+ print()
9410
9411 map(self.declareWrapperInterface, interfaces)
9412
9413 # Helper functions to wrap/unwrap interface pointers
9414- print r'static inline bool'
9415- print r'hasChildInterface(REFIID riid, IUnknown *pUnknown) {'
9416- print r' IUnknown *pObj = NULL;'
9417- print r' HRESULT hr = pUnknown->QueryInterface(riid, (VOID **)&pObj);'
9418- print r' if (FAILED(hr)) {'
9419- print r' return false;'
9420- print r' }'
9421- print r' assert(pObj);'
9422- print r' pObj->Release();'
9423- print r' return pUnknown == pObj;'
9424- print r'}'
9425- print
9426- print r'static inline const void *'
9427- print r'getVtbl(const void *pvObj) {'
9428- print r' return pvObj ? *(const void **)pvObj : NULL;'
9429- print r'}'
9430- print
9431+ print(r'static inline bool')
9432+ print(r'hasChildInterface(REFIID riid, IUnknown *pUnknown) {')
9433+ print(r' IUnknown *pObj = NULL;')
9434+ print(r' HRESULT hr = pUnknown->QueryInterface(riid, (VOID **)&pObj);')
9435+ print(r' if (FAILED(hr)) {')
9436+ print(r' return false;')
9437+ print(r' }')
9438+ print(r' assert(pObj);')
9439+ print(r' pObj->Release();')
9440+ print(r' return pUnknown == pObj;')
9441+ print(r'}')
9442+ print()
9443+ print(r'static inline const void *')
9444+ print(r'getVtbl(const void *pvObj) {')
9445+ print(r' return pvObj ? *(const void **)pvObj : NULL;')
9446+ print(r'}')
9447+ print()
9448
9449 self.implementIidWrapper(api)
9450
9451- map(self.implementWrapperInterface, interfaces)
9452- print
9453+ for iface in interfaces:
9454+ self.implementWrapperInterface(iface)
9455+
9456+ print()
9457
9458 def declareWrapperInterface(self, interface):
9459 wrapperInterfaceName = getWrapperInterfaceName(interface)
9460- print "class %s : public %s " % (wrapperInterfaceName, interface.name)
9461- print "{"
9462- print "private:"
9463- print " %s(%s * pInstance);" % (wrapperInterfaceName, interface.name)
9464- print " virtual ~%s();" % wrapperInterfaceName
9465- print "public:"
9466- print " static %s* _create(const char *entryName, %s * pInstance);" % (wrapperInterfaceName, interface.name)
9467- print " static void _wrap(const char *entryName, %s ** ppInstance);" % (interface.name,)
9468- print " static void _unwrap(const char *entryName, %s ** pInstance);" % (interface.name,)
9469- print
9470+ print("class %s : public %s " % (wrapperInterfaceName, interface.name))
9471+ print("{")
9472+ print("private:")
9473+ print(" %s(%s * pInstance);" % (wrapperInterfaceName, interface.name))
9474+ print(" virtual ~%s();" % wrapperInterfaceName)
9475+ print("public:")
9476+ print(" static %s* _create(const char *entryName, %s * pInstance);" % (wrapperInterfaceName, interface.name))
9477+ print(" static void _wrap(const char *entryName, %s ** ppInstance);" % (interface.name,))
9478+ print(" static void _unwrap(const char *entryName, %s ** pInstance);" % (interface.name,))
9479+ print()
9480
9481 methods = list(interface.iterMethods())
9482 for method in methods:
9483- print " " + method.prototype() + ";"
9484+ print(" " + method.prototype() + ";")
9485 print
9486
9487 for type, name, value in self.enumWrapperInterfaceVariables(interface):
9488- print ' %s %s;' % (type, name)
9489- print
9490-
9491- print r'private:'
9492- print r' void _dummy(unsigned i) const {'
9493- 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
9494- print r' trace::localWriter.flush();'
9495- print r' os::abort();'
9496- print r' }'
9497- print
9498+ print(' %s %s;' % (type, name))
9499+ print()
9500+
9501+ print(r'private:')
9502+ print(r' void _dummy(unsigned i) const {')
9503+ 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)
9504+ print(r' trace::localWriter.flush();')
9505+ print(r' os::abort();')
9506+ print(r' }')
9507+ print()
9508 for i in range(len(methods), 64):
9509- print r' virtual void _dummy%i(void) const { _dummy(%i); }' % (i, i)
9510- print
9511+ print(r' virtual void _dummy%i(void) const { _dummy(%i); }' % (i, i))
9512+ print()
9513
9514- print "};"
9515- print
9516+ print("};")
9517+ print()
9518
9519 def enumWrapperInterfaceVariables(self, interface):
9520 return [
9521@@ -751,101 +756,101 @@ class Tracer:
9522 wrapperInterfaceName = getWrapperInterfaceName(iface)
9523
9524 # Private constructor
9525- print '%s::%s(%s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name)
9526+ print('%s::%s(%s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name))
9527 for type, name, value in self.enumWrapperInterfaceVariables(iface):
9528 if value is not None:
9529- print ' %s = %s;' % (name, value)
9530- print '}'
9531- print
9532+ print(' %s = %s;' % (name, value))
9533+ print('}')
9534+ print()
9535
9536 # Public constructor
9537- print '%s *%s::_create(const char *entryName, %s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name)
9538- print r' Wrap%s *pWrapper = new Wrap%s(pInstance);' % (iface.name, iface.name)
9539+ print('%s *%s::_create(const char *entryName, %s * pInstance) {' % (wrapperInterfaceName, wrapperInterfaceName, iface.name))
9540+ print(r' Wrap%s *pWrapper = new Wrap%s(pInstance);' % (iface.name, iface.name))
9541 if debug:
9542- print r' os::log("%%s: created %s pvObj=%%p pWrapper=%%p pVtbl=%%p\n", entryName, pInstance, pWrapper, pWrapper->m_pVtbl);' % iface.name
9543- print r' g_WrappedObjects[pInstance] = pWrapper;'
9544- print r' return pWrapper;'
9545- print '}'
9546- print
9547+ print(r' os::log("%%s: created %s pvObj=%%p pWrapper=%%p pVtbl=%%p\n", entryName, pInstance, pWrapper, pWrapper->m_pVtbl);' % iface.name)
9548+ print(r' g_WrappedObjects[pInstance] = pWrapper;')
9549+ print(r' return pWrapper;')
9550+ print('}')
9551+ print()
9552
9553 # Destructor
9554- print '%s::~%s() {' % (wrapperInterfaceName, wrapperInterfaceName)
9555+ print('%s::~%s() {' % (wrapperInterfaceName, wrapperInterfaceName))
9556 if debug:
9557- print r' os::log("%s::Release: deleted pvObj=%%p pWrapper=%%p pVtbl=%%p\n", m_pInstance, this, m_pVtbl);' % iface.name
9558- print r' g_WrappedObjects.erase(m_pInstance);'
9559- print '}'
9560- print
9561+ print(r' os::log("%s::Release: deleted pvObj=%%p pWrapper=%%p pVtbl=%%p\n", m_pInstance, this, m_pVtbl);' % iface.name)
9562+ print(r' g_WrappedObjects.erase(m_pInstance);')
9563+ print('}')
9564+ print()
9565
9566 baseMethods = list(iface.iterBaseMethods())
9567 for base, method in baseMethods:
9568 self.base = base
9569 self.implementWrapperInterfaceMethod(iface, base, method)
9570
9571- print
9572+ print()
9573
9574 # Wrap pointer
9575 ifaces = self.api.getAllInterfaces()
9576- print r'void'
9577- print r'%s::_wrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name)
9578- print r' if (!ppObj) {'
9579- print r' return;'
9580- print r' }'
9581- print r' %s *pObj = *ppObj;' % (iface.name,)
9582- print r' if (!pObj) {'
9583- print r' return;'
9584- print r' }'
9585- print r' assert(hasChildInterface(IID_%s, pObj));' % iface.name
9586- print r' std::map<void *, void *>::const_iterator it = g_WrappedObjects.find(pObj);'
9587- print r' if (it != g_WrappedObjects.end()) {'
9588- print r' Wrap%s *pWrapper = (Wrap%s *)it->second;' % (iface.name, iface.name)
9589- print r' assert(pWrapper);'
9590- print r' assert(pWrapper->m_dwMagic == 0xd8365d6c);'
9591- print r' assert(pWrapper->m_pInstance == pObj);'
9592- print r' if (pWrapper->m_pVtbl == getVtbl(pObj) &&'
9593- print r' pWrapper->m_NumMethods >= %s) {' % len(baseMethods)
9594+ print(r'void')
9595+ print(r'%s::_wrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name))
9596+ print(r' if (!ppObj) {')
9597+ print(r' return;')
9598+ print(r' }')
9599+ print(r' %s *pObj = *ppObj;' % (iface.name,))
9600+ print(r' if (!pObj) {')
9601+ print(r' return;')
9602+ print(r' }')
9603+ print(r' assert(hasChildInterface(IID_%s, pObj));' % iface.name)
9604+ print(r' std::map<void *, void *>::const_iterator it = g_WrappedObjects.find(pObj);')
9605+ print(r' if (it != g_WrappedObjects.end()) {')
9606+ print(r' Wrap%s *pWrapper = (Wrap%s *)it->second;' % (iface.name, iface.name))
9607+ print(r' assert(pWrapper);')
9608+ print(r' assert(pWrapper->m_dwMagic == 0xd8365d6c);')
9609+ print(r' assert(pWrapper->m_pInstance == pObj);')
9610+ print(r' if (pWrapper->m_pVtbl == getVtbl(pObj) &&')
9611+ print(r' pWrapper->m_NumMethods >= %s) {' % len(baseMethods))
9612 if debug:
9613- print r' os::log("%s: fetched pvObj=%p pWrapper=%p pVtbl=%p\n", entryName, pObj, pWrapper, pWrapper->m_pVtbl);'
9614- print r' *ppObj = pWrapper;'
9615- print r' return;'
9616- print r' }'
9617- print r' }'
9618+ print(r' os::log("%s: fetched pvObj=%p pWrapper=%p pVtbl=%p\n", entryName, pObj, pWrapper, pWrapper->m_pVtbl);')
9619+ print(r' *ppObj = pWrapper;')
9620+ print(r' return;')
9621+ print(r' }')
9622+ print(r' }')
9623 for childIface in getInterfaceHierarchy(ifaces, iface):
9624- print r' if (hasChildInterface(IID_%s, pObj)) {' % (childIface.name,)
9625- print r' *ppObj = Wrap%s::_create(entryName, static_cast<%s *>(pObj));' % (childIface.name, childIface.name)
9626- print r' return;'
9627- print r' }'
9628- print r' *ppObj = Wrap%s::_create(entryName, pObj);' % iface.name
9629- print r'}'
9630- print
9631+ print(r' if (hasChildInterface(IID_%s, pObj)) {' % (childIface.name,))
9632+ print(r' *ppObj = Wrap%s::_create(entryName, static_cast<%s *>(pObj));' % (childIface.name, childIface.name))
9633+ print(r' return;')
9634+ print(r' }')
9635+ print(r' *ppObj = Wrap%s::_create(entryName, pObj);' % iface.name)
9636+ print(r'}')
9637+ print()
9638
9639 # Unwrap pointer
9640- print r'void'
9641- print r'%s::_unwrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name)
9642- print r' if (!ppObj || !*ppObj) {'
9643- print r' return;'
9644- print r' }'
9645- print r' const %s *pWrapper = static_cast<const %s*>(*ppObj);' % (wrapperInterfaceName, getWrapperInterfaceName(iface))
9646- print r' if (pWrapper && pWrapper->m_dwMagic == 0xd8365d6c) {'
9647- print r' *ppObj = pWrapper->m_pInstance;'
9648- print r' } else {'
9649- print r' os::log("apitrace: warning: %%s: unexpected %%s pointer %%p\n", entryName, "%s", *ppObj);' % iface.name
9650- print r' trace::localWriter.flush();'
9651- print r' }'
9652- print r'}'
9653- print
9654+ print(r'void')
9655+ print(r'%s::_unwrap(const char *entryName, %s **ppObj) {' % (wrapperInterfaceName, iface.name))
9656+ print(r' if (!ppObj || !*ppObj) {')
9657+ print(r' return;')
9658+ print(r' }')
9659+ print(r' const %s *pWrapper = static_cast<const %s*>(*ppObj);' % (wrapperInterfaceName, getWrapperInterfaceName(iface)))
9660+ print(r' if (pWrapper && pWrapper->m_dwMagic == 0xd8365d6c) {')
9661+ print(r' *ppObj = pWrapper->m_pInstance;')
9662+ print(r' } else {')
9663+ print(r' os::log("apitrace: warning: %%s: unexpected %%s pointer %%p\n", entryName, "%s", *ppObj);' % iface.name)
9664+ print(r' trace::localWriter.flush();')
9665+ print(r' }')
9666+ print(r'}')
9667+ print()
9668
9669 def implementWrapperInterfaceMethod(self, interface, base, method):
9670 wrapperInterfaceName = getWrapperInterfaceName(interface)
9671
9672- print method.prototype(wrapperInterfaceName + '::' + method.name) + ' {'
9673+ print(method.prototype(wrapperInterfaceName + '::' + method.name) + ' {')
9674
9675 if False:
9676- print r' os::log("%%s(%%p -> %%p)\n", "%s", this, m_pInstance);' % (wrapperInterfaceName + '::' + method.name)
9677+ print(r' os::log("%%s(%%p -> %%p)\n", "%s", this, m_pInstance);' % (wrapperInterfaceName + '::' + method.name))
9678
9679 if method.type is not stdapi.Void:
9680- print ' %s _result;' % method.type
9681+ print(' %s _result;' % method.type)
9682
9683- print ' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base)
9684+ print(' %s *_this = static_cast<%s *>(m_pInstance);' % (base, base))
9685 for arg in method.args:
9686 if not arg.output:
9687 self.unwrapArg(method, arg)
9688@@ -855,36 +860,36 @@ class Tracer:
9689 # XXX: wrapping should go here, but before we can do that we'll need to protect g_WrappedObjects with its own mutex
9690
9691 if method.type is not stdapi.Void:
9692- print ' return _result;'
9693+ print(' return _result;')
9694
9695- print '}'
9696- print
9697+ print('}')
9698+ print()
9699
9700 def implementWrapperInterfaceMethodBody(self, interface, base, method):
9701 assert not method.internal
9702
9703- print ' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args]))
9704- print ' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (self.getFunctionSigId(), interface.name + '::' + method.name, len(method.args) + 1)
9705+ print(' static const char * _args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args])))
9706+ print(' static const trace::FunctionSig _sig = {%u, "%s", %u, _args};' % (self.getFunctionSigId(), interface.name + '::' + method.name, len(method.args) + 1))
9707
9708- print ' unsigned _call = trace::localWriter.beginEnter(&_sig);'
9709- print ' trace::localWriter.beginArg(0);'
9710- print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);'
9711- print ' trace::localWriter.endArg();'
9712+ print(' unsigned _call = trace::localWriter.beginEnter(&_sig);')
9713+ print(' trace::localWriter.beginArg(0);')
9714+ print(' trace::localWriter.writePointer((uintptr_t)m_pInstance);')
9715+ print(' trace::localWriter.endArg();')
9716 for arg in method.args:
9717 if not arg.output:
9718 self.serializeArg(method, arg)
9719- print ' trace::localWriter.endEnter();'
9720+ print(' trace::localWriter.endEnter();')
9721
9722 self.invokeMethod(interface, base, method)
9723
9724- print ' trace::localWriter.beginLeave(_call);'
9725+ print(' trace::localWriter.beginLeave(_call);')
9726
9727- print ' if (%s) {' % self.wasFunctionSuccessful(method)
9728+ print(' if (%s) {' % self.wasFunctionSuccessful(method))
9729 for arg in method.args:
9730 if arg.output:
9731 self.serializeArg(method, arg)
9732 self.wrapArg(method, arg)
9733- print ' }'
9734+ print(' }')
9735
9736 if method.type is not stdapi.Void:
9737 self.serializeRet(method, '_result')
9738@@ -893,51 +898,51 @@ class Tracer:
9739
9740 if method.name == 'Release':
9741 assert method.type is not stdapi.Void
9742- print r' if (!_result) {'
9743- print r' delete this;'
9744- print r' }'
9745+ print(r' if (!_result) {')
9746+ print(r' delete this;')
9747+ print(r' }')
9748
9749- print ' trace::localWriter.endLeave();'
9750+ print(' trace::localWriter.endLeave();')
9751
9752 def implementIidWrapper(self, api):
9753 ifaces = api.getAllInterfaces()
9754
9755- print r'static void'
9756- print r'warnIID(const char *entryName, REFIID riid, void *pvObj, const char *reason) {'
9757- print r' os::log("apitrace: warning: %s: %s IID %s\n",'
9758- print r' entryName, reason,'
9759- print r' getGuidName(riid));'
9760- print r' void * pVtbl = *(void **)pvObj;'
9761- print r' HMODULE hModule = 0;'
9762- print r' BOOL bRet = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |'
9763- print r' GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,'
9764- print r' (LPCTSTR)pVtbl,'
9765- print r' &hModule);'
9766- print r' assert(bRet);'
9767- print r' if (bRet) {'
9768- print r' char szModule[MAX_PATH];'
9769- print r' DWORD dwRet = GetModuleFileNameA(hModule, szModule, sizeof szModule);'
9770- print r' assert(dwRet);'
9771- print r' if (dwRet) {'
9772- print r' DWORD dwOffset = (UINT_PTR)pVtbl - (UINT_PTR)hModule;'
9773- print r' os::log("apitrace: warning: pVtbl = %p (%s!+0x%0lx)\n", pVtbl, szModule, dwOffset);'
9774- print r' }'
9775- print r' }'
9776- print r'}'
9777- print
9778- print r'static void'
9779- print r'wrapIID(const char *entryName, REFIID riid, void * * ppvObj) {'
9780- print r' if (!ppvObj || !*ppvObj) {'
9781- print r' return;'
9782- print r' }'
9783+ print(r'static void')
9784+ print(r'warnIID(const char *entryName, REFIID riid, void *pvObj, const char *reason) {')
9785+ print(r' os::log("apitrace: warning: %s: %s IID %s\n",')
9786+ print(r' entryName, reason,')
9787+ print(r' getGuidName(riid));')
9788+ print(r' void * pVtbl = *(void **)pvObj;')
9789+ print(r' HMODULE hModule = 0;')
9790+ print(r' BOOL bRet = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |')
9791+ print(r' GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,')
9792+ print(r' (LPCTSTR)pVtbl,')
9793+ print(r' &hModule);')
9794+ print(r' assert(bRet);')
9795+ print(r' if (bRet) {')
9796+ print(r' char szModule[MAX_PATH];')
9797+ print(r' DWORD dwRet = GetModuleFileNameA(hModule, szModule, sizeof szModule);')
9798+ print(r' assert(dwRet);')
9799+ print(r' if (dwRet) {')
9800+ print(r' DWORD dwOffset = (UINT_PTR)pVtbl - (UINT_PTR)hModule;')
9801+ print(r' os::log("apitrace: warning: pVtbl = %p (%s!+0x%0lx)\n", pVtbl, szModule, dwOffset);')
9802+ print(r' }')
9803+ print(r' }')
9804+ print(r'}')
9805+ print()
9806+ print(r'static void')
9807+ print(r'wrapIID(const char *entryName, REFIID riid, void * * ppvObj) {')
9808+ print(r' if (!ppvObj || !*ppvObj) {')
9809+ print(r' return;')
9810+ print(r' }')
9811 for iface in ifaces:
9812- print r' if (riid == IID_%s) {' % (iface.name,)
9813- print r' Wrap%s::_wrap(entryName, (%s **) ppvObj);' % (iface.name, iface.name)
9814- print r' return;'
9815- print r' }'
9816- print r' warnIID(entryName, riid, *ppvObj, "unsupported");'
9817- print r'}'
9818- print
9819+ print(r' if (riid == IID_%s) {' % (iface.name,))
9820+ print(r' Wrap%s::_wrap(entryName, (%s **) ppvObj);' % (iface.name, iface.name))
9821+ print(r' return;')
9822+ print(r' }')
9823+ print(r' warnIID(entryName, riid, *ppvObj, "unsupported");')
9824+ print(r'}')
9825+ print()
9826
9827 def wrapIid(self, function, riid, out):
9828 # Cast output arg to `void **` if necessary
9829@@ -947,42 +952,42 @@ class Tracer:
9830 assert isinstance(obj_type, stdapi.Interface)
9831 out_name = 'reinterpret_cast<void * *>(%s)' % out_name
9832
9833- print r' if (%s && *%s) {' % (out.name, out.name)
9834+ print(r' if (%s && *%s) {' % (out.name, out.name))
9835 functionName = function.name
9836 else_ = ''
9837 if self.interface is not None:
9838 functionName = self.interface.name + '::' + functionName
9839- print r' if (*%s == m_pInstance &&' % (out_name,)
9840- print r' (%s)) {' % ' || '.join('%s == IID_%s' % (riid.name, iface.name) for iface in self.interface.iterBases())
9841- print r' *%s = this;' % (out_name,)
9842- print r' }'
9843+ print(r' if (*%s == m_pInstance &&' % (out_name,))
9844+ print(r' (%s)) {' % ' || '.join('%s == IID_%s' % (riid.name, iface.name) for iface in self.interface.iterBases()))
9845+ print(r' *%s = this;' % (out_name,))
9846+ print(r' }')
9847 else_ = 'else '
9848- print r' %s{' % else_
9849- print r' wrapIID("%s", %s, %s);' % (functionName, riid.name, out_name)
9850- print r' }'
9851- print r' }'
9852+ print(r' %s{' % else_)
9853+ print(r' wrapIID("%s", %s, %s);' % (functionName, riid.name, out_name))
9854+ print(r' }')
9855+ print(r' }')
9856
9857 def invokeMethod(self, interface, base, method):
9858 if method.type is stdapi.Void:
9859 result = ''
9860 else:
9861 result = '_result = '
9862- print ' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args]))
9863+ print(' %s_this->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args])))
9864
9865 def emit_memcpy(self, ptr, size):
9866- print ' trace::fakeMemcpy(%s, %s);' % (ptr, size)
9867+ print(' trace::fakeMemcpy(%s, %s);' % (ptr, size))
9868
9869 def emit_memcpy_opt(self, ptr, size):
9870- print ' trace::fakeMemcpyOpt(%s, %s);' % (ptr, size)
9871+ print(' trace::fakeMemcpyOpt(%s, %s);' % (ptr, size))
9872
9873 def fake_call(self, function, args):
9874- print ' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,)
9875+ print(' unsigned _fake_call = trace::localWriter.beginEnter(&_%s_sig, true);' % (function.name,))
9876 for arg, instance in zip(function.args, args):
9877 assert not arg.output
9878- print ' trace::localWriter.beginArg(%u);' % (arg.index,)
9879+ print(' trace::localWriter.beginArg(%u);' % (arg.index,))
9880 self.serializeValue(arg.type, instance)
9881- print ' trace::localWriter.endArg();'
9882- print ' trace::localWriter.endEnter();'
9883- print ' trace::localWriter.beginLeave(_fake_call);'
9884- print ' trace::localWriter.endLeave();'
9885+ print(' trace::localWriter.endArg();')
9886+ print(' trace::localWriter.endEnter();')
9887+ print(' trace::localWriter.beginLeave(_fake_call);')
9888+ print(' trace::localWriter.endLeave();')
9889
9890diff --git a/wrappers/wgltrace.py b/wrappers/wgltrace.py
9891index bc79d774..be86c36e 100644
9892--- a/wrappers/wgltrace.py
9893+++ b/wrappers/wgltrace.py
9894@@ -66,63 +66,65 @@ class WglTracer(GlTracer):
9895 # wglCreateContext/wglCreateLayerContext to obtain a HGLRC that's
9896 # recognizable by OPENGL32.DLL. Therefore we need to detect and
9897 # dispatch internal calls, without further ado.
9898- print r' if (_reentrant) {'
9899+ print(r' if (_reentrant) {')
9900 self.invokeFunction(function)
9901 if function.type is not Void:
9902- print ' return _result;'
9903- print r' }'
9904- print r' ReentryScope _reentry;'
9905- print r' (void)_reentry;'
9906- print
9907+ print(' return _result;')
9908+ print(r' }')
9909+ print(r' ReentryScope _reentry;')
9910+ print(r' (void)_reentry;')
9911+ print()
9912
9913 if function.name in self.destroyContextFunctionNames:
9914 # Unlike other GL APIs like EGL or GLX, WGL will make the context
9915 # inactive if it's currently the active context.
9916- print ' if (_wglGetCurrentContext() == hglrc) {'
9917- print ' gltrace::clearContext();'
9918- print ' }'
9919- print ' gltrace::releaseContext((uintptr_t)hglrc);'
9920+ print(' if (_wglGetCurrentContext() == hglrc) {')
9921+ print(' gltrace::clearContext();')
9922+ print(' }')
9923+ print(' gltrace::releaseContext((uintptr_t)hglrc);')
9924
9925 GlTracer.traceFunctionImplBody(self, function)
9926
9927 if function.name in self.createContextFunctionNames:
9928- print ' if (_result)'
9929- print ' gltrace::createContext((uintptr_t)_result);'
9930+ print(' if (_result)')
9931+ print(' gltrace::createContext((uintptr_t)_result);')
9932
9933 if function.name in self.makeCurrentFunctionNames:
9934- print ' if (_result) {'
9935- print ' if (hglrc != NULL)'
9936- print ' gltrace::setContext((uintptr_t)hglrc);'
9937- print ' else'
9938- print ' gltrace::clearContext();'
9939- print ' }'
9940+ print(' if (_result) {')
9941+ print(' if (hglrc != NULL)')
9942+ print(' gltrace::setContext((uintptr_t)hglrc);')
9943+ print(' else')
9944+ print(' gltrace::clearContext();')
9945+ print(' }')
9946
9947
9948 if __name__ == '__main__':
9949- print
9950- print '#define _GDI32_'
9951- print
9952- print '#include <string.h>'
9953- print '#include <windows.h>'
9954- print
9955- print '#include "trace_writer_local.hpp"'
9956- print '#include "os.hpp"'
9957- print
9958- print '// To validate our prototypes'
9959- print '#define GL_GLEXT_PROTOTYPES'
9960- print '#define WGL_GLXEXT_PROTOTYPES'
9961- print
9962- print '#include "glproc.hpp"'
9963- print '#include "glsize.hpp"'
9964- print
9965- print 'static OS_THREAD_SPECIFIC(uintptr_t) _reentrant;'
9966- print
9967- print '// Helper class to track reentries in function scope.'
9968- print 'struct ReentryScope {'
9969- print 'inline ReentryScope() { _reentrant = 1; }'
9970- print 'inline ~ReentryScope() { _reentrant = 0; }'
9971- print '};'
9972- print
9973+ print()
9974+ print('#define _GDI32_')
9975+ print()
9976+ print('#include <string.h>')
9977+ print('#include <windows.h>')
9978+ print()
9979+ print('#include <sstream>')
9980+ print()
9981+ print('#include "trace_writer_local.hpp"')
9982+ print('#include "os.hpp"')
9983+ print()
9984+ print('// To validate our prototypes')
9985+ print('#define GL_GLEXT_PROTOTYPES')
9986+ print('#define WGL_GLXEXT_PROTOTYPES')
9987+ print()
9988+ print('#include "glproc.hpp"')
9989+ print('#include "glsize.hpp"')
9990+ print()
9991+ print('static OS_THREAD_LOCAL uintptr_t _reentrant;')
9992+ print()
9993+ print('// Helper class to track reentries in function scope.')
9994+ print('struct ReentryScope {')
9995+ print('inline ReentryScope() { _reentrant = 1; }')
9996+ print('inline ~ReentryScope() { _reentrant = 0; }')
9997+ print('};')
9998+ print()
9999 module = Module()
10000 module.mergeModule(glapi)
10001 module.mergeModule(wglapi)
10002--
100032.17.1
10004
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0002-specs-Tie-Python-2-3-conversion-loose-ends.patch b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0002-specs-Tie-Python-2-3-conversion-loose-ends.patch
deleted file mode 100644
index 25141602..00000000
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0002-specs-Tie-Python-2-3-conversion-loose-ends.patch
+++ /dev/null
@@ -1,169 +0,0 @@
1From a8791e3dca61500a382be84dc96973639b8bd182 Mon Sep 17 00:00:00 2001
2From: Jose Fonseca <jfonseca@vmware.com>
3Date: Sun, 28 Apr 2019 14:13:01 +0100
4Subject: [PATCH 2/4] specs: Tie Python 2 ->3 conversion loose ends.
5
6Upstream-Status: Backport [https://github.com/apitrace/apitrace/commit/5b3c68cafaddc82c0f34bea8127582eee07ac3be]
7
8(cherry picked from commit 5b3c68cafaddc82c0f34bea8127582eee07ac3be)
9Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
10---
11 specs/scripts/Makefile | 16 ++++++++--------
12 specs/scripts/c2api.py | 6 +++---
13 specs/scripts/cxx2api.py | 2 +-
14 specs/scripts/spec2api.py | 2 +-
15 specs/scripts/txt2api.py | 8 +++++---
16 specs/scripts/xml2api.py | 2 +-
17 specs/scripts/xml2enum.py | 2 +-
18 specs/scripts/xml2glparams.py | 2 +-
19 8 files changed, 21 insertions(+), 19 deletions(-)
20
21diff --git a/specs/scripts/Makefile b/specs/scripts/Makefile
22index 714a3deb..f03f36eb 100644
23--- a/specs/scripts/Makefile
24+++ b/specs/scripts/Makefile
25@@ -37,28 +37,28 @@ download: \
26 wget -N https://www.opengl.org/registry/oldspecs/$@
27
28 glapi.py: xml2api.py gl.xml
29- python $^ > $@
30+ python3 $^ > $@
31
32 glxapi.py: xml2api.py glx.xml
33- python $^ > $@
34+ python3 $^ > $@
35
36 wglapi.py: xml2api.py wgl.xml
37- python $^ > $@
38+ python3 $^ > $@
39
40 eglapi.py: xml2api.py egl.xml
41- python $^ > $@
42+ python3 $^ > $@
43
44 glparams.py: xml2glparams.py gl.xml
45- python $^ > $@
46+ python3 $^ > $@
47
48 glxenum.py: xml2enum.py glx.xml
49- python $^ > $@
50+ python3 $^ > $@
51
52 wglenum.py: xml2enum.py wgl.xml
53- python $^ > $@
54+ python3 $^ > $@
55
56 eglenum.py: xml2enum.py egl.xml
57- python $^ > $@
58+ python3 $^ > $@
59
60 clean:
61 rm -f \
62diff --git a/specs/scripts/c2api.py b/specs/scripts/c2api.py
63index b8aaa81d..208169d2 100755
64--- a/specs/scripts/c2api.py
65+++ b/specs/scripts/c2api.py
66@@ -1,4 +1,4 @@
67-#!/usr/bin/env python
68+#!/usr/bin/env python3
69 ##########################################################################
70 #
71 # Copyright 2011 Jose Fonseca
72@@ -404,8 +404,8 @@ class DeclParser:
73 type = 'S' + type
74 elif short:
75 type = 'Short'
76- elif int:
77- type = 'Long' * int
78+ elif long:
79+ type = 'Long' * long
80 else:
81 type = 'Int'
82 if unsigned:
83diff --git a/specs/scripts/cxx2api.py b/specs/scripts/cxx2api.py
84index 9720615d..8056de47 100755
85--- a/specs/scripts/cxx2api.py
86+++ b/specs/scripts/cxx2api.py
87@@ -1,4 +1,4 @@
88-#!/usr/bin/env python
89+#!/usr/bin/env python3
90
91
92
93diff --git a/specs/scripts/spec2api.py b/specs/scripts/spec2api.py
94index 7fb395a4..33a8d058 100755
95--- a/specs/scripts/spec2api.py
96+++ b/specs/scripts/spec2api.py
97@@ -1,4 +1,4 @@
98-#!/usr/bin/env python
99+#!/usr/bin/env python3
100 ##########################################################################
101 #
102 # Copyright 2010 VMware, Inc.
103diff --git a/specs/scripts/txt2api.py b/specs/scripts/txt2api.py
104index e9469d3c..a32ca658 100755
105--- a/specs/scripts/txt2api.py
106+++ b/specs/scripts/txt2api.py
107@@ -1,4 +1,4 @@
108-#!/usr/bin/env python
109+#!/usr/bin/env python3
110 ##########################################################################
111 #
112 # Copyright 2010 VMware, Inc.
113@@ -28,6 +28,7 @@
114 """Parser for OpenGL .txt extensions specification."""
115
116
117+import io
118 import sys
119 import re
120 import optparse
121@@ -233,12 +234,13 @@ def main():
122
123 for arg in args:
124 if arg.startswith('http://') or arg.startswith('https://'):
125- stream = urlopen(arg, 'rt')
126+ stream = urlopen(arg)
127+ stream = io.TextIOWrapper(stream, encoding='ascii')
128 else:
129 stream = open(arg, 'rt')
130 parser = TxtParser(stream, prefix = options.prefix)
131 parser.parse()
132-
133+
134
135 if __name__ == '__main__':
136 main()
137diff --git a/specs/scripts/xml2api.py b/specs/scripts/xml2api.py
138index f09fe0bf..6b4ec3b7 100755
139--- a/specs/scripts/xml2api.py
140+++ b/specs/scripts/xml2api.py
141@@ -1,4 +1,4 @@
142-#!/usr/bin/env python
143+#!/usr/bin/env python3
144 ##########################################################################
145 #
146 # Copyright 2014 VMware, Inc
147diff --git a/specs/scripts/xml2enum.py b/specs/scripts/xml2enum.py
148index cb2c4ae9..f799b7b5 100755
149--- a/specs/scripts/xml2enum.py
150+++ b/specs/scripts/xml2enum.py
151@@ -1,4 +1,4 @@
152-#!/usr/bin/env python
153+#!/usr/bin/env python3
154 ##########################################################################
155 #
156 # Copyright 2014 VMware, Inc
157diff --git a/specs/scripts/xml2glparams.py b/specs/scripts/xml2glparams.py
158index 805aac86..a651d896 100755
159--- a/specs/scripts/xml2glparams.py
160+++ b/specs/scripts/xml2glparams.py
161@@ -1,4 +1,4 @@
162-#!/usr/bin/env python
163+#!/usr/bin/env python3
164 ##########################################################################
165 #
166 # Copyright 2014 VMware, Inc
167--
1682.17.1
169
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0003-scripts-Tie-Python-2-3-conversion-loose-ends.patch b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0003-scripts-Tie-Python-2-3-conversion-loose-ends.patch
deleted file mode 100644
index e30273d5..00000000
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0003-scripts-Tie-Python-2-3-conversion-loose-ends.patch
+++ /dev/null
@@ -1,276 +0,0 @@
1From 8ba82a1ef77e60bd614cca1e583e1a0c25b4f281 Mon Sep 17 00:00:00 2001
2From: Jose Fonseca <jfonseca@vmware.com>
3Date: Sun, 28 Apr 2019 14:14:44 +0100
4Subject: [PATCH 3/4] scripts: Tie Python 2 -> 3 conversion loose ends.
5
6Upstream-Status: Backport [https://github.com/apitrace/apitrace/commit/247e1fa87f4e87b8914662e44a8ecef4d444cc90]
7
8(cherry picked from commit 247e1fa87f4e87b8914662e44a8ecef4d444cc90)
9Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
10---
11 retrace/glstate_params.py | 2 +-
12 scripts/convert.py | 2 +-
13 scripts/highlight.py | 3 ++-
14 scripts/jsondiff.py | 2 +-
15 scripts/jsonextractimages.py | 2 +-
16 scripts/leaks.py | 4 ++--
17 scripts/profileshader.py | 2 +-
18 scripts/retracediff.py | 2 +-
19 scripts/snapdiff.py | 2 +-
20 scripts/tracecheck.py | 2 +-
21 scripts/tracediff.py | 10 +++++-----
22 scripts/unpickle.py | 19 ++++++++++---------
23 12 files changed, 27 insertions(+), 25 deletions(-)
24
25diff --git a/retrace/glstate_params.py b/retrace/glstate_params.py
26index bc90f66b..55f2dbc9 100755
27--- a/retrace/glstate_params.py
28+++ b/retrace/glstate_params.py
29@@ -1,4 +1,4 @@
30-#!/usr/bin/env python
31+#!/usr/bin/env python3
32 ##########################################################################
33 #
34 # Copyright 2011 Jose Fonseca
35diff --git a/scripts/convert.py b/scripts/convert.py
36index 83df70ce..1f285a8c 100755
37--- a/scripts/convert.py
38+++ b/scripts/convert.py
39@@ -1,4 +1,4 @@
40-#!/usr/bin/env python
41+#!/usr/bin/env python3
42 ##########################################################################
43 #
44 # Copyright 2012 VMware Inc.
45diff --git a/scripts/highlight.py b/scripts/highlight.py
46index ed3b54d4..e494abf4 100644
47--- a/scripts/highlight.py
48+++ b/scripts/highlight.py
49@@ -221,7 +221,8 @@ def LessHighlighter():
50 try:
51 less = subprocess.Popen(
52 args = ['less', '-FRXn'],
53- stdin = subprocess.PIPE
54+ stdin = subprocess.PIPE,
55+ universal_newlines = True
56 )
57 except OSError:
58 return ColorHighlighter()
59diff --git a/scripts/jsondiff.py b/scripts/jsondiff.py
60index 25c4840e..d7a18e21 100755
61--- a/scripts/jsondiff.py
62+++ b/scripts/jsondiff.py
63@@ -1,4 +1,4 @@
64-#!/usr/bin/env python
65+#!/usr/bin/env python3
66 ##########################################################################
67 #
68 # Copyright 2015 VMware, Inc.
69diff --git a/scripts/jsonextractimages.py b/scripts/jsonextractimages.py
70index 917ee7e4..785e32db 100755
71--- a/scripts/jsonextractimages.py
72+++ b/scripts/jsonextractimages.py
73@@ -1,4 +1,4 @@
74-#!/usr/bin/env python
75+#!/usr/bin/env python3
76 ##########################################################################
77 #
78 # Copyright 2012 Jose Fonseca
79diff --git a/scripts/leaks.py b/scripts/leaks.py
80index 325af1e2..706e60a9 100755
81--- a/scripts/leaks.py
82+++ b/scripts/leaks.py
83@@ -1,4 +1,4 @@
84-#!/usr/bin/env python
85+#!/usr/bin/env python3
86 ##########################################################################
87 #
88 # Copyright 2014-2016 VMware, Inc.
89@@ -39,7 +39,7 @@ class LeakDetector(unpickle.Unpickler):
90 def __init__(self, apitrace, trace):
91
92 cmd = [apitrace, 'pickle', '--symbolic', trace]
93- p = subprocess.Popen(args = cmd, stdout = subprocess.PIPE)
94+ p = subprocess.Popen(args = cmd, stdout=subprocess.PIPE)
95
96 unpickle.Unpickler.__init__(self, p.stdout)
97
98diff --git a/scripts/profileshader.py b/scripts/profileshader.py
99index 5c2a58fb..c6c1c935 100755
100--- a/scripts/profileshader.py
101+++ b/scripts/profileshader.py
102@@ -1,4 +1,4 @@
103-#!/usr/bin/env python
104+#!/usr/bin/env python3
105 ##########################################################################
106 #
107 # Copyright 2012-2013 VMware, Inc.
108diff --git a/scripts/retracediff.py b/scripts/retracediff.py
109index 8105f536..967f3a93 100755
110--- a/scripts/retracediff.py
111+++ b/scripts/retracediff.py
112@@ -1,4 +1,4 @@
113-#!/usr/bin/env python
114+#!/usr/bin/env python3
115 ##########################################################################
116 #
117 # Copyright 2011 Jose Fonseca
118diff --git a/scripts/snapdiff.py b/scripts/snapdiff.py
119index b0d5f757..58fefe88 100755
120--- a/scripts/snapdiff.py
121+++ b/scripts/snapdiff.py
122@@ -1,4 +1,4 @@
123-#!/usr/bin/env python
124+#!/usr/bin/env python3
125 ##########################################################################
126 #
127 # Copyright 2011 Jose Fonseca
128diff --git a/scripts/tracecheck.py b/scripts/tracecheck.py
129index 3a2ec452..38167e89 100755
130--- a/scripts/tracecheck.py
131+++ b/scripts/tracecheck.py
132@@ -1,4 +1,4 @@
133-#!/usr/bin/env python
134+#!/usr/bin/env python3
135 ##########################################################################
136 #
137 # Copyright 2011 VMware, Inc.
138diff --git a/scripts/tracediff.py b/scripts/tracediff.py
139index 0cd9c8c6..88e389a3 100755
140--- a/scripts/tracediff.py
141+++ b/scripts/tracediff.py
142@@ -1,4 +1,4 @@
143-#!/usr/bin/env python
144+#!/usr/bin/env python3
145 ##########################################################################
146 #
147 # Copyright 2011 Jose Fonseca
148@@ -173,7 +173,7 @@ class ExternalDiffer(Differ):
149 try:
150 less = subprocess.Popen(
151 args = ['less', '-FRXn'],
152- stdin = subprocess.PIPE
153+ stdin = subprocess.PIPE,
154 )
155 except OSError:
156 pass
157@@ -214,7 +214,7 @@ ignoredFunctionNames = set([
158
159
160 class Blob:
161- '''Data-less proxy for bytearrays, to save memory.'''
162+ '''Data-less proxy for bytes, to save memory.'''
163
164 def __init__(self, size, hash):
165 self.size = size
166@@ -233,7 +233,7 @@ class Blob:
167 class BlobReplacer(Rebuilder):
168 '''Replace blobs with proxys.'''
169
170- def visitByteArray(self, obj):
171+ def visitBytes(self, obj):
172 return Blob(len(obj), hash(str(obj)))
173
174 def visitCall(self, call):
175@@ -287,7 +287,7 @@ class PythonDiffer(Differ):
176 '--calls=' + calls,
177 trace
178 ],
179- stdout = subprocess.PIPE,
180+ stdout=subprocess.PIPE,
181 )
182
183 parser = Loader(p.stdout)
184diff --git a/scripts/unpickle.py b/scripts/unpickle.py
185index 86891d29..822b8ea8 100755
186--- a/scripts/unpickle.py
187+++ b/scripts/unpickle.py
188@@ -1,4 +1,4 @@
189-#!/usr/bin/env python
190+#!/usr/bin/env python3
191 ##########################################################################
192 #
193 # Copyright 2012 Jose Fonseca
194@@ -34,6 +34,7 @@ Run as:
195
196
197 import itertools
198+import operator
199 import optparse
200 import sys
201 import time
202@@ -55,7 +56,7 @@ CALL_FLAG_MARKER_PUSH = (1 << 9)
203 CALL_FLAG_MARKER_POP = (1 << 10)
204
205
206-class Pointer(long):
207+class Pointer(int):
208
209 def __str__(self):
210 if self == 0:
211@@ -79,7 +80,7 @@ class Visitor:
212 self.dispatch[tuple] = self.visitTuple
213 self.dispatch[list] = self.visitList
214 self.dispatch[dict] = self.visitDict
215- self.dispatch[bytearray] = self.visitByteArray
216+ self.dispatch[bytes] = self.visitBytes
217 self.dispatch[Pointer] = self.visitPointer
218
219 def visit(self, obj):
220@@ -119,7 +120,7 @@ class Visitor:
221 def visitDict(self, obj):
222 return self.visitIterable(obj)
223
224- def visitByteArray(self, obj):
225+ def visitBytes(self, obj):
226 raise NotImplementedError
227
228 def visitPointer(self, obj):
229@@ -153,7 +154,7 @@ class Dumper(Visitor):
230 def visitDict(self, obj):
231 return '{' + self.visitItems(iter(obj.items())) + '}'
232
233- def visitByteArray(self, obj):
234+ def visitBytes(self, obj):
235 return 'blob(%u)' % len(obj)
236
237
238@@ -169,7 +170,7 @@ class Hasher(Visitor):
239 def visitIterable(self, obj):
240 return tuple(map(self.visit, obj))
241
242- def visitByteArray(self, obj):
243+ def visitBytes(self, obj):
244 return str(obj)
245
246
247@@ -193,7 +194,7 @@ class Rebuilder(Visitor):
248 else:
249 return obj
250
251- def visitByteArray(self, obj):
252+ def visitBytes(self, obj):
253 return obj
254
255
256@@ -269,7 +270,7 @@ class Counter(Unpickler):
257 Unpickler.parse(self)
258
259 functionFrequencies = list(self.functionFrequencies.items())
260- functionFrequencies.sort(lambda (name1, freq1), (name2, freq2): cmp(freq1, freq2))
261+ functionFrequencies.sort(key=operator.itemgetter(1))
262 for name, frequency in functionFrequencies:
263 sys.stdout.write('%8u %s\n' % (frequency, name))
264
265@@ -311,7 +312,7 @@ def main():
266 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
267
268 startTime = time.time()
269- parser = Counter(sys.stdin, options.verbose)
270+ parser = Counter(sys.stdin.buffer, options.verbose)
271 parser.parse()
272 stopTime = time.time()
273 duration = stopTime - startTime
274--
2752.17.1
276
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0004-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0004-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch
deleted file mode 100644
index 8974e5db..00000000
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0004-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch
+++ /dev/null
@@ -1,62 +0,0 @@
1From aa8e341e73c288b77a5187e3676a2bbb6588b705 Mon Sep 17 00:00:00 2001
2From: Jose Fonseca <jfonseca@vmware.com>
3Date: Mon, 29 Apr 2019 06:41:49 +0100
4Subject: [PATCH 4/4] scripts: Tie a few more Python 2 to 3 conversion loose
5 ends.
6
7Upstream-Status: Backport [https://github.com/apitrace/apitrace/commit/f527924cca45591966139eae8c2fefb4a9a0f947]
8
9(cherry picked from commit f527924cca45591966139eae8c2fefb4a9a0f947)
10Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
11---
12 scripts/jsonextractimages.py | 10 +++++-----
13 scripts/profileshader.py | 2 +-
14 2 files changed, 6 insertions(+), 6 deletions(-)
15
16diff --git a/scripts/jsonextractimages.py b/scripts/jsonextractimages.py
17index 785e32db..ac20c23d 100755
18--- a/scripts/jsonextractimages.py
19+++ b/scripts/jsonextractimages.py
20@@ -34,7 +34,7 @@ import base64
21 import sys
22
23
24-pngSignature = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"
25+pngSignature = b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A"
26
27
28 def dumpSurfaces(state, memberName):
29@@ -46,13 +46,13 @@ def dumpSurfaces(state, memberName):
30 extName = 'png'
31 else:
32 magic = data[:2]
33- if magic in ('P1', 'P4'):
34+ if magic in (b'P1', b'P4'):
35 extName = 'pbm'
36- elif magic in ('P2', 'P5'):
37+ elif magic in (b'P2', b'P5'):
38 extName = 'pgm'
39- elif magic in ('P3', 'P6'):
40+ elif magic in (b'P3', b'P6'):
41 extName = 'ppm'
42- elif magic in ('Pf', 'PF'):
43+ elif magic in (b'Pf', b'PF'):
44 extName = 'pfm'
45 else:
46 sys.stderr.write('warning: unsupport Netpbm format %s\n' % magic)
47diff --git a/scripts/profileshader.py b/scripts/profileshader.py
48index c6c1c935..7e8637eb 100755
49--- a/scripts/profileshader.py
50+++ b/scripts/profileshader.py
51@@ -92,7 +92,7 @@ def process(stream, groupField):
52 id = str(group[0]).rjust(maxGroupLen)
53 draw = str(group[1]['draws']).rjust(12)
54 dura = str(group[1]['duration']).rjust(18)
55- perCall = str(group[1]['duration'] / group[1]['draws']).rjust(12)
56+ perCall = str(group[1]['duration'] // group[1]['draws']).rjust(12)
57 longest = str(group[1]['longest']).rjust(11)
58 print("| %s | %s | %s | %s | %s |" % (id, draw, dura, perCall, longest))
59
60--
612.17.1
62
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0005-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0005-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch
deleted file mode 100644
index 6bff7e92..00000000
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace/0005-scripts-Tie-a-few-more-Python-2-to-3-conversion-loos.patch
+++ /dev/null
@@ -1,60 +0,0 @@
1From 8b3afcaeebdd87962f2f3fef36973090621d116b Mon Sep 17 00:00:00 2001
2From: Max Krummenacher <max.krummenacher@toradex.com>
3Date: Sun, 29 Mar 2020 15:38:31 +0000
4Subject: [PATCH 5/5] scripts: Tie a few more Python 2 to 3 conversion loose
5 ends.
6
7Upstream-Status: pending
8Note: code exists in NXP's fork only.
9
10Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
11---
12 wrappers/glxtrace.py | 14 +++++++-------
13 1 file changed, 7 insertions(+), 7 deletions(-)
14
15diff --git a/wrappers/glxtrace.py b/wrappers/glxtrace.py
16index b05028e2..2472560d 100644
17--- a/wrappers/glxtrace.py
18+++ b/wrappers/glxtrace.py
19@@ -67,9 +67,9 @@ class GlxTracer(GlTracer):
20 print(' gltrace::releaseContext((uintptr_t)ctx);')
21
22 if function.name == 'glXGetCurrentDisplay':
23- print ' if(_glXGetCurrentDisplay == &glXGetCurrentDisplay ){'
24- print ' _glXGetCurrentDisplay = (PFN_GLXGETCURRENTDISPLAY)_getPublicProcAddress("glXGetCurrentDisplay");'
25- print ' }'
26+ print (' if(_glXGetCurrentDisplay == &glXGetCurrentDisplay ){')
27+ print (' _glXGetCurrentDisplay = (PFN_GLXGETCURRENTDISPLAY)_getPublicProcAddress("glXGetCurrentDisplay");')
28+ print (' }')
29
30 GlTracer.traceFunctionImplBody(self, function)
31
32@@ -184,7 +184,7 @@ if __name__ == '__main__':
33 tracer = GlxTracer()
34 tracer.traceApi(api)
35
36- print r'''
37+ print (r'''
38
39
40 /*
41@@ -247,8 +247,8 @@ void * dlopen(const char *filename, int flag)
42
43
44
45-'''
46- print r'''
47+''')
48+ print (r'''
49 /*
50 * let the GPU driver know that we are in apitrace
51 */
52@@ -257,4 +257,4 @@ int APIENTRY ApiTraceEnabled(void) {
53 return 1;
54 }
55
56-'''
57+''')
58--
592.20.1
60
diff --git a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace_9.0.0.bb b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace_9.0.0.bb
index 9461a34d..2f8029a4 100644
--- a/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace_9.0.0.bb
+++ b/recipes-graphics/imx-gpu-apitrace/imx-gpu-apitrace_9.0.0.bb
@@ -5,17 +5,18 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=aeb969185a143c3c25130bc2c3ef9a50"
5DEPENDS = "imx-gpu-viv zlib libpng procps" 5DEPENDS = "imx-gpu-viv zlib libpng procps"
6 6
7SRC_URI = "git://source.codeaurora.org/external/imx/apitrace-imx.git;protocol=https;branch=imx_9.0" 7SRC_URI = "git://source.codeaurora.org/external/imx/apitrace-imx.git;protocol=https;branch=imx_9.0"
8SRCREV = "8636fa989d8e914a7986916b058878761a981a6f" 8SRCREV = "fed74f6f84cb4f48ddace4306c9bf90bf7a9a967"
9 9
10S = "${WORKDIR}/git" 10S = "${WORKDIR}/git"
11 11
12inherit cmake pkgconfig perlnative python3native 12inherit cmake pkgconfig perlnative python3native
13 13
14PACKAGECONFIG ??= "egl waffle" 14PACKAGECONFIG ??= "egl"
15PACKAGECONFIG_append = \ 15PACKAGECONFIG_append = \
16 "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', \ 16 "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', \
17 bb.utils.contains('DISTRO_FEATURES', 'x11', ' x11', \ 17 bb.utils.contains('DISTRO_FEATURES', 'x11', ' x11', \
18 '', d), d)}" 18 '', d), d)}"
19PACKAGECONFIG_append_mx8 = " waffle"
19PACKAGECONFIG_append_imxgpu2d = " vivante" 20PACKAGECONFIG_append_imxgpu2d = " vivante"
20 21
21PACKAGECONFIG[egl] = "-DENABLE_EGL=ON,-DENABLE_EGL=OFF,virtual/egl" 22PACKAGECONFIG[egl] = "-DENABLE_EGL=ON,-DENABLE_EGL=OFF,virtual/egl"