X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=retrace%2Fdxgiretrace.py;h=8de3c989efa5f46057c6b04c19cbee22665af4f0;hb=1eb7673ecc412fa7358750fc3d0bb68bebe09e46;hp=95face8b9e2d3be2216c439b8872f08de645ed7b;hpb=e7d82190a094f0ddef7d6de1f80e7b048be68c4c;p=apitrace diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py index 95face8..8de3c98 100644 --- a/retrace/dxgiretrace.py +++ b/retrace/dxgiretrace.py @@ -74,14 +74,6 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { if 'pSwapChainDesc' in function.argNames(): print r' createWindow(pSwapChainDesc);' - # Compensate for the fact we don't trace the software renderer - # module LoadLibrary call - if 'Software' in function.argNames(): - print r' if (Software) {' - print r' retrace::warning(call) << "using WARP for software device\n";' - print r' Software = LoadLibraryA("d3d10warp");' - print r' }' - # Compensate for the fact we don't trace DXGI object creation if function.name.startswith('D3D11CreateDevice'): print r' if (DriverType == D3D_DRIVER_TYPE_UNKNOWN && !pAdapter) {' @@ -89,52 +81,73 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print r' }' if function.name.startswith('D3D10CreateDevice'): + # Toggle debugging + print r' Flags &= ~D3D10_CREATE_DEVICE_DEBUG;' + print r' if (retrace::debug) {' + print r' if (LoadLibraryA("d3d10sdklayers")) {' + print r' Flags |= D3D10_CREATE_DEVICE_DEBUG;' + print r' }' + print r' }' + + # Force driver self.forceDriver('D3D10_DRIVER_TYPE') + if function.name.startswith('D3D11CreateDevice'): + # Toggle debugging + print r' Flags &= ~D3D11_CREATE_DEVICE_DEBUG;' + print r' if (retrace::debug) {' + print r' if (LoadLibraryA("d3d11sdklayers")) {' + print r' Flags |= D3D11_CREATE_DEVICE_DEBUG;' + print r' }' + print r' }' + + # Force driver self.forceDriver('D3D_DRIVER_TYPE') Retracer.invokeFunction(self, function) def forceDriver(self, enum): - print r' switch (retrace::driver) {' - print r' case retrace::DRIVER_HARDWARE:' - print r' DriverType = %s_HARDWARE;' % enum - print r' Software = NULL;' - print r' break;' - print r' case retrace::DRIVER_SOFTWARE:' - print r' pAdapter = NULL;' - print r' DriverType = %s_WARP;' % enum - print r' Software = NULL;' - print r' break;' - print r' case retrace::DRIVER_REFERENCE:' - print r' pAdapter = NULL;' - print r' DriverType = %s_REFERENCE;' % enum - print r' Software = NULL;' - print r' break;' - print r' case retrace::DRIVER_NULL:' - print r' pAdapter = NULL;' - print r' DriverType = %s_NULL;' % enum - print r' Software = NULL;' - print r' break;' - print r' case retrace::DRIVER_MODULE:' - print r' pAdapter = NULL;' - print r' DriverType = %s_SOFTWARE;' % enum - print r' Software = LoadLibraryA(retrace::driverModule);' - print r' if (!Software) {' - print r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";' - print r' }' - print r' break;' - print r' default:' - print r' assert(0);' - print r' /* fall-through */' - print r' case retrace::DRIVER_DEFAULT:' - print r' if (DriverType == %s_SOFTWARE) {' % enum - print r' Software = LoadLibraryA("d3d10warp");' + # This can only work when pAdapter is NULL. For non-NULL pAdapter we + # need to override inside the EnumAdapters call below + print r' if (pAdapter == NULL) {' + print r' switch (retrace::driver) {' + print r' case retrace::DRIVER_HARDWARE:' + print r' DriverType = %s_HARDWARE;' % enum + print r' Software = NULL;' + print r' break;' + print r' case retrace::DRIVER_SOFTWARE:' + print r' DriverType = %s_WARP;' % enum + print r' Software = NULL;' + print r' break;' + print r' case retrace::DRIVER_REFERENCE:' + print r' DriverType = %s_REFERENCE;' % enum + print r' Software = NULL;' + print r' break;' + print r' case retrace::DRIVER_NULL:' + print r' DriverType = %s_NULL;' % enum + print r' Software = NULL;' + print r' break;' + print r' case retrace::DRIVER_MODULE:' + print r' DriverType = %s_SOFTWARE;' % enum + print r' Software = LoadLibraryA(retrace::driverModule);' print r' if (!Software) {' - print r' retrace::warning(call) << "failed to load d3d10warp.dll\n";' + print r' retrace::warning(call) << "failed to load " << retrace::driverModule << "\n";' + print r' }' + print r' break;' + print r' default:' + print r' assert(0);' + print r' /* fall-through */' + print r' case retrace::DRIVER_DEFAULT:' + print r' if (DriverType == %s_SOFTWARE) {' % enum + print r' Software = LoadLibraryA("d3d10warp");' + print r' if (!Software) {' + print r' retrace::warning(call) << "failed to load d3d10warp.dll\n";' + print r' }' print r' }' + print r' break;' print r' }' - print r' break;' + print r' } else {' + print r' Software = NULL;' print r' }' def invokeInterfaceMethod(self, interface, method): @@ -164,6 +177,34 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print r' pSharedResource = NULL;' print r' }' + # Force driver + if interface.name.startswith('IDXGIFactory') and method.name == 'EnumAdapters': + print r' const char *szSoftware = NULL;' + print r' switch (retrace::driver) {' + print r' case retrace::DRIVER_REFERENCE:' + print r' case retrace::DRIVER_SOFTWARE:' + print r' szSoftware = "d3d10warp.dll";' + print r' break;' + print r' case retrace::DRIVER_MODULE:' + print r' szSoftware = retrace::driverModule;' + print r' break;' + print r' default:' + print r' break;' + print r' }' + print r' HMODULE hSoftware = NULL;' + print r' if (szSoftware) {' + print r' hSoftware = LoadLibraryA(szSoftware);' + print r' if (!hSoftware) {' + print r' retrace::warning(call) << "failed to load " << szSoftware << "\n";' + print r' }' + print r' }' + print r' if (hSoftware) {' + print r' _result = _this->CreateSoftwareAdapter(hSoftware, ppAdapter);' + print r' } else {' + Retracer.invokeInterfaceMethod(self, interface, method) + print r' }' + return + Retracer.invokeInterfaceMethod(self, interface, method) # process events after presents @@ -188,6 +229,14 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { print ' _maps[_this] = 0;' print ' }' + # Attach shader byte code for lookup + if 'pShaderBytecode' in method.argNames(): + ppShader = method.args[-1] + assert ppShader.output + print r' if (retrace::dumpingState && SUCCEEDED(_result)) {' + print r' (*%s)->SetPrivateData(d3dstate::GUID_D3DSTATE, BytecodeLength, pShaderBytecode);' % ppShader.name + print r' }' + def main(): print r'#include ' @@ -207,8 +256,6 @@ def main(): if 'd3d10' in moduleNames: if 'd3d10_1' in moduleNames: print r'#include "d3d10_1imports.hpp"' - # D3D10CreateBlob is duplicated in d3d10 and d3d10_1 - d3d10_1.functions = [function for function in d3d10_1.functions if function.name != 'D3D10CreateBlob'] api.addModule(d3d10_1) else: print r'#include "d3d10imports.hpp"'