diff options
Diffstat (limited to 'src/video_core/shader/decode.cpp')
| -rw-r--r-- | src/video_core/shader/decode.cpp | 36 |
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 | ||
| 59 | std::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 | ||
| 61 | class ASTDecoder { | 84 | class 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 |