]> git.cworth.org Git - apitrace/blobdiff - retrace/dxgiretrace.py
d3dretrace: Dump D3D11 images/shaders too.
[apitrace] / retrace / dxgiretrace.py
index c7baaf280b701e66f04b3223d97949fd60acd4b1..a412c3aeb8b86a6b53a61d56740bcc978a78b126 100644 (file)
@@ -88,8 +88,55 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) {
                 print r'        DriverType = D3D_DRIVER_TYPE_HARDWARE;'
                 print r'    }'
 
+            if function.name.startswith('D3D10CreateDevice'):
+                self.forceDriver('D3D10_DRIVER_TYPE')
+            if function.name.startswith('D3D11CreateDevice'):
+                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");'
+        print r'            if (!Software) {'
+        print r'                retrace::warning(call) << "failed to load d3d10warp.dll\n";'
+        print r'            }'
+        print r'        }'
+        print r'        break;'
+        print r'    }'
+
     def invokeInterfaceMethod(self, interface, method):
         # keep track of the last used device for state dumping
         if interface.name in ('ID3D10Device', 'ID3D10Device1'):
@@ -141,6 +188,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 <string.h>'
@@ -160,8 +215,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"'