forked from eden-emu/eden
		
	gl_shader_gen: Add hashable setup/config structs.
This commit is contained in:
		
							parent
							
								
									1aa7a9ae50
								
							
						
					
					
						commit
						7cebff07e4
					
				
					 2 changed files with 50 additions and 29 deletions
				
			
		|  | @ -7,12 +7,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace GLShader { | namespace GLShader { | ||||||
| 
 | 
 | ||||||
| std::string GenerateVertexShader(const MaxwellVSConfig& config) { | std::string GenerateVertexShader(const ShaderSetup& setup, const MaxwellVSConfig& config) { | ||||||
|     UNREACHABLE(); |     UNREACHABLE(); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::string GenerateFragmentShader(const MaxwellFSConfig& config) { | std::string GenerateFragmentShader(const ShaderSetup& setup, const MaxwellFSConfig& config) { | ||||||
|     UNREACHABLE(); |     UNREACHABLE(); | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,46 +4,67 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <cstring> | #include <array> | ||||||
| #include <string> | #include <string> | ||||||
| #include <type_traits> | #include <type_traits> | ||||||
|  | #include "common/common_types.h" | ||||||
| #include "common/hash.h" | #include "common/hash.h" | ||||||
| 
 | 
 | ||||||
| namespace GLShader { | namespace GLShader { | ||||||
| 
 | 
 | ||||||
| enum Attributes { | constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000}; | ||||||
|     ATTRIBUTE_POSITION, | 
 | ||||||
|     ATTRIBUTE_COLOR, | using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>; | ||||||
|     ATTRIBUTE_TEXCOORD0, | 
 | ||||||
|     ATTRIBUTE_TEXCOORD1, | struct ShaderSetup { | ||||||
|     ATTRIBUTE_TEXCOORD2, |     ShaderSetup(ProgramCode&& program_code) : program_code(std::move(program_code)) {} | ||||||
|     ATTRIBUTE_TEXCOORD0_W, | 
 | ||||||
|     ATTRIBUTE_NORMQUAT, |     ProgramCode program_code; | ||||||
|     ATTRIBUTE_VIEW, |     bool program_code_hash_dirty = true; | ||||||
|  | 
 | ||||||
|  |     u64 GetProgramCodeHash() { | ||||||
|  |         if (program_code_hash_dirty) { | ||||||
|  |             program_code_hash = Common::ComputeHash64(&program_code, sizeof(program_code)); | ||||||
|  |             program_code_hash_dirty = false; | ||||||
|  |         } | ||||||
|  |         return program_code_hash; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     u64 program_code_hash{}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct MaxwellShaderConfigCommon { | struct MaxwellShaderConfigCommon { | ||||||
|     explicit MaxwellShaderConfigCommon(){}; |     void Init(ShaderSetup& setup) { | ||||||
|  |         program_hash = setup.GetProgramCodeHash(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     u64 program_hash; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct MaxwellVSConfig : MaxwellShaderConfigCommon { | struct MaxwellVSConfig : Common::HashableStruct<MaxwellShaderConfigCommon> { | ||||||
|     explicit MaxwellVSConfig() : MaxwellShaderConfigCommon() {} |     explicit MaxwellVSConfig(ShaderSetup& setup) { | ||||||
| 
 |         state.Init(setup); | ||||||
|     bool operator==(const MaxwellVSConfig& o) const { |     } | ||||||
|         return std::memcmp(this, &o, sizeof(MaxwellVSConfig)) == 0; |  | ||||||
|     }; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct MaxwellFSConfig : MaxwellShaderConfigCommon { | struct MaxwellFSConfig : Common::HashableStruct<MaxwellShaderConfigCommon> { | ||||||
|     explicit MaxwellFSConfig() : MaxwellShaderConfigCommon() {} |     explicit MaxwellFSConfig(ShaderSetup& setup) { | ||||||
| 
 |         state.Init(setup); | ||||||
|     bool operator==(const MaxwellFSConfig& o) const { |     } | ||||||
|         return std::memcmp(this, &o, sizeof(MaxwellFSConfig)) == 0; |  | ||||||
|     }; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| std::string GenerateVertexShader(const MaxwellVSConfig& config); | /**
 | ||||||
| std::string GenerateFragmentShader(const MaxwellFSConfig& config); |  * Generates the GLSL vertex shader program source code for the given VS program | ||||||
|  |  * @returns String of the shader source code | ||||||
|  |  */ | ||||||
|  | std::string GenerateVertexShader(const ShaderSetup& setup, const MaxwellVSConfig& config); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Generates the GLSL fragment shader program source code for the given FS program | ||||||
|  |  * @returns String of the shader source code | ||||||
|  |  */ | ||||||
|  | std::string GenerateFragmentShader(const ShaderSetup& setup, const MaxwellFSConfig& config); | ||||||
| 
 | 
 | ||||||
| } // namespace GLShader
 | } // namespace GLShader
 | ||||||
| 
 | 
 | ||||||
|  | @ -52,14 +73,14 @@ namespace std { | ||||||
| template <> | template <> | ||||||
| struct hash<GLShader::MaxwellVSConfig> { | struct hash<GLShader::MaxwellVSConfig> { | ||||||
|     size_t operator()(const GLShader::MaxwellVSConfig& k) const { |     size_t operator()(const GLShader::MaxwellVSConfig& k) const { | ||||||
|         return Common::ComputeHash64(&k, sizeof(GLShader::MaxwellVSConfig)); |         return k.Hash(); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template <> | template <> | ||||||
| struct hash<GLShader::MaxwellFSConfig> { | struct hash<GLShader::MaxwellFSConfig> { | ||||||
|     size_t operator()(const GLShader::MaxwellFSConfig& k) const { |     size_t operator()(const GLShader::MaxwellFSConfig& k) const { | ||||||
|         return Common::ComputeHash64(&k, sizeof(GLShader::MaxwellFSConfig)); |         return k.Hash(); | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei