From 640783513b68d818c449672761d719fa09db6cb8 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:12:01 -0600 Subject: [PATCH] nvk: Use 2D array views for 3D storage images Part-of: --- src/nouveau/vulkan/nvk_descriptor_set.c | 1 - src/nouveau/vulkan/nvk_image.c | 6 ++++++ src/nouveau/vulkan/nvk_image_view.c | 13 +++++++++++++ src/nouveau/vulkan/nvk_nir_lower_descriptors.c | 7 +++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index dfca4e8b206..7309bba5ad4 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -54,7 +54,6 @@ write_image_view_desc(struct nvk_descriptor_set *set, * that our descriptor index is at most 11 bits. */ assert(view->storage_desc_index < (1 << 11)); - assert(view->vk.image->image_type != VK_IMAGE_TYPE_3D); desc.image_index = view->storage_desc_index; } else { diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 8a156b4600e..4c4670b06f6 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -230,6 +230,12 @@ nvk_image_init(struct nvk_device *device, if (pCreateInfo->flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT) usage |= NIL_IMAGE_USAGE_2D_VIEW_BIT; + /* We treat 3D storage images as 2D arrays. One day, we may wire up actual + * 3D storage image support but baseArrayLayer gets tricky. + */ + if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) + usage |= NIL_IMAGE_USAGE_2D_VIEW_BIT; + struct nil_image_init_info nil_info = { .dim = vk_image_type_to_nil_dim(pCreateInfo->imageType), .format = vk_format_to_pipe_format(pCreateInfo->format), diff --git a/src/nouveau/vulkan/nvk_image_view.c b/src/nouveau/vulkan/nvk_image_view.c index 57ee5e5cb0e..aa59a41c7e8 100644 --- a/src/nouveau/vulkan/nvk_image_view.c +++ b/src/nouveau/vulkan/nvk_image_view.c @@ -108,6 +108,19 @@ nvk_image_view_init(struct nvk_device *device, view->vk.view_type == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) nil_view.type = NIL_VIEW_TYPE_2D_ARRAY; + if (view->vk.view_type == VK_IMAGE_VIEW_TYPE_3D) { + /* Without VK_AMD_shader_image_load_store_lod, the client can only + * get at the first LOD from the shader anyway. + */ + assert(view->vk.base_array_layer == 0); + assert(view->vk.layer_count = 1); + nil_view.type = NIL_VIEW_TYPE_2D_ARRAY; + nil_view.num_levels = 1; + nil_view.base_array_layer = 0; + nil_view.array_len = view->vk.extent.depth; + image_3d_view_as_2d_array(&nil_image, &nil_view, &base_addr); + } + uint32_t tic[8]; nil_image_fill_tic(nvk_device_physical(device)->dev, &nil_image, &nil_view, base_addr, tic); diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index 37d8abfcc0f..7e8458b07be 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -190,6 +190,13 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intrin, nir_ssa_def *desc = load_resource_deref_desc(b, deref, 0, 1, 32, ctx); nir_rewrite_image_intrinsic(intrin, desc, true); + /* We treat 3D images as 2D arrays */ + if (nir_intrinsic_image_dim(intrin) == GLSL_SAMPLER_DIM_3D) { + assert(!nir_intrinsic_image_array(intrin)); + nir_intrinsic_set_image_dim(intrin, GLSL_SAMPLER_DIM_2D); + nir_intrinsic_set_image_array(intrin, true); + } + /* We don't support ReadWithoutFormat yet */ if (intrin->intrinsic == nir_intrinsic_image_deref_load) assert(nir_intrinsic_format(intrin) != PIPE_FORMAT_NONE);