spirv: Handle doubles when multiplying a mat by a scalar
authorNeil Roberts <nroberts@igalia.com>
Tue, 13 Mar 2018 12:26:19 +0000 (13:26 +0100)
committerNeil Roberts <nroberts@igalia.com>
Wed, 14 Mar 2018 07:43:33 +0000 (08:43 +0100)
The code to handle mat multiplication by a scalar tries to pick either
imul or fmul depending on whether the matrix is float or integer.
However it was doing this by checking whether the base type is float.
This was making it choose the int path for doubles (and presumably
float16s).

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/spirv/vtn_alu.c

index d0c9e31693542c75be37ef652c7a14a8cd54d078..110fcec2a60d343e86e14db242472c1bc23b56f9 100644 (file)
@@ -142,10 +142,10 @@ mat_times_scalar(struct vtn_builder *b,
 {
    struct vtn_ssa_value *dest = vtn_create_ssa_value(b, mat->type);
    for (unsigned i = 0; i < glsl_get_matrix_columns(mat->type); i++) {
-      if (glsl_get_base_type(mat->type) == GLSL_TYPE_FLOAT)
-         dest->elems[i]->def = nir_fmul(&b->nb, mat->elems[i]->def, scalar);
-      else
+      if (glsl_base_type_is_integer(glsl_get_base_type(mat->type)))
          dest->elems[i]->def = nir_imul(&b->nb, mat->elems[i]->def, scalar);
+      else
+         dest->elems[i]->def = nir_fmul(&b->nb, mat->elems[i]->def, scalar);
    }
 
    return dest;