From d7dc4f21433c5c065226ee834db14b6487ae1db2 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Fri, 3 Jul 2026 20:58:34 -0400 Subject: [PATCH] [vulkan] Correction on mislead of BindVertexBuffer entries --- src/video_core/renderer_vulkan/vk_buffer_cache.cpp | 4 ++-- src/video_core/renderer_vulkan/vk_buffer_cache.h | 8 +++++++- src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 7bd0a260b3..7bc23a5e8b 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -556,7 +556,7 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset if (index >= device.GetMaxVertexInputBindings()) { return; } - if (device.IsExtExtendedDynamicStateSupported()) { + if (device.IsExtExtendedDynamicStateSupported() && !vertex_input_dynamic_state_active) { scheduler.Record([index, buffer, offset, size, stride](vk::CommandBuffer cmdbuf) { const VkDeviceSize vk_offset = buffer != VK_NULL_HANDLE ? offset : 0; const VkDeviceSize vk_size = buffer != VK_NULL_HANDLE ? size : VK_WHOLE_SIZE; @@ -596,7 +596,7 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings& bi if (binding_count == 0) { return; } - if (device.IsExtExtendedDynamicStateSupported()) { + if (device.IsExtExtendedDynamicStateSupported() && !vertex_input_dynamic_state_active) { scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles), binding_count](vk::CommandBuffer cmdbuf) { cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(), bindings_.offsets.data(), bindings_.sizes.data(), bindings_.strides.data()); }); diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index b73fcd162b..b26e5d2ffe 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -127,6 +127,10 @@ public: void BindVertexBuffers(VideoCommon::HostBindings& bindings); + void SetVertexInputDynamicState(bool is_active) { + vertex_input_dynamic_state_active = is_active; + } + void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size); void BindTransformFeedbackBuffers(VideoCommon::HostBindings& bindings); @@ -185,6 +189,8 @@ private: bool limit_dynamic_storage_buffers = false; u32 max_dynamic_storage_buffers = (std::numeric_limits::max)(); + + bool vertex_input_dynamic_state_active = false; }; struct BufferCacheParams { diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index b6c2d855d2..32ae502b82 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -472,6 +472,7 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { } buffer_cache.UpdateGraphicsBuffers(is_indexed); + buffer_cache.runtime.SetVertexInputDynamicState(HasDynamicVertexInput()); buffer_cache.BindHostGeometryBuffers(is_indexed); guest_descriptor_queue.Acquire(scheduler, num_descriptor_entries);