From 1643d8766f9071e1c5ffe7599ba3a19f19845992 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 7 Jul 2026 19:57:45 +0200 Subject: [PATCH] [vk] invalidate shader cache automatically if !=driverId or !=driverVersion (#4174) this integrates neatly into the existing GraphicsPipelineKey system no need for extra funcs :) Signed-off-by: lizzie Co-authored-by: CamilleLaVey Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4174 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | 3 +++ src/video_core/renderer_vulkan/fixed_pipeline_state.h | 4 ++++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 4 +++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index c6aa28fa23..12d1c2e372 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -56,6 +56,9 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe const Maxwell& regs = maxwell3d.regs; const auto topology_ = maxwell3d.draw_manager.draw_state.topology; + driver_id = features.driver_id; + driver_version = features.driver_version; + raw1 = 0; extended_dynamic_state.Assign(features.has_extended_dynamic_state ? 1 : 0); extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2 ? 1 : 0); diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index 44157d686d..c203e13880 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -21,6 +21,8 @@ namespace Vulkan { using Maxwell = Tegra::Engines::Maxwell3D::Regs; struct DynamicFeatures { + u32 driver_id; + u32 driver_version; bool has_extended_dynamic_state; bool has_extended_dynamic_state_2; bool has_extended_dynamic_state_2_logic_op; @@ -228,6 +230,8 @@ struct FixedPipelineState { }; std::array color_formats; + u32 driver_id; + u32 driver_version; u32 alpha_test_ref; u32 point_size; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 15f7e9bf43..3d63d6eb23 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -62,7 +62,7 @@ using VideoCommon::FileEnvironment; using VideoCommon::GenericEnvironment; using VideoCommon::GraphicsEnvironment; -constexpr u32 CACHE_VERSION = 17; +constexpr u32 CACHE_VERSION = 18; constexpr std::array VULKAN_CACHE_MAGIC_NUMBER{'y', 'u', 'z', 'u', 'v', 'k', 'c', 'h'}; template @@ -479,6 +479,8 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, LOG_INFO(Render_Vulkan, "DynamicState setting value: {}", u32(Settings::values.dyna_state.GetValue())); dynamic_features = {}; + dynamic_features.driver_id = device.GetDriverID(); + dynamic_features.driver_version = device.GetDriverVersion(); // User granularity enforced in vulkan_device.cpp switch statement: // Level 0: Core Dynamic States only