mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-15 08:30:42 +01:00
nir/opt_non_uniform_access: use new query flags
NFC for drivers Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39743>
This commit is contained in:
parent
61a96be494
commit
aa92b464f3
1 changed files with 51 additions and 12 deletions
|
|
@ -46,7 +46,7 @@ is_ssbo_intrinsic(nir_intrinsic_instr *intrin)
|
|||
}
|
||||
|
||||
static bool
|
||||
is_image_intrinsic(nir_intrinsic_instr *intrin)
|
||||
is_image_access_intrinsic(nir_intrinsic_instr *intrin)
|
||||
{
|
||||
switch (intrin->intrinsic) {
|
||||
case nir_intrinsic_image_load:
|
||||
|
|
@ -54,25 +54,39 @@ is_image_intrinsic(nir_intrinsic_instr *intrin)
|
|||
case nir_intrinsic_image_store:
|
||||
case nir_intrinsic_image_atomic:
|
||||
case nir_intrinsic_image_atomic_swap:
|
||||
case nir_intrinsic_image_size:
|
||||
case nir_intrinsic_image_samples:
|
||||
case nir_intrinsic_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_bindless_image_load:
|
||||
case nir_intrinsic_bindless_image_sparse_load:
|
||||
case nir_intrinsic_bindless_image_store:
|
||||
case nir_intrinsic_bindless_image_atomic:
|
||||
case nir_intrinsic_bindless_image_atomic_swap:
|
||||
case nir_intrinsic_bindless_image_size:
|
||||
case nir_intrinsic_bindless_image_samples:
|
||||
case nir_intrinsic_bindless_image_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_deref_load:
|
||||
case nir_intrinsic_image_deref_sparse_load:
|
||||
case nir_intrinsic_image_deref_store:
|
||||
case nir_intrinsic_image_deref_atomic:
|
||||
case nir_intrinsic_image_deref_atomic_swap:
|
||||
case nir_intrinsic_image_deref_fragment_mask_load_amd:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
is_image_query_intrinsic(nir_intrinsic_instr *intrin)
|
||||
{
|
||||
switch (intrin->intrinsic) {
|
||||
case nir_intrinsic_image_size:
|
||||
case nir_intrinsic_image_samples:
|
||||
case nir_intrinsic_image_levels:
|
||||
case nir_intrinsic_bindless_image_size:
|
||||
case nir_intrinsic_bindless_image_samples:
|
||||
case nir_intrinsic_bindless_image_levels:
|
||||
case nir_intrinsic_image_deref_size:
|
||||
case nir_intrinsic_image_deref_samples:
|
||||
case nir_intrinsic_image_deref_fragment_mask_load_amd:
|
||||
case nir_intrinsic_image_deref_levels:
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
|
@ -85,10 +99,29 @@ has_non_uniform_tex_access(nir_tex_instr *tex, enum nir_lower_non_uniform_access
|
|||
{
|
||||
bool ret = false;
|
||||
|
||||
if (types & nir_lower_non_uniform_texture_access)
|
||||
ret |= tex->texture_non_uniform || tex->sampler_non_uniform;
|
||||
if (types & nir_lower_non_uniform_texture_offset_access)
|
||||
ret |= tex->offset_non_uniform;
|
||||
switch (tex->op) {
|
||||
case nir_texop_txs:
|
||||
case nir_texop_query_levels:
|
||||
case nir_texop_texture_samples:
|
||||
case nir_texop_descriptor_amd:
|
||||
if (types & nir_lower_non_uniform_texture_query)
|
||||
ret |= tex->texture_non_uniform;
|
||||
break;
|
||||
|
||||
case nir_texop_lod_bias:
|
||||
case nir_texop_sampler_descriptor_amd:
|
||||
if (types & nir_lower_non_uniform_texture_query)
|
||||
ret |= tex->sampler_non_uniform;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (types & nir_lower_non_uniform_texture_access)
|
||||
ret |= tex->texture_non_uniform || tex->sampler_non_uniform;
|
||||
if (types & nir_lower_non_uniform_texture_offset_access)
|
||||
ret |= tex->offset_non_uniform;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -121,10 +154,14 @@ nir_has_non_uniform_access_impl(nir_function_impl *impl, enum nir_lower_non_unif
|
|||
if ((types & nir_lower_non_uniform_ssbo_access) &&
|
||||
has_non_uniform_access_intrin(intrin))
|
||||
return true;
|
||||
} else if (is_image_intrinsic(intrin)) {
|
||||
} else if (is_image_access_intrinsic(intrin)) {
|
||||
if ((types & nir_lower_non_uniform_image_access) &&
|
||||
has_non_uniform_access_intrin(intrin))
|
||||
return true;
|
||||
} else if (is_image_query_intrinsic(intrin)) {
|
||||
if ((types & nir_lower_non_uniform_image_query) &&
|
||||
has_non_uniform_access_intrin(intrin))
|
||||
return true;
|
||||
} else if (intrin->intrinsic == nir_intrinsic_get_ssbo_size) {
|
||||
if ((types & nir_lower_non_uniform_get_ssbo_size) &&
|
||||
has_non_uniform_access_intrin(intrin))
|
||||
|
|
@ -161,6 +198,7 @@ opt_non_uniform_tex_access(nir_tex_instr *tex)
|
|||
{
|
||||
if (!has_non_uniform_tex_access(tex,
|
||||
nir_lower_non_uniform_texture_access |
|
||||
nir_lower_non_uniform_texture_query |
|
||||
nir_lower_non_uniform_texture_offset_access))
|
||||
return false;
|
||||
|
||||
|
|
@ -224,7 +262,8 @@ nir_opt_non_uniform_access_instr(nir_builder *b, nir_instr *instr, UNUSED void *
|
|||
|
||||
case nir_instr_type_intrinsic: {
|
||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
|
||||
if (is_ubo_intrinsic(intrin) || is_ssbo_intrinsic(intrin) || is_image_intrinsic(intrin)) {
|
||||
if (is_ubo_intrinsic(intrin) || is_ssbo_intrinsic(intrin) ||
|
||||
is_image_access_intrinsic(intrin) || is_image_query_intrinsic(intrin)) {
|
||||
unsigned handle_src = 0;
|
||||
/* SSBO Stores put the index in the second source */
|
||||
if (intrin->intrinsic == nir_intrinsic_store_ssbo)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue