def doInvokeInterfaceMethod(self, interface, method): Retracer.doInvokeInterfaceMethod(self, interface, method) # Keep retrying IDirectXVideoDecoder::BeginFrame when returns E_PENDING if interface.name == 'IDirectXVideoDecoder' and method.name == 'BeginFrame': print r' while (_result == E_PENDING) {' print r' Sleep(1);' Retracer.doInvokeInterfaceMethod(self, interface, method) print r' }'
def doInvokeInterfaceMethod(self, interface, method): Retracer.doInvokeInterfaceMethod(self, interface, method) # Keep retrying ID3D11VideoContext::DecoderBeginFrame when returns E_PENDING if interface.name == 'ID3D11VideoContext' and method.name == 'DecoderBeginFrame': print r' while (_result == D3DERR_WASSTILLDRAWING || _result == E_PENDING) {' print r' Sleep(1);' Retracer.doInvokeInterfaceMethod(self, interface, method) print r' }'
def doInvokeInterfaceMethod(self, interface, method): Retracer.doInvokeInterfaceMethod(self, interface, method) # Force driver if interface.name.startswith('IDXGIFactory') and method.name.startswith('EnumAdapters'): print r' const char *szSoftware = NULL;' print r' switch (retrace::driver) {' print r' case retrace::DRIVER_REFERENCE:' print r' szSoftware = "d3d11ref.dll";' print r' break;' 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, reinterpret_cast<IDXGIAdapter **>(ppAdapter));' print r' } else {' print r' if (Adapter != 0) {' print r' retrace::warning(call) << "ignoring non-default adapter " << Adapter << "\n";' print r' Adapter = 0;' print r' }' Retracer.doInvokeInterfaceMethod(self, interface, method) print r' }' return if interface.name.startswith('IDXGIFactory') and method.name == 'CreateSoftwareAdapter': print r' const char *szSoftware = NULL;' print r' switch (retrace::driver) {' print r' case retrace::DRIVER_REFERENCE:' print r' szSoftware = "d3d11ref.dll";' print r' break;' print r' case retrace::DRIVER_MODULE:' print r' szSoftware = retrace::driverModule;' print r' break;' print r' case retrace::DRIVER_SOFTWARE:' print r' default:' print r' szSoftware = "d3d10warp.dll";' print r' break;' print r' }' print r' Module = LoadLibraryA("d3d10warp");' print r' if (!Module) {' print r' retrace::warning(call) << "failed to load " << szSoftware << "\n";' print r' }' Retracer.doInvokeInterfaceMethod(self, interface, method) # Keep retrying ID3D11VideoContext::DecoderBeginFrame when returns E_PENDING if interface.name == 'ID3D11VideoContext' and method.name == 'DecoderBeginFrame': print r' while (_result == D3DERR_WASSTILLDRAWING || _result == E_PENDING) {' print r' Sleep(1);' Retracer.doInvokeInterfaceMethod(self, interface, method) print r' }'
def doInvokeInterfaceMethod(self, interface, method): if interface.name.startswith('IDXGIAdapter') and method.name == 'EnumOutputs': print(r' if (Output != 0) {') print(r' retrace::warning(call) << "ignoring output " << Output << "\n";') print(r' Output = 0;') print(r' }') # GPU counters are vendor specific and likely to fail, so use a # timestamp query instead, which is guaranteed to succeed if method.name == 'CreateCounter': if interface.name.startswith('ID3D10'): print(r' D3D10_QUERY_DESC _queryDesc;') print(r' _queryDesc.Query = D3D10_QUERY_TIMESTAMP;') print(r' _queryDesc.MiscFlags = 0;') print(r' _result = _this->CreateQuery(&_queryDesc, reinterpret_cast<ID3D10Query **>(ppCounter));') return if interface.name.startswith('ID3D11'): print(r' D3D11_QUERY_DESC _queryDesc;') print(r' _queryDesc.Query = D3D11_QUERY_TIMESTAMP;') print(r' _queryDesc.MiscFlags = 0;') print(r' _result = _this->CreateQuery(&_queryDesc, reinterpret_cast<ID3D11Query **>(ppCounter));') return Retracer.doInvokeInterfaceMethod(self, interface, method) # Force driver if interface.name.startswith('IDXGIFactory') and method.name.startswith('EnumAdapters'): print(r' const char *szSoftware = NULL;') print(r' switch (retrace::driver) {') print(r' case retrace::DRIVER_REFERENCE:') print(r' szSoftware = "d3d11ref.dll";') print(r' break;') 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, reinterpret_cast<IDXGIAdapter **>(ppAdapter));') print(r' } else {') print(r' if (Adapter != 0) {') print(r' retrace::warning(call) << "ignoring non-default adapter " << Adapter << "\n";') print(r' Adapter = 0;') print(r' }') Retracer.doInvokeInterfaceMethod(self, interface, method) print(r' }') return if interface.name.startswith('IDXGIFactory') and method.name == 'CreateSoftwareAdapter': print(r' const char *szSoftware = NULL;') print(r' switch (retrace::driver) {') print(r' case retrace::DRIVER_REFERENCE:') print(r' szSoftware = "d3d11ref.dll";') print(r' break;') print(r' case retrace::DRIVER_MODULE:') print(r' szSoftware = retrace::driverModule;') print(r' break;') print(r' case retrace::DRIVER_SOFTWARE:') print(r' default:') print(r' szSoftware = "d3d10warp.dll";') print(r' break;') print(r' }') print(r' Module = LoadLibraryA("d3d10warp");') print(r' if (!Module) {') print(r' retrace::warning(call) << "failed to load " << szSoftware << "\n";') print(r' }') Retracer.doInvokeInterfaceMethod(self, interface, method) # Keep retrying ID3D11VideoContext::DecoderBeginFrame when returns E_PENDING if interface.name == 'ID3D11VideoContext' and method.name == 'DecoderBeginFrame': print(r' while (_result == D3DERR_WASSTILLDRAWING || _result == E_PENDING) {') print(r' Sleep(1);') Retracer.doInvokeInterfaceMethod(self, interface, method) print(r' }')