diff options
| -rw-r--r-- | src/video_core/pica.h | 105 | 
1 files changed, 104 insertions, 1 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h index b8db7869a..81a568e88 100644 --- a/src/video_core/pica.h +++ b/src/video_core/pica.h @@ -643,7 +643,110 @@ struct Regs {          }      } -    INSERT_PADDING_WORDS(0xe0); +    INSERT_PADDING_WORDS(0x20); + +    struct { +        union LightColor { +            BitField< 0, 10, u32> b; +            BitField<10, 10, u32> g; +            BitField<20, 10, u32> r; + +            Math::Vec3f ToVec3f() const { +                return Math::MakeVec((f32)r / 255.f, (f32)g / 255.f, (f32)b / 255.f); +            } +        }; + +        struct LightSrc { +            LightColor specular_0;  // material.specular_0 * light.specular_0 +            LightColor specular_1;  // material.specular_1 * light.specular_1 +            LightColor diffuse;     // material.diffuse * light.diffuse +            LightColor ambient;     // material.ambient * light.ambient + +            struct { +                // Encoded as 16-bit floating point +                u16 x; +                u16 y; +                u16 z; +                u16 unk; + +                INSERT_PADDING_WORDS(0x3); + +                // 1.f if 0, otherwise 0.f +                BitField<0, 1, u32> w; +            } position; + + +            BitField<0, 20, u32> dist_atten_bias; +            BitField<0, 20, u32> dist_atten_scale; + +            INSERT_PADDING_WORDS(0x4); +        }; +        static_assert(sizeof(LightSrc) == 0x10 * sizeof(u32), "LightSrc structure must be 0x10 words"); + +        LightSrc light[8]; +        LightColor global_ambient; // emission + (material.ambient * lighting.ambient) +        INSERT_PADDING_WORDS(0x1); +        BitField<0, 3, u32> src_num; // number of enabled lights - 1 +        INSERT_PADDING_WORDS(0x1); + +        union { +            // Each bit specifies whether distance attenuation should be applied for the +            // corresponding light + +            BitField<24, 1, u32> light_0; +            BitField<25, 1, u32> light_1; +            BitField<26, 1, u32> light_2; +            BitField<27, 1, u32> light_3; +            BitField<28, 1, u32> light_4; +            BitField<29, 1, u32> light_5; +            BitField<30, 1, u32> light_6; +            BitField<31, 1, u32> light_7; + +            bool IsEnabled(unsigned index) const { +                const unsigned enable[] = { light_0, light_1, light_2, light_3, light_4, light_5, light_6, light_7 }; +                return enable[index] == 0; +            } +        } dist_atten_enable; + +        union { +            BitField<0, 8, u32> index;      ///< Index at which to set data in the LUT +            BitField<8, 5, u32> type;       ///< Type of LUT for which to set data +        } lut_config; + +        BitField<0, 1, u32> disable; +        INSERT_PADDING_WORDS(0x1); + +        // When data is written to any of these registers, it gets written to the lookup table of +        // the selected type at the selected index, specified above in the `lut_config` register. +        // With each write, `lut_config.index` is incremented. It does not matter which of these +        // registers is written to, the behavior will be the same. +        u32 lut_data[8]; + +        INSERT_PADDING_WORDS(0x9); + +        union { +            // There are 8 light enable "slots", corresponding to the total number of lights +            // supported by Pica. For N enabled lights (specified by register 0x1c2, or 'src_num' +            // above), the first N slots below will be set to integers within the range of 0-7, +            // corresponding to the actual light that is enabled for each slot. + +            BitField< 0, 3, u32> slot_0; +            BitField< 4, 3, u32> slot_1; +            BitField< 8, 3, u32> slot_2; +            BitField<12, 3, u32> slot_3; +            BitField<16, 3, u32> slot_4; +            BitField<20, 3, u32> slot_5; +            BitField<24, 3, u32> slot_6; +            BitField<28, 3, u32> slot_7; + +            unsigned GetNum(unsigned index) const { +                const unsigned enable_slots[] = { slot_0, slot_1, slot_2, slot_3, slot_4, slot_5, slot_6, slot_7 }; +                return enable_slots[index]; +            } +        } light_enable; +    } lighting; + +    INSERT_PADDING_WORDS(0x26);      enum class VertexAttributeFormat : u64 {          BYTE = 0,  | 
