[Mesa-dev] [PATCH 3/8] spirv: Add basic type validation for OpLoad, OpStore, and OpCopyMemory

Grazvydas Ignotas notasas at gmail.com
Sat Dec 30 23:57:06 UTC 2017


Hi,

I don't know if it's the game's fault, but it appears this change broke DOOM.
here is the offending spirv binary:
https://people.freedesktop.org/~notaz/doom_compute_spirv

GraÅžvydas


On Thu, Dec 7, 2017 at 6:12 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> ---
>  src/compiler/spirv/vtn_variables.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
> index cf44ed3..8ce19ff 100644
> --- a/src/compiler/spirv/vtn_variables.c
> +++ b/src/compiler/spirv/vtn_variables.c
> @@ -1969,6 +1969,9 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
>        struct vtn_value *dest = vtn_value(b, w[1], vtn_value_type_pointer);
>        struct vtn_value *src = vtn_value(b, w[2], vtn_value_type_pointer);
>
> +      vtn_fail_if(dest->type->deref != src->type->deref,
> +                  "Result and pointer types of OpLoad do not match");
> +
>        vtn_variable_copy(b, dest->pointer, src->pointer);
>        break;
>     }
> @@ -1976,8 +1979,11 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
>     case SpvOpLoad: {
>        struct vtn_type *res_type =
>           vtn_value(b, w[1], vtn_value_type_type)->type;
> -      struct vtn_pointer *src =
> -         vtn_value(b, w[3], vtn_value_type_pointer)->pointer;
> +      struct vtn_value *src_val = vtn_value(b, w[3], vtn_value_type_pointer);
> +      struct vtn_pointer *src = src_val->pointer;
> +
> +      vtn_fail_if(res_type != src_val->type->deref,
> +                  "Result and pointer types of OpLoad do not match");
>
>        if (src->mode == vtn_variable_mode_image ||
>            src->mode == vtn_variable_mode_sampler) {
> @@ -1990,8 +1996,12 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
>     }
>
>     case SpvOpStore: {
> -      struct vtn_pointer *dest =
> -         vtn_value(b, w[1], vtn_value_type_pointer)->pointer;
> +      struct vtn_value *dest_val = vtn_value(b, w[1], vtn_value_type_pointer);
> +      struct vtn_pointer *dest = dest_val->pointer;
> +      struct vtn_value *src_val = vtn_untyped_value(b, w[2]);
> +
> +      vtn_fail_if(dest_val->type->deref != src_val->type,
> +                  "Value and pointer types of OpStore do not match");
>
>        if (glsl_type_is_sampler(dest->type->type)) {
>           vtn_warn("OpStore of a sampler detected.  Doing on-the-fly copy "
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> 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