From b47ea93f867e453ab3a734d64f4a626526da7472 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 17 May 2024 10:17:54 -0500 Subject: [PATCH] nvk/meta: Save and restore set_dynamic_buffer_start Fixes: e0d907f56fd8 ("nvk: Rework descriptor set binding") Part-of: (cherry picked from commit 681acde6d3925ec05275bea60e8b38999bc0662e) --- .pick_status.json | 2 +- src/nouveau/vulkan/nvk_cmd_meta.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 2f46ac166e0..93fe2144c19 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -84,7 +84,7 @@ "description": "nvk/meta: Save and restore set_dynamic_buffer_start", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "e0d907f56fd84c119af22d6b4d14c52d99fd7b0c", "notes": null diff --git a/src/nouveau/vulkan/nvk_cmd_meta.c b/src/nouveau/vulkan/nvk_cmd_meta.c index a91d39fb71d..0eff0827c6a 100644 --- a/src/nouveau/vulkan/nvk_cmd_meta.c +++ b/src/nouveau/vulkan/nvk_cmd_meta.c @@ -65,6 +65,7 @@ struct nvk_meta_save { struct nvk_descriptor_set *desc0; bool has_push_desc0; struct nvk_push_descriptor_set push_desc0; + uint8_t set_dynamic_buffer_start[NVK_MAX_SETS]; uint8_t push[128]; }; @@ -86,6 +87,12 @@ nvk_meta_begin(struct nvk_cmd_buffer *cmd, if (save->has_push_desc0) save->push_desc0 = *cmd->state.gfx.descriptors.push[0]; + STATIC_ASSERT(sizeof(save->set_dynamic_buffer_start) == + sizeof(cmd->state.gfx.descriptors.root.set_dynamic_buffer_start)); + memcpy(save->set_dynamic_buffer_start, + cmd->state.gfx.descriptors.root.set_dynamic_buffer_start, + sizeof(save->set_dynamic_buffer_start)); + STATIC_ASSERT(sizeof(save->push) == sizeof(cmd->state.gfx.descriptors.root.push)); memcpy(save->push, cmd->state.gfx.descriptors.root.push, sizeof(save->push)); @@ -141,6 +148,15 @@ nvk_meta_end(struct nvk_cmd_buffer *cmd, cmd->state.gfx.descriptors.push_dirty |= BITFIELD_BIT(0); } + /* Restore set_dynaic_buffer_start because meta binding set 0 can disturb + * all dynamic buffers starts for all sets. + */ + STATIC_ASSERT(sizeof(save->set_dynamic_buffer_start) == + sizeof(cmd->state.gfx.descriptors.root.set_dynamic_buffer_start)); + memcpy(cmd->state.gfx.descriptors.root.set_dynamic_buffer_start, + save->set_dynamic_buffer_start, + sizeof(save->set_dynamic_buffer_start)); + /* Restore the dynamic state */ assert(save->dynamic.vi == &cmd->state.gfx._dynamic_vi); assert(save->dynamic.ms.sample_locations == &cmd->state.gfx._dynamic_sl);