nir: add nir_intrinsic_image_samples_identical

radeonsi will use it

Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17693>
This commit is contained in:
Marek Olšák
2022-07-19 01:23:44 -04:00
committed by Marge Bot
parent 22eff86eaf
commit ea6993f9c7
9 changed files with 21 additions and 0 deletions

View File

@@ -3844,6 +3844,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
break; break;
case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_sparse_load: case nir_intrinsic_image_deref_sparse_load:
case nir_intrinsic_image_deref_samples_identical:
result = visit_image_load(ctx, instr, false); result = visit_image_load(ctx, instr, false);
break; break;
case nir_intrinsic_bindless_image_store: case nir_intrinsic_bindless_image_store:

View File

@@ -78,6 +78,7 @@ lower_impl(nir_builder *b, nir_instr *instr, bool bindless_only)
case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_samples: case nir_intrinsic_image_deref_samples:
case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_size:
case nir_intrinsic_image_deref_samples_identical:
case nir_intrinsic_image_deref_store: { case nir_intrinsic_image_deref_store: {
deref = nir_src_as_deref(intrinsic->src[0]); deref = nir_src_as_deref(intrinsic->src[0]);
var = nir_deref_instr_get_variable(deref); var = nir_deref_instr_get_variable(deref);

View File

@@ -328,6 +328,7 @@ lower_intrinsic(nir_intrinsic_instr *instr,
instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap || instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap ||
instr->intrinsic == nir_intrinsic_image_deref_atomic_fadd || instr->intrinsic == nir_intrinsic_image_deref_atomic_fadd ||
instr->intrinsic == nir_intrinsic_image_deref_size || instr->intrinsic == nir_intrinsic_image_deref_size ||
instr->intrinsic == nir_intrinsic_image_deref_samples_identical ||
instr->intrinsic == nir_intrinsic_image_deref_samples) { instr->intrinsic == nir_intrinsic_image_deref_samples) {
b->cursor = nir_before_instr(&instr->instr); b->cursor = nir_before_instr(&instr->instr);

View File

@@ -323,6 +323,13 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
is_divergent = instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM); is_divergent = instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM);
break; break;
case nir_intrinsic_image_samples_identical:
case nir_intrinsic_image_deref_samples_identical:
case nir_intrinsic_bindless_image_samples_identical:
is_divergent = (instr->src[0].ssa->divergent && (nir_intrinsic_access(instr) & ACCESS_NON_UNIFORM)) ||
instr->src[1].ssa->divergent;
break;
case nir_intrinsic_image_load: case nir_intrinsic_image_load:
case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_load:
case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_load:

View File

@@ -83,6 +83,9 @@ get_intrinsic_resource(nir_intrinsic_instr *intr)
case nir_intrinsic_image_sparse_load: case nir_intrinsic_image_sparse_load:
case nir_intrinsic_image_deref_sparse_load: case nir_intrinsic_image_deref_sparse_load:
/* Group image_size too because it has the same latency as cache hits. */ /* Group image_size too because it has the same latency as cache hits. */
case nir_intrinsic_image_samples_identical:
case nir_intrinsic_image_deref_samples_identical:
case nir_intrinsic_bindless_image_samples_identical:
case nir_intrinsic_image_size: case nir_intrinsic_image_size:
case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_size:
case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_load:

View File

@@ -649,6 +649,8 @@ image("size", dest_comp=0, src_comp=[1], flags=[CAN_ELIMINATE, CAN_REORDER])
image("samples", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) image("samples", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER])
image("atomic_inc_wrap", src_comp=[4, 1, 1], dest_comp=1) image("atomic_inc_wrap", src_comp=[4, 1, 1], dest_comp=1)
image("atomic_dec_wrap", src_comp=[4, 1, 1], dest_comp=1) image("atomic_dec_wrap", src_comp=[4, 1, 1], dest_comp=1)
# This returns true if all samples within the pixel have equal color values.
image("samples_identical", dest_comp=1, src_comp=[4], flags=[CAN_ELIMINATE])
# CL-specific format queries # CL-specific format queries
image("format", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) image("format", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER])
image("order", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER]) image("order", dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER])

