]> git.cworth.org Git - apitrace/blob - wrappers/dxgitrace.py
440d691e50d4dbdd11fe972c1d5d6816ae3c67aa
[apitrace] / wrappers / dxgitrace.py
1 ##########################################################################
2 #
3 # Copyright 2008-2009 VMware, Inc.
4 # All Rights Reserved.
5 #
6 # Permission is hereby granted, free of charge, to any person obtaining a copy
7 # of this software and associated documentation files (the "Software"), to deal
8 # in the Software without restriction, including without limitation the rights
9 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 # copies of the Software, and to permit persons to whom the Software is
11 # furnished to do so, subject to the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be included in
14 # all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 # THE SOFTWARE.
23 #
24 ##########################################################################/
25
26
27 import sys
28 from dlltrace import DllTracer
29 from specs import stdapi
30 from specs.stdapi import API
31 from specs.dxgi import dxgi
32 from specs.d3d10 import d3d10
33 from specs.d3d10_1 import d3d10_1
34 from specs.d3d11 import d3d11
35
36
37 class D3DCommonTracer(DllTracer):
38
39     def serializeArgValue(self, function, arg):
40         # Dump shaders as strings
41         if isinstance(arg.type, stdapi.Blob) and arg.name.startswith('pShaderBytecode'):
42             print '    DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size)
43             return
44
45         # Serialize the swapchain dimensions
46         if function.name == 'CreateSwapChain' and arg.name == 'pDesc':
47             print r'    DXGI_SWAP_CHAIN_DESC *_pDesc = NULL;'
48             print r'    DXGI_SWAP_CHAIN_DESC _Desc;'
49             print r'    if (pDesc) {'
50             print r'        _Desc = *pDesc;'
51             if not self.interface.name.endswith('DWM'):
52                 # Obtain size from the window
53                 print r'        RECT _rect;'
54                 print r'        if (GetClientRect(pDesc->OutputWindow, &_rect)) {'
55                 print r'            if (pDesc->BufferDesc.Width == 0) {'
56                 print r'                _Desc.BufferDesc.Width = _rect.right  - _rect.left;'
57                 print r'            }'
58                 print r'            if (pDesc->BufferDesc.Height == 0) {'
59                 print r'                _Desc.BufferDesc.Height = _rect.bottom - _rect.top;'
60                 print r'            }'
61                 print r'        }'
62             else:
63                 # Obtain size from the output
64                 print r'        DXGI_OUTPUT_DESC _OutputDesc;'
65                 print r'        if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {'
66                 print r'            _Desc.BufferDesc.Width  = _OutputDesc.DesktopCoordinates.right  - _OutputDesc.DesktopCoordinates.left;'
67                 print r'            _Desc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;'
68                 print r'        }'
69             print r'        _pDesc = &_Desc;'
70             print r'    }'
71             self.serializeValue(arg.type, '_pDesc')
72             return
73
74         DllTracer.serializeArgValue(self, function, arg)
75     
76     def enumWrapperInterfaceVariables(self, interface):
77         variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
78         
79         # Add additional members to track maps
80         if interface.getMethodByName('Map') is not None:
81             variables += [
82                 ('VOID *', '_pMappedData', '0'),
83                 ('size_t', '_MappedSize', '0'),
84             ]
85
86         return variables
87
88     def implementWrapperInterfaceMethodBody(self, interface, base, method):
89         if method.name == 'Unmap':
90             print '    if (_MappedSize && _pMappedData) {'
91             self.emit_memcpy('_pMappedData', '_pMappedData', '_MappedSize')
92             print '    }'
93
94         DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
95
96         if method.name == 'Map':
97             # NOTE: recursive locks are explicitely forbidden
98             print '    if (SUCCEEDED(_result)) {'
99             print '        _getMapInfo(_this, %s, _pMappedData, _MappedSize);' % ', '.join(method.argNames())
100             print '    } else {'
101             print '        _pMappedData = NULL;'
102             print '        _MappedSize = 0;'
103             print '    }'
104
105
106 if __name__ == '__main__':
107     print '#define INITGUID'
108     print
109     print '#include "trace_writer_local.hpp"'
110     print '#include "os.hpp"'
111     print
112     print '#include "d3dcommonshader.hpp"'
113     print
114
115     moduleNames = sys.argv[1:]
116
117     api = API()
118     
119     if moduleNames:
120         api.addModule(dxgi)
121     
122     if 'd3d10' in moduleNames:
123         if 'd3d10_1' in moduleNames:
124             print r'#include "d3d10_1imports.hpp"'
125             api.addModule(d3d10_1)
126         else:
127             print r'#include "d3d10imports.hpp"'
128         print r'#include "d3d10size.hpp"'
129         api.addModule(d3d10)
130
131     if 'd3d11' in moduleNames:
132         print r'#include "d3d11imports.hpp"'
133         if 'd3d11_1' in moduleNames:
134             print '#include <d3d11_1.h>'
135             import specs.d3d11_1
136         print r'#include "d3d11size.hpp"'
137         api.addModule(d3d11)
138
139     tracer = D3DCommonTracer()
140     tracer.traceApi(api)