From b0030755708849eb27fe2bf1cc481c5ab905468e Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 9 Sep 2015 22:39:43 -0400 Subject: pica: Implement decoding of basic fragment lighting components. - Diffuse - Distance attenuation - float16/float20 types - Vertex Shader 'view' output --- src/video_core/pica.h | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 10 deletions(-) (limited to 'src/video_core/pica.h') diff --git a/src/video_core/pica.h b/src/video_core/pica.h index b09484de4..178a4b83f 100644 --- a/src/video_core/pica.h +++ b/src/video_core/pica.h @@ -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); -- cgit v1.2.3