case trace::API_D3D9:
wrapperFilename = "d3d9.dll";
break;
- case trace::API_D3D10:
- case trace::API_D3D10_1:
- case trace::API_D3D11:
+ case trace::API_DXGI:
wrapperFilename = "dxgitrace.dll";
useInject = true;
break;
return 1;
}
- os::String wrapperPath = findWrapper(wrapperFilename);
+ os::String wrapperPath = findWrapper(wrapperFilename, verbose);
if (!wrapperPath.length()) {
- std::cerr << "error: failed to find " << wrapperFilename << "\n";
+ std::cerr << "error: failed to find " << wrapperFilename << " wrapper\n";
goto exit;
}
#if defined(_WIN32)
+ useInject = true;
if (useInject) {
args.push_back("inject");
args.push_back(wrapperPath);
wrapperPath.trimFilename();
#endif
+ /*
+ * Spawn child process.
+ */
+
+ {
#if defined(TRACE_VARIABLE)
- if (verbose) {
- std::cerr << TRACE_VARIABLE << "=" << wrapperPath.str() << "\n";
- }
- /* FIXME: Don't modify the current environment */
- os::setEnvironment(TRACE_VARIABLE, wrapperPath.str());
+ const char *oldEnvVarValue = getenv(TRACE_VARIABLE);
+ if (oldEnvVarValue) {
+ wrapperPath.append(OS_PATH_SEP);
+ wrapperPath.append(oldEnvVarValue);
+ }
+
+ /* FIXME: Don't modify our (ie parent) environment */
+ os::setEnvironment(TRACE_VARIABLE, wrapperPath.str());
+
+ if (verbose) {
+ std::cerr << TRACE_VARIABLE << "=" << wrapperPath.str() << "\n";
+ }
#endif /* TRACE_VARIABLE */
- if (output) {
- os::setEnvironment("TRACE_FILE", output);
- }
+ if (output) {
+ os::setEnvironment("TRACE_FILE", output);
+ }
- for (char * const * arg = argv; *arg; ++arg) {
- args.push_back(*arg);
- }
- args.push_back(NULL);
+ for (char * const * arg = argv; *arg; ++arg) {
+ args.push_back(*arg);
+ }
- if (verbose) {
- const char *sep = "";
- for (unsigned i = 0; i < args.size(); ++i) {
- std::cerr << sep << args[i];
- sep = " ";
+ if (verbose) {
+ const char *sep = "";
+ for (unsigned i = 0; i < args.size(); ++i) {
+ std::cerr << sep << args[i];
+ sep = " ";
+ }
+ std::cerr << "\n";
}
- std::cerr << "\n";
- }
- status = os::execute((char * const *)&args[0]);
+ args.push_back(NULL);
+
+ status = os::execute((char * const *)&args[0]);
-exit:
#if defined(TRACE_VARIABLE)
- os::unsetEnvironment(TRACE_VARIABLE);
+ if (oldEnvVarValue) {
+ os::setEnvironment(TRACE_VARIABLE, oldEnvVarValue);
+ } else {
+ os::unsetEnvironment(TRACE_VARIABLE);
+ }
#endif
+ }
+
+exit:
#if defined(_WIN32)
if (!useInject) {
os::String tmpWrapper(argv[0]);
" -v, --verbose verbose output\n"
" -a, --api=API specify API to trace ("
#ifdef _WIN32
- "gl, d3d7, d3d8, d3d9, or d3d10"
+ "gl, d3d7, d3d8, d3d9, or dxgi (for d3d10 and higher) "
#else
"gl or egl"
#endif
api = trace::API_D3D8;
} else if (strcmp(optarg, "d3d9") == 0) {
api = trace::API_D3D9;
- } else if (strcmp(optarg, "d3d10") == 0) {
- api = trace::API_D3D10;
- } else if (strcmp(optarg, "d3d10_1") == 0) {
- api = trace::API_D3D10_1;
- } else if (strcmp(optarg, "d3d11") == 0) {
- api = trace::API_D3D11;
+ } else if (strcmp(optarg, "dxgi") == 0 ||
+ strcmp(optarg, "d3d10") == 0 ||
+ strcmp(optarg, "d3d10_1") == 0 ||
+ strcmp(optarg, "d3d11") == 0 ||
+ strcmp(optarg, "d3d11_1") == 0) {
+ api = trace::API_DXGI;
} else {
std::cerr << "error: unknown API `" << optarg << "`\n";
usage();