X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=cli%2Fcli_trace.cpp;h=5903bdc5f7865cd7327a71b9b14f50d97a567e37;hb=da7bbffeef688461351b45f95c14945142db5921;hp=1d19ed5c5ba11e9662d3253192d2ca5e26869122;hpb=8e27804d29abfa3a7cd8630aaa3394677c8a3844;p=apitrace diff --git a/cli/cli_trace.cpp b/cli/cli_trace.cpp index 1d19ed5..5903bdc 100644 --- a/cli/cli_trace.cpp +++ b/cli/cli_trace.cpp @@ -116,9 +116,7 @@ traceProgram(trace::API api, 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; @@ -128,13 +126,14 @@ traceProgram(trace::API api, 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); @@ -155,38 +154,57 @@ traceProgram(trace::API api, 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]); @@ -221,7 +239,7 @@ usage(void) " -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 @@ -270,12 +288,12 @@ command(int argc, char *argv[]) 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();