diff options
| author | 2020-01-03 18:15:24 -0400 | |
|---|---|---|
| committer | 2020-01-24 16:43:29 -0400 | |
| commit | 1e4b6bef6f1b278bdc99170b76f33179a2eff26f (patch) | |
| tree | 1f61df883d015efc725638d811c76ea82723861d /src | |
| parent | GPU: Implement guest driver profile and deduce texture handler sizes. (diff) | |
| download | yuzu-1e4b6bef6f1b278bdc99170b76f33179a2eff26f.tar.gz yuzu-1e4b6bef6f1b278bdc99170b76f33179a2eff26f.tar.xz yuzu-1e4b6bef6f1b278bdc99170b76f33179a2eff26f.zip | |
Shader_IR: Store Bound buffer on Shader Usage
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | 12 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.h | 1 | ||||
| -rw-r--r-- | src/video_core/shader/const_buffer_locker.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/shader/const_buffer_locker.h | 12 |
5 files changed, 41 insertions, 5 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 3c5bdd377..489eb143c 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -214,6 +214,7 @@ std::unique_ptr<ConstBufferLocker> MakeLocker(Core::System& system, ShaderType s | |||
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | void FillLocker(ConstBufferLocker& locker, const ShaderDiskCacheUsage& usage) { | 216 | void FillLocker(ConstBufferLocker& locker, const ShaderDiskCacheUsage& usage) { |
| 217 | locker.SetBoundBuffer(usage.bound_buffer); | ||
| 217 | for (const auto& key : usage.keys) { | 218 | for (const auto& key : usage.keys) { |
| 218 | const auto [buffer, offset] = key.first; | 219 | const auto [buffer, offset] = key.first; |
| 219 | locker.InsertKey(buffer, offset, key.second); | 220 | locker.InsertKey(buffer, offset, key.second); |
| @@ -418,7 +419,8 @@ bool CachedShader::EnsureValidLockerVariant() { | |||
| 418 | 419 | ||
| 419 | ShaderDiskCacheUsage CachedShader::GetUsage(const ProgramVariant& variant, | 420 | ShaderDiskCacheUsage CachedShader::GetUsage(const ProgramVariant& variant, |
| 420 | const ConstBufferLocker& locker) const { | 421 | const ConstBufferLocker& locker) const { |
| 421 | return ShaderDiskCacheUsage{unique_identifier, variant, locker.GetKeys(), | 422 | return ShaderDiskCacheUsage{unique_identifier, variant, |
| 423 | locker.GetBoundBuffer(), locker.GetKeys(), | ||
| 422 | locker.GetBoundSamplers(), locker.GetBindlessSamplers()}; | 424 | locker.GetBoundSamplers(), locker.GetBindlessSamplers()}; |
| 423 | } | 425 | } |
| 424 | 426 | ||
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp index cf874a09a..1fc204f6f 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | |||
| @@ -53,7 +53,7 @@ struct BindlessSamplerKey { | |||
| 53 | Tegra::Engines::SamplerDescriptor sampler{}; | 53 | Tegra::Engines::SamplerDescriptor sampler{}; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | constexpr u32 NativeVersion = 11; | 56 | constexpr u32 NativeVersion = 12; |
| 57 | 57 | ||
| 58 | // Making sure sizes doesn't change by accident | 58 | // Making sure sizes doesn't change by accident |
| 59 | static_assert(sizeof(ProgramVariant) == 20); | 59 | static_assert(sizeof(ProgramVariant) == 20); |
| @@ -186,7 +186,8 @@ ShaderDiskCacheOpenGL::LoadTransferable() { | |||
| 186 | u32 num_bound_samplers{}; | 186 | u32 num_bound_samplers{}; |
| 187 | u32 num_bindless_samplers{}; | 187 | u32 num_bindless_samplers{}; |
| 188 | if (file.ReadArray(&usage.unique_identifier, 1) != 1 || | 188 | if (file.ReadArray(&usage.unique_identifier, 1) != 1 || |
| 189 | file.ReadArray(&usage.variant, 1) != 1 || file.ReadArray(&num_keys, 1) != 1 || | 189 | file.ReadArray(&usage.variant, 1) != 1 || |
| 190 | file.ReadArray(&usage.bound_buffer, 1) != 1 || file.ReadArray(&num_keys, 1) != 1 || | ||
| 190 | file.ReadArray(&num_bound_samplers, 1) != 1 || | 191 | file.ReadArray(&num_bound_samplers, 1) != 1 || |
| 191 | file.ReadArray(&num_bindless_samplers, 1) != 1) { | 192 | file.ReadArray(&num_bindless_samplers, 1) != 1) { |
| 192 | LOG_ERROR(Render_OpenGL, error_loading); | 193 | LOG_ERROR(Render_OpenGL, error_loading); |
| @@ -281,7 +282,9 @@ ShaderDiskCacheOpenGL::LoadPrecompiledFile(FileUtil::IOFile& file) { | |||
| 281 | u32 num_bindless_samplers{}; | 282 | u32 num_bindless_samplers{}; |
| 282 | ShaderDiskCacheUsage usage; | 283 | ShaderDiskCacheUsage usage; |
| 283 | if (!LoadObjectFromPrecompiled(usage.unique_identifier) || | 284 | if (!LoadObjectFromPrecompiled(usage.unique_identifier) || |
| 284 | !LoadObjectFromPrecompiled(usage.variant) || !LoadObjectFromPrecompiled(num_keys) || | 285 | !LoadObjectFromPrecompiled(usage.variant) || |
| 286 | !LoadObjectFromPrecompiled(usage.bound_buffer) || | ||
| 287 | !LoadObjectFromPrecompiled(num_keys) || | ||
| 285 | !LoadObjectFromPrecompiled(num_bound_samplers) || | 288 | !LoadObjectFromPrecompiled(num_bound_samplers) || |
| 286 | !LoadObjectFromPrecompiled(num_bindless_samplers)) { | 289 | !LoadObjectFromPrecompiled(num_bindless_samplers)) { |
| 287 | return {}; | 290 | return {}; |
| @@ -393,6 +396,7 @@ void ShaderDiskCacheOpenGL::SaveUsage(const ShaderDiskCacheUsage& usage) { | |||
| 393 | 396 | ||
| 394 | if (file.WriteObject(TransferableEntryKind::Usage) != 1 || | 397 | if (file.WriteObject(TransferableEntryKind::Usage) != 1 || |
| 395 | file.WriteObject(usage.unique_identifier) != 1 || file.WriteObject(usage.variant) != 1 || | 398 | file.WriteObject(usage.unique_identifier) != 1 || file.WriteObject(usage.variant) != 1 || |
| 399 | file.WriteObject(usage.bound_buffer) != 1 || | ||
| 396 | file.WriteObject(static_cast<u32>(usage.keys.size())) != 1 || | 400 | file.WriteObject(static_cast<u32>(usage.keys.size())) != 1 || |
| 397 | file.WriteObject(static_cast<u32>(usage.bound_samplers.size())) != 1 || | 401 | file.WriteObject(static_cast<u32>(usage.bound_samplers.size())) != 1 || |
| 398 | file.WriteObject(static_cast<u32>(usage.bindless_samplers.size())) != 1) { | 402 | file.WriteObject(static_cast<u32>(usage.bindless_samplers.size())) != 1) { |
| @@ -447,7 +451,7 @@ void ShaderDiskCacheOpenGL::SaveDump(const ShaderDiskCacheUsage& usage, GLuint p | |||
| 447 | }; | 451 | }; |
| 448 | 452 | ||
| 449 | if (!SaveObjectToPrecompiled(usage.unique_identifier) || | 453 | if (!SaveObjectToPrecompiled(usage.unique_identifier) || |
| 450 | !SaveObjectToPrecompiled(usage.variant) || | 454 | !SaveObjectToPrecompiled(usage.variant) || !SaveObjectToPrecompiled(usage.bound_buffer) || |
| 451 | !SaveObjectToPrecompiled(static_cast<u32>(usage.keys.size())) || | 455 | !SaveObjectToPrecompiled(static_cast<u32>(usage.keys.size())) || |
| 452 | !SaveObjectToPrecompiled(static_cast<u32>(usage.bound_samplers.size())) || | 456 | !SaveObjectToPrecompiled(static_cast<u32>(usage.bound_samplers.size())) || |
| 453 | !SaveObjectToPrecompiled(static_cast<u32>(usage.bindless_samplers.size()))) { | 457 | !SaveObjectToPrecompiled(static_cast<u32>(usage.bindless_samplers.size()))) { |
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.h b/src/video_core/renderer_opengl/gl_shader_disk_cache.h index 69a2fbdda..ef2371f6d 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h | |||
| @@ -79,6 +79,7 @@ static_assert(std::is_trivially_copyable_v<ProgramVariant>); | |||
| 79 | struct ShaderDiskCacheUsage { | 79 | struct ShaderDiskCacheUsage { |
| 80 | u64 unique_identifier{}; | 80 | u64 unique_identifier{}; |
| 81 | ProgramVariant variant; | 81 | ProgramVariant variant; |
| 82 | u32 bound_buffer{}; | ||
| 82 | VideoCommon::Shader::KeyMap keys; | 83 | VideoCommon::Shader::KeyMap keys; |
| 83 | VideoCommon::Shader::BoundSamplerMap bound_samplers; | 84 | VideoCommon::Shader::BoundSamplerMap bound_samplers; |
| 84 | VideoCommon::Shader::BindlessSamplerMap bindless_samplers; | 85 | VideoCommon::Shader::BindlessSamplerMap bindless_samplers; |
diff --git a/src/video_core/shader/const_buffer_locker.cpp b/src/video_core/shader/const_buffer_locker.cpp index a4a0319eb..0638be8cb 100644 --- a/src/video_core/shader/const_buffer_locker.cpp +++ b/src/video_core/shader/const_buffer_locker.cpp | |||
| @@ -66,6 +66,18 @@ std::optional<Tegra::Engines::SamplerDescriptor> ConstBufferLocker::ObtainBindle | |||
| 66 | return value; | 66 | return value; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | std::optional<u32> ConstBufferLocker::ObtainBoundBuffer() { | ||
| 70 | if (bound_buffer_saved) { | ||
| 71 | return bound_buffer; | ||
| 72 | } | ||
| 73 | if (!engine) { | ||
| 74 | return std::nullopt; | ||
| 75 | } | ||
| 76 | bound_buffer_saved = true; | ||
| 77 | bound_buffer = engine->GetBoundBuffer(); | ||
| 78 | return bound_buffer; | ||
| 79 | } | ||
| 80 | |||
| 69 | void ConstBufferLocker::InsertKey(u32 buffer, u32 offset, u32 value) { | 81 | void ConstBufferLocker::InsertKey(u32 buffer, u32 offset, u32 value) { |
| 70 | keys.insert_or_assign({buffer, offset}, value); | 82 | keys.insert_or_assign({buffer, offset}, value); |
| 71 | } | 83 | } |
| @@ -78,6 +90,11 @@ void ConstBufferLocker::InsertBindlessSampler(u32 buffer, u32 offset, SamplerDes | |||
| 78 | bindless_samplers.insert_or_assign({buffer, offset}, sampler); | 90 | bindless_samplers.insert_or_assign({buffer, offset}, sampler); |
| 79 | } | 91 | } |
| 80 | 92 | ||
| 93 | void ConstBufferLocker::SetBoundBuffer(u32 buffer) { | ||
| 94 | bound_buffer_saved = true; | ||
| 95 | bound_buffer = buffer; | ||
| 96 | } | ||
| 97 | |||
| 81 | bool ConstBufferLocker::IsConsistent() const { | 98 | bool ConstBufferLocker::IsConsistent() const { |
| 82 | if (!engine) { | 99 | if (!engine) { |
| 83 | return false; | 100 | return false; |
diff --git a/src/video_core/shader/const_buffer_locker.h b/src/video_core/shader/const_buffer_locker.h index 78d9d7037..f26cce2ce 100644 --- a/src/video_core/shader/const_buffer_locker.h +++ b/src/video_core/shader/const_buffer_locker.h | |||
| @@ -41,6 +41,8 @@ public: | |||
| 41 | 41 | ||
| 42 | std::optional<Tegra::Engines::SamplerDescriptor> ObtainBindlessSampler(u32 buffer, u32 offset); | 42 | std::optional<Tegra::Engines::SamplerDescriptor> ObtainBindlessSampler(u32 buffer, u32 offset); |
| 43 | 43 | ||
| 44 | std::optional<u32> ObtainBoundBuffer(); | ||
| 45 | |||
| 44 | /// Inserts a key. | 46 | /// Inserts a key. |
| 45 | void InsertKey(u32 buffer, u32 offset, u32 value); | 47 | void InsertKey(u32 buffer, u32 offset, u32 value); |
| 46 | 48 | ||
| @@ -50,6 +52,10 @@ public: | |||
| 50 | /// Inserts a bindless sampler key. | 52 | /// Inserts a bindless sampler key. |
| 51 | void InsertBindlessSampler(u32 buffer, u32 offset, Tegra::Engines::SamplerDescriptor sampler); | 53 | void InsertBindlessSampler(u32 buffer, u32 offset, Tegra::Engines::SamplerDescriptor sampler); |
| 52 | 54 | ||
| 55 | /// Set the bound buffer for this locker. | ||
| 56 | |||
| 57 | void SetBoundBuffer(u32 buffer); | ||
| 58 | |||
| 53 | /// Checks keys and samplers against engine's current const buffers. Returns true if they are | 59 | /// Checks keys and samplers against engine's current const buffers. Returns true if they are |
| 54 | /// the same value, false otherwise; | 60 | /// the same value, false otherwise; |
| 55 | bool IsConsistent() const; | 61 | bool IsConsistent() const; |
| @@ -72,6 +78,10 @@ public: | |||
| 72 | return bindless_samplers; | 78 | return bindless_samplers; |
| 73 | } | 79 | } |
| 74 | 80 | ||
| 81 | u32 GetBoundBuffer() const { | ||
| 82 | return bound_buffer; | ||
| 83 | } | ||
| 84 | |||
| 75 | VideoCore::GuestDriverProfile* AccessGuestDriverProfile() { | 85 | VideoCore::GuestDriverProfile* AccessGuestDriverProfile() { |
| 76 | if (engine) { | 86 | if (engine) { |
| 77 | return &(engine->AccessGuestDriverProfile()); | 87 | return &(engine->AccessGuestDriverProfile()); |
| @@ -85,6 +95,8 @@ private: | |||
| 85 | KeyMap keys; | 95 | KeyMap keys; |
| 86 | BoundSamplerMap bound_samplers; | 96 | BoundSamplerMap bound_samplers; |
| 87 | BindlessSamplerMap bindless_samplers; | 97 | BindlessSamplerMap bindless_samplers; |
| 98 | bool bound_buffer_saved{}; | ||
| 99 | u32 bound_buffer{}; | ||
| 88 | }; | 100 | }; |
| 89 | 101 | ||
| 90 | } // namespace VideoCommon::Shader | 102 | } // namespace VideoCommon::Shader |