blob: fe7a4715486bf0296dbd7ec8b791c16ebf059265 [file] [log] [blame]
José Fonsecaff0b1ee2012-10-25 12:17:39 +01001##########################################################################
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
José Fonseca20aa9352012-11-23 14:34:29 +000027import sys
José Fonsecaff0b1ee2012-10-25 12:17:39 +010028from dlltrace import DllTracer
José Fonseca5abf5602013-05-30 14:00:44 +010029from trace import getWrapperInterfaceName
José Fonsecaff0b1ee2012-10-25 12:17:39 +010030from specs import stdapi
José Fonseca20aa9352012-11-23 14:34:29 +000031from specs.stdapi import API
José Fonseca5abf5602013-05-30 14:00:44 +010032from specs import dxgi
33from specs import d3d10
34from specs import d3d10_1
35from specs import d3d11
José Fonsecae354d8d2015-02-06 10:30:01 +000036from specs import d3d9
José Fonsecaff0b1ee2012-10-25 12:17:39 +010037
38
39class D3DCommonTracer(DllTracer):
40
41 def serializeArgValue(self, function, arg):
42 # Dump shaders as strings
43 if isinstance(arg.type, stdapi.Blob) and arg.name.startswith('pShaderBytecode'):
44 print ' DumpShader(trace::localWriter, %s, %s);' % (arg.name, arg.type.size)
45 return
46
José Fonseca419d7682013-02-22 10:24:31 +000047 # Serialize the swapchain dimensions
José Fonseca2b6d24e2013-02-22 15:00:26 +000048 if function.name == 'CreateSwapChain' and arg.name == 'pDesc' \
49 or arg.name == 'pSwapChainDesc':
50 print r' DXGI_SWAP_CHAIN_DESC *_pSwapChainDesc = NULL;'
51 print r' DXGI_SWAP_CHAIN_DESC _SwapChainDesc;'
52 print r' if (%s) {' % arg.name
53 print r' _SwapChainDesc = *%s;' % arg.name
54 if function.name != 'CreateSwapChain' or not self.interface.name.endswith('DWM'):
José Fonseca419d7682013-02-22 10:24:31 +000055 # Obtain size from the window
56 print r' RECT _rect;'
José Fonseca2b6d24e2013-02-22 15:00:26 +000057 print r' if (GetClientRect(%s->OutputWindow, &_rect)) {' % arg.name
58 print r' if (%s->BufferDesc.Width == 0) {' % arg.name
59 print r' _SwapChainDesc.BufferDesc.Width = _rect.right - _rect.left;'
José Fonseca419d7682013-02-22 10:24:31 +000060 print r' }'
José Fonseca2b6d24e2013-02-22 15:00:26 +000061 print r' if (%s->BufferDesc.Height == 0) {' % arg.name
62 print r' _SwapChainDesc.BufferDesc.Height = _rect.bottom - _rect.top;'
José Fonseca419d7682013-02-22 10:24:31 +000063 print r' }'
64 print r' }'
65 else:
66 # Obtain size from the output
67 print r' DXGI_OUTPUT_DESC _OutputDesc;'
68 print r' if (SUCCEEDED(pOutput->GetDesc(&_OutputDesc))) {'
José Fonseca2b6d24e2013-02-22 15:00:26 +000069 print r' _SwapChainDesc.BufferDesc.Width = _OutputDesc.DesktopCoordinates.right - _OutputDesc.DesktopCoordinates.left;'
70 print r' _SwapChainDesc.BufferDesc.Height = _OutputDesc.DesktopCoordinates.bottom - _OutputDesc.DesktopCoordinates.top;'
José Fonseca419d7682013-02-22 10:24:31 +000071 print r' }'
José Fonseca2b6d24e2013-02-22 15:00:26 +000072 print r' _pSwapChainDesc = &_SwapChainDesc;'
José Fonseca419d7682013-02-22 10:24:31 +000073 print r' }'
José Fonseca2b6d24e2013-02-22 15:00:26 +000074 self.serializeValue(arg.type, '_pSwapChainDesc')
José Fonseca419d7682013-02-22 10:24:31 +000075 return
76
José Fonseca04ffbed2014-07-23 13:57:14 +010077 # Serialize object names
78 # http://blogs.msdn.com/b/chuckw/archive/2010/04/15/object-naming.aspx
79 if function.name == 'SetPrivateData' and arg.name == 'pData':
80 iid = function.args[0].name
81 print r' if (%s == WKPDID_D3DDebugObjectName) {' % iid
82 print r' trace::localWriter.writeString(static_cast<const char *>(pData), DataSize);'
83 print r' } else {'
84 DllTracer.serializeArgValue(self, function, arg)
85 print r' }'
86 return
87
José Fonsecaff0b1ee2012-10-25 12:17:39 +010088 DllTracer.serializeArgValue(self, function, arg)
José Fonseca5abf5602013-05-30 14:00:44 +010089
90 # Interfaces that need book-keeping for maps
91 mapInterfaces = (
92 dxgi.IDXGISurface,
93 d3d10.ID3D10Resource,
José Fonseca5abf5602013-05-30 14:00:44 +010094 )
José Fonseca0168b512012-11-03 18:44:36 +000095
96 def enumWrapperInterfaceVariables(self, interface):
97 variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
98
99 # Add additional members to track maps
José Fonseca5abf5602013-05-30 14:00:44 +0100100 if interface.hasBase(*self.mapInterfaces):
José Fonseca0168b512012-11-03 18:44:36 +0000101 variables += [
José Fonseca6a940052014-10-07 21:39:06 +0100102 ('_MAP_DESC', 'm_MapDesc', None),
103 ]
104 if interface.hasBase(d3d11.ID3D11DeviceContext):
105 variables += [
106 ('std::map< std::pair<ID3D11Resource *, UINT>, _MAP_DESC >', 'm_MapDescs', None),
José Fonseca0168b512012-11-03 18:44:36 +0000107 ]
108
109 return variables
110
111 def implementWrapperInterfaceMethodBody(self, interface, base, method):
José Fonseca5abf5602013-05-30 14:00:44 +0100112 if method.name in ('Map', 'Unmap'):
113 # On D3D11 Map/Unmap is not a resource method, but a context method instead.
114 resourceArg = method.getArgByName('pResource')
115 if resourceArg is None:
José Fonseca6a940052014-10-07 21:39:06 +0100116 print ' _MAP_DESC & _MapDesc = m_MapDesc;'
José Fonseca5abf5602013-05-30 14:00:44 +0100117 else:
José Fonseca6a940052014-10-07 21:39:06 +0100118 print ' _MAP_DESC & _MapDesc = m_MapDescs[std::pair<%s, UINT>(pResource, Subresource)];' % resourceArg.type
José Fonseca5abf5602013-05-30 14:00:44 +0100119
José Fonseca0168b512012-11-03 18:44:36 +0000120 if method.name == 'Unmap':
José Fonseca003b8be2013-05-29 19:59:40 +0100121 print ' if (_MapDesc.Size && _MapDesc.pData) {'
José Fonseca6f0e3032014-06-25 01:00:35 +0100122 self.emit_memcpy('_MapDesc.pData', '_MapDesc.Size')
José Fonseca0168b512012-11-03 18:44:36 +0000123 print ' }'
124
125 DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
126
127 if method.name == 'Map':
128 # NOTE: recursive locks are explicitely forbidden
129 print ' if (SUCCEEDED(_result)) {'
José Fonseca003b8be2013-05-29 19:59:40 +0100130 print ' _getMapDesc(_this, %s, _MapDesc);' % ', '.join(method.argNames())
José Fonseca0168b512012-11-03 18:44:36 +0000131 print ' } else {'
José Fonseca003b8be2013-05-29 19:59:40 +0100132 print ' _MapDesc.pData = NULL;'
133 print ' _MapDesc.Size = 0;'
José Fonseca0168b512012-11-03 18:44:36 +0000134 print ' }'
135
136
José Fonseca20aa9352012-11-23 14:34:29 +0000137if __name__ == '__main__':
José Fonsecafc58d052014-06-13 12:47:19 +0100138 print r'#define INITGUID'
José Fonseca20aa9352012-11-23 14:34:29 +0000139 print
José Fonsecafc58d052014-06-13 12:47:19 +0100140 print r'#include "trace_writer_local.hpp"'
141 print r'#include "os.hpp"'
José Fonseca20aa9352012-11-23 14:34:29 +0000142 print
José Fonsecafc58d052014-06-13 12:47:19 +0100143 print r'#include "d3dcommonshader.hpp"'
José Fonseca20aa9352012-11-23 14:34:29 +0000144 print
José Fonsecafc58d052014-06-13 12:47:19 +0100145 print r'#include "d3d10imports.hpp"'
146 print r'#include "d3d10size.hpp"'
147 print r'#include "d3d11imports.hpp"'
148 print r'#include "d3d11size.hpp"'
José Fonsecae354d8d2015-02-06 10:30:01 +0000149 print r'#include "d3d9imports.hpp" // D3DPERF_*'
José Fonsecafc58d052014-06-13 12:47:19 +0100150 print
José Fonseca20aa9352012-11-23 14:34:29 +0000151
152 api = API()
José Fonsecafc58d052014-06-13 12:47:19 +0100153 api.addModule(dxgi.dxgi)
154 api.addModule(d3d10.d3d10)
155 api.addModule(d3d10_1.d3d10_1)
156 api.addModule(d3d11.d3d11)
José Fonsecae354d8d2015-02-06 10:30:01 +0000157 api.addModule(d3d9.d3dperf)
José Fonseca20aa9352012-11-23 14:34:29 +0000158
159 tracer = D3DCommonTracer()
160 tracer.traceApi(api)