diff options
| author | 2023-01-29 20:26:49 -0500 | |
|---|---|---|
| committer | 2023-01-29 20:26:49 -0500 | |
| commit | 01eeda74a65611b833de871a188db30a12f51fa3 (patch) | |
| tree | 813ecfe619aabc53af9d982835ff3a96ba9ff35c /src | |
| parent | Merge pull request #9699 from ameerj/texture-pass-desc (diff) | |
| download | yuzu-01eeda74a65611b833de871a188db30a12f51fa3.tar.gz yuzu-01eeda74a65611b833de871a188db30a12f51fa3.tar.xz yuzu-01eeda74a65611b833de871a188db30a12f51fa3.zip | |
gl_graphics_pipeline: Force context flush when loading shader cache
Diffstat (limited to 'src')
4 files changed, 12 insertions, 9 deletions
diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index c115dabe1..29491e762 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp | |||
| @@ -176,7 +176,7 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c | |||
| 176 | std::array<std::string, 5> sources, | 176 | std::array<std::string, 5> sources, |
| 177 | std::array<std::vector<u32>, 5> sources_spirv, | 177 | std::array<std::vector<u32>, 5> sources_spirv, |
| 178 | const std::array<const Shader::Info*, 5>& infos, | 178 | const std::array<const Shader::Info*, 5>& infos, |
| 179 | const GraphicsPipelineKey& key_) | 179 | const GraphicsPipelineKey& key_, bool force_context_flush) |
| 180 | : texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, program_manager{program_manager_}, | 180 | : texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, program_manager{program_manager_}, |
| 181 | state_tracker{state_tracker_}, key{key_} { | 181 | state_tracker{state_tracker_}, key{key_} { |
| 182 | if (shader_notify) { | 182 | if (shader_notify) { |
| @@ -231,7 +231,8 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c | |||
| 231 | const bool in_parallel = thread_worker != nullptr; | 231 | const bool in_parallel = thread_worker != nullptr; |
| 232 | const auto backend = device.GetShaderBackend(); | 232 | const auto backend = device.GetShaderBackend(); |
| 233 | auto func{[this, sources = std::move(sources), sources_spirv = std::move(sources_spirv), | 233 | auto func{[this, sources = std::move(sources), sources_spirv = std::move(sources_spirv), |
| 234 | shader_notify, backend, in_parallel](ShaderContext::Context*) mutable { | 234 | shader_notify, backend, in_parallel, |
| 235 | force_context_flush](ShaderContext::Context*) mutable { | ||
| 235 | for (size_t stage = 0; stage < 5; ++stage) { | 236 | for (size_t stage = 0; stage < 5; ++stage) { |
| 236 | switch (backend) { | 237 | switch (backend) { |
| 237 | case Settings::ShaderBackend::GLSL: | 238 | case Settings::ShaderBackend::GLSL: |
| @@ -251,7 +252,7 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c | |||
| 251 | break; | 252 | break; |
| 252 | } | 253 | } |
| 253 | } | 254 | } |
| 254 | if (in_parallel) { | 255 | if (force_context_flush || in_parallel) { |
| 255 | std::scoped_lock lock{built_mutex}; | 256 | std::scoped_lock lock{built_mutex}; |
| 256 | built_fence.Create(); | 257 | built_fence.Create(); |
| 257 | // Flush this context to ensure compilation commands and fence are in the GPU pipe. | 258 | // Flush this context to ensure compilation commands and fence are in the GPU pipe. |
diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.h b/src/video_core/renderer_opengl/gl_graphics_pipeline.h index 1c06b3655..7bab3be0a 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.h +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.h | |||
| @@ -78,7 +78,7 @@ public: | |||
| 78 | std::array<std::string, 5> sources, | 78 | std::array<std::string, 5> sources, |
| 79 | std::array<std::vector<u32>, 5> sources_spirv, | 79 | std::array<std::vector<u32>, 5> sources_spirv, |
| 80 | const std::array<const Shader::Info*, 5>& infos, | 80 | const std::array<const Shader::Info*, 5>& infos, |
| 81 | const GraphicsPipelineKey& key_); | 81 | const GraphicsPipelineKey& key_, bool force_context_flush = false); |
| 82 | 82 | ||
| 83 | void Configure(bool is_indexed) { | 83 | void Configure(bool is_indexed) { |
| 84 | configure_func(this, is_indexed); | 84 | configure_func(this, is_indexed); |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 7dd854e0f..15812b678 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -307,7 +307,7 @@ void ShaderCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading, | |||
| 307 | env_ptrs.push_back(&env); | 307 | env_ptrs.push_back(&env); |
| 308 | } | 308 | } |
| 309 | ctx->pools.ReleaseContents(); | 309 | ctx->pools.ReleaseContents(); |
| 310 | auto pipeline{CreateGraphicsPipeline(ctx->pools, key, MakeSpan(env_ptrs), false)}; | 310 | auto pipeline{CreateGraphicsPipeline(ctx->pools, key, MakeSpan(env_ptrs), false, true)}; |
| 311 | std::scoped_lock lock{state.mutex}; | 311 | std::scoped_lock lock{state.mutex}; |
| 312 | if (pipeline) { | 312 | if (pipeline) { |
| 313 | graphics_cache.emplace(key, std::move(pipeline)); | 313 | graphics_cache.emplace(key, std::move(pipeline)); |
| @@ -439,7 +439,8 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline() { | |||
| 439 | 439 | ||
| 440 | std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline( | 440 | std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline( |
| 441 | ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, | 441 | ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, |
| 442 | std::span<Shader::Environment* const> envs, bool build_in_parallel) try { | 442 | std::span<Shader::Environment* const> envs, bool use_shader_workers, |
| 443 | bool force_context_flush) try { | ||
| 443 | LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash()); | 444 | LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash()); |
| 444 | size_t env_index{}; | 445 | size_t env_index{}; |
| 445 | u32 total_storage_buffers{}; | 446 | u32 total_storage_buffers{}; |
| @@ -531,10 +532,10 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline( | |||
| 531 | } | 532 | } |
| 532 | previous_program = &program; | 533 | previous_program = &program; |
| 533 | } | 534 | } |
| 534 | auto* const thread_worker{build_in_parallel ? workers.get() : nullptr}; | 535 | auto* const thread_worker{use_shader_workers ? workers.get() : nullptr}; |
| 535 | return std::make_unique<GraphicsPipeline>(device, texture_cache, buffer_cache, program_manager, | 536 | return std::make_unique<GraphicsPipeline>(device, texture_cache, buffer_cache, program_manager, |
| 536 | state_tracker, thread_worker, &shader_notify, sources, | 537 | state_tracker, thread_worker, &shader_notify, sources, |
| 537 | sources_spirv, infos, key); | 538 | sources_spirv, infos, key, force_context_flush); |
| 538 | 539 | ||
| 539 | } catch (Shader::Exception& exception) { | 540 | } catch (Shader::Exception& exception) { |
| 540 | LOG_ERROR(Render_OpenGL, "{}", exception.what()); | 541 | LOG_ERROR(Render_OpenGL, "{}", exception.what()); |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index f82420592..50f610cd0 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h | |||
| @@ -50,7 +50,8 @@ private: | |||
| 50 | 50 | ||
| 51 | std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline( | 51 | std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline( |
| 52 | ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, | 52 | ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, |
| 53 | std::span<Shader::Environment* const> envs, bool build_in_parallel); | 53 | std::span<Shader::Environment* const> envs, bool use_shader_workers, |
| 54 | bool force_context_flush = false); | ||
| 54 | 55 | ||
| 55 | std::unique_ptr<ComputePipeline> CreateComputePipeline(const ComputePipelineKey& key, | 56 | std::unique_ptr<ComputePipeline> CreateComputePipeline(const ComputePipelineKey& key, |
| 56 | const VideoCommon::ShaderInfo* shader); | 57 | const VideoCommon::ShaderInfo* shader); |