From c921e496eb47de49a4d6ce62527581b966dca259 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Fri, 3 Jan 2020 16:16:29 -0400 Subject: GPU: Implement guest driver profile and deduce texture handler sizes. --- src/video_core/shader/decode.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/video_core/shader/decode.cpp') diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index 22c3e5120..aed35a9b8 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp @@ -315,4 +315,25 @@ u32 ShaderIR::DecodeInstr(NodeBlock& bb, u32 pc) { return pc + 1; } +void ShaderIR::PostDecode() { + // Deduce texture handler size if needed + auto* gpu_driver = locker.AccessGuestDriverProfile(); + if (gpu_driver) { + if (!gpu_driver->TextureHandlerSizeKnown() && used_samplers.size() > 1) { + u32 count{}; + std::vector bound_offsets; + for (const auto& sampler : used_samplers) { + if (sampler.IsBindless()) { + continue; + } + count++; + bound_offsets.emplace_back(sampler.GetOffset()); + } + if (count > 1) { + gpu_driver->DeduceTextureHandlerSize(std::move(bound_offsets)); + } + } + } +} + } // namespace VideoCommon::Shader -- cgit v1.2.3 From dc5cfa8d287757dede737553b6f1f8521971c6e2 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sun, 5 Jan 2020 12:08:39 -0400 Subject: Shader_IR: Address Feedback --- src/video_core/shader/decode.cpp | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) (limited to 'src/video_core/shader/decode.cpp') diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index aed35a9b8..c702c7629 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp @@ -315,25 +315,33 @@ u32 ShaderIR::DecodeInstr(NodeBlock& bb, u32 pc) { return pc + 1; } +void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, + std::list& used_samplers) { + if (gpu_driver == nullptr) { + LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); + return; + } + if (gpu_driver->TextureHandlerSizeKnown() || used_samplers.size() <= 1) { + return; + } + u32 count{}; + std::vector bound_offsets; + for (const auto& sampler : used_samplers) { + if (sampler.IsBindless()) { + continue; + } + count++; + bound_offsets.emplace_back(sampler.GetOffset()); + } + if (count > 1) { + gpu_driver->DeduceTextureHandlerSize(std::move(bound_offsets)); + } +} + void ShaderIR::PostDecode() { // Deduce texture handler size if needed auto* gpu_driver = locker.AccessGuestDriverProfile(); - if (gpu_driver) { - if (!gpu_driver->TextureHandlerSizeKnown() && used_samplers.size() > 1) { - u32 count{}; - std::vector bound_offsets; - for (const auto& sampler : used_samplers) { - if (sampler.IsBindless()) { - continue; - } - count++; - bound_offsets.emplace_back(sampler.GetOffset()); - } - if (count > 1) { - gpu_driver->DeduceTextureHandlerSize(std::move(bound_offsets)); - } - } - } + DeduceTextureHandlerSize(gpu_driver, used_samplers); } } // namespace VideoCommon::Shader -- cgit v1.2.3 From 64496f24569ecc23ebbb816725f27142867b1468 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Wed, 8 Jan 2020 11:46:36 -0400 Subject: Shader_IR: Address Feedback --- src/video_core/shader/decode.cpp | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'src/video_core/shader/decode.cpp') diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index c702c7629..507614d59 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp @@ -33,6 +33,29 @@ constexpr bool IsSchedInstruction(u32 offset, u32 main_offset) { return (absolute_offset % SchedPeriod) == 0; } +void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, + std::list& used_samplers) { + if (gpu_driver == nullptr) { + LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); + return; + } + if (gpu_driver->TextureHandlerSizeKnown() || used_samplers.size() <= 1) { + return; + } + u32 count{}; + std::vector bound_offsets; + for (const auto& sampler : used_samplers) { + if (sampler.IsBindless()) { + continue; + } + ++count; + bound_offsets.emplace_back(sampler.GetOffset()); + } + if (count > 1) { + gpu_driver->DeduceTextureHandlerSize(std::move(bound_offsets)); + } +} + } // Anonymous namespace class ASTDecoder { @@ -315,32 +338,9 @@ u32 ShaderIR::DecodeInstr(NodeBlock& bb, u32 pc) { return pc + 1; } -void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, - std::list& used_samplers) { - if (gpu_driver == nullptr) { - LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); - return; - } - if (gpu_driver->TextureHandlerSizeKnown() || used_samplers.size() <= 1) { - return; - } - u32 count{}; - std::vector bound_offsets; - for (const auto& sampler : used_samplers) { - if (sampler.IsBindless()) { - continue; - } - count++; - bound_offsets.emplace_back(sampler.GetOffset()); - } - if (count > 1) { - gpu_driver->DeduceTextureHandlerSize(std::move(bound_offsets)); - } -} - void ShaderIR::PostDecode() { // Deduce texture handler size if needed - auto* gpu_driver = locker.AccessGuestDriverProfile(); + auto gpu_driver = locker.AccessGuestDriverProfile(); DeduceTextureHandlerSize(gpu_driver, used_samplers); } -- cgit v1.2.3 From 037ea431ceb93e93274fdcf9fb724819639d04fd Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sun, 5 Jan 2020 18:36:21 -0400 Subject: Shader_IR: deduce size of indexed samplers --- src/video_core/shader/decode.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/video_core/shader/decode.cpp') 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, } } +std::optional TryDeduceSamplerSize(Sampler& sampler_to_deduce, + VideoCore::GuestDriverProfile* gpu_driver, + std::list& used_samplers) { + if (gpu_driver == nullptr) { + LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); + return std::nullopt; + } + const u32 base_offset = sampler_to_deduce.GetOffset(); + u32 max_offset{UINT_MAX}; + for (const auto& sampler : used_samplers) { + if (sampler.IsBindless()) { + continue; + } + if (sampler.GetOffset() > base_offset) { + max_offset = std::min(sampler.GetOffset(), max_offset); + } + } + if (max_offset == UINT_MAX) { + return std::nullopt; + } + return ((max_offset - base_offset) * 4) / gpu_driver->GetTextureHandlerSize(); +} + } // Anonymous namespace class ASTDecoder { @@ -342,6 +365,19 @@ void ShaderIR::PostDecode() { // Deduce texture handler size if needed auto gpu_driver = locker.AccessGuestDriverProfile(); DeduceTextureHandlerSize(gpu_driver, used_samplers); + // Deduce Indexed Samplers + if (uses_indexed_samplers) { + for (auto& sampler : used_samplers) { + if (sampler.IsIndexed()) { + auto size = TryDeduceSamplerSize(sampler, gpu_driver, used_samplers); + if (size) { + sampler.SetSize(*size); + } else { + sampler.SetSize(1); + } + } + } + } } } // namespace VideoCommon::Shader -- cgit v1.2.3 From 3919b7b8a935174c91927bc0a312cbfee2971583 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Wed, 8 Jan 2020 12:13:05 -0400 Subject: Shader_IR: Corrections, styling and extras. --- src/video_core/shader/decode.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/video_core/shader/decode.cpp') diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index dd2f68a3e..d4a10eee5 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include @@ -64,7 +65,7 @@ std::optional TryDeduceSamplerSize(Sampler& sampler_to_deduce, return std::nullopt; } const u32 base_offset = sampler_to_deduce.GetOffset(); - u32 max_offset{UINT_MAX}; + u32 max_offset{std::numeric_limits::max()}; for (const auto& sampler : used_samplers) { if (sampler.IsBindless()) { continue; @@ -73,7 +74,7 @@ std::optional TryDeduceSamplerSize(Sampler& sampler_to_deduce, max_offset = std::min(sampler.GetOffset(), max_offset); } } - if (max_offset == UINT_MAX) { + if (max_offset == std::numeric_limits::max()) { return std::nullopt; } return ((max_offset - base_offset) * 4) / gpu_driver->GetTextureHandlerSize(); @@ -373,6 +374,7 @@ void ShaderIR::PostDecode() { if (size) { sampler.SetSize(*size); } else { + LOG_CRITICAL(HW_GPU, "Failed to deduce size of indexed sampler"); sampler.SetSize(1); } } -- cgit v1.2.3 From bb8eb15d392d69693f8cda0427669d011e23db97 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Fri, 24 Jan 2020 10:44:34 -0400 Subject: Shader_IR: Address feedback. --- src/video_core/shader/decode.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'src/video_core/shader/decode.cpp') diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index d4a10eee5..6b697ed5d 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp @@ -35,9 +35,9 @@ constexpr bool IsSchedInstruction(u32 offset, u32 main_offset) { } void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, - std::list& used_samplers) { + const std::list& used_samplers) { if (gpu_driver == nullptr) { - LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); + LOG_CRITICAL(HW_GPU, "GPU driver profile has not been created yet"); return; } if (gpu_driver->TextureHandlerSizeKnown() || used_samplers.size() <= 1) { @@ -57,9 +57,9 @@ void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, } } -std::optional TryDeduceSamplerSize(Sampler& sampler_to_deduce, +std::optional TryDeduceSamplerSize(const Sampler& sampler_to_deduce, VideoCore::GuestDriverProfile* gpu_driver, - std::list& used_samplers) { + const std::list& used_samplers) { if (gpu_driver == nullptr) { LOG_CRITICAL(HW_GPU, "GPU Driver profile has not been created yet"); return std::nullopt; @@ -367,17 +367,18 @@ void ShaderIR::PostDecode() { auto gpu_driver = locker.AccessGuestDriverProfile(); DeduceTextureHandlerSize(gpu_driver, used_samplers); // Deduce Indexed Samplers - if (uses_indexed_samplers) { - for (auto& sampler : used_samplers) { - if (sampler.IsIndexed()) { - auto size = TryDeduceSamplerSize(sampler, gpu_driver, used_samplers); - if (size) { - sampler.SetSize(*size); - } else { - LOG_CRITICAL(HW_GPU, "Failed to deduce size of indexed sampler"); - sampler.SetSize(1); - } - } + if (!uses_indexed_samplers) { + return; + } + for (auto& sampler : used_samplers) { + if (!sampler.IsIndexed()) { + continue; + } + if (const auto size = TryDeduceSamplerSize(sampler, gpu_driver, used_samplers)) { + sampler.SetSize(*size); + } else { + LOG_CRITICAL(HW_GPU, "Failed to deduce size of indexed sampler"); + sampler.SetSize(1); } } } -- cgit v1.2.3