|
|
@ -286,7 +286,7 @@ void ShaderCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading, |
|
|
file.read(reinterpret_cast<char*>(&key), sizeof(key)); |
|
|
file.read(reinterpret_cast<char*>(&key), sizeof(key)); |
|
|
queue_work([this, key, env = std::move(env), &state, &callback](Context* ctx) mutable { |
|
|
queue_work([this, key, env = std::move(env), &state, &callback](Context* ctx) mutable { |
|
|
ctx->pools.ReleaseContents(); |
|
|
ctx->pools.ReleaseContents(); |
|
|
auto pipeline{CreateComputePipeline(ctx->pools, key, env)}; |
|
|
|
|
|
|
|
|
auto pipeline{CreateComputePipeline(ctx->pools, key, env, true)}; |
|
|
std::scoped_lock lock{state.mutex}; |
|
|
std::scoped_lock lock{state.mutex}; |
|
|
if (pipeline) { |
|
|
if (pipeline) { |
|
|
compute_cache.emplace(key, std::move(pipeline)); |
|
|
compute_cache.emplace(key, std::move(pipeline)); |
|
|
@ -560,8 +560,8 @@ std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline( |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline( |
|
|
std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline( |
|
|
ShaderContext::ShaderPools& pools, const ComputePipelineKey& key, |
|
|
|
|
|
Shader::Environment& env) try { |
|
|
|
|
|
|
|
|
ShaderContext::ShaderPools& pools, const ComputePipelineKey& key, Shader::Environment& env, |
|
|
|
|
|
bool force_context_flush) try { |
|
|
LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash()); |
|
|
LOG_INFO(Render_OpenGL, "0x{:016x}", key.Hash()); |
|
|
|
|
|
|
|
|
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()}; |
|
|
Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()}; |
|
|
@ -590,7 +590,7 @@ std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline( |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return std::make_unique<ComputePipeline>(device, texture_cache, buffer_cache, program_manager, |
|
|
return std::make_unique<ComputePipeline>(device, texture_cache, buffer_cache, program_manager, |
|
|
program.info, code, code_spirv); |
|
|
|
|
|
|
|
|
program.info, code, code_spirv, force_context_flush); |
|
|
} catch (Shader::Exception& exception) { |
|
|
} catch (Shader::Exception& exception) { |
|
|
LOG_ERROR(Render_OpenGL, "{}", exception.what()); |
|
|
LOG_ERROR(Render_OpenGL, "{}", exception.what()); |
|
|
return nullptr; |
|
|
return nullptr; |
|
|
|