|
|
|
@ -345,7 +345,8 @@ ShaderDiskCacheUsage CachedShader::GetUsage(GLenum primitive_mode,
|
|
|
|
|
ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system)
|
|
|
|
|
: RasterizerCache{rasterizer}, disk_cache{system} {}
|
|
|
|
|
|
|
|
|
|
void ShaderCacheOpenGL::LoadDiskCache() {
|
|
|
|
|
void ShaderCacheOpenGL::LoadDiskCache(const std::atomic_bool& stop_loading,
|
|
|
|
|
const VideoCore::DiskResourceLoadCallback& callback) {
|
|
|
|
|
const auto transferable = disk_cache.LoadTransferable();
|
|
|
|
|
if (!transferable) {
|
|
|
|
|
return;
|
|
|
|
@ -355,10 +356,18 @@ void ShaderCacheOpenGL::LoadDiskCache() {
|
|
|
|
|
auto [decompiled, dumps] = disk_cache.LoadPrecompiled();
|
|
|
|
|
|
|
|
|
|
const auto supported_formats{GetSupportedFormats()};
|
|
|
|
|
const auto unspecialized{GenerateUnspecializedShaders(raws, decompiled)};
|
|
|
|
|
const auto unspecialized{
|
|
|
|
|
GenerateUnspecializedShaders(stop_loading, callback, raws, decompiled)};
|
|
|
|
|
if (stop_loading)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Build shaders
|
|
|
|
|
if (callback)
|
|
|
|
|
callback(VideoCore::LoadCallbackStage::Build, 0, usages.size());
|
|
|
|
|
for (std::size_t i = 0; i < usages.size(); ++i) {
|
|
|
|
|
if (stop_loading)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
const auto& usage{usages[i]};
|
|
|
|
|
LOG_INFO(Render_OpenGL, "Building shader {:016x} ({} of {})", usage.unique_identifier,
|
|
|
|
|
i + 1, usages.size());
|
|
|
|
@ -381,6 +390,9 @@ void ShaderCacheOpenGL::LoadDiskCache() {
|
|
|
|
|
usage.bindings, usage.primitive, true);
|
|
|
|
|
}
|
|
|
|
|
precompiled_programs.insert({usage, std::move(shader)});
|
|
|
|
|
|
|
|
|
|
if (callback)
|
|
|
|
|
callback(VideoCore::LoadCallbackStage::Build, i + 1, usages.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(Rodrigo): Do state tracking for transferable shaders and do a dummy draw before
|
|
|
|
@ -420,11 +432,19 @@ CachedProgram ShaderCacheOpenGL::GeneratePrecompiledProgram(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecializedShaders(
|
|
|
|
|
const std::atomic_bool& stop_loading, const VideoCore::DiskResourceLoadCallback& callback,
|
|
|
|
|
const std::vector<ShaderDiskCacheRaw>& raws,
|
|
|
|
|
const std::map<u64, ShaderDiskCacheDecompiled>& decompiled) {
|
|
|
|
|
std::map<u64, UnspecializedShader> unspecialized;
|
|
|
|
|
|
|
|
|
|
for (const auto& raw : raws) {
|
|
|
|
|
if (callback)
|
|
|
|
|
callback(VideoCore::LoadCallbackStage::Decompile, 0, raws.size());
|
|
|
|
|
|
|
|
|
|
for (std::size_t i = 0; i < raws.size(); ++i) {
|
|
|
|
|
if (stop_loading)
|
|
|
|
|
return {};
|
|
|
|
|
|
|
|
|
|
const auto& raw{raws[i]};
|
|
|
|
|
const u64 unique_identifier = raw.GetUniqueIdentifier();
|
|
|
|
|
const u64 calculated_hash =
|
|
|
|
|
GetUniqueIdentifier(raw.GetProgramType(), raw.GetProgramCode(), raw.GetProgramCodeB());
|
|
|
|
@ -454,6 +474,9 @@ std::map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecializedShade
|
|
|
|
|
unspecialized.insert(
|
|
|
|
|
{raw.GetUniqueIdentifier(),
|
|
|
|
|
{std::move(result.first), std::move(result.second), raw.GetProgramType()}});
|
|
|
|
|
|
|
|
|
|
if (callback)
|
|
|
|
|
callback(VideoCore::LoadCallbackStage::Decompile, i, raws.size());
|
|
|
|
|
}
|
|
|
|
|
return unspecialized;
|
|
|
|
|
}
|
|
|
|
|