gl_shader_gen: Use a std::vector to represent program code instead of std::array
While convenient as a std::array, it's also quite a large set of data as well (32KB). It being an array also means data cannot be std::moved. Any situation where the code is being set or relocated means that a full copy of that 32KB data must be done. If we use a std::vector we do need to allocate on the heap, however, it does allow us to std::move the data we have within the std::vector into another std::vector instance, eliminating the need to always copy the program data (as std::move in this case would just transfer the pointers and bare necessities over to the new vector instance).
This commit is contained in:
		
							parent
							
								
									d1b1c42c07
								
							
						
					
					
						commit
						1fd979f50a
					
				| @ -179,7 +179,7 @@ static GLShader::ProgramCode GetShaderProgramCode(Maxwell::ShaderProgram program | ||||
|     auto& gpu = Core::System::GetInstance().GPU().Maxwell3D(); | ||||
| 
 | ||||
|     // Fetch program code from memory
 | ||||
|     GLShader::ProgramCode program_code; | ||||
|     GLShader::ProgramCode program_code(GLShader::MAX_PROGRAM_CODE_LENGTH); | ||||
|     auto& shader_config = gpu.regs.shader_config[static_cast<size_t>(program)]; | ||||
|     const u64 gpu_address{gpu.regs.code_address.CodeAddress() + shader_config.offset}; | ||||
|     const boost::optional<VAddr> cpu_address{gpu.memory_manager.GpuToCpuAddress(gpu_address)}; | ||||
|  | ||||
| @ -9,14 +9,14 @@ | ||||
| #include <type_traits> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| #include <boost/functional/hash.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "common/hash.h" | ||||
| 
 | ||||
| namespace GLShader { | ||||
| 
 | ||||
| constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000}; | ||||
| 
 | ||||
| using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>; | ||||
| using ProgramCode = std::vector<u64>; | ||||
| 
 | ||||
| class ConstBufferEntry { | ||||
|     using Maxwell = Tegra::Engines::Maxwell3D::Regs; | ||||
| @ -115,8 +115,8 @@ struct ShaderEntries { | ||||
| using ProgramResult = std::pair<std::string, ShaderEntries>; | ||||
| 
 | ||||
| struct ShaderSetup { | ||||
|     ShaderSetup(const ProgramCode& program_code) { | ||||
|         program.code = program_code; | ||||
|     ShaderSetup(ProgramCode program_code) { | ||||
|         program.code = std::move(program_code); | ||||
|     } | ||||
| 
 | ||||
|     struct { | ||||
| @ -135,8 +135,8 @@ struct ShaderSetup { | ||||
|     } | ||||
| 
 | ||||
|     /// Used in scenarios where we have a dual vertex shaders
 | ||||
|     void SetProgramB(const ProgramCode& program_b) { | ||||
|         program.code_b = program_b; | ||||
|     void SetProgramB(ProgramCode program_b) { | ||||
|         program.code_b = std::move(program_b); | ||||
|         has_program_b = true; | ||||
|     } | ||||
| 
 | ||||
| @ -146,13 +146,18 @@ struct ShaderSetup { | ||||
| 
 | ||||
| private: | ||||
|     u64 GetNewHash() const { | ||||
|         size_t hash = 0; | ||||
| 
 | ||||
|         const u64 hash_a = Common::ComputeHash64(program.code.data(), program.code.size()); | ||||
|         boost::hash_combine(hash, hash_a); | ||||
| 
 | ||||
|         if (has_program_b) { | ||||
|             // Compute hash over dual shader programs
 | ||||
|             return Common::ComputeHash64(&program, sizeof(program)); | ||||
|         } else { | ||||
|             // Compute hash over a single shader program
 | ||||
|             return Common::ComputeHash64(&program.code, program.code.size()); | ||||
|             const u64 hash_b = Common::ComputeHash64(program.code_b.data(), program.code_b.size()); | ||||
|             boost::hash_combine(hash, hash_b); | ||||
|         } | ||||
| 
 | ||||
|         return hash; | ||||
|     } | ||||
| 
 | ||||
|     u64 program_code_hash{}; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Lioncash
						Lioncash