From 3c3476bae8b3aaece9e3eb9b9726f664992a2500 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Thu, 28 Mar 2024 09:40:51 +0100 Subject: [PATCH] panvk: Fix input attachment support Lower input attachments to texture operations as it was meant to be according to the set layout accounting, and fix the descriptor set logic to fill texture descriptors instead of image descriptors. Signed-off-by: Boris Brezillon Reviewed-by: Mary Guillemard Part-of: --- src/panfrost/vulkan/panvk_vX_descriptor_set.c | 9 +++++---- src/panfrost/vulkan/panvk_vX_shader.c | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index 17ddb702190..8d64f6eea25 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -658,6 +658,7 @@ panvk_per_arch(UpdateDescriptorSets)( break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (uint32_t j = 0; j < write->descriptorCount; j++) { panvk_write_tex_desc(set, write->dstBinding, write->dstArrayElement + j, @@ -666,7 +667,6 @@ panvk_per_arch(UpdateDescriptorSets)( break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (uint32_t j = 0; j < write->descriptorCount; j++) { panvk_write_img_desc(set, write->dstBinding, write->dstArrayElement + j, @@ -772,6 +772,7 @@ panvk_per_arch(UpdateDescriptorSets)( break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: for (uint32_t j = 0; j < copy->descriptorCount; j++) { panvk_copy_tex_desc(dst_set, copy->dstBinding, @@ -781,7 +782,6 @@ panvk_per_arch(UpdateDescriptorSets)( break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t j = 0; j < copy->descriptorCount; j++) { panvk_copy_img_desc(dst_set, copy->dstBinding, @@ -848,6 +848,7 @@ panvk_per_arch(UpdateDescriptorSetWithTemplate)( case VK_DESCRIPTOR_TYPE_SAMPLER: case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (unsigned j = 0; j < entry->array_count; j++) { const VkDescriptorImageInfo *info = data + entry->offset + j * entry->stride; @@ -861,7 +862,8 @@ panvk_per_arch(UpdateDescriptorSetWithTemplate)( } if (entry->type == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE || - entry->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { + entry->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER || + entry->type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) { panvk_write_tex_desc(set, entry->binding, entry->array_element + j, info); @@ -870,7 +872,6 @@ panvk_per_arch(UpdateDescriptorSetWithTemplate)( break; case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: for (unsigned j = 0; j < entry->array_count; j++) { const VkDescriptorImageInfo *info = data + entry->offset + j * entry->stride; diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index f661e224739..4f09989d1ca 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -115,6 +115,14 @@ panvk_lower_sysvals(nir_builder *b, nir_instr *instr, void *data) val = load_sysval_from_ubo(b, intr, SYSVAL(blend_constants)); } break; + + case nir_intrinsic_load_layer_id: + /* We don't support layered rendering yet, so force the layer_id to + * zero for now. + */ + val = nir_imm_int(b, 0); + break; + default: return false; } @@ -274,6 +282,15 @@ panvk_per_arch(shader_create)(struct panvk_device *dev, gl_shader_stage stage, NIR_PASS_V(nir, nir_opt_combine_stores, nir_var_all); NIR_PASS_V(nir, nir_opt_loop); + if (stage == MESA_SHADER_FRAGMENT) { + struct nir_input_attachment_options lower_input_attach_opts = { + .use_fragcoord_sysval = true, + .use_layer_id_sysval = true, + }; + + NIR_PASS_V(nir, nir_lower_input_attachments, &lower_input_attach_opts); + } + /* Do texture lowering here. Yes, it's a duplication of the texture * lowering in bifrost_compile. However, we need to lower texture stuff * now, before we call panvk_per_arch(nir_lower_descriptors)() because some