[Mesa-dev] [PATCH] drirc: add option to disable ARB_draw_indirect

Rob Clark robdclark at gmail.com
Tue Dec 5 12:54:12 UTC 2017


This is a bit sad/annoying.  But with current GPU firmware (at least on
a5xx) we can support both draw-indirect and base-instance.  But we can't
support draw-indirect with a non-zero base-instance specified.  So add a
driconf option to hide the extension from games that are known to use
both.

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
Tbh, I'm also not really sure what to do when/if we got updated firmware
which handled draw-indirect with base-instance, since we'd need to make
this option conditional on fw version.  For STK that probably isn't a
big deal since it doesn't use draw-indirect in a particularly useful way
(the indirect buffer is generated on CPU).

 src/gallium/auxiliary/pipe-loader/driinfo_gallium.h |  1 +
 src/gallium/include/state_tracker/st_api.h          |  1 +
 src/gallium/state_trackers/dri/dri_screen.c         |  2 ++
 src/mesa/state_tracker/st_extensions.c              |  3 +++
 src/util/drirc                                      | 10 ++++++++++
 src/util/xmlpool/t_options.h                        |  5 +++++
 6 files changed, 22 insertions(+)

diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
index 003a3d7089e..9c1705bd9a8 100644
--- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
+++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
@@ -32,4 +32,5 @@ DRI_CONF_SECTION_END
 DRI_CONF_SECTION_MISCELLANEOUS
    DRI_CONF_ALWAYS_HAVE_DEPTH_BUFFER("false")
    DRI_CONF_GLSL_ZERO_INIT("false")
+   DRI_CONF_DISABLE_DRAW_INDIRECT("false")
 DRI_CONF_SECTION_END
diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
index 44d6b474f8f..20a7843992a 100644
--- a/src/gallium/include/state_tracker/st_api.h
+++ b/src/gallium/include/state_tracker/st_api.h
@@ -217,6 +217,7 @@ struct st_config_options
    boolean disable_blend_func_extended;
    boolean disable_glsl_line_continuations;
    boolean disable_shader_bit_encoding;
+   boolean disable_draw_indirect;
    boolean force_glsl_extensions_warn;
    unsigned force_glsl_version;
    boolean allow_glsl_extension_directive_midshader;
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 1ca511612ad..035406a771e 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -68,6 +68,8 @@ dri_fill_st_options(struct dri_screen *screen)
       driQueryOptionb(optionCache, "disable_glsl_line_continuations");
    options->disable_shader_bit_encoding =
       driQueryOptionb(optionCache, "disable_shader_bit_encoding");
+   options->disable_draw_indirect =
+      driQueryOptionb(optionCache, "disable_draw_indirect");
    options->force_glsl_extensions_warn =
       driQueryOptionb(optionCache, "force_glsl_extensions_warn");
    options->force_glsl_version =
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 9ef0df1e926..0c7e7e3abf1 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -909,6 +909,9 @@ void st_init_extensions(struct pipe_screen *screen,
       }
    }
 
+   if (options->disable_draw_indirect)
+      extensions->ARB_draw_indirect = GL_FALSE;
+
    /* Expose the extensions which directly correspond to gallium formats. */
    init_format_extensions(screen, extensions, rendertarget_mapping,
                           ARRAY_SIZE(rendertarget_mapping), PIPE_TEXTURE_2D,
diff --git a/src/util/drirc b/src/util/drirc
index 9d27330036e..cea80ecc3d6 100644
--- a/src/util/drirc
+++ b/src/util/drirc
@@ -275,4 +275,14 @@ TODO: document the other workarounds.
             <option name="radeonsi_clear_db_cache_before_clear" value="true" />
         </application>
     </device>
+    <device driver="msm">
+        <!--
+           hw supports both GL_ARB_base_instance and GL_ARB_draw_indirect,
+           but current firmware does not support both at the same time, so
+           we need to blacklist apps that are known to depend on both.
+         -->
+        <application name="SuperTuxKart" executable="supertuxkart">
+            <option name="disable_draw_indirect" value="true"/>
+        </application>
+    </device>
 </driconf>
diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h
index bd553085c86..0d1c597a830 100644
--- a/src/util/xmlpool/t_options.h
+++ b/src/util/xmlpool/t_options.h
@@ -379,6 +379,11 @@ DRI_CONF_OPT_BEGIN_B(glsl_zero_init, def) \
         DRI_CONF_DESC(en,gettext("Force uninitialized variables to default to zero")) \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_DISABLE_DRAW_INDIRECT(def) \
+DRI_CONF_OPT_BEGIN_B(disable_draw_indirect, def) \
+   DRI_CONF_DESC(en, gettext("Disable the GL_ARB_draw_indirect extension")) \
+DRI_CONF_OPT_END
+
 /**
  * \brief Initialization configuration options
  */
-- 
2.13.6



More information about the mesa-dev mailing list