From d6c48c60effb382f6e376de641fc5e9ac5338119 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 8 Mar 2016 09:42:59 +0800 Subject: [PATCH 1/3] Fix renderdoccmd -c on Linux * argv[0] should always be set up * log an error when execve fails * logfile is always NULL and constructing a std::string from NULL throws * really apply EnvironmentModification --- renderdoc/os/linux/linux_process.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/renderdoc/os/linux/linux_process.cpp b/renderdoc/os/linux/linux_process.cpp index 5e0a95b72..bfda3e320 100644 --- a/renderdoc/os/linux/linux_process.cpp +++ b/renderdoc/os/linux/linux_process.cpp @@ -83,8 +83,8 @@ static pid_t RunProcess(const char *app, const char *workingDir, const char *cmd { if(!app) return (pid_t)0; - int argc = 0; - char *emptyargv[] = { NULL }; + // it is safe to use app directly as execve never modifies argv + char *emptyargv[] = { (char *) app, NULL }; char **argv = emptyargv; const char *c = cmdLine; @@ -92,7 +92,7 @@ static pid_t RunProcess(const char *app, const char *workingDir, const char *cmd // parse command line into argv[], similar to how bash would if(cmdLine) { - argc = 1; + int argc = 1; // get a rough upper bound on the number of arguments while(*c) @@ -212,6 +212,7 @@ static pid_t RunProcess(const char *app, const char *workingDir, const char *cmd } execve(app, argv, envp); + RDCERR("Failed to execute %s: %s", app, strerror(errno)); exit(0); } @@ -261,6 +262,9 @@ uint32_t Process::LaunchAndInjectIntoProcess(const char *app, const char *workin map env = EnvStringToEnvMap((const char **)environ); vector &modifications = GetEnvModifications(); + if (logfile == NULL) + logfile = ""; + string libpath; { FileIO::GetExecutableFilename(libpath); @@ -287,7 +291,7 @@ uint32_t Process::LaunchAndInjectIntoProcess(const char *app, const char *workin { EnvironmentModification &m = modifications[i]; - string value = env[m.name]; + string &value = env[m.name]; switch(m.type) { From 1f93ba2d3bd5d2cbededd24220d9b94d4c2b154e Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 8 Mar 2016 10:28:40 +0800 Subject: [PATCH 2/3] Make RenderDoc::SetLogFile safer logFile will be "" when the app is launched from renderdoccmd on Linux. --- renderdoc/core/core.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 2f37f9860..d2d976429 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -773,9 +773,12 @@ void RenderDoc::SetCaptureOptions(const CaptureOptions &opts) void RenderDoc::SetLogFile(const char *logFile) { + if (logFile == NULL || logFile[0] == '\0') + return; + m_LogFile = logFile; - if(m_LogFile.substr(m_LogFile.length()-4) == ".rdc") + if(m_LogFile.length() > 4 && m_LogFile.substr(m_LogFile.length()-4) == ".rdc") m_LogFile = m_LogFile.substr(0, m_LogFile.length()-4); FileIO::CreateParentDirectory(m_LogFile); From faf1f086dff8047b7c43d79f20fe222105afd541 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 8 Mar 2016 10:54:32 +0800 Subject: [PATCH 3/3] Check for glXIsDirect in MakeContext Create a direct renerding context when the shared context is too. Otherwise, I got this error X Error of failed request: BadMatch (invalid parameter attributes) on nVidia. --- renderdoc/driver/gl/gl_hooks_linux.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_hooks_linux.cpp b/renderdoc/driver/gl/gl_hooks_linux.cpp index 8cea7e5e8..70efbbb6c 100644 --- a/renderdoc/driver/gl/gl_hooks_linux.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux.cpp @@ -50,6 +50,7 @@ typedef void (*PFNGLXSWAPBUFFERSPROC)(Display *dpy, GLXDrawable drawable); typedef XVisualInfo* (*PFNGLXGETVISUALFROMFBCONFIGPROC)(Display *dpy, GLXFBConfig config); typedef int (*PFNGLXGETCONFIGPROC)(Display *dpy, XVisualInfo *vis, int attrib, int * value); typedef Bool (*PFNGLXQUERYEXTENSIONPROC)(Display *dpy, int *errorBase, int *eventBase); +typedef Bool (*PFNGLXISDIRECTPROC)(Display *dpy, GLXContext ctx); void *libGLdlsymHandle = RTLD_NEXT; // default to RTLD_NEXT, but overwritten if app calls dlopen() on real libGL @@ -336,9 +337,14 @@ class OpenGLHook : LibraryHook GLX_CONTEXT_CORE_PROFILE_BIT_ARB, 0, 0, }; + bool is_direct = false; + PFNGLXISDIRECTPROC glXIsDirectProc = (PFNGLXISDIRECTPROC)dlsym(RTLD_NEXT, "glXIsDirect"); PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfigProc = (PFNGLXCHOOSEFBCONFIGPROC)dlsym(RTLD_NEXT, "glXChooseFBConfig"); + if (glXIsDirectProc) + is_direct = glXIsDirectProc(share.dpy, share.ctx); + if(glXChooseFBConfigProc) { // don't need to care about the fb config as we won't be using the default framebuffer (backbuffer) @@ -349,7 +355,7 @@ class OpenGLHook : LibraryHook if(fbcfg) { ret.dpy = share.dpy; - ret.ctx = glXCreateContextAttribsARB_real(share.dpy, fbcfg[0], share.ctx, false, attribs); + ret.ctx = glXCreateContextAttribsARB_real(share.dpy, fbcfg[0], share.ctx, is_direct, attribs); } } }