mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 09:18:04 +02:00
nir/group_loads: make is_grouped_load use get_load_resource
and unify get_intrinsic_resource & get_uniform_inst_resource into the new helper get_load_resource. Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36100>
This commit is contained in:
parent
b9f7dc5d26
commit
318a57c57c
1 changed files with 58 additions and 71 deletions
|
|
@ -51,58 +51,72 @@
|
|||
#include "nir.h"
|
||||
|
||||
static nir_instr *
|
||||
get_intrinsic_resource(nir_intrinsic_instr *intr)
|
||||
get_load_resource(nir_instr *instr)
|
||||
{
|
||||
/* This is also the list of intrinsics that are grouped. */
|
||||
switch (intr->intrinsic) {
|
||||
/* Image loads. */
|
||||
case nir_intrinsic_image_load:
|
||||
case nir_intrinsic_image_deref_load:
|
||||
case nir_intrinsic_bindless_image_load:
|
||||
case nir_intrinsic_image_sparse_load:
|
||||
case nir_intrinsic_image_deref_sparse_load:
|
||||
case nir_intrinsic_bindless_image_sparse_load:
|
||||
/* Fragment mask loads. (samples_identical also loads it) */
|
||||
case nir_intrinsic_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_deref_fragment_mask_load_amd:
|
||||
case nir_intrinsic_bindless_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_samples_identical:
|
||||
case nir_intrinsic_image_deref_samples_identical:
|
||||
case nir_intrinsic_bindless_image_samples_identical:
|
||||
/* Queries */
|
||||
case nir_intrinsic_image_size:
|
||||
case nir_intrinsic_image_deref_size:
|
||||
case nir_intrinsic_bindless_image_size:
|
||||
case nir_intrinsic_image_samples:
|
||||
case nir_intrinsic_image_deref_samples:
|
||||
case nir_intrinsic_bindless_image_samples:
|
||||
case nir_intrinsic_image_levels:
|
||||
case nir_intrinsic_image_deref_levels:
|
||||
case nir_intrinsic_bindless_image_levels:
|
||||
/* Other loads. */
|
||||
/* load_ubo is ignored because it's usually cheap. */
|
||||
case nir_intrinsic_load_ssbo:
|
||||
case nir_intrinsic_load_global:
|
||||
return intr->src[0].ssa->parent_instr;
|
||||
default:
|
||||
return NULL;
|
||||
if (instr->type == nir_instr_type_tex) {
|
||||
nir_tex_instr *tex = nir_instr_as_tex(instr);
|
||||
|
||||
for (unsigned i = 0; i < tex->num_srcs; i++) {
|
||||
switch (tex->src[i].src_type) {
|
||||
case nir_tex_src_texture_deref:
|
||||
case nir_tex_src_texture_handle:
|
||||
return tex->src[i].src.ssa->parent_instr;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
unreachable("tex instr should have a resource");
|
||||
}
|
||||
|
||||
if (instr->type == nir_instr_type_intrinsic) {
|
||||
/* This is also the list of intrinsics that are grouped. */
|
||||
switch (nir_instr_as_intrinsic(instr)->intrinsic) {
|
||||
/* Image loads. */
|
||||
case nir_intrinsic_image_load:
|
||||
case nir_intrinsic_image_deref_load:
|
||||
case nir_intrinsic_bindless_image_load:
|
||||
case nir_intrinsic_image_sparse_load:
|
||||
case nir_intrinsic_image_deref_sparse_load:
|
||||
case nir_intrinsic_bindless_image_sparse_load:
|
||||
/* Fragment mask loads. (samples_identical also loads it) */
|
||||
case nir_intrinsic_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_deref_fragment_mask_load_amd:
|
||||
case nir_intrinsic_bindless_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_samples_identical:
|
||||
case nir_intrinsic_image_deref_samples_identical:
|
||||
case nir_intrinsic_bindless_image_samples_identical:
|
||||
/* Queries */
|
||||
case nir_intrinsic_image_size:
|
||||
case nir_intrinsic_image_deref_size:
|
||||
case nir_intrinsic_bindless_image_size:
|
||||
case nir_intrinsic_image_samples:
|
||||
case nir_intrinsic_image_deref_samples:
|
||||
case nir_intrinsic_bindless_image_samples:
|
||||
case nir_intrinsic_image_levels:
|
||||
case nir_intrinsic_image_deref_levels:
|
||||
case nir_intrinsic_bindless_image_levels:
|
||||
/* Other loads. */
|
||||
/* load_ubo is ignored because it's usually cheap. */
|
||||
case nir_intrinsic_load_ssbo:
|
||||
case nir_intrinsic_load_global:
|
||||
return nir_instr_as_intrinsic(instr)->src[0].ssa->parent_instr;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Track only those that we want to group. */
|
||||
static bool
|
||||
is_grouped_load(nir_instr *instr)
|
||||
{
|
||||
/* Count texture_size too because it has the same latency as cache hits. */
|
||||
if (instr->type == nir_instr_type_tex)
|
||||
return true;
|
||||
if (instr->type == nir_instr_type_intrinsic &&
|
||||
!nir_intrinsic_can_reorder(nir_instr_as_intrinsic(instr)))
|
||||
return false;
|
||||
|
||||
if (instr->type == nir_instr_type_intrinsic) {
|
||||
return get_intrinsic_resource(nir_instr_as_intrinsic(instr)) != NULL &&
|
||||
nir_intrinsic_can_reorder(nir_instr_as_intrinsic(instr));
|
||||
}
|
||||
|
||||
return false;
|
||||
return get_load_resource(instr) != NULL;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
@ -121,33 +135,6 @@ is_part_of_group(nir_instr *instr, uint8_t current_indirection_level)
|
|||
return is_grouped_load(instr) && instr->pass_flags == current_indirection_level;
|
||||
}
|
||||
|
||||
static nir_instr *
|
||||
get_uniform_inst_resource(nir_instr *instr)
|
||||
{
|
||||
if (instr->type == nir_instr_type_tex) {
|
||||
nir_tex_instr *tex = nir_instr_as_tex(instr);
|
||||
|
||||
if (tex->texture_non_uniform)
|
||||
return NULL;
|
||||
|
||||
for (unsigned i = 0; i < tex->num_srcs; i++) {
|
||||
switch (tex->src[i].src_type) {
|
||||
case nir_tex_src_texture_deref:
|
||||
case nir_tex_src_texture_handle:
|
||||
return tex->src[i].src.ssa->parent_instr;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (instr->type == nir_instr_type_intrinsic)
|
||||
return get_intrinsic_resource(nir_instr_as_intrinsic(instr));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct check_sources_state {
|
||||
nir_block *block;
|
||||
uint32_t first_index;
|
||||
|
|
@ -426,7 +413,7 @@ process_block(nir_block *block, nir_load_grouping grouping,
|
|||
break;
|
||||
|
||||
case nir_group_same_resource_only:
|
||||
current_resource = get_uniform_inst_resource(current);
|
||||
current_resource = get_load_resource(current);
|
||||
|
||||
if (current_resource) {
|
||||
if (!first_load) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue