diff options
| author | 2021-11-07 17:52:45 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:51 +0200 | |
| commit | 3f8e7a55851a613becf715cbf3016a8e9f63d65f (patch) | |
| tree | 6b42cdddda0fb26fd0241ae2def28416179c3d51 /src/video_core/renderer_vulkan | |
| parent | OpenGl: Implement Channels. (diff) | |
| download | yuzu-3f8e7a55851a613becf715cbf3016a8e9f63d65f.tar.gz yuzu-3f8e7a55851a613becf715cbf3016a8e9f63d65f.tar.xz yuzu-3f8e7a55851a613becf715cbf3016a8e9f63d65f.zip | |
VideoCore: Fix channels with disk pipeline/shader cache.
Diffstat (limited to 'src/video_core/renderer_vulkan')
4 files changed, 31 insertions, 24 deletions
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 5aca8f038..1e993185f 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -215,15 +215,14 @@ ConfigureFuncPtr ConfigureFunc(const std::array<vk::ShaderModule, NUM_STAGES>& m | |||
| 215 | } // Anonymous namespace | 215 | } // Anonymous namespace |
| 216 | 216 | ||
| 217 | GraphicsPipeline::GraphicsPipeline( | 217 | GraphicsPipeline::GraphicsPipeline( |
| 218 | Tegra::Engines::Maxwell3D& maxwell3d_, Tegra::MemoryManager& gpu_memory_, Scheduler& scheduler_, | 218 | Scheduler& scheduler_, BufferCache& buffer_cache_, TextureCache& texture_cache_, |
| 219 | BufferCache& buffer_cache_, TextureCache& texture_cache_, | ||
| 220 | VideoCore::ShaderNotify* shader_notify, const Device& device_, DescriptorPool& descriptor_pool, | 219 | VideoCore::ShaderNotify* shader_notify, const Device& device_, DescriptorPool& descriptor_pool, |
| 221 | UpdateDescriptorQueue& update_descriptor_queue_, Common::ThreadWorker* worker_thread, | 220 | UpdateDescriptorQueue& update_descriptor_queue_, Common::ThreadWorker* worker_thread, |
| 222 | PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache, | 221 | PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache, |
| 223 | const GraphicsPipelineCacheKey& key_, std::array<vk::ShaderModule, NUM_STAGES> stages, | 222 | const GraphicsPipelineCacheKey& key_, std::array<vk::ShaderModule, NUM_STAGES> stages, |
| 224 | const std::array<const Shader::Info*, NUM_STAGES>& infos) | 223 | const std::array<const Shader::Info*, NUM_STAGES>& infos) |
| 225 | : key{key_}, maxwell3d{maxwell3d_}, gpu_memory{gpu_memory_}, device{device_}, | 224 | : key{key_}, device{device_}, texture_cache{texture_cache_}, |
| 226 | texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, scheduler{scheduler_}, | 225 | buffer_cache{buffer_cache_}, scheduler{scheduler_}, |
| 227 | update_descriptor_queue{update_descriptor_queue_}, spv_modules{std::move(stages)} { | 226 | update_descriptor_queue{update_descriptor_queue_}, spv_modules{std::move(stages)} { |
| 228 | if (shader_notify) { | 227 | if (shader_notify) { |
| 229 | shader_notify->MarkShaderBuilding(); | 228 | shader_notify->MarkShaderBuilding(); |
| @@ -288,7 +287,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { | |||
| 288 | 287 | ||
| 289 | buffer_cache.SetUniformBuffersState(enabled_uniform_buffer_masks, &uniform_buffer_sizes); | 288 | buffer_cache.SetUniformBuffersState(enabled_uniform_buffer_masks, &uniform_buffer_sizes); |
| 290 | 289 | ||
| 291 | const auto& regs{maxwell3d.regs}; | 290 | const auto& regs{maxwell3d->regs}; |
| 292 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; | 291 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; |
| 293 | const auto config_stage{[&](size_t stage) LAMBDA_FORCEINLINE { | 292 | const auto config_stage{[&](size_t stage) LAMBDA_FORCEINLINE { |
| 294 | const Shader::Info& info{stage_infos[stage]}; | 293 | const Shader::Info& info{stage_infos[stage]}; |
| @@ -302,7 +301,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { | |||
| 302 | ++ssbo_index; | 301 | ++ssbo_index; |
| 303 | } | 302 | } |
| 304 | } | 303 | } |
| 305 | const auto& cbufs{maxwell3d.state.shader_stages[stage].const_buffers}; | 304 | const auto& cbufs{maxwell3d->state.shader_stages[stage].const_buffers}; |
| 306 | const auto read_handle{[&](const auto& desc, u32 index) { | 305 | const auto read_handle{[&](const auto& desc, u32 index) { |
| 307 | ASSERT(cbufs[desc.cbuf_index].enabled); | 306 | ASSERT(cbufs[desc.cbuf_index].enabled); |
| 308 | const u32 index_offset{index << desc.size_shift}; | 307 | const u32 index_offset{index << desc.size_shift}; |
| @@ -315,13 +314,13 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { | |||
| 315 | const u32 second_offset{desc.secondary_cbuf_offset + index_offset}; | 314 | const u32 second_offset{desc.secondary_cbuf_offset + index_offset}; |
| 316 | const GPUVAddr separate_addr{cbufs[desc.secondary_cbuf_index].address + | 315 | const GPUVAddr separate_addr{cbufs[desc.secondary_cbuf_index].address + |
| 317 | second_offset}; | 316 | second_offset}; |
| 318 | const u32 lhs_raw{gpu_memory.Read<u32>(addr)}; | 317 | const u32 lhs_raw{gpu_memory->Read<u32>(addr)}; |
| 319 | const u32 rhs_raw{gpu_memory.Read<u32>(separate_addr)}; | 318 | const u32 rhs_raw{gpu_memory->Read<u32>(separate_addr)}; |
| 320 | const u32 raw{lhs_raw | rhs_raw}; | 319 | const u32 raw{lhs_raw | rhs_raw}; |
| 321 | return TexturePair(raw, via_header_index); | 320 | return TexturePair(raw, via_header_index); |
| 322 | } | 321 | } |
| 323 | } | 322 | } |
| 324 | return TexturePair(gpu_memory.Read<u32>(addr), via_header_index); | 323 | return TexturePair(gpu_memory->Read<u32>(addr), via_header_index); |
| 325 | }}; | 324 | }}; |
| 326 | const auto add_image{[&](const auto& desc, bool blacklist) LAMBDA_FORCEINLINE { | 325 | const auto add_image{[&](const auto& desc, bool blacklist) LAMBDA_FORCEINLINE { |
| 327 | for (u32 index = 0; index < desc.count; ++index) { | 326 | for (u32 index = 0; index < desc.count; ++index) { |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index e8949a9ab..85602592b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h | |||
| @@ -69,15 +69,16 @@ class GraphicsPipeline { | |||
| 69 | static constexpr size_t NUM_STAGES = Tegra::Engines::Maxwell3D::Regs::MaxShaderStage; | 69 | static constexpr size_t NUM_STAGES = Tegra::Engines::Maxwell3D::Regs::MaxShaderStage; |
| 70 | 70 | ||
| 71 | public: | 71 | public: |
| 72 | explicit GraphicsPipeline( | 72 | explicit GraphicsPipeline(Scheduler& scheduler, BufferCache& buffer_cache, |
| 73 | Tegra::Engines::Maxwell3D& maxwell3d, Tegra::MemoryManager& gpu_memory, | 73 | TextureCache& texture_cache, VideoCore::ShaderNotify* shader_notify, |
| 74 | Scheduler& scheduler, BufferCache& buffer_cache, TextureCache& texture_cache, | 74 | const Device& device, DescriptorPool& descriptor_pool, |
| 75 | VideoCore::ShaderNotify* shader_notify, const Device& device, | 75 | UpdateDescriptorQueue& update_descriptor_queue, |
| 76 | DescriptorPool& descriptor_pool, UpdateDescriptorQueue& update_descriptor_queue, | 76 | Common::ThreadWorker* worker_thread, |
| 77 | Common::ThreadWorker* worker_thread, PipelineStatistics* pipeline_statistics, | 77 | PipelineStatistics* pipeline_statistics, |
| 78 | RenderPassCache& render_pass_cache, const GraphicsPipelineCacheKey& key, | 78 | RenderPassCache& render_pass_cache, |
| 79 | std::array<vk::ShaderModule, NUM_STAGES> stages, | 79 | const GraphicsPipelineCacheKey& key, |
| 80 | const std::array<const Shader::Info*, NUM_STAGES>& infos); | 80 | std::array<vk::ShaderModule, NUM_STAGES> stages, |
| 81 | const std::array<const Shader::Info*, NUM_STAGES>& infos); | ||
| 81 | 82 | ||
| 82 | GraphicsPipeline& operator=(GraphicsPipeline&&) noexcept = delete; | 83 | GraphicsPipeline& operator=(GraphicsPipeline&&) noexcept = delete; |
| 83 | GraphicsPipeline(GraphicsPipeline&&) noexcept = delete; | 84 | GraphicsPipeline(GraphicsPipeline&&) noexcept = delete; |
| @@ -109,6 +110,11 @@ public: | |||
| 109 | return [](GraphicsPipeline* pl, bool is_indexed) { pl->ConfigureImpl<Spec>(is_indexed); }; | 110 | return [](GraphicsPipeline* pl, bool is_indexed) { pl->ConfigureImpl<Spec>(is_indexed); }; |
| 110 | } | 111 | } |
| 111 | 112 | ||
| 113 | void SetEngine(Tegra::Engines::Maxwell3D* maxwell3d_, Tegra::MemoryManager* gpu_memory_) { | ||
| 114 | maxwell3d = maxwell3d_; | ||
| 115 | gpu_memory = gpu_memory_; | ||
| 116 | } | ||
| 117 | |||
| 112 | private: | 118 | private: |
| 113 | template <typename Spec> | 119 | template <typename Spec> |
| 114 | void ConfigureImpl(bool is_indexed); | 120 | void ConfigureImpl(bool is_indexed); |
| @@ -120,8 +126,8 @@ private: | |||
| 120 | void Validate(); | 126 | void Validate(); |
| 121 | 127 | ||
| 122 | const GraphicsPipelineCacheKey key; | 128 | const GraphicsPipelineCacheKey key; |
| 123 | Tegra::Engines::Maxwell3D& maxwell3d; | 129 | Tegra::Engines::Maxwell3D* maxwell3d; |
| 124 | Tegra::MemoryManager& gpu_memory; | 130 | Tegra::MemoryManager* gpu_memory; |
| 125 | const Device& device; | 131 | const Device& device; |
| 126 | TextureCache& texture_cache; | 132 | TextureCache& texture_cache; |
| 127 | BufferCache& buffer_cache; | 133 | BufferCache& buffer_cache; |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index b1e0b96c4..732e7b6f2 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -555,10 +555,10 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline( | |||
| 555 | previous_stage = &program; | 555 | previous_stage = &program; |
| 556 | } | 556 | } |
| 557 | Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr}; | 557 | Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr}; |
| 558 | return std::make_unique<GraphicsPipeline>( | 558 | return std::make_unique<GraphicsPipeline>(scheduler, buffer_cache, texture_cache, |
| 559 | *maxwell3d, *gpu_memory, scheduler, buffer_cache, texture_cache, &shader_notify, device, | 559 | &shader_notify, device, descriptor_pool, |
| 560 | descriptor_pool, update_descriptor_queue, thread_worker, statistics, render_pass_cache, key, | 560 | update_descriptor_queue, thread_worker, statistics, |
| 561 | std::move(modules), infos); | 561 | render_pass_cache, key, std::move(modules), infos); |
| 562 | 562 | ||
| 563 | } catch (const Shader::Exception& exception) { | 563 | } catch (const Shader::Exception& exception) { |
| 564 | LOG_ERROR(Render_Vulkan, "{}", exception.what()); | 564 | LOG_ERROR(Render_Vulkan, "{}", exception.what()); |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index bf750452f..7e0805544 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -190,6 +190,8 @@ void RasterizerVulkan::Draw(bool is_indexed, bool is_instanced) { | |||
| 190 | return; | 190 | return; |
| 191 | } | 191 | } |
| 192 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; | 192 | std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; |
| 193 | // update engine as channel may be different. | ||
| 194 | pipeline->SetEngine(maxwell3d, gpu_memory); | ||
| 193 | pipeline->Configure(is_indexed); | 195 | pipeline->Configure(is_indexed); |
| 194 | 196 | ||
| 195 | BeginTransformFeedback(); | 197 | BeginTransformFeedback(); |