diff options
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                                     std::array<std::string, 5> sources,                                     std::array<std::vector<u32>, 5> sources_spirv,                                     const std::array<const Shader::Info*, 5>& infos, -                                   const GraphicsPipelineKey& key_) +                                   const GraphicsPipelineKey& key_, bool force_context_flush)      : texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, program_manager{program_manager_},        state_tracker{state_tracker_}, key{key_} {      if (shader_notify) { @@ -231,7 +231,8 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c      const bool in_parallel = thread_worker != nullptr;      const auto backend = device.GetShaderBackend();      auto func{[this, sources = std::move(sources), sources_spirv = std::move(sources_spirv), -               shader_notify, backend, in_parallel](ShaderContext::Context*) mutable { +               shader_notify, backend, in_parallel, +               force_context_flush](ShaderContext::Context*) mutable {          for (size_t stage = 0; stage < 5; ++stage) {              switch (backend) {              case Settings::ShaderBackend::GLSL: @@ -251,7 +252,7 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c                  break;              }          } -        if (in_parallel) { +        if (force_context_flush || in_parallel) {              std::scoped_lock lock{built_mutex};              built_fence.Create();              // 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:                                std::array<std::string, 5> sources,                                std::array<std::vector<u32>, 5> sources_spirv,                                const std::array<const Shader::Info*, 5>& infos, -                              const GraphicsPipelineKey& key_); +                              const GraphicsPipelineKey& key_, bool force_context_flush = false);      void Configure(bool is_indexed) {          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,                  env_ptrs.push_back(&env);              }              ctx->pools.ReleaseContents(); -            auto pipeline{CreateGraphicsPipeline(ctx->pools, key, MakeSpan(env_ptrs), false)}; +            auto pipeline{CreateGraphicsPipeline(ctx->pools, key, MakeSpan(env_ptrs), false, true)};              std::scoped_lock lock{state.mutex};              if (pipeline) {                  graphics_cache.emplace(key, std::move(pipeline)); @@ -439,7 +439,8 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline() {  std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(      ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, -    std::span<Shader::Environment* const> envs, bool build_in_parallel) try { +    std::span<Shader::Environment* const> envs, bool use_shader_workers, +    bool force_context_flush) try {      LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash());      size_t env_index{};      u32 total_storage_buffers{}; @@ -531,10 +532,10 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(          }          previous_program = &program;      } -    auto* const thread_worker{build_in_parallel ? workers.get() : nullptr}; +    auto* const thread_worker{use_shader_workers ? workers.get() : nullptr};      return std::make_unique<GraphicsPipeline>(device, texture_cache, buffer_cache, program_manager,                                                state_tracker, thread_worker, &shader_notify, sources, -                                              sources_spirv, infos, key); +                                              sources_spirv, infos, key, force_context_flush);  } catch (Shader::Exception& exception) {      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:      std::unique_ptr<GraphicsPipeline> CreateGraphicsPipeline(          ShaderContext::ShaderPools& pools, const GraphicsPipelineKey& key, -        std::span<Shader::Environment* const> envs, bool build_in_parallel); +        std::span<Shader::Environment* const> envs, bool use_shader_workers, +        bool force_context_flush = false);      std::unique_ptr<ComputePipeline> CreateComputePipeline(const ComputePipelineKey& key,                                                             const VideoCommon::ShaderInfo* shader); | 
