nouveau/nvk: Support multi-plane descriptors in nvk_nir_lower_descriptors.c

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
Mohamed Ahmed
2023-07-27 12:46:22 +03:00
committed by Marge Bot
parent a863ddcf9e
commit 41b2034460
+18 -11
View File
@@ -30,7 +30,7 @@ load_descriptor_set_addr(nir_builder *b, uint32_t set,
static nir_ssa_def *
load_descriptor(nir_builder *b, unsigned num_components, unsigned bit_size,
uint32_t set, uint32_t binding, nir_ssa_def *index,
const struct lower_descriptors_ctx *ctx)
unsigned offset_B, const struct lower_descriptors_ctx *ctx)
{
assert(set < NVK_MAX_SETS);
@@ -83,7 +83,7 @@ load_descriptor(nir_builder *b, unsigned num_components, unsigned bit_size,
assert(binding_layout->stride > 0);
nir_ssa_def *desc_ubo_offset =
nir_iadd_imm(b, nir_imul_imm(b, index, binding_layout->stride),
binding_layout->offset);
binding_layout->offset + offset_B);
unsigned desc_align = (1 << (ffs(binding_layout->stride) - 1));
desc_align = MIN2(desc_align, 16);
@@ -113,7 +113,7 @@ load_descriptor_for_idx_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
uint32_t binding = nir_intrinsic_binding(intrin);
index = nir_iadd(b, index, nir_ssa_for_src(b, intrin->src[0], 1));
return load_descriptor(b, 4, 32, set, binding, index, ctx);
return load_descriptor(b, 4, 32, set, binding, index, 0, ctx);
}
static bool
@@ -239,16 +239,16 @@ get_resource_deref_binding(nir_builder *b, nir_deref_instr *deref,
}
static nir_ssa_def *
load_resource_deref_desc(nir_builder *b, nir_deref_instr *deref,
unsigned desc_offset, unsigned num_components,
unsigned bit_size,
load_resource_deref_desc(nir_builder *b,
unsigned num_components, unsigned bit_size,
nir_deref_instr *deref, unsigned offset_B,
const struct lower_descriptors_ctx *ctx)
{
uint32_t set, binding;
nir_ssa_def *index;
get_resource_deref_binding(b, deref, &set, &binding, &index);
return load_descriptor(b, num_components, bit_size,
set, binding, index, ctx);
set, binding, index, offset_B, ctx);
}
static bool
@@ -257,7 +257,7 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
{
b->cursor = nir_before_instr(&intrin->instr);
nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 1, 32, ctx);
nir_ssa_def *desc = load_resource_deref_desc(b, 1, 32, deref, 0, ctx);
nir_rewrite_image_intrinsic(intrin, desc, true);
/* We treat 3D images as 2D arrays */
@@ -333,18 +333,25 @@ lower_tex(nir_builder *b, nir_tex_instr *tex,
nir_src_as_deref(tex->src[sampler_src_idx].src);
assert(texture);
const int plane_src_idx =
nir_tex_instr_src_index(tex, nir_tex_src_plane);
uint32_t plane = (plane_src_idx < 0) ? 0 :
nir_src_as_uint(tex->src[plane_src_idx].src);
uint64_t plane_offset_B = plane * sizeof(struct nvk_image_descriptor);
nir_ssa_def *combined_handle;
if (texture == sampler) {
combined_handle = load_resource_deref_desc(b, texture, 0, 1, 32, ctx);
combined_handle = load_resource_deref_desc(b, 1, 32, texture, plane_offset_B, ctx);
} else {
nir_ssa_def *texture_desc =
load_resource_deref_desc(b, texture, 0, 1, 32, ctx);
load_resource_deref_desc(b, 1, 32, texture, plane_offset_B, ctx);
combined_handle = nir_iand_imm(b, texture_desc,
NVK_IMAGE_DESCRIPTOR_IMAGE_INDEX_MASK);
if (sampler != NULL) {
nir_ssa_def *sampler_desc =
load_resource_deref_desc(b, sampler, 0, 1, 32, ctx);
load_resource_deref_desc(b, 1, 32, sampler, plane_offset_B, ctx);
nir_ssa_def *sampler_index =
nir_iand_imm(b, sampler_desc,
NVK_IMAGE_DESCRIPTOR_SAMPLER_INDEX_MASK);