mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 15:39:02 -05:00 
			
		
		
		
	Shader_IR: Address Feedback
This commit is contained in:
		 Fernando Sahmkow
					Fernando Sahmkow
				
			
				
					committed by
					
						 FernandoS27
						FernandoS27
					
				
			
			
				
	
			
			
			 FernandoS27
						FernandoS27
					
				
			
						parent
						
							74aa7de5e3
						
					
				
				
					commit
					dc5cfa8d28
				
			| @@ -1,8 +1,9 @@ | ||||
| // Copyright 2019 yuzu Emulator Project | ||||
| // Copyright 2020 yuzu Emulator Project | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include <algorithm> | ||||
| #include <climits> | ||||
|  | ||||
| #include "video_core/guest_driver.h" | ||||
|  | ||||
| @@ -12,13 +13,13 @@ void GuestDriverProfile::DeduceTextureHandlerSize(std::vector<u32>&& bound_offse | ||||
|     if (texture_handler_size_deduced) { | ||||
|         return; | ||||
|     } | ||||
|     std::size_t size = bound_offsets.size(); | ||||
|     const std::size_t size = bound_offsets.size(); | ||||
|     if (size < 2) { | ||||
|         return; | ||||
|     } | ||||
|     std::sort(bound_offsets.begin(), bound_offsets.end(), | ||||
|               [](const u32& a, const u32& b) { return a < b; }); | ||||
|     u32 min_val = 0xFFFFFFFF; // set to highest possible 32 bit integer; | ||||
|     u32 min_val = UINT_MAX; | ||||
|     for (std::size_t i = 1; i < size; i++) { | ||||
|         if (bound_offsets[i] == bound_offsets[i - 1]) { | ||||
|             continue; | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // Copyright 2019 yuzu Emulator Project | ||||
| // Copyright 2020 yuzu Emulator Project | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
|   | ||||
| @@ -53,7 +53,6 @@ public: | ||||
|     void InsertBindlessSampler(u32 buffer, u32 offset, Tegra::Engines::SamplerDescriptor sampler); | ||||
|  | ||||
|     /// Set the bound buffer for this locker. | ||||
|  | ||||
|     void SetBoundBuffer(u32 buffer); | ||||
|  | ||||
|     /// Checks keys and samplers against engine's current const buffers. Returns true if they are | ||||
|   | ||||
| @@ -315,25 +315,33 @@ 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<u32> 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 DeduceTextureHandlerSize(VideoCore::GuestDriverProfile* gpu_driver, | ||||
|                               std::list<Sampler>& 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<u32> 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(); | ||||
|     DeduceTextureHandlerSize(gpu_driver, used_samplers); | ||||
| } | ||||
|  | ||||
| } // namespace VideoCommon::Shader | ||||
|   | ||||
		Reference in New Issue
	
	Block a user