[Mesa-dev] [PATCH] spirv: Relax the validation conditions of OpSelect
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Mon Dec 18 17:46:57 UTC 2017
Thanks for point me to the code actually doing this (nir_build_alu).
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
On 15/12/17 03:56, Jason Ekstrand wrote:
> The Talos Principle contains shaders with an OpSelect between two
> vectors where the condition is a scalar boolean. This is technically
> against the spec bout nir_builder gracefully handles it by splatting
s/bout/but/
> out the condition to all the channels. So long as the condition is a
> boolean, just emit a warning instead of failing.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104246
> ---
> src/compiler/spirv/spirv_to_nir.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
> index 0493dd3..f0476b2 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -3511,10 +3511,20 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
> vtn_fail("Result type of OpSelect must be a scalar, vector, or pointer");
> }
>
> - vtn_fail_if(sel_val->type->type != sel_type,
> - "Condition type of OpSelect must be a scalar or vector of "
> - "Boolean type. It must have the same number of components "
> - "as Result Type");
> + if (unlikely(sel_val->type->type != sel_type)) {
> + if (sel_val->type->type == glsl_bool_type()) {
> + /* This case is illegal but some versions of GLSLang produce it.
> + * That's fine, nir_builder will just splat the condition out
> + * which is most likely what the client wanted anyway.
> + */
> + vtn_warn("Condition type of OpSelect must have the same number "
> + "of components as Result Type");
> + } else {
> + vtn_fail("Condition type of OpSelect must be a scalar or vector "
> + "of Boolean type. It must have the same number of "
> + "components as Result Type");
> + }
> + }
>
> vtn_fail_if(obj1_val->type != res_val->type ||
> obj2_val->type != res_val->type,
More information about the mesa-dev
mailing list