gl_graphics_pipeline: Force context flush when loading shader cache
This commit is contained in:
parent
3aab574521
commit
01eeda74a6
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
Reference in New Issue