From: Kenneth Graunke Date: Tue, 24 Feb 2015 07:47:00 +0000 (-0800) Subject: nir: Introduce nir_intrinsic_discard_if. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8e62bd52f8296a220bd4542abd6fdcdfc41a388c;p=mesa.git nir: Introduce nir_intrinsic_discard_if. This is a conditional discard, which takes a boolean source. Note that we don't generate ir_discard::condition today, so this shouldn't break drivers (since none implement this intrinsic yet). Signed-off-by: Kenneth Graunke Reviewed-by: Connor Abbott Reviewed-by: Matt Turner Reviewed-by: Eric Anholt --- diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp index 544d0d93282..adef19c80a2 100644 --- a/src/glsl/nir/glsl_to_nir.cpp +++ b/src/glsl/nir/glsl_to_nir.cpp @@ -563,8 +563,14 @@ nir_visitor::visit(ir_discard *ir) * discards will be immediately followed by a return. */ - nir_intrinsic_instr *discard = - nir_intrinsic_instr_create(this->shader, nir_intrinsic_discard); + nir_intrinsic_instr *discard; + if (ir->condition) { + discard = nir_intrinsic_instr_create(this->shader, + nir_intrinsic_discard_if); + discard->src[0] = evaluate_rvalue(ir->condition); + } else { + discard = nir_intrinsic_instr_create(this->shader, nir_intrinsic_discard); + } nir_instr_insert_after_cf_list(this->cf_node_list, &discard->instr); } diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h index d94866c8597..3bf102fc15c 100644 --- a/src/glsl/nir/nir_intrinsics.h +++ b/src/glsl/nir/nir_intrinsics.h @@ -68,6 +68,8 @@ INTRINSIC(interp_var_at_offset, 1, ARR(2), true, 0, 1, 0, #define BARRIER(name) INTRINSIC(name, 0, ARR(), false, 0, 0, 0, 0) BARRIER(discard) +/** A conditional discard, with a single boolean source. */ +INTRINSIC(discard_if, 1, ARR(1), false, 0, 0, 0, 0) INTRINSIC(emit_vertex, 0, ARR(), false, 0, 0, 1, 0) INTRINSIC(end_primitive, 0, ARR(), false, 0, 0, 1, 0)