From 13970a56441cb6efaa866df977ecb8b7b2a81af7 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Thu, 29 Sep 2022 21:16:31 +0100 Subject: [PATCH] Refresh pipeline cached storage buffer bindings after each execution --- .../gpu/interconnect/maxwell_3d/pipeline_manager.cpp | 9 +++++++++ .../gpu/interconnect/maxwell_3d/pipeline_manager.h | 3 +++ 2 files changed, 12 insertions(+) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.cpp index b85d2a94..bf0aabb2 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.cpp @@ -565,6 +565,15 @@ namespace skyline::gpu::interconnect::maxwell3d { storageBufferViews.resize(descriptorInfo.totalStorageBufferCount); } + void Pipeline::SyncCachedStorageBufferViews(u32 executionNumber) { + if (lastExecutionNumber != executionNumber) { + for (auto &view : storageBufferViews) + view.PurgeCaches(); + + lastExecutionNumber = executionNumber; + } + } + Pipeline *Pipeline::LookupNext(const PackedPipelineState &packedState) { auto it{std::find_if(transitionCache.begin(), transitionCache.end(), [&packedState](auto pipeline) { if (pipeline && pipeline->sourcePackedState == packedState) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h index d202b731..025780cf 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h @@ -85,6 +85,7 @@ namespace skyline::gpu::interconnect::maxwell3d { private: std::vector storageBufferViews; + u32 lastExecutionNumber{}; //!< The last execution number this pipeline was used at std::array shaderStages; DescriptorInfo descriptorInfo; cache::GraphicsPipelineCache::CompiledPipeline compiledPipeline; @@ -94,6 +95,8 @@ namespace skyline::gpu::interconnect::maxwell3d { tsl::robin_map bindingMatchCache; //!< Cache of which pipelines have bindings that match this pipeline + void SyncCachedStorageBufferViews(u32 executionNumber); + public: PackedPipelineState sourcePackedState;