From 8689e640bdd588c42b254e9d4782f588f99d26f4 Mon Sep 17 00:00:00 2001 From: Erik Abair Date: Mon, 24 Jan 2022 16:53:14 -0800 Subject: [PATCH] nv2a: Add missing vertex attribute setters --- hw/xbox/nv2a/nv2a_regs.h | 27 ++++- hw/xbox/nv2a/pgraph.c | 190 +++++++++++++++++++++++++++++++--- hw/xbox/nv2a/pgraph_methods.h | 27 ++++- 3 files changed, 220 insertions(+), 24 deletions(-) diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h index 4a9f18b0c4..8e0110f2d1 100644 --- a/hw/xbox/nv2a/nv2a_regs.h +++ b/hw/xbox/nv2a/nv2a_regs.h @@ -1041,13 +1041,30 @@ # define NV097_SET_LIGHT_LOCAL_POSITION 0x0000105C # define NV097_SET_LIGHT_LOCAL_ATTENUATION 0x00001068 # define NV097_SET_VERTEX4F 0x00001518 -# define NV097_SET_NORMAL 0x00001530 +# define NV097_SET_NORMAL3F 0x00001530 +# define NV097_SET_NORMAL3S 0x00001540 # define NV097_SET_DIFFUSE_COLOR4F 0x00001550 +# define NV097_SET_DIFFUSE_COLOR3F 0x00001560 +# define NV097_SET_DIFFUSE_COLOR4UB 0x0000156C # define NV097_SET_SPECULAR_COLOR4F 0x00001570 -# define NV097_SET_TEXCOORD0 0x00001590 -# define NV097_SET_TEXCOORD1 0x000015B8 -# define NV097_SET_TEXCOORD2 0x000015E0 -# define NV097_SET_TEXCOORD3 0x00001608 +# define NV097_SET_SPECULAR_COLOR3F 0x00001580 +# define NV097_SET_SPECULAR_COLOR4UB 0x0000158C +# define NV097_SET_TEXCOORD0_2F 0x00001590 +# define NV097_SET_TEXCOORD0_4F 0x000015A0 +# define NV097_SET_TEXCOORD0_2S 0x00001598 +# define NV097_SET_TEXCOORD0_4S 0x000015B0 +# define NV097_SET_TEXCOORD1_2F 0x000015B8 +# define NV097_SET_TEXCOORD1_4F 0x000015C8 +# define NV097_SET_TEXCOORD1_2S 0x000015C0 +# define NV097_SET_TEXCOORD1_4S 0x000015D8 +# define NV097_SET_TEXCOORD2_2F 0x000015E0 +# define NV097_SET_TEXCOORD2_4F 0x000015F0 +# define NV097_SET_TEXCOORD2_2S 0x000015E8 +# define NV097_SET_TEXCOORD2_4S 0x00001600 +# define NV097_SET_TEXCOORD3_2F 0x00001608 +# define NV097_SET_TEXCOORD3_4F 0x00001620 +# define NV097_SET_TEXCOORD3_2S 0x00001610 +# define NV097_SET_TEXCOORD3_4S 0x00001630 # 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.c b/hw/xbox/nv2a/pgraph.c index a1703be5c3..f1861a54d7 100644 --- a/hw/xbox/nv2a/pgraph.c +++ b/hw/xbox/nv2a/pgraph.c @@ -2260,7 +2260,107 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F) } } -#define SET_VERTEX_ATTRIBUTE(command, attr_index) \ +DEF_METHOD_INC(NV097, SET_NORMAL3S) +{ + int slot = (method - NV097_SET_NORMAL3S) / 4; + unsigned int part = slot % 2; + VertexAttribute *attribute = + &pg->vertex_attributes[NV2A_VERTEX_ATTR_NORMAL]; + pgraph_allocate_inline_buffer_vertices(pg, NV2A_VERTEX_ATTR_NORMAL); + int16_t val = parameter & 0xFFFF; + attribute->inline_value[part * 2 + 0] = MAX(-1.0f, (float)val / 32767.0f); + val = parameter >> 16; + attribute->inline_value[part * 2 + 1] = MAX(-1.0f, (float)val / 32767.0f); +} + +#define SET_VERTEX_ATTRIBUTE_4S(command, attr_index) \ + do { \ + int slot = (method - (command)) / 4; \ + unsigned int part = slot % 2; \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[part * 2 + 0] = \ + (float)(int16_t)(parameter & 0xFFFF); \ + attribute->inline_value[part * 2 + 1] = \ + (float)(int16_t)(parameter >> 16); \ + } while (0) + +DEF_METHOD_INC(NV097, SET_TEXCOORD0_4S) +{ + SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD0_4S, NV2A_VERTEX_ATTR_TEXTURE0); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD1_4S) +{ + SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD1_4S, NV2A_VERTEX_ATTR_TEXTURE1); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD2_4S) +{ + SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD2_4S, NV2A_VERTEX_ATTR_TEXTURE2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD3_4S) +{ + SET_VERTEX_ATTRIBUTE_4S(NV097_SET_TEXCOORD3_4S, NV2A_VERTEX_ATTR_TEXTURE3); +} + +#undef SET_VERTEX_ATTRIBUTE_4S + +#define SET_VERTEX_ATRIBUTE_TEX_2S(attr_index) \ + do { \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[0] = (float)(int16_t)(parameter & 0xFFFF); \ + attribute->inline_value[1] = (float)(int16_t)(parameter >> 16); \ + attribute->inline_value[2] = 0.0f; \ + attribute->inline_value[3] = 1.0f; \ + } while (0) + +DEF_METHOD_INC(NV097, SET_TEXCOORD0_2S) +{ + SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE0); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD1_2S) +{ + SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE1); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD2_2S) +{ + SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD3_2S) +{ + SET_VERTEX_ATRIBUTE_TEX_2S(NV2A_VERTEX_ATTR_TEXTURE3); +} + +#undef SET_VERTEX_ATRIBUTE_TEX_2S + +#define SET_VERTEX_COLOR_3F(command, attr_index) \ + do { \ + int slot = (method - (command)) / 4; \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[slot] = *(float*)¶meter; \ + attribute->inline_value[3] = 1.0f; \ + } while (0) + +DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR3F) +{ + SET_VERTEX_COLOR_3F(NV097_SET_DIFFUSE_COLOR3F, NV2A_VERTEX_ATTR_DIFFUSE); +} + +DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR3F) +{ + SET_VERTEX_COLOR_3F(NV097_SET_SPECULAR_COLOR3F, NV2A_VERTEX_ATTR_SPECULAR); +} + +#undef SET_VERTEX_COLOR_3F + +#define SET_VERTEX_ATTRIBUTE_F(command, attr_index) \ do { \ int slot = (method - (command)) / 4; \ VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ @@ -2268,42 +2368,104 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F) attribute->inline_value[slot] = *(float*)¶meter; \ } while (0) -DEF_METHOD_INC(NV097, SET_NORMAL) +DEF_METHOD_INC(NV097, SET_NORMAL3F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_NORMAL, NV2A_VERTEX_ATTR_NORMAL); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_NORMAL3F, NV2A_VERTEX_ATTR_NORMAL); } DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_DIFFUSE_COLOR4F, NV2A_VERTEX_ATTR_DIFFUSE); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_DIFFUSE_COLOR4F, NV2A_VERTEX_ATTR_DIFFUSE); } DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_SPECULAR_COLOR4F, NV2A_VERTEX_ATTR_SPECULAR); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_SPECULAR_COLOR4F, + NV2A_VERTEX_ATTR_SPECULAR); } -DEF_METHOD_INC(NV097, SET_TEXCOORD0) +DEF_METHOD_INC(NV097, SET_TEXCOORD0_4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD0, NV2A_VERTEX_ATTR_TEXTURE0); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD0_4F, NV2A_VERTEX_ATTR_TEXTURE0); } -DEF_METHOD_INC(NV097, SET_TEXCOORD1) +DEF_METHOD_INC(NV097, SET_TEXCOORD1_4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD1, NV2A_VERTEX_ATTR_TEXTURE1); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD1_4F, NV2A_VERTEX_ATTR_TEXTURE1); } -DEF_METHOD_INC(NV097, SET_TEXCOORD2) + +DEF_METHOD_INC(NV097, SET_TEXCOORD2_4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD2, NV2A_VERTEX_ATTR_TEXTURE2); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD2_4F, NV2A_VERTEX_ATTR_TEXTURE2); } -DEF_METHOD_INC(NV097, SET_TEXCOORD3) +DEF_METHOD_INC(NV097, SET_TEXCOORD3_4F) { - SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD3, NV2A_VERTEX_ATTR_TEXTURE3); + SET_VERTEX_ATTRIBUTE_F(NV097_SET_TEXCOORD3_4F, NV2A_VERTEX_ATTR_TEXTURE3); } -#undef SET_VERTEX_ATTRIBUTE +#undef SET_VERTEX_ATTRIBUTE_F + +#define SET_VERTEX_ATRIBUTE_TEX_2F(command, attr_index) \ + do { \ + int slot = (method - (command)) / 4; \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[slot] = *(float*)¶meter; \ + attribute->inline_value[2] = 0.0f; \ + attribute->inline_value[3] = 1.0f; \ + } while (0) + +DEF_METHOD_INC(NV097, SET_TEXCOORD0_2F) +{ + SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD0_2F, + NV2A_VERTEX_ATTR_TEXTURE0); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD1_2F) +{ + SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD1_2F, + NV2A_VERTEX_ATTR_TEXTURE1); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD2_2F) +{ + SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD2_2F, + NV2A_VERTEX_ATTR_TEXTURE2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD3_2F) +{ + SET_VERTEX_ATRIBUTE_TEX_2F(NV097_SET_TEXCOORD3_2F, + NV2A_VERTEX_ATTR_TEXTURE3); +} + +#undef SET_VERTEX_ATRIBUTE_TEX_2F + +#define SET_VERTEX_ATTRIBUTE_4UB(command, attr_index) \ + do { \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[0] = (parameter & 0xFF) / 255.0f; \ + attribute->inline_value[1] = ((parameter >> 8) & 0xFF) / 255.0f; \ + attribute->inline_value[2] = ((parameter >> 16) & 0xFF) / 255.0f; \ + attribute->inline_value[3] = ((parameter >> 24) & 0xFF) / 255.0f; \ + } while (0) + +DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR4UB) +{ + SET_VERTEX_ATTRIBUTE_4UB(NV097_SET_DIFFUSE_COLOR4UB, + NV2A_VERTEX_ATTR_DIFFUSE); +} + +DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR4UB) +{ + SET_VERTEX_ATTRIBUTE_4UB(NV097_SET_SPECULAR_COLOR4UB, + NV2A_VERTEX_ATTR_SPECULAR); +} + +#undef SET_VERTEX_ATTRIBUTE_4UB DEF_METHOD_INC(NV097, SET_VERTEX_DATA_ARRAY_FORMAT) { diff --git a/hw/xbox/nv2a/pgraph_methods.h b/hw/xbox/nv2a/pgraph_methods.h index fb29b51e26..c5fe209904 100644 --- a/hw/xbox/nv2a/pgraph_methods.h +++ b/hw/xbox/nv2a/pgraph_methods.h @@ -108,13 +108,30 @@ DEF_METHOD_RANGE(NV097, SET_VERTEX3F, 3) DEF_METHOD_RANGE(NV097, SET_BACK_LIGHT_AMBIENT_COLOR, 8*16) DEF_METHOD_RANGE(NV097, SET_LIGHT_AMBIENT_COLOR, 8*32) DEF_METHOD_RANGE(NV097, SET_VERTEX4F, 4) -DEF_METHOD_RANGE(NV097, SET_NORMAL, 3) +DEF_METHOD_RANGE(NV097, SET_NORMAL3F, 3) +DEF_METHOD_RANGE(NV097, SET_NORMAL3S, 3) DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR4F, 4) +DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR3F, 3) +DEF_METHOD_RANGE(NV097, SET_DIFFUSE_COLOR4UB, 1) DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR4F, 4) -DEF_METHOD_RANGE(NV097, SET_TEXCOORD0, 2) -DEF_METHOD_RANGE(NV097, SET_TEXCOORD1, 2) -DEF_METHOD_RANGE(NV097, SET_TEXCOORD2, 2) -DEF_METHOD_RANGE(NV097, SET_TEXCOORD3, 2) +DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR3F, 3) +DEF_METHOD_RANGE(NV097, SET_SPECULAR_COLOR4UB, 1) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_2F, 2) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_4F, 4) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_2S, 1) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD0_4S, 2) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_2F, 2) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_4F, 4) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_2S, 1) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD1_4S, 2) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_2F, 2) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_4F, 4) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_2S, 1) +DEF_METHOD_RANGE(NV097, SET_TEXCOORD2_4S, 2) +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_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)