summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intel/blorp/blorp_blit.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 19f6c363f1e..d119a99b31f 100644
--- a/src/intel/blorp/blorp_blit.c
+++ b/src/intel/blorp/blorp_blit.c
@@ -21,7 +21,7 @@
* IN THE SOFTWARE.
*/
-#include "compiler/nir/nir_builder.h"
+#include "blorp_nir_builder.h"
#include "blorp_priv.h"
@@ -680,6 +680,11 @@ blorp_nir_manual_blend_average(nir_builder *b, struct brw_blorp_blit_vars *v,
* ld2dms are equivalent (since all samples are on sample slice 0).
* Since we have already sampled from sample 0, all we need to do is
* skip the remaining fetches and averaging if MCS is zero.
+ *
+ * It's also trivial to detect when the MCS has the magic clear color
+ * value. In this case, the txf we did on sample 0 will return the
+ * clear color and we can skip the remaining fetches just like we do
+ * when MCS == 0.
*/
nir_ssa_def *mcs_zero =
nir_ieq(b, nir_channel(b, mcs, 0), nir_imm_int(b, 0));
@@ -687,9 +692,11 @@ blorp_nir_manual_blend_average(nir_builder *b, struct brw_blorp_blit_vars *v,
mcs_zero = nir_iand(b, mcs_zero,
nir_ieq(b, nir_channel(b, mcs, 1), nir_imm_int(b, 0)));
}
+ nir_ssa_def *mcs_clear =
+ blorp_nir_mcs_is_clear_color(b, mcs, tex_samples);
nir_if *if_stmt = nir_if_create(b->shader);
- if_stmt->condition = nir_src_for_ssa(mcs_zero);
+ if_stmt->condition = nir_src_for_ssa(nir_ior(b, mcs_zero, mcs_clear));
nir_cf_node_insert(b->cursor, &if_stmt->cf_node);
b->cursor = nir_after_cf_list(&if_stmt->then_list);