summaryrefslogtreecommitdiff
path: root/src/video_core/shader/decode.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-01-05 18:36:21 -0400
committerGravatar FernandoS272020-01-24 16:43:31 -0400
commit037ea431ceb93e93274fdcf9fb724819639d04fd (patch)
tree7357dac5799959d2dc7dbe78346cb8cbd1a5400b /src/video_core/shader/decode.cpp
parentShader_IR: Setup Indexed Samplers on the IR (diff)
downloadyuzu-037ea431ceb93e93274fdcf9fb724819639d04fd.tar.gz
yuzu-037ea431ceb93e93274fdcf9fb724819639d04fd.tar.xz
yuzu-037ea431ceb93e93274fdcf9fb724819639d04fd.zip
Shader_IR: deduce size of indexed samplers
Diffstat (limited to 'src/video_core/shader/decode.cpp')
-rw-r--r--src/video_core/shader/decode.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp
index 507614d59..dd2f68a3e 100644
--- a/src/video_core/shader/decode.cpp
+++ b/src/video_core/shader/decode.cpp
@@ -56,6 +56,29 @@ void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver,
56 } 56 }
57} 57}
58 58
59std::optional<u32> TryDeduceSamplerSize(Sampler& sampler_to_deduce,
60 VideoCore::GuestDriverProfile* gpu_driver,
61 std::list<Sampler>& used_samplers) {
62 if (gpu_driver == nullptr) {
63 LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet");
64 return std::nullopt;
65 }
66 const u32 base_offset = sampler_to_deduce.GetOffset();
67 u32 max_offset{UINT_MAX};
68 for (const auto& sampler : used_samplers) {
69 if (sampler.IsBindless()) {
70 continue;
71 }
72 if (sampler.GetOffset() > base_offset) {
73 max_offset = std::min(sampler.GetOffset(), max_offset);
74 }
75 }
76 if (max_offset == UINT_MAX) {
77 return std::nullopt;
78 }
79 return ((max_offset - base_offset) * 4) / gpu_driver->GetTextureHandlerSize();
80}
81
59} // Anonymous namespace 82} // Anonymous namespace
60 83
61class ASTDecoder { 84class ASTDecoder {
@@ -342,6 +365,19 @@ void ShaderIR::PostDecode() {
342 // Deduce texture handler size if needed 365 // Deduce texture handler size if needed
343 auto gpu_driver = locker.AccessGuestDriverProfile(); 366 auto gpu_driver = locker.AccessGuestDriverProfile();
344 DeduceTextureHandlerSize(gpu_driver, used_samplers); 367 DeduceTextureHandlerSize(gpu_driver, used_samplers);
368 // Deduce Indexed Samplers
369 if (uses_indexed_samplers) {
370 for (auto& sampler : used_samplers) {
371 if (sampler.IsIndexed()) {
372 auto size = TryDeduceSamplerSize(sampler, gpu_driver, used_samplers);
373 if (size) {
374 sampler.SetSize(*size);
375 } else {
376 sampler.SetSize(1);
377 }
378 }
379 }
380 }
345} 381}
346 382
347} // namespace VideoCommon::Shader 383} // namespace VideoCommon::Shader