|
|
@@ -4,46 +4,67 @@
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
-#include <cstring>
|
|
|
+#include <array>
|
|
|
#include <string>
|
|
|
#include <type_traits>
|
|
|
+#include "common/common_types.h"
|
|
|
#include "common/hash.h"
|
|
|
|
|
|
namespace GLShader {
|
|
|
|
|
|
-enum Attributes {
|
|
|
- ATTRIBUTE_POSITION,
|
|
|
- ATTRIBUTE_COLOR,
|
|
|
- ATTRIBUTE_TEXCOORD0,
|
|
|
- ATTRIBUTE_TEXCOORD1,
|
|
|
- ATTRIBUTE_TEXCOORD2,
|
|
|
- ATTRIBUTE_TEXCOORD0_W,
|
|
|
- ATTRIBUTE_NORMQUAT,
|
|
|
- ATTRIBUTE_VIEW,
|
|
|
-};
|
|
|
+constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000};
|
|
|
|
|
|
-struct MaxwellShaderConfigCommon {
|
|
|
- explicit MaxwellShaderConfigCommon(){};
|
|
|
+using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>;
|
|
|
+
|
|
|
+struct ShaderSetup {
|
|
|
+ ShaderSetup(ProgramCode&& program_code) : program_code(std::move(program_code)) {}
|
|
|
+
|
|
|
+ ProgramCode program_code;
|
|
|
+ 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 MaxwellVSConfig : MaxwellShaderConfigCommon {
|
|
|
- explicit MaxwellVSConfig() : MaxwellShaderConfigCommon() {}
|
|
|
+struct MaxwellShaderConfigCommon {
|
|
|
+ void Init(ShaderSetup& setup) {
|
|
|
+ program_hash = setup.GetProgramCodeHash();
|
|
|
+ }
|
|
|
|
|
|
- bool operator==(const MaxwellVSConfig& o) const {
|
|
|
- return std::memcmp(this, &o, sizeof(MaxwellVSConfig)) == 0;
|
|
|
- };
|
|
|
+ u64 program_hash;
|
|
|
};
|
|
|
|
|
|
-struct MaxwellFSConfig : MaxwellShaderConfigCommon {
|
|
|
- explicit MaxwellFSConfig() : MaxwellShaderConfigCommon() {}
|
|
|
+struct MaxwellVSConfig : Common::HashableStruct<MaxwellShaderConfigCommon> {
|
|
|
+ explicit MaxwellVSConfig(ShaderSetup& setup) {
|
|
|
+ state.Init(setup);
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
- bool operator==(const MaxwellFSConfig& o) const {
|
|
|
- return std::memcmp(this, &o, sizeof(MaxwellFSConfig)) == 0;
|
|
|
- };
|
|
|
+struct MaxwellFSConfig : Common::HashableStruct<MaxwellShaderConfigCommon> {
|
|
|
+ explicit MaxwellFSConfig(ShaderSetup& setup) {
|
|
|
+ state.Init(setup);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
-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
|
|
|
|
|
|
@@ -52,14 +73,14 @@ namespace std {
|
|
|
template <>
|
|
|
struct hash<GLShader::MaxwellVSConfig> {
|
|
|
size_t operator()(const GLShader::MaxwellVSConfig& k) const {
|
|
|
- return Common::ComputeHash64(&k, sizeof(GLShader::MaxwellVSConfig));
|
|
|
+ return k.Hash();
|
|
|
}
|
|
|
};
|
|
|
|
|
|
template <>
|
|
|
struct hash<GLShader::MaxwellFSConfig> {
|
|
|
size_t operator()(const GLShader::MaxwellFSConfig& k) const {
|
|
|
- return Common::ComputeHash64(&k, sizeof(GLShader::MaxwellFSConfig));
|
|
|
+ return k.Hash();
|
|
|
}
|
|
|
};
|
|
|
|