summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-01-03 09:26:18 -0800
committerJason Ekstrand <[email protected]>2018-01-08 14:57:44 -0800
commit9e5aaa93cb242d8e401d61156809082dae86ed03 (patch)
tree240ed850156044dec5c80eb5b13495223aa5ce45 /src
parent154668e79c4556ba0eda4751d6a14a45b9242a90 (diff)
spirv: Do implicit conversions of uint to bool in OpStore
Technically, the GLSLang bug related to this can also affect SSBO writes where the bool -> uint conversion is missing. However, the only known shipping application with an old enough version of GLSLang to cause issues with this is the new DOOM game so we keep the workaround as small as possible. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104424 Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/spirv/vtn_variables.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 41125f689a5..eb306d0c4a8 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -2041,6 +2041,25 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
vtn_fail_if(dest->type->type == NULL,
"Invalid destination type for OpStore");
+ if (glsl_get_base_type(dest->type->type) == GLSL_TYPE_BOOL &&
+ glsl_get_base_type(src_val->type->type) == GLSL_TYPE_UINT) {
+ /* Early versions of GLSLang would use uint types for UBOs/SSBOs but
+ * would then store them to a local variable as bool. Work around
+ * the issue by doing an implicit conversion.
+ *
+ * https://github.com/KhronosGroup/glslang/issues/170
+ * https://bugs.freedesktop.org/show_bug.cgi?id=104424
+ */
+ vtn_warn("OpStore of value of type OpTypeInt to a pointer to type "
+ "OpTypeBool. Doing an implicit conversion to work around "
+ "the problem.");
+ struct vtn_ssa_value *bool_ssa =
+ vtn_create_ssa_value(b, dest->type->type);
+ bool_ssa->def = nir_i2b(&b->nb, vtn_ssa_value(b, w[2])->def);
+ vtn_variable_store(b, bool_ssa, dest);
+ break;
+ }
+
vtn_assert_types_equal(b, opcode, dest_val->type->deref, src_val->type);
if (glsl_type_is_sampler(dest->type->type)) {