[Mesa-dev] [PATCH] [rfc] spirv: work around doom shaders having load/store to sampler types

Ian Romanick idr at freedesktop.org
Sat Jan 21 00:46:16 UTC 2017


On 12/23/2016 06:46 AM, Jason Ekstrand wrote:
> Bah... It's definitely illegal.  I had fix glslang myself.  I have some
> NIR reworks planned that would make this work "properly" but it's a bit
> more complicated than this hack.  That said, I'm very reluctant to fix
> app bugs in our driver.  There are a lot of ways apps can go wrong with
> Vulkan and we don't want to start down the road of hacking around them.

Is this something the SPIR-V validator would flag?

> On Dec 22, 2016 22:57, "Dave Airlie" <airlied at gmail.com
> <mailto:airlied at gmail.com>> wrote:
> 
>     From: Dave Airlie <airlied at redhat.com <mailto:airlied at redhat.com>>
> 
>     Doom appears to generate SPIR-V that loads/store samplers before
>     passing them to functions, this confuses NIR, but I'm not sure
>     it's illegal.
> 
>     Workaround this by replacing the value on store with the access
>     chain from the src.
> 
>     This gets doom a bit further.
> 
>     Signed-off-by: Dave Airlie <airlied at redhat.com
>     <mailto:airlied at redhat.com>>
>     ---
>      src/compiler/spirv/vtn_variables.c | 8 ++++++++
>      1 file changed, 8 insertions(+)
> 
>     diff --git a/src/compiler/spirv/vtn_variables.c
>     b/src/compiler/spirv/vtn_variables.c
>     index be64dd9..f6672c0 100644
>     --- a/src/compiler/spirv/vtn_variables.c
>     +++ b/src/compiler/spirv/vtn_variables.c
>     @@ -1437,6 +1437,14 @@ 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_get_base_type(dest->var->type->type) ==
>     GLSL_TYPE_SAMPLER) {
>     +         struct vtn_value *val = vtn_untyped_value(b, w[2]);
>     +         dest->var = val->access_chain->var;
>     +         b->values[w[1]].value_type = vtn_value_type_invalid;
>     +         vtn_push_value(b, w[1],
>     vtn_value_type_access_chain)->access_chain = val->access_chain;
>     +         return;
>     +      }
>            struct vtn_ssa_value *src = vtn_ssa_value(b, w[2]);
>            vtn_variable_store(b, src, dest);
>            break;
>     --
>     2.7.4
> 
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>     <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>
> 
> 
> 
> 
> _______________________________________________
> 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