summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-05-02 12:30:45 -0700
committerJason Ekstrand <[email protected]>2016-05-14 13:34:53 -0700
commit6adb8d6d3a4f3586101937ab8754805ef2b3b5eb (patch)
tree169ec5e146797565057c685c35d530e557e7bd47 /src
parent4bdace079143c8fec152bda30ca996dc6e4482f3 (diff)
i965/blorp: Add support for discard-based bounds checks to the NIR path
Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp_blit.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index 40b8b947adb..56078456b6f 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -427,6 +427,23 @@ blorp_blit_apply_transform(nir_builder *b, nir_ssa_def *src_pos,
return pos;
}
+static inline void
+blorp_nir_discard_if_outside_rect(nir_builder *b, nir_ssa_def *pos,
+ struct brw_blorp_blit_vars *v)
+{
+ nir_ssa_def *c0, *c1, *c2, *c3;
+ c0 = nir_ult(b, nir_channel(b, pos, 0), nir_load_var(b, v->u_dst_x0));
+ c1 = nir_uge(b, nir_channel(b, pos, 0), nir_load_var(b, v->u_dst_x1));
+ c2 = nir_ult(b, nir_channel(b, pos, 1), nir_load_var(b, v->u_dst_y0));
+ c3 = nir_uge(b, nir_channel(b, pos, 1), nir_load_var(b, v->u_dst_y1));
+ nir_ssa_def *oob = nir_ior(b, nir_ior(b, c0, c1), nir_ior(b, c2, c3));
+
+ nir_intrinsic_instr *discard =
+ nir_intrinsic_instr_create(b->shader, nir_intrinsic_discard_if);
+ discard->src[0] = nir_src_for_ssa(oob);
+ nir_builder_instr_insert(b, &discard->instr);
+}
+
static nir_tex_instr *
blorp_create_nir_tex_instr(nir_shader *shader, nir_texop op,
nir_ssa_def *pos, unsigned num_srcs,
@@ -785,7 +802,7 @@ brw_blorp_build_nir_shader(struct brw_context *brw,
* now is the time to do it.
*/
if (key->use_kill)
- goto fail;
+ blorp_nir_discard_if_outside_rect(&b, dst_pos, &v);
src_pos = blorp_blit_apply_transform(&b, nir_i2f(&b, dst_pos), &v);