diff options
| author | 2019-01-21 16:38:23 -0300 | |
|---|---|---|
| committer | 2019-02-06 22:23:40 -0300 | |
| commit | eb7324743372d3b94db9a915a5508d8293d45ecb (patch) | |
| tree | 085261558efeb2b47ce5316b52314980005b3e5c /src/video_core | |
| parent | gl_shader_cache: Set GL_PROGRAM_SEPARABLE to dumped shaders (diff) | |
| download | yuzu-eb7324743372d3b94db9a915a5508d8293d45ecb.tar.gz yuzu-eb7324743372d3b94db9a915a5508d8293d45ecb.tar.xz yuzu-eb7324743372d3b94db9a915a5508d8293d45ecb.zip | |
gl_shader_cache: Link loading screen with disk shader cache load
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/rasterizer_interface.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 29 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.h | 5 |
5 files changed, 40 insertions, 9 deletions
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index bb4bc0e36..77da135a0 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <atomic> | ||
| 7 | #include <functional> | 8 | #include <functional> |
| 8 | #include "common/common_types.h" | 9 | #include "common/common_types.h" |
| 9 | #include "video_core/engines/fermi_2d.h" | 10 | #include "video_core/engines/fermi_2d.h" |
| @@ -63,6 +64,7 @@ public: | |||
| 63 | virtual void UpdatePagesCachedCount(Tegra::GPUVAddr addr, u64 size, int delta) {} | 64 | virtual void UpdatePagesCachedCount(Tegra::GPUVAddr addr, u64 size, int delta) {} |
| 64 | 65 | ||
| 65 | /// Initialize disk cached resources for the game being emulated | 66 | /// Initialize disk cached resources for the game being emulated |
| 66 | virtual void LoadDiskResources() {} | 67 | virtual void LoadDiskResources(const std::atomic_bool& stop_loading = false, |
| 68 | const DiskResourceLoadCallback& callback = {}) {} | ||
| 67 | }; | 69 | }; |
| 68 | } // namespace VideoCore | 70 | } // namespace VideoCore |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 94a5058de..974ca6a20 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -449,7 +449,7 @@ static constexpr auto RangeFromInterval(Map& map, const Interval& interval) { | |||
| 449 | return boost::make_iterator_range(map.equal_range(interval)); | 449 | return boost::make_iterator_range(map.equal_range(interval)); |
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | void RasterizerOpenGL::UpdatePagesCachedCount(VAddr addr, u64 size, int delta) { | 452 | void RasterizerOpenGL::UpdatePagesCachedCount(Tegra::GPUVAddr addr, u64 size, int delta) { |
| 453 | const u64 page_start{addr >> Memory::PAGE_BITS}; | 453 | const u64 page_start{addr >> Memory::PAGE_BITS}; |
| 454 | const u64 page_end{(addr + size + Memory::PAGE_SIZE - 1) >> Memory::PAGE_BITS}; | 454 | const u64 page_end{(addr + size + Memory::PAGE_SIZE - 1) >> Memory::PAGE_BITS}; |
| 455 | 455 | ||
| @@ -479,8 +479,9 @@ void RasterizerOpenGL::UpdatePagesCachedCount(VAddr addr, u64 size, int delta) { | |||
| 479 | cached_pages.add({pages_interval, delta}); | 479 | cached_pages.add({pages_interval, delta}); |
| 480 | } | 480 | } |
| 481 | 481 | ||
| 482 | void RasterizerOpenGL::LoadDiskResources() { | 482 | void RasterizerOpenGL::LoadDiskResources(const std::atomic_bool& stop_loading, |
| 483 | shader_cache.LoadDiskCache(); | 483 | const VideoCore::DiskResourceLoadCallback& callback) { |
| 484 | shader_cache.LoadDiskCache(stop_loading, callback); | ||
| 484 | } | 485 | } |
| 485 | 486 | ||
| 486 | std::pair<bool, bool> RasterizerOpenGL::ConfigureFramebuffers( | 487 | std::pair<bool, bool> RasterizerOpenGL::ConfigureFramebuffers( |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index ebabf80d1..f3b607f4d 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <atomic> | ||
| 8 | #include <cstddef> | 9 | #include <cstddef> |
| 9 | #include <map> | 10 | #include <map> |
| 10 | #include <memory> | 11 | #include <memory> |
| @@ -65,7 +66,8 @@ public: | |||
| 65 | u32 pixel_stride) override; | 66 | u32 pixel_stride) override; |
| 66 | bool AccelerateDrawBatch(bool is_indexed) override; | 67 | bool AccelerateDrawBatch(bool is_indexed) override; |
| 67 | void UpdatePagesCachedCount(Tegra::GPUVAddr addr, u64 size, int delta) override; | 68 | void UpdatePagesCachedCount(Tegra::GPUVAddr addr, u64 size, int delta) override; |
| 68 | void LoadDiskResources() override; | 69 | void LoadDiskResources(const std::atomic_bool& stop_loading, |
| 70 | const VideoCore::DiskResourceLoadCallback& callback) override; | ||
| 69 | 71 | ||
| 70 | /// Maximum supported size that a constbuffer can have in bytes. | 72 | /// Maximum supported size that a constbuffer can have in bytes. |
| 71 | static constexpr std::size_t MaxConstbufferSize = 0x10000; | 73 | static constexpr std::size_t MaxConstbufferSize = 0x10000; |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 7eeae082a..e0e624e6f 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -345,7 +345,8 @@ ShaderDiskCacheUsage CachedShader::GetUsage(GLenum primitive_mode, | |||
| 345 | ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system) | 345 | ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system) |
| 346 | : RasterizerCache{rasterizer}, disk_cache{system} {} | 346 | : RasterizerCache{rasterizer}, disk_cache{system} {} |
| 347 | 347 | ||
| 348 | void ShaderCacheOpenGL::LoadDiskCache() { | 348 | void ShaderCacheOpenGL::LoadDiskCache(const std::atomic_bool& stop_loading, |
| 349 | const VideoCore::DiskResourceLoadCallback& callback) { | ||
| 349 | const auto transferable = disk_cache.LoadTransferable(); | 350 | const auto transferable = disk_cache.LoadTransferable(); |
| 350 | if (!transferable) { | 351 | if (!transferable) { |
| 351 | return; | 352 | return; |
| @@ -355,10 +356,18 @@ void ShaderCacheOpenGL::LoadDiskCache() { | |||
| 355 | auto [decompiled, dumps] = disk_cache.LoadPrecompiled(); | 356 | auto [decompiled, dumps] = disk_cache.LoadPrecompiled(); |
| 356 | 357 | ||
| 357 | const auto supported_formats{GetSupportedFormats()}; | 358 | const auto supported_formats{GetSupportedFormats()}; |
| 358 | const auto unspecialized{GenerateUnspecializedShaders(raws, decompiled)}; | 359 | const auto unspecialized{ |
| 360 | GenerateUnspecializedShaders(stop_loading, callback, raws, decompiled)}; | ||
| 361 | if (stop_loading) | ||
| 362 | return; | ||
| 359 | 363 | ||
| 360 | // Build shaders | 364 | // Build shaders |
| 365 | if (callback) | ||
| 366 | callback(VideoCore::LoadCallbackStage::Build, 0, usages.size()); | ||
| 361 | for (std::size_t i = 0; i < usages.size(); ++i) { | 367 | for (std::size_t i = 0; i < usages.size(); ++i) { |
| 368 | if (stop_loading) | ||
| 369 | return; | ||
| 370 | |||
| 362 | const auto& usage{usages[i]}; | 371 | const auto& usage{usages[i]}; |
| 363 | LOG_INFO(Render_OpenGL, "Building shader {:016x} ({} of {})", usage.unique_identifier, | 372 | LOG_INFO(Render_OpenGL, "Building shader {:016x} ({} of {})", usage.unique_identifier, |
| 364 | i + 1, usages.size()); | 373 | i + 1, usages.size()); |
| @@ -381,6 +390,9 @@ void ShaderCacheOpenGL::LoadDiskCache() { | |||
| 381 | usage.bindings, usage.primitive, true); | 390 | usage.bindings, usage.primitive, true); |
| 382 | } | 391 | } |
| 383 | precompiled_programs.insert({usage, std::move(shader)}); | 392 | precompiled_programs.insert({usage, std::move(shader)}); |
| 393 | |||
| 394 | if (callback) | ||
| 395 | callback(VideoCore::LoadCallbackStage::Build, i + 1, usages.size()); | ||
| 384 | } | 396 | } |
| 385 | 397 | ||
| 386 | // TODO(Rodrigo): Do state tracking for transferable shaders and do a dummy draw before | 398 | // TODO(Rodrigo): Do state tracking for transferable shaders and do a dummy draw before |
| @@ -420,11 +432,19 @@ CachedProgram ShaderCacheOpenGL::GeneratePrecompiledProgram( | |||
| 420 | } | 432 | } |
| 421 | 433 | ||
| 422 | std::map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecializedShaders( | 434 | std::map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecializedShaders( |
| 435 | const std::atomic_bool& stop_loading, const VideoCore::DiskResourceLoadCallback& callback, | ||
| 423 | const std::vector<ShaderDiskCacheRaw>& raws, | 436 | const std::vector<ShaderDiskCacheRaw>& raws, |
| 424 | const std::map<u64, ShaderDiskCacheDecompiled>& decompiled) { | 437 | const std::map<u64, ShaderDiskCacheDecompiled>& decompiled) { |
| 425 | std::map<u64, UnspecializedShader> unspecialized; | 438 | std::map<u64, UnspecializedShader> unspecialized; |
| 426 | 439 | ||
| 427 | for (const auto& raw : raws) { | 440 | if (callback) |
| 441 | callback(VideoCore::LoadCallbackStage::Decompile, 0, raws.size()); | ||
| 442 | |||
| 443 | for (std::size_t i = 0; i < raws.size(); ++i) { | ||
| 444 | if (stop_loading) | ||
| 445 | return {}; | ||
| 446 | |||
| 447 | const auto& raw{raws[i]}; | ||
| 428 | const u64 unique_identifier = raw.GetUniqueIdentifier(); | 448 | const u64 unique_identifier = raw.GetUniqueIdentifier(); |
| 429 | const u64 calculated_hash = | 449 | const u64 calculated_hash = |
| 430 | GetUniqueIdentifier(raw.GetProgramType(), raw.GetProgramCode(), raw.GetProgramCodeB()); | 450 | GetUniqueIdentifier(raw.GetProgramType(), raw.GetProgramCode(), raw.GetProgramCodeB()); |
| @@ -454,6 +474,9 @@ std::map<u64, UnspecializedShader> ShaderCacheOpenGL::GenerateUnspecializedShade | |||
| 454 | unspecialized.insert( | 474 | unspecialized.insert( |
| 455 | {raw.GetUniqueIdentifier(), | 475 | {raw.GetUniqueIdentifier(), |
| 456 | {std::move(result.first), std::move(result.second), raw.GetProgramType()}}); | 476 | {std::move(result.first), std::move(result.second), raw.GetProgramType()}}); |
| 477 | |||
| 478 | if (callback) | ||
| 479 | callback(VideoCore::LoadCallbackStage::Decompile, i, raws.size()); | ||
| 457 | } | 480 | } |
| 458 | return unspecialized; | 481 | return unspecialized; |
| 459 | } | 482 | } |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index 6914127c3..9c6b19fc3 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include "common/assert.h" | 15 | #include "common/assert.h" |
| 16 | #include "common/common_types.h" | 16 | #include "common/common_types.h" |
| 17 | #include "video_core/rasterizer_cache.h" | 17 | #include "video_core/rasterizer_cache.h" |
| 18 | #include "video_core/renderer_base.h" | ||
| 18 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 19 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 19 | #include "video_core/renderer_opengl/gl_shader_decompiler.h" | 20 | #include "video_core/renderer_opengl/gl_shader_decompiler.h" |
| 20 | #include "video_core/renderer_opengl/gl_shader_disk_cache.h" | 21 | #include "video_core/renderer_opengl/gl_shader_disk_cache.h" |
| @@ -114,13 +115,15 @@ public: | |||
| 114 | explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system); | 115 | explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system); |
| 115 | 116 | ||
| 116 | /// Loads disk cache for the current game | 117 | /// Loads disk cache for the current game |
| 117 | void LoadDiskCache(); | 118 | void LoadDiskCache(const std::atomic_bool& stop_loading, |
| 119 | const VideoCore::DiskResourceLoadCallback& callback); | ||
| 118 | 120 | ||
| 119 | /// Gets the current specified shader stage program | 121 | /// Gets the current specified shader stage program |
| 120 | Shader GetStageProgram(Maxwell::ShaderProgram program); | 122 | Shader GetStageProgram(Maxwell::ShaderProgram program); |
| 121 | 123 | ||
| 122 | private: | 124 | private: |
| 123 | std::map<u64, UnspecializedShader> GenerateUnspecializedShaders( | 125 | std::map<u64, UnspecializedShader> GenerateUnspecializedShaders( |
| 126 | const std::atomic_bool& stop_loading, const VideoCore::DiskResourceLoadCallback& callback, | ||
| 124 | const std::vector<ShaderDiskCacheRaw>& raws, | 127 | const std::vector<ShaderDiskCacheRaw>& raws, |
| 125 | const std::map<u64, ShaderDiskCacheDecompiled>& decompiled); | 128 | const std::map<u64, ShaderDiskCacheDecompiled>& decompiled); |
| 126 | 129 | ||