nir/spirv: Create integer types of correct signedness.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 1 Feb 2016 22:59:01 +0000 (14:59 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 8 Feb 2016 23:23:35 +0000 (15:23 -0800)
vtn_handle_type() creates a signed type regardless of the value of the
signedness flag, which usually doesn't make much of a difference
except when the type is used as base sampled type of an image type,
what will cause the base type of the NIR image variable to be
inconsistent with its format and cause an assertion failure in the
back-end (most likely only reproducible on Gen7), and may change the
semantics of the image intrinsic subtly (e.g. UMIN may become IMIN).

src/compiler/nir/spirv/spirv_to_nir.c

index c002457ce12d5fad42babaf94952a2f45e4e6a38..ee39b333c1a94cc29fc7ea55a966a3bbbdc13f48 100644 (file)
@@ -594,9 +594,11 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
    case SpvOpTypeBool:
       val->type->type = glsl_bool_type();
       break;
-   case SpvOpTypeInt:
-      val->type->type = glsl_int_type();
+   case SpvOpTypeInt: {
+      const bool signedness = w[3];
+      val->type->type = (signedness ? glsl_int_type() : glsl_uint_type());
       break;
+   }
    case SpvOpTypeFloat:
       val->type->type = glsl_float_type();
       break;