diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h index fa62536181..99fd3ee526 100644 --- a/hw/xbox/nv2a/nv2a_regs.h +++ b/hw/xbox/nv2a/nv2a_regs.h @@ -1099,6 +1099,11 @@ # define NV097_SET_TEXCOORD3_4F 0x00001620 # define NV097_SET_TEXCOORD3_2S 0x00001610 # define NV097_SET_TEXCOORD3_4S 0x00001630 +# define NV097_SET_FOG_COORD 0x00001698 +# define NV097_SET_WEIGHT1F 0x0000169C +# define NV097_SET_WEIGHT2F 0x000016A0 +# define NV097_SET_WEIGHT3F 0x000016B0 +# define NV097_SET_WEIGHT4F 0x000016C0 # define NV097_SET_VERTEX_DATA_ARRAY_OFFSET 0x00001720 # define NV097_SET_VERTEX_DATA_ARRAY_FORMAT 0x00001760 # define NV097_SET_VERTEX_DATA_ARRAY_FORMAT_TYPE 0x0000000F diff --git a/hw/xbox/nv2a/pgraph/methods.h.inc b/hw/xbox/nv2a/pgraph/methods.h.inc index fd6184426e..d2892c5501 100644 --- a/hw/xbox/nv2a/pgraph/methods.h.inc +++ b/hw/xbox/nv2a/pgraph/methods.h.inc @@ -134,6 +134,11 @@ DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_2F, 2) DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_4F, 4) DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_2S, 1) DEF_METHOD_RANGE(NV097, SET_TEXCOORD3_4S, 2) +DEF_METHOD(NV097, SET_FOG_COORD) +DEF_METHOD(NV097, SET_WEIGHT1F) +DEF_METHOD_RANGE(NV097, SET_WEIGHT2F, 2) +DEF_METHOD_RANGE(NV097, SET_WEIGHT3F, 3) +DEF_METHOD_RANGE(NV097, SET_WEIGHT4F, 4) DEF_METHOD_RANGE(NV097, SET_VERTEX_DATA_ARRAY_FORMAT, 16) DEF_METHOD_RANGE(NV097, SET_VERTEX_DATA_ARRAY_OFFSET, 16) DEF_METHOD(NV097, SET_LOGIC_OP_ENABLE) diff --git a/hw/xbox/nv2a/pgraph/pgraph.c b/hw/xbox/nv2a/pgraph/pgraph.c index 0f17fde184..14de8a78ff 100644 --- a/hw/xbox/nv2a/pgraph/pgraph.c +++ b/hw/xbox/nv2a/pgraph/pgraph.c @@ -2010,6 +2010,26 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F) } } +DEF_METHOD(NV097, SET_FOG_COORD) +{ + VertexAttribute *attribute = &pg->vertex_attributes[NV2A_VERTEX_ATTR_FOG]; + pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_FOG); + attribute->inline_value[0] = *(float*)¶meter; + attribute->inline_value[1] = attribute->inline_value[0]; + attribute->inline_value[2] = attribute->inline_value[0]; + attribute->inline_value[3] = attribute->inline_value[0]; +} + +DEF_METHOD(NV097, SET_WEIGHT1F) +{ + VertexAttribute *attribute = &pg->vertex_attributes[NV2A_VERTEX_ATTR_WEIGHT]; + pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_WEIGHT); + attribute->inline_value[0] = *(float*)¶meter; + attribute->inline_value[1] = 0.f; + attribute->inline_value[2] = 0.f; + attribute->inline_value[3] = 1.f; +} + DEF_METHOD_INC(NV097, SET_NORMAL3S) { int slot = (method - NV097_SET_NORMAL3S) / 4; @@ -2144,7 +2164,6 @@ DEF_METHOD_INC(NV097, SET_TEXCOORD1_4F) SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD1_4F, NV2A_VERTEX_ATTR_TEXTURE1); } - DEF_METHOD_INC(NV097, SET_TEXCOORD2_4F) { SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD2_4F, NV2A_VERTEX_ATTR_TEXTURE2); @@ -2155,8 +2174,34 @@ DEF_METHOD_INC(NV097, SET_TEXCOORD3_4F) SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD3_4F, NV2A_VERTEX_ATTR_TEXTURE3); } +DEF_METHOD_INC(NV097, SET_WEIGHT4F) +{ + SET_VERTEX_ATTRIBUTE_F(NV097_SET_WEIGHT4F, NV2A_VERTEX_ATTR_WEIGHT); +} + #undef SET_VERTEX_ATTRIBUTE_F +DEF_METHOD_INC(NV097, SET_WEIGHT2F) +{ + int slot = (method - NV097_SET_WEIGHT2F) / 4; + VertexAttribute *attribute = + &pg->vertex_attributes[NV2A_VERTEX_ATTR_WEIGHT]; + pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_WEIGHT); + attribute->inline_value[slot] = *(float*)¶meter; + attribute->inline_value[2] = 0.0f; + attribute->inline_value[3] = 1.0f; +} + +DEF_METHOD_INC(NV097, SET_WEIGHT3F) +{ + int slot = (method - NV097_SET_WEIGHT3F) / 4; + VertexAttribute *attribute = + &pg->vertex_attributes[NV2A_VERTEX_ATTR_WEIGHT]; + pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_WEIGHT); + attribute->inline_value[slot] = *(float*)¶meter; + attribute->inline_value[3] = 1.0f; +} + #define SET_VERTEX_ATRIBUTE_TEX_2F(command, attr_index) \ do { \ int slot = (method - (command)) / 4; \