|
|
@@ -241,7 +241,8 @@ struct Regs {
|
|
|
TextureConfig texture0;
|
|
|
INSERT_PADDING_WORDS(0x8);
|
|
|
BitField<0, 4, TextureFormat> texture0_format;
|
|
|
- INSERT_PADDING_WORDS(0x2);
|
|
|
+ BitField<0, 1, u32> fragment_lighting_enable;
|
|
|
+ INSERT_PADDING_WORDS(0x1);
|
|
|
TextureConfig texture1;
|
|
|
BitField<0, 4, TextureFormat> texture1_format;
|
|
|
INSERT_PADDING_WORDS(0x2);
|
|
|
@@ -645,6 +646,22 @@ struct Regs {
|
|
|
|
|
|
INSERT_PADDING_WORDS(0x20);
|
|
|
|
|
|
+ enum class LightingSampler {
|
|
|
+ Distribution0 = 0,
|
|
|
+ Distribution1 = 1,
|
|
|
+ Fresnel = 3,
|
|
|
+ Blue = 4,
|
|
|
+ Green = 5,
|
|
|
+ Red = 6,
|
|
|
+ SpotlightAttenuation = 8,
|
|
|
+ DistanceAttenuation = 16,
|
|
|
+ };
|
|
|
+
|
|
|
+ enum class LightingLutInput {
|
|
|
+ NH = 0, // Cosine of the angle between the normal and half-angle vectors
|
|
|
+ LN = 3, // Cosine of the angle between the light and the normal vectors
|
|
|
+ };
|
|
|
+
|
|
|
struct {
|
|
|
union LightColor {
|
|
|
BitField< 0, 10, u32> b;
|
|
|
@@ -664,17 +681,21 @@ struct Regs {
|
|
|
|
|
|
struct {
|
|
|
// Encoded as 16-bit floating point
|
|
|
- u16 x;
|
|
|
- u16 y;
|
|
|
- u16 z;
|
|
|
- u16 unk;
|
|
|
+ union {
|
|
|
+ BitField< 0, 16, u32> x;
|
|
|
+ BitField<16, 16, u32> y;
|
|
|
+ };
|
|
|
+ union {
|
|
|
+ BitField< 0, 16, u32> z;
|
|
|
+ };
|
|
|
|
|
|
INSERT_PADDING_WORDS(0x3);
|
|
|
|
|
|
- // 1.f if 0, otherwise 0.f
|
|
|
- BitField<0, 1, u32> w;
|
|
|
- } position;
|
|
|
-
|
|
|
+ union {
|
|
|
+ BitField<0, 1, u32> w; // 1.f if 0, otherwise 0.f
|
|
|
+ BitField<1, 1, u32> two_sided_diffuse; // when disabled, clamp dot-product to 0
|
|
|
+ };
|
|
|
+ };
|
|
|
|
|
|
BitField<0, 20, u32> dist_atten_bias;
|
|
|
BitField<0, 20, u32> dist_atten_scale;
|
|
|
@@ -722,7 +743,27 @@ struct Regs {
|
|
|
// registers is written to, the behavior will be the same.
|
|
|
u32 lut_data[8];
|
|
|
|
|
|
- INSERT_PADDING_WORDS(0x9);
|
|
|
+ union {
|
|
|
+ BitField< 1, 1, u32> d0;
|
|
|
+ BitField< 5, 1, u32> d1;
|
|
|
+ BitField< 9, 1, u32> sp;
|
|
|
+ BitField<13, 1, u32> fr;
|
|
|
+ BitField<17, 1, u32> rb;
|
|
|
+ BitField<21, 1, u32> rg;
|
|
|
+ BitField<25, 1, u32> rr;
|
|
|
+ } abs_lut_input;
|
|
|
+
|
|
|
+ union {
|
|
|
+ BitField< 0, 3, u32> d0;
|
|
|
+ BitField< 4, 3, u32> d1;
|
|
|
+ BitField< 8, 3, u32> sp;
|
|
|
+ BitField<12, 3, u32> fr;
|
|
|
+ BitField<16, 3, u32> rb;
|
|
|
+ BitField<20, 3, u32> rg;
|
|
|
+ BitField<24, 3, u32> rr;
|
|
|
+ } lut_input;
|
|
|
+
|
|
|
+ INSERT_PADDING_WORDS(0x7);
|
|
|
|
|
|
union {
|
|
|
// There are 8 light enable "slots", corresponding to the total number of lights
|
|
|
@@ -1095,6 +1136,7 @@ ASSERT_REG_POSITION(viewport_corner, 0x68);
|
|
|
ASSERT_REG_POSITION(texture0_enable, 0x80);
|
|
|
ASSERT_REG_POSITION(texture0, 0x81);
|
|
|
ASSERT_REG_POSITION(texture0_format, 0x8e);
|
|
|
+ASSERT_REG_POSITION(fragment_lighting_enable, 0x8f);
|
|
|
ASSERT_REG_POSITION(texture1, 0x91);
|
|
|
ASSERT_REG_POSITION(texture1_format, 0x96);
|
|
|
ASSERT_REG_POSITION(texture2, 0x99);
|
|
|
@@ -1109,6 +1151,7 @@ ASSERT_REG_POSITION(tev_stage5, 0xf8);
|
|
|
ASSERT_REG_POSITION(tev_combiner_buffer_color, 0xfd);
|
|
|
ASSERT_REG_POSITION(output_merger, 0x100);
|
|
|
ASSERT_REG_POSITION(framebuffer, 0x110);
|
|
|
+ASSERT_REG_POSITION(lighting, 0x140);
|
|
|
ASSERT_REG_POSITION(vertex_attributes, 0x200);
|
|
|
ASSERT_REG_POSITION(index_array, 0x227);
|
|
|
ASSERT_REG_POSITION(num_vertices, 0x228);
|