shader_ir: propagate shader size to the IR
This commit is contained in:
		 Fernando Sahmkow
					Fernando Sahmkow
				
			
				
					committed by
					
						 FernandoS27
						FernandoS27
					
				
			
			
				
	
			
			
			 FernandoS27
						FernandoS27
					
				
			
						parent
						
							8a6fc529a9
						
					
				
				
					commit
					459fce3a8f
				
			| @@ -39,7 +39,7 @@ void ShaderIR::Decode() { | ||||
|     std::memcpy(&header, program_code.data(), sizeof(Tegra::Shader::Header)); | ||||
|  | ||||
|     ShaderCharacteristics shader_info{}; | ||||
|     bool can_proceed = ScanFlow(program_code, MAX_PROGRAM_LENGTH, main_offset, shader_info); | ||||
|     bool can_proceed = ScanFlow(program_code, program_code.size(), main_offset, shader_info); | ||||
|     if (can_proceed) { | ||||
|         coverage_begin = shader_info.start; | ||||
|         coverage_end = shader_info.end; | ||||
| @@ -52,12 +52,12 @@ void ShaderIR::Decode() { | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|     LOG_CRITICAL(HW_GPU, "Flow Analysis failed, falling back to brute force compiling"); | ||||
|     LOG_WARNING(HW_GPU, "Flow Analysis failed, falling back to brute force compiling"); | ||||
|  | ||||
|     // Now we need to deal with an undecompilable shader. We need to brute force | ||||
|     // a shader that captures every position. | ||||
|     coverage_begin = shader_info.start; | ||||
|     const u32 shader_end = static_cast<u32>(MAX_PROGRAM_LENGTH); | ||||
|     const u32 shader_end = static_cast<u32>(program_size / sizeof(u64)); | ||||
|     coverage_end = shader_end; | ||||
|     for (u32 label = main_offset; label < shader_end; label++) { | ||||
|         basic_blocks.insert({label, DecodeRange(label, label + 1)}); | ||||
|   | ||||
| @@ -22,8 +22,8 @@ using Tegra::Shader::PredCondition; | ||||
| using Tegra::Shader::PredOperation; | ||||
| using Tegra::Shader::Register; | ||||
|  | ||||
| ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset) | ||||
|     : program_code{program_code}, main_offset{main_offset} { | ||||
| ShaderIR::ShaderIR(const ProgramCode& program_code, u32 main_offset, const std::size_t size) | ||||
|     : program_code{program_code}, main_offset{main_offset}, program_size{size} { | ||||
|     Decode(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -65,7 +65,7 @@ struct GlobalMemoryUsage { | ||||
|  | ||||
| class ShaderIR final { | ||||
| public: | ||||
|     explicit ShaderIR(const ProgramCode& program_code, u32 main_offset); | ||||
|     explicit ShaderIR(const ProgramCode& program_code, u32 main_offset, std::size_t size); | ||||
|     ~ShaderIR(); | ||||
|  | ||||
|     const std::map<u32, NodeBlock>& GetBasicBlocks() const { | ||||
| @@ -316,6 +316,7 @@ private: | ||||
|  | ||||
|     const ProgramCode& program_code; | ||||
|     const u32 main_offset; | ||||
|     const std::size_t program_size; | ||||
|  | ||||
|     u32 coverage_begin{}; | ||||
|     u32 coverage_end{}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user