View File

@@ -272,6 +272,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl,
case nir_intrinsic_image_atomic_fmax: case nir_intrinsic_image_atomic_fmax:
case nir_intrinsic_image_size: case nir_intrinsic_image_size:
case nir_intrinsic_image_samples: case nir_intrinsic_image_samples:
case nir_intrinsic_image_samples_identical:
case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_sparse_load: case nir_intrinsic_bindless_image_sparse_load:
case nir_intrinsic_bindless_image_store: case nir_intrinsic_bindless_image_store:
@@ -290,6 +291,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl,
case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_bindless_image_atomic_fmax:
case nir_intrinsic_bindless_image_size: case nir_intrinsic_bindless_image_size:
case nir_intrinsic_bindless_image_samples: case nir_intrinsic_bindless_image_samples:
case nir_intrinsic_bindless_image_samples_identical:
case nir_intrinsic_image_deref_load: case nir_intrinsic_image_deref_load:
case nir_intrinsic_image_deref_sparse_load: case nir_intrinsic_image_deref_sparse_load:
case nir_intrinsic_image_deref_store: case nir_intrinsic_image_deref_store:
@@ -308,6 +310,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl,
case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_atomic_fmax:
case nir_intrinsic_image_deref_size: case nir_intrinsic_image_deref_size:
case nir_intrinsic_image_deref_samples: case nir_intrinsic_image_deref_samples:
case nir_intrinsic_image_deref_samples_identical:
if ((options->types & nir_lower_non_uniform_image_access) && if ((options->types & nir_lower_non_uniform_image_access) &&
lower_non_uniform_access_intrin(options, &b, intrin, 0)) lower_non_uniform_access_intrin(options, &b, intrin, 0))
progress = true; progress = true;

View File

@@ -97,6 +97,7 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_image_deref_atomic_fadd: case nir_intrinsic_image_deref_atomic_fadd:
case nir_intrinsic_image_deref_atomic_fmin: case nir_intrinsic_image_deref_atomic_fmin:
case nir_intrinsic_image_deref_atomic_fmax: case nir_intrinsic_image_deref_atomic_fmax:
case nir_intrinsic_image_deref_samples_identical:
var = nir_intrinsic_get_var(instr, 0); var = nir_intrinsic_get_var(instr, 0);
read = instr->intrinsic != nir_intrinsic_image_deref_store; read = instr->intrinsic != nir_intrinsic_image_deref_store;
write = instr->intrinsic != nir_intrinsic_image_deref_load && write = instr->intrinsic != nir_intrinsic_image_deref_load &&
@@ -139,6 +140,7 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
case nir_intrinsic_bindless_image_atomic_fadd: case nir_intrinsic_bindless_image_atomic_fadd:
case nir_intrinsic_bindless_image_atomic_fmin: case nir_intrinsic_bindless_image_atomic_fmin:
case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_bindless_image_atomic_fmax:
case nir_intrinsic_bindless_image_samples_identical:
read = instr->intrinsic != nir_intrinsic_bindless_image_store; read = instr->intrinsic != nir_intrinsic_bindless_image_store;
write = instr->intrinsic != nir_intrinsic_bindless_image_load && write = instr->intrinsic != nir_intrinsic_bindless_image_load &&
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load; instr->intrinsic != nir_intrinsic_bindless_image_sparse_load;

View File

@@ -197,6 +197,7 @@ can_move_intrinsic(nir_intrinsic_instr *instr, opt_preamble_ctx *ctx)
* sources can be moved. * sources can be moved.
*/ */
case nir_intrinsic_image_load: case nir_intrinsic_image_load:
case nir_intrinsic_image_samples_identical:
case nir_intrinsic_bindless_image_load: case nir_intrinsic_bindless_image_load:
case nir_intrinsic_load_ssbo: case nir_intrinsic_load_ssbo:
case nir_intrinsic_load_ssbo_ir3: case nir_intrinsic_load_ssbo_ir3: