nir/spirv: Array lengths are constants not literals
[mesa.git] / src / glsl / lower_discard_flow.cpp
index d385c14354754a7dff4d59f70f84f19e669ec1d3..ee45bf2215580d60e8e085f447ea634d6b2ff438 100644 (file)
@@ -48,6 +48,8 @@
 #include "ir.h"
 #include "program/hash_table.h"
 
+namespace {
+
 class lower_discard_flow_visitor : public ir_hierarchical_visitor {
 public:
    lower_discard_flow_visitor(ir_variable *discarded)
@@ -71,6 +73,8 @@ public:
    void *mem_ctx;
 };
 
+} /* anonymous namespace */
+
 ir_visitor_status
 lower_discard_flow_visitor::visit_enter(ir_loop_jump *ir)
 {
@@ -86,7 +90,14 @@ ir_visitor_status
 lower_discard_flow_visitor::visit_enter(ir_discard *ir)
 {
    ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(discarded);
-   ir_rvalue *rhs = new(mem_ctx) ir_constant(true);
+   ir_rvalue *rhs;
+   if (ir->condition) {
+      /* discarded <- condition, use (var_ref discarded) as the condition */
+      rhs = ir->condition;
+      ir->condition = new(mem_ctx) ir_dereference_variable(discarded);
+   } else {
+      rhs = new(mem_ctx) ir_constant(true);
+   }
    ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, rhs);
    ir->insert_before(assign);