diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 3aac0abf274..e783277bbb1 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -564,9 +564,6 @@ blorp_nir_combine_samples(nir_builder *b, struct brw_blorp_blit_vars *v, nir_alu_type dst_type, enum blorp_filter filter) { - /* If non-null, this is the outer-most if statement */ - nir_if *outer_if = NULL; - nir_variable *color = nir_local_variable_create(b->impl, glsl_vec4_type(), "color"); @@ -603,6 +600,10 @@ blorp_nir_combine_samples(nir_builder *b, struct brw_blorp_blit_vars *v, unreachable("Invalid filter"); } + /* If true, we inserted an if statement that we need to pop at at the end. + */ + bool inserted_if = false; + /* We add together samples using a binary tree structure, e.g. for 4x MSAA: * * result = ((sample[0] + sample[1]) + (sample[2] + sample[3])) / 4 @@ -674,15 +675,11 @@ blorp_nir_combine_samples(nir_builder *b, struct brw_blorp_blit_vars *v, 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(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); + nir_push_if(b, nir_ior(b, mcs_zero, mcs_clear)); nir_store_var(b, color, texture_data[0], 0xf); - b->cursor = nir_after_cf_list(&if_stmt->else_list); - outer_if = if_stmt; + nir_push_else(b, NULL); + inserted_if = true; } for (int j = 0; j < count_trailing_one_bits(i); j++) { @@ -708,8 +705,8 @@ blorp_nir_combine_samples(nir_builder *b, struct brw_blorp_blit_vars *v, nir_store_var(b, color, texture_data[0], 0xf); - if (outer_if) - b->cursor = nir_after_cf_node(&outer_if->cf_node); + if (inserted_if) + nir_pop_if(b, NULL); return nir_load_var(b, color); } diff --git a/src/intel/compiler/brw_nir_tcs_workarounds.c b/src/intel/compiler/brw_nir_tcs_workarounds.c index 174cf6eec88..ac2a90b4cc1 100644 --- a/src/intel/compiler/brw_nir_tcs_workarounds.c +++ b/src/intel/compiler/brw_nir_tcs_workarounds.c @@ -100,12 +100,7 @@ emit_quads_workaround(nir_builder *b, nir_block *block) nir_ior(b, nir_bany(b, nir_flt(b, nir_imm_float(b, 1.0f), outer)), nir_bany(b, nir_flt(b, nir_imm_float(b, 1.0f), inner))); - nir_if *if_stmt = nir_if_create(b->shader); - if_stmt->condition = nir_src_for_ssa(any_greater_than_1); - nir_builder_cf_insert(b, &if_stmt->cf_node); - - /* Fill out the new then-block */ - b->cursor = nir_after_cf_list(&if_stmt->then_list); + nir_push_if(b, any_greater_than_1); inner = nir_bcsel(b, nir_fge(b, nir_imm_float(b, 1.0f), inner), nir_imm_float(b, 2.0f), inner); @@ -118,6 +113,8 @@ emit_quads_workaround(nir_builder *b, nir_block *block) store->src[0] = nir_src_for_ssa(inner); store->src[1] = nir_src_for_ssa(nir_imm_int(b, 0)); nir_builder_instr_insert(b, &store->instr); + + nir_pop_if(b, NULL); } void