[Mesa-dev] [PATCH] drirc: add option to disable ARB_draw_indirect
Rob Clark
robdclark at gmail.com
Tue Dec 5 13:15:16 UTC 2017
On Tue, Dec 5, 2017 at 8:02 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Tue, Dec 5, 2017 at 7:54 AM, Rob Clark <robdclark at gmail.com> wrote:
>> 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
>
> That means you should only expose one of those features, probably the
> draw-indirect one. If someone desperately wants that functionality,
> they can force it with MESA_EXTENSION_OVERRIDE. ARB_base_instance has
> a specc'd interaction with ARB_indirect_draw...
>
In that case, we should have driconf to force override extension (ie.
not rely on user to remember magic MESA_EXTENSION_OVERRIDE
incantations) for any games that might use base-instance but not
draw-indirect..
BR,
-R
> -ilia
>
>> 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
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list