summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-01-03 18:15:24 -0400
committerGravatar FernandoS272020-01-24 16:43:29 -0400
commit1e4b6bef6f1b278bdc99170b76f33179a2eff26f (patch)
tree1f61df883d015efc725638d811c76ea82723861d /src
parentGPU: Implement guest driver profile and deduce texture handler sizes. (diff)
downloadyuzu-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.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.cpp12
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.h1
-rw-r--r--src/video_core/shader/const_buffer_locker.cpp17
-rw-r--r--src/video_core/shader/const_buffer_locker.h12
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
216void FillLocker(ConstBufferLocker& locker, const ShaderDiskCacheUsage& usage) { 216void 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
419ShaderDiskCacheUsage CachedShader::GetUsage(const ProgramVariant& variant, 420ShaderDiskCacheUsage 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
56constexpr u32 NativeVersion = 11; 56constexpr u32 NativeVersion = 12;
57 57
58// Making sure sizes doesn't change by accident 58// Making sure sizes doesn't change by accident
59static_assert(sizeof(ProgramVariant) == 20); 59static_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>);
79struct ShaderDiskCacheUsage { 79struct 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
69std::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
69void ConstBufferLocker::InsertKey(u32 buffer, u32 offset, u32 value) { 81void 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
93void ConstBufferLocker::SetBoundBuffer(u32 buffer) {
94 bound_buffer_saved = true;
95 bound_buffer = buffer;
96}
97
81bool ConstBufferLocker::IsConsistent() const { 98bool 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