]> git.cworth.org Git - apitrace/commitdiff
d3dretrace: Allow to force a driver type.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Tue, 27 Nov 2012 12:19:45 +0000 (12:19 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 27 Nov 2012 16:18:49 +0000 (16:18 +0000)
common/os.hpp
retrace/dxgiretrace.py
retrace/retrace.hpp
retrace/retrace_main.cpp

index cc72a0ea5b288184ffeb1759894344d2f5f5de3a..91c819fca55f09a516a746d23283bd0ab81766de 100644 (file)
@@ -42,6 +42,9 @@
 #ifndef vsnprintf
 #define vsnprintf _vsnprintf
 #endif
+#ifndef strcasecmp
+#define strcasecmp stricmp
+#endif
 #endif /* !_WIN32 */
 
 namespace os {
index c7baaf280b701e66f04b3223d97949fd60acd4b1..95face8b9e2d3be2216c439b8872f08de645ed7b 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'):
index cc77029e7aba59839cb907fbf969234b4df4a9d0..228c81352e979046ece2e8040d2f885ef7b27051 100644 (file)
@@ -152,6 +152,18 @@ extern bool profilingPixelsDrawn;
 extern bool dumpingState;
 
 
+enum Driver {
+    DRIVER_DEFAULT,
+    DRIVER_HARDWARE, // force hardware
+    DRIVER_SOFTWARE,
+    DRIVER_REFERENCE,
+    DRIVER_NULL,
+    DRIVER_MODULE,
+};
+
+extern Driver driver;
+extern const char *driverModule;
+
 extern bool doubleBuffer;
 extern bool coreProfile;
 
index a59ee9ae81f3f4aecbdd8b6501a77eaf3f05bffb..63d3dab07064a7b2a615af967e1263440b68862a 100644 (file)
@@ -61,6 +61,9 @@ int verbosity = 0;
 bool debug = true;
 bool dumpingState = false;
 
+Driver driver = DRIVER_DEFAULT;
+const char *driverModule = NULL;
+
 bool doubleBuffer = true;
 bool coreProfile = false;
 
@@ -106,6 +109,7 @@ takeSnapshot(unsigned call_no) {
 
     image::Image *src = dumper->getSnapshot();
     if (!src) {
+        std::cout << "Failed to get snapshot\n";
         return;
     }
 
@@ -505,6 +509,7 @@ usage(const char *argv0) {
         "  -C, --calls=CALLSET     calls to compare (default is every frame)\n"
         "      --core              use core profile\n"
         "      --db                use a double buffer visual (default)\n"
+        "      --driver=DRIVER     force driver type (`hw`, `sw`, `ref`, `null`, or driver module name)\n"
         "      --sb                use a single buffer visual\n"
         "  -s, --snapshot-prefix=PREFIX    take snapshots; `-` for PNM stdout output\n"
         "  -S, --snapshot=CALLSET  calls to snapshot (default is every frame)\n"
@@ -516,6 +521,7 @@ usage(const char *argv0) {
 enum {
     CORE_OPT = CHAR_MAX + 1,
     DB_OPT,
+    DRIVER_OPT,
     PCPU_OPT,
     PGPU_OPT,
     PPD_OPT,
@@ -532,6 +538,7 @@ longOptions[] = {
     {"compare", required_argument, 0, 'c'},
     {"core", no_argument, 0, CORE_OPT},
     {"db", no_argument, 0, DB_OPT},
+    {"driver", required_argument, 0, DRIVER_OPT},
     {"dump-state", required_argument, 0, 'D'},
     {"help", no_argument, 0, 'h'},
     {"pcpu", no_argument, 0, PCPU_OPT},
@@ -594,6 +601,20 @@ int main(int argc, char **argv)
         case DB_OPT:
             retrace::doubleBuffer = true;
             break;
+        case DRIVER_OPT:
+            if (strcasecmp(optarg, "hw") == 0) {
+                driver = DRIVER_HARDWARE;
+            } else if (strcasecmp(optarg, "sw") == 0) {
+                driver = DRIVER_SOFTWARE;
+            } else if (strcasecmp(optarg, "ref") == 0) {
+                driver = DRIVER_REFERENCE;
+            } else if (strcasecmp(optarg, "null") == 0) {
+                driver = DRIVER_NULL;
+            } else {
+                driver = DRIVER_MODULE;
+                driverModule = optarg;
+            }
+            break;
         case SB_OPT:
             retrace::doubleBuffer = false;
             break;