nir/spirv/cfg: Only set fall to true at the start of a case
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 7 Jan 2016 01:00:01 +0000 (17:00 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 7 Jan 2016 01:00:55 +0000 (17:00 -0800)
Previously, we were setting it to true at the top of the switch statement.
However, this causes all of the cases to get executed until you hit a
break.  Instead, you want to be not executing at the start, start executing
when you hit your case, and end at a break.

src/glsl/nir/spirv/vtn_cfg.c

index 9330ac03769e4fb2f02ee20590140ff21448a922..db1163d0707f6a7fe71b33d5343ed6a68c5cb3fd 100644 (file)
@@ -598,7 +598,7 @@ vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list,
           */
          nir_variable *fall_var =
             nir_local_variable_create(b->nb.impl, glsl_bool_type(), "fall");
-         nir_store_var(&b->nb, fall_var, nir_imm_int(&b->nb, NIR_TRUE), 1);
+         nir_store_var(&b->nb, fall_var, nir_imm_int(&b->nb, NIR_FALSE), 1);
 
          /* Next, we gather up all of the conditions.  We have to do this
           * up-front because we also need to build an "any" condition so
@@ -649,6 +649,7 @@ vtn_emit_cf_list(struct vtn_builder *b, struct list_head *cf_list,
 
             bool has_break = false;
             b->nb.cursor = nir_after_cf_list(&case_if->then_list);
+            nir_store_var(&b->nb, fall_var, nir_imm_int(&b->nb, NIR_TRUE), 1);
             vtn_emit_cf_list(b, &cse->body, fall_var, &has_break, handler);
             (void)has_break; /* We don't care */