glx/drirc: add a force_direct_glx_context option
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Thu, 7 Oct 2021 10:14:44 +0000 (12:14 +0200)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Thu, 4 Nov 2021 12:59:00 +0000 (13:59 +0100)
Some applications may request an indirect context but this feature is
disabled by default on Xorg and thus context creation will fail.

This commit adds a drirc setting to force the creation of direct glx
context, regardless of what the app is requesting.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13246>

src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
src/glx/create_context.c
src/glx/dri2_glx.c
src/glx/dri3_glx.c
src/glx/glxclient.h
src/glx/glxcmds.c
src/glx/tests/fake_glx_screen.h
src/util/driconf.h
src/util/xmlconfig.c

index 5a15388..e3bf517 100644 (file)
@@ -44,6 +44,7 @@ DRI_CONF_SECTION_DEBUG
    DRI_CONF_INDIRECT_GL_EXTENSION_OVERRIDE()
    DRI_CONF_DISABLE_PROTECTED_CONTENT_CHECK(false)
    DRI_CONF_IGNORE_MAP_UNSYNCHRONIZED(false)
+   DRI_CONF_FORCE_DIRECT_GLX_CONTEXT(false)
 DRI_CONF_SECTION_END
 
 DRI_CONF_SECTION_MISCELLANEOUS
index 7e1cec9..c44d579 100644 (file)
@@ -92,6 +92,15 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config,
 
    assert(screen == psc->scr);
 
+   /* Some application may request an indirect context but we may want to force a direct
+    * one because Xorg only allows indirect contexts if they were enabled.
+    */
+   if (!direct &&
+       psc->force_direct_context) {
+      direct = true;
+   }
+
+
    if (direct && psc->vtable->create_context_attribs) {
       /* GLX drops the error returned by the driver.  The expectation is that
        * an error will also be returned by the server.  The server's error
index fbbfe1f..4092842 100644 (file)
@@ -1280,6 +1280,14 @@ dri2CreateScreen(int screen, struct glx_display * priv)
                                     &tmp) == 0)
       __IndirectGlParseExtensionOverride(&psc->base, tmp);
 
+   if (psc->config->base.version > 1) {
+      uint8_t force = false;
+      if (psc->config->configQueryb(psc->driScreen, "force_direct_glx_context",
+                                    &force) == 0) {
+         psc->base.force_direct_context = force;
+      }
+   }
+
    /* DRI2 supports SubBuffer through DRI2CopyRegion, so it's always
     * available.*/
    psp->copySubBuffer = dri2CopySubBuffer;
index 3b3918c..3c0d60b 100644 (file)
@@ -1014,6 +1014,14 @@ dri3_create_screen(int screen, struct glx_display * priv)
                                     &tmp) == 0)
       __IndirectGlParseExtensionOverride(&psc->base, tmp);
 
+   if (psc->config->base.version > 1) {
+      uint8_t force = false;
+      if (psc->config->configQueryb(psc->driScreen, "force_direct_glx_context",
+                                    &force) == 0) {
+         psc->base.force_direct_context = force;
+      }
+   }
+
    free(driverName);
 
    tmp = getenv("LIBGL_SHOW_FPS");
index 50aa4d8..880f4fb 100644 (file)
@@ -521,6 +521,7 @@ struct glx_screen
 
    Display *dpy;
    int scr;
+   bool force_direct_context;
 
 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
     /**
index ecf94ee..901de99 100644 (file)
@@ -339,6 +339,14 @@ CreateContext(Display *dpy, int generic_id, struct glx_config *config,
    if (generic_id == None)
       return NULL;
 
+   /* Some application may request an indirect context but we may want to force a direct
+    * one because Xorg only allows indirect contexts if they were enabled.
+    */
+   if (!allowDirect &&
+       psc->force_direct_context) {
+      allowDirect = 1;
+   }
+
    gc = NULL;
 #ifdef GLX_USE_APPLEGL
    gc = applegl_create_context(psc, config, shareList, renderType);
index 39b250f..02b212a 100644 (file)
@@ -34,6 +34,7 @@ public:
       this->scr = num;
       this->visuals = 0;
       this->configs = 0;
+      this->force_direct_context = false;
 
       this->display = glx_dpy;
       this->dpy = (glx_dpy != NULL) ? glx_dpy->dpy : NULL;
index 77e5aa8..c514bd9 100644 (file)
    DRI_CONF_OPT_B(force_compat_profile, def, \
                   "Force an OpenGL compatibility context")
 
+#define DRI_CONF_FORCE_DIRECT_GLX_CONTEXT(def) \
+   DRI_CONF_OPT_B(force_direct_glx_context, def, \
+                  "Force direct GLX context (even if indirect is requested)")
+
 #define DRI_CONF_OVERRIDE_VRAM_SIZE() \
    DRI_CONF_OPT_I(override_vram_size, -1, -1, 2147483647, \
                   "Override the VRAM size advertised to the application in MiB (-1 = default)")
index 6090815..8614497 100644 (file)
@@ -320,7 +320,7 @@ driParseOptionInfo(driOptionCache *info,
    /* Make the hash table big enough to fit more than the maximum number of
     * config options we've ever seen in a driver.
     */
-   info->tableSize = 6;
+   info->tableSize = 7;
    info->info = calloc((size_t)1 << info->tableSize, sizeof(driOptionInfo));
    info->values = calloc((size_t)1 << info->tableSize, sizeof(driOptionValue));
    if (info->info == NULL || info->values == NULL) {