nir/spirv: Handle boolean uniforms correctly
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 6 May 2015 19:54:02 +0000 (12:54 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 16 May 2015 18:16:34 +0000 (11:16 -0700)
src/glsl/nir/spirv_to_nir.c

index a4f13603dacb661ec04653ed5a4ecbdbf17d1cac..099bbaf42e1f92f8802b191c5ac0560f2601c265 100644 (file)
@@ -573,7 +573,16 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
 
       nir_builder_instr_insert(&b->nb, &load->instr);
       val->type = src_type;
-      val->ssa = &load->dest.ssa;
+
+      if (src->var->data.mode == nir_var_uniform &&
+          glsl_get_base_type(src_type) == GLSL_TYPE_BOOL) {
+         /* Uniform boolean loads need to be fixed up since they're defined
+          * to be zero/nonzero rather than NIR_FALSE/NIR_TRUE.
+          */
+         val->ssa = nir_ine(&b->nb, &load->dest.ssa, nir_imm_int(&b->nb, 0));
+      } else {
+         val->ssa = &load->dest.ssa;
+      }
       break;
    }