Added shader state serialization

This commit is contained in:
Hamish Milne 2019-08-08 05:25:24 +01:00 committed by zhupengfei
parent 6f00976ab5
commit 45788b9c82
4 changed files with 76 additions and 14 deletions

View file

@ -32,6 +32,7 @@
#include <cmath> #include <cmath>
#include <type_traits> #include <type_traits>
#include <boost/serialization/access.hpp>
namespace Common { namespace Common {
@ -44,6 +45,14 @@ class Vec4;
template <typename T> template <typename T>
class Vec2 { class Vec2 {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & x;
ar & y;
}
public: public:
T x; T x;
T y; T y;
@ -191,6 +200,15 @@ inline float Vec2<float>::Normalize() {
template <typename T> template <typename T>
class Vec3 { class Vec3 {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & x;
ar & y;
ar & z;
}
public: public:
T x; T x;
T y; T y;
@ -399,6 +417,16 @@ using Vec3f = Vec3<float>;
template <typename T> template <typename T>
class Vec4 { class Vec4 {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & x;
ar & y;
ar & z;
ar & w;
}
public: public:
T x; T x;
T y; T y;

View file

@ -14,11 +14,15 @@
#include "video_core/regs.h" #include "video_core/regs.h"
#include "video_core/shader/shader.h" #include "video_core/shader/shader.h"
// NB, by defining this we can't use the built-in std::array serializer in this file // Boost::serialization doesn't like union types for some reason,
// so we need to mark arrays of union values with a special serialization method
template<typename Value, size_t Size>
struct UnionArray : public std::array<Value, Size> { };
namespace boost::serialization { namespace boost::serialization {
template<class Archive, typename Value, size_t Size> template<class Archive, typename Value, size_t Size>
void serialize(Archive & ar, std::array<Value, Size> &array, const unsigned int version) void serialize(Archive& ar, UnionArray<Value, Size>& array, const unsigned int version)
{ {
static_assert(sizeof(Value) == sizeof(u32)); static_assert(sizeof(Value) == sizeof(u32));
ar & *static_cast<u32 (*)[Size]>(static_cast<void *>(array.data())); ar & *static_cast<u32 (*)[Size]>(static_cast<void *>(array.data()));
@ -87,11 +91,11 @@ struct State {
} }
}; };
std::array<ValueEntry, 128> noise_table; UnionArray<ValueEntry, 128> noise_table;
std::array<ValueEntry, 128> color_map_table; UnionArray<ValueEntry, 128> color_map_table;
std::array<ValueEntry, 128> alpha_map_table; UnionArray<ValueEntry, 128> alpha_map_table;
std::array<ColorEntry, 256> color_table; UnionArray<ColorEntry, 256> color_table;
std::array<ColorDifferenceEntry, 256> color_diff_table; UnionArray<ColorDifferenceEntry, 256> color_diff_table;
private: private:
friend class boost::serialization::access; friend class boost::serialization::access;
@ -134,7 +138,7 @@ struct State {
} }
}; };
std::array<std::array<LutEntry, 256>, 24> luts; std::array<UnionArray<LutEntry, 256>, 24> luts;
} lighting; } lighting;
struct { struct {
@ -154,7 +158,7 @@ struct State {
} }
}; };
std::array<LutEntry, 128> lut; UnionArray<LutEntry, 128> lut;
} fog; } fog;
#undef SERIALIZE_RAW #undef SERIALIZE_RAW
@ -214,13 +218,11 @@ private:
void serialize(Archive & ar, const unsigned int file_version) void serialize(Archive & ar, const unsigned int file_version)
{ {
ar & regs.reg_array; ar & regs.reg_array;
// ar & vs; ar & vs;
// ar & gs; ar & gs;
// ar & input_default_attributes; // ar & input_default_attributes;
ar & proctex; ar & proctex;
for (auto i = 0; i < lighting.luts.size(); i++) { ar & lighting.luts;
ar & lighting.luts[i];
}
ar & fog.lut; ar & fog.lut;
ar & cmd_list.addr; ar & cmd_list.addr;
ar & cmd_list.length; ar & cmd_list.length;

View file

@ -6,6 +6,7 @@
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <boost/serialization/access.hpp>
#include "common/common_types.h" #include "common/common_types.h"
namespace Pica { namespace Pica {
@ -140,6 +141,13 @@ private:
// Stored as a regular float, merely for convenience // Stored as a regular float, merely for convenience
// TODO: Perform proper arithmetic on this! // TODO: Perform proper arithmetic on this!
float value; float value;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & value;
}
}; };
using float24 = Float<16, 7>; using float24 = Float<16, 7>;

View file

@ -9,6 +9,7 @@
#include <functional> #include <functional>
#include <type_traits> #include <type_traits>
#include <nihstro/shader_bytecode.h> #include <nihstro/shader_bytecode.h>
#include <boost/serialization/array.hpp>
#include "common/assert.h" #include "common/assert.h"
#include "common/common_funcs.h" #include "common/common_funcs.h"
#include "common/common_types.h" #include "common/common_types.h"
@ -193,6 +194,16 @@ struct Uniforms {
static std::size_t GetIntUniformOffset(unsigned index) { static std::size_t GetIntUniformOffset(unsigned index) {
return offsetof(Uniforms, i) + index * sizeof(Common::Vec4<u8>); return offsetof(Uniforms, i) + index * sizeof(Common::Vec4<u8>);
} }
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & f;
ar & b;
ar & i;
}
}; };
struct ShaderSetup { struct ShaderSetup {
@ -237,6 +248,19 @@ private:
bool swizzle_data_hash_dirty = true; bool swizzle_data_hash_dirty = true;
u64 program_code_hash = 0xDEADC0DE; u64 program_code_hash = 0xDEADC0DE;
u64 swizzle_data_hash = 0xDEADC0DE; u64 swizzle_data_hash = 0xDEADC0DE;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & uniforms;
ar & program_code;
ar & swizzle_data;
ar & program_code_hash_dirty;
ar & swizzle_data_hash_dirty;
ar & program_code_hash;
ar & swizzle_data_hash;
}
}; };
class ShaderEngine { class ShaderEngine {