[Mesa-dev] [PATCH] spirv: Work around the Doom shader bug
Jason Ekstrand
jason at jlekstrand.net
Tue Jun 20 19:29:58 UTC 2017
On Tue, Jun 20, 2017 at 12:19 PM, Pierre-Loup A. Griffais <
pgriffais at valvesoftware.com> wrote:
> They gave us access to a build with the fix and I believe Dave confirmed
> the fix was looking good by running it against a mainline build of radv. I
> can't comment on what their planned timeline is for releasing it or whether
> it's going to be released for sure, but it seems that title is going to be
> in good shape eventually. What's the other title you saw it with?
>
Well, it was a problem with Talos at the initial release but that's been
fixed. The only that more recently crossed my radar was GfxBench 5.
>
> On 06/20/2017 12:11 PM, Connor Abbott wrote:
>
>> I've been told by Pierre that there is an update, but it just hasn't
>> been pushed out yet. He'd know better when it's supposed to be
>> released.
>>
>> On Tue, Jun 20, 2017 at 9:11 AM, Jason Ekstrand <jason at jlekstrand.net>
>> wrote:
>>
>>> Doom shipped with a broken version of GLSLang which handles samplers as
>>> function arguments in a way that isn't spec-compliant. In particular,
>>> it creates a temporary local sampler variable and copies the sampler
>>> into it. While Dave has had a hack patch out for a while that gets it
>>> working, we've never landed it because we've been hoping that a game
>>> update would come out with fixed shaders. Unfortunately, no game update
>>> appears on to be on the horizon and I've found this issue in yet another
>>> application so I think we're stuck working around it. Hopefully, we can
>>> delete this code one day.
>>>
>>> Cc: Dave Airlie <airlied at redhat.com>
>>> ---
>>> src/compiler/spirv/vtn_private.h | 14 ++++++++++++++
>>> src/compiler/spirv/vtn_variables.c | 14 ++++++++++++++
>>> 2 files changed, 28 insertions(+)
>>>
>>> diff --git a/src/compiler/spirv/vtn_private.h
>>> b/src/compiler/spirv/vtn_private.h
>>> index 59fcc94..a377c90 100644
>>> --- a/src/compiler/spirv/vtn_private.h
>>> +++ b/src/compiler/spirv/vtn_private.h
>>> @@ -288,6 +288,20 @@ struct vtn_variable {
>>> nir_variable *var;
>>> nir_variable **members;
>>>
>>> + /**
>>> + * In some early released versions of GLSLang, it implemented all
>>> function
>>> + * calls by making copies of all parameters into temporary variables
>>> and
>>> + * passing those variables into the function. It even did so for
>>> samplers
>>> + * and images which violates the SPIR-V spec. Unfortunately, two
>>> games
>>> + * (Talos Principle and Doom) shipped with this old version of
>>> GLSLang and
>>> + * also happen to pass samplers into functions. Talos Principle
>>> received
>>> + * an update fairly shortly after release with an updated GLSLang.
>>> Doom,
>>> + * on the other hand, has never received an update so we need to work
>>> + * around this GLSLang issue in SPIR-V -> NIR. Hopefully, we can
>>> drop this
>>> + * hack at some point in the future.
>>> + */
>>> + struct vtn_access_chain *copy_prop_sampler;
>>> +
>>> struct vtn_access_chain chain;
>>> };
>>>
>>> diff --git a/src/compiler/spirv/vtn_variables.c
>>> b/src/compiler/spirv/vtn_variables.c
>>> index 0f0cc1c..974adb5 100644
>>> --- a/src/compiler/spirv/vtn_variables.c
>>> +++ b/src/compiler/spirv/vtn_variables.c
>>> @@ -96,6 +96,10 @@ rewrite_deref_types(nir_deref *deref, const struct
>>> glsl_type *type)
>>> nir_deref_var *
>>> vtn_access_chain_to_deref(struct vtn_builder *b, struct
>>> vtn_access_chain *chain)
>>> {
>>> + /* Do on-the-fly copy propagation for samplers. */
>>> + if (chain->var->copy_prop_sampler)
>>> + return vtn_access_chain_to_deref(b, chain->var->copy_prop_sampler)
>>> ;
>>> +
>>> nir_deref_var *deref_var;
>>> if (chain->var->var) {
>>> deref_var = nir_deref_var_create(b, chain->var->var);
>>> @@ -1613,6 +1617,16 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp
>>> opcode,
>>> case SpvOpStore: {
>>> struct vtn_access_chain *dest =
>>> vtn_value(b, w[1], vtn_value_type_access_chain)->
>>> access_chain;
>>> +
>>> + if (glsl_type_is_sampler(dest->var->type->type)) {
>>> + vtn_warn("OpStore of a sampler detected. Doing on-the-fly
>>> copy "
>>> + "propagation to workaround the problem.");
>>> + assert(dest->var->copy_prop_sampler == NULL);
>>> + dest->var->copy_prop_sampler =
>>> + vtn_value(b, w[2], vtn_value_type_access_chain)->
>>> access_chain;
>>> + break;
>>> + }
>>> +
>>> struct vtn_ssa_value *src = vtn_ssa_value(b, w[2]);
>>> vtn_variable_store(b, src, dest);
>>> break;
>>> --
>>> 2.5.0.400.gff86faf
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170620/3a8494da/attachment.html>
More information about the mesa-dev
mailing list