|
@@ -45,46 +45,31 @@ namespace Pica {
|
|
|
#endif // _MSC_VER
|
|
#endif // _MSC_VER
|
|
|
|
|
|
|
|
struct Regs {
|
|
struct Regs {
|
|
|
- INSERT_PADDING_WORDS(0x10);
|
|
|
|
|
- u32 trigger_irq;
|
|
|
|
|
- INSERT_PADDING_WORDS(0x2f);
|
|
|
|
|
- RasterizerRegs rasterizer;
|
|
|
|
|
- TexturingRegs texturing;
|
|
|
|
|
- FramebufferRegs framebuffer;
|
|
|
|
|
- LightingRegs lighting;
|
|
|
|
|
- PipelineRegs pipeline;
|
|
|
|
|
- ShaderRegs gs;
|
|
|
|
|
- ShaderRegs vs;
|
|
|
|
|
- INSERT_PADDING_WORDS(0x20);
|
|
|
|
|
|
|
+ static constexpr size_t NUM_REGS = 0x300;
|
|
|
|
|
+
|
|
|
|
|
+ union {
|
|
|
|
|
+ struct {
|
|
|
|
|
+ INSERT_PADDING_WORDS(0x10);
|
|
|
|
|
+ u32 trigger_irq;
|
|
|
|
|
+ INSERT_PADDING_WORDS(0x2f);
|
|
|
|
|
+ RasterizerRegs rasterizer;
|
|
|
|
|
+ TexturingRegs texturing;
|
|
|
|
|
+ FramebufferRegs framebuffer;
|
|
|
|
|
+ LightingRegs lighting;
|
|
|
|
|
+ PipelineRegs pipeline;
|
|
|
|
|
+ ShaderRegs gs;
|
|
|
|
|
+ ShaderRegs vs;
|
|
|
|
|
+ INSERT_PADDING_WORDS(0x20);
|
|
|
|
|
+ };
|
|
|
|
|
+ std::array<u32, NUM_REGS> reg_array;
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
// Map register indices to names readable by humans
|
|
// Map register indices to names readable by humans
|
|
|
- // Used for debugging purposes, so performance is not an issue here
|
|
|
|
|
static std::string GetCommandName(int index);
|
|
static std::string GetCommandName(int index);
|
|
|
-
|
|
|
|
|
- static constexpr size_t NumIds() {
|
|
|
|
|
- return sizeof(Regs) / sizeof(u32);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- const u32& operator[](int index) const {
|
|
|
|
|
- const u32* content = reinterpret_cast<const u32*>(this);
|
|
|
|
|
- return content[index];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- u32& operator[](int index) {
|
|
|
|
|
- u32* content = reinterpret_cast<u32*>(this);
|
|
|
|
|
- return content[index];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-private:
|
|
|
|
|
- /*
|
|
|
|
|
- * Most physical addresses which Pica registers refer to are 8-byte aligned.
|
|
|
|
|
- * This function should be used to get the address from a raw register value.
|
|
|
|
|
- */
|
|
|
|
|
- static inline u32 DecodeAddressRegister(u32 register_value) {
|
|
|
|
|
- return register_value * 8;
|
|
|
|
|
- }
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+static_assert(sizeof(Regs) == Regs::NUM_REGS * sizeof(u32), "Regs struct has wrong size");
|
|
|
|
|
+
|
|
|
// TODO: MSVC does not support using offsetof() on non-static data members even though this
|
|
// TODO: MSVC does not support using offsetof() on non-static data members even though this
|
|
|
// is technically allowed since C++11. This macro should be enabled once MSVC adds
|
|
// is technically allowed since C++11. This macro should be enabled once MSVC adds
|
|
|
// support for that.
|
|
// support for that.
|
|
@@ -154,11 +139,4 @@ ASSERT_REG_POSITION(vs, 0x2b0);
|
|
|
#undef ASSERT_REG_POSITION
|
|
#undef ASSERT_REG_POSITION
|
|
|
#endif // !defined(_MSC_VER)
|
|
#endif // !defined(_MSC_VER)
|
|
|
|
|
|
|
|
-// The total number of registers is chosen arbitrarily, but let's make sure it's not some odd value
|
|
|
|
|
-// anyway.
|
|
|
|
|
-static_assert(sizeof(Regs) <= 0x300 * sizeof(u32),
|
|
|
|
|
- "Register set structure larger than it should be");
|
|
|
|
|
-static_assert(sizeof(Regs) >= 0x300 * sizeof(u32),
|
|
|
|
|
- "Register set structure smaller than it should be");
|
|
|
|
|
-
|
|
|
|
|
} // namespace Pica
|
|
} // namespace Pica
|