From bacdf351f68df6ae7035628ea232c39fa1958e6f Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Mon, 25 Nov 2024 17:50:24 +0100 Subject: [PATCH] panvk: Disable integer array indices clamping This is required to support VK_EXT_image_robustness properly as otherwise the array index would be clamped to the array size on TEX_FETCH and would not end up returning zeroes as expected by the extension. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c | 3 ++- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 6 ++++-- src/panfrost/vulkan/panvk_vX_cmd_desc_state.c | 3 ++- src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c | 2 ++ src/panfrost/vulkan/panvk_vX_sampler.c | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index 2387edc6a42..45fc5d252b1 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -51,7 +51,8 @@ prepare_driver_set(struct panvk_cmd_buffer *cmdbuf) return VK_ERROR_OUT_OF_DEVICE_MEMORY; /* Dummy sampler always comes first. */ - pan_pack(&descs[0], SAMPLER, _) { + pan_pack(&descs[0], SAMPLER, cfg) { + cfg.clamp_integer_array_indices = false; } panvk_per_arch(cmd_fill_dyn_bufs)(desc_state, cs, diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index e9ef2e9c326..5dd45dde260 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -160,7 +160,8 @@ prepare_vs_driver_set(struct panvk_cmd_buffer *cmdbuf) } /* Dummy sampler always comes right after the vertex attribs. */ - pan_pack(&descs[MAX_VS_ATTRIBS], SAMPLER, _) { + pan_pack(&descs[MAX_VS_ATTRIBS], SAMPLER, cfg) { + cfg.clamp_integer_array_indices = false; } panvk_per_arch(cmd_fill_dyn_bufs)( @@ -203,7 +204,8 @@ prepare_fs_driver_set(struct panvk_cmd_buffer *cmdbuf) return VK_ERROR_OUT_OF_DEVICE_MEMORY; /* Dummy sampler always comes first. */ - pan_pack(&descs[0], SAMPLER, _) { + pan_pack(&descs[0], SAMPLER, cfg) { + cfg.clamp_integer_array_indices = false; } panvk_per_arch(cmd_fill_dyn_bufs)(desc_state, fs, diff --git a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c index cfaa19833f0..0b267394f39 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_desc_state.c @@ -234,7 +234,8 @@ panvk_per_arch(cmd_prepare_shader_desc_tables)( return VK_ERROR_OUT_OF_DEVICE_MEMORY; /* Emit a dummy sampler if we have to. */ - pan_pack(sampler.cpu, SAMPLER, _) { + pan_pack(sampler.cpu, SAMPLER, cfg) { + cfg.clamp_integer_array_indices = false; } shader_desc_state->tables[PANVK_BIFROST_DESC_TABLE_SAMPLER] = sampler.gpu; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index c0fd55880f7..b3e0faf8c2e 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -428,6 +428,7 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, pan_pack(sampler.cpu, SAMPLER, cfg) { cfg.seamless_cube_map = false; cfg.normalized_coordinates = false; + cfg.clamp_integer_array_indices = false; cfg.minify_nearest = true; cfg.magnify_nearest = true; } @@ -558,6 +559,7 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, pan_pack(sampler, SAMPLER, cfg) { cfg.seamless_cube_map = false; cfg.normalized_coordinates = false; + cfg.clamp_integer_array_indices = false; cfg.minify_nearest = true; cfg.magnify_nearest = true; } diff --git a/src/panfrost/vulkan/panvk_vX_sampler.c b/src/panfrost/vulkan/panvk_vX_sampler.c index bb3ec406a06..873ba41c229 100644 --- a/src/panfrost/vulkan/panvk_vX_sampler.c +++ b/src/panfrost/vulkan/panvk_vX_sampler.c @@ -106,6 +106,7 @@ panvk_per_arch(CreateSampler)(VkDevice _device, cfg.mipmap_mode = panvk_translate_sampler_mipmap_mode(pCreateInfo->mipmapMode); cfg.normalized_coordinates = !pCreateInfo->unnormalizedCoordinates; + cfg.clamp_integer_array_indices = false; cfg.lod_bias = pCreateInfo->mipLodBias; cfg.minimum_lod = pCreateInfo->minLod;