Common: Add convenience function for hashing a struct
This commit is contained in:
parent
7f77820460
commit
d93ee65164
|
@ -20,4 +20,17 @@ static inline u64 ComputeHash64(const void* data, size_t len) {
|
||||||
return CityHash64(static_cast<const char*>(data), len);
|
return CityHash64(static_cast<const char*>(data), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes a 64-bit hash of a struct. In addition to being POD (trivially copyable and having
|
||||||
|
* standard layout), it is also critical that either the struct includes no padding, or that any
|
||||||
|
* padding is initialized to a known value by memsetting the struct to 0 before filling it in.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
static inline u64 ComputeStructHash64(const T& data) {
|
||||||
|
static_assert(
|
||||||
|
std::is_trivially_copyable<T>::value && std::is_standard_layout<T>::value,
|
||||||
|
"Type passed to ComputeStructHash64 must be trivially copyable and standard layout");
|
||||||
|
return ComputeHash64(&data, sizeof(data));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -65,6 +65,7 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
|
||||||
PicaShaderConfig res;
|
PicaShaderConfig res;
|
||||||
|
|
||||||
auto& state = res.state;
|
auto& state = res.state;
|
||||||
|
// Memset structure to zero padding bits, so that they will be deterministic when hashing
|
||||||
std::memset(&state, 0, sizeof(PicaShaderConfig::State));
|
std::memset(&state, 0, sizeof(PicaShaderConfig::State));
|
||||||
|
|
||||||
state.scissor_test_mode = regs.rasterizer.scissor_test.mode;
|
state.scissor_test_mode = regs.rasterizer.scissor_test.mode;
|
||||||
|
|
|
@ -131,10 +131,6 @@ union PicaShaderConfig {
|
||||||
|
|
||||||
} state;
|
} state;
|
||||||
};
|
};
|
||||||
#if (__GNUC__ >= 5) || defined(__clang__) || defined(_MSC_VER)
|
|
||||||
static_assert(std::is_trivially_copyable<PicaShaderConfig::State>::value,
|
|
||||||
"PicaShaderConfig::State must be trivially copyable");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the GLSL vertex shader program source code for the current Pica state
|
* Generates the GLSL vertex shader program source code for the current Pica state
|
||||||
|
@ -156,7 +152,7 @@ namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct hash<GLShader::PicaShaderConfig> {
|
struct hash<GLShader::PicaShaderConfig> {
|
||||||
size_t operator()(const GLShader::PicaShaderConfig& k) const {
|
size_t operator()(const GLShader::PicaShaderConfig& k) const {
|
||||||
return Common::ComputeHash64(&k.state, sizeof(GLShader::PicaShaderConfig::State));
|
return Common::ComputeStructHash64(k.state);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
Reference in New Issue