From d17e019684f5471147cb08a3d63088242b367a6c Mon Sep 17 00:00:00 2001 From: Erik Abair Date: Mon, 24 Jan 2022 13:05:27 -0800 Subject: [PATCH] nv2a: Implement vertex attribute setters --- hw/xbox/nv2a/nv2a_regs.h | 7 ++++++ hw/xbox/nv2a/pgraph.c | 45 +++++++++++++++++++++++++++++++++++ hw/xbox/nv2a/pgraph_methods.h | 7 ++++++ 3 files changed, 59 insertions(+) diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h index e512287761..de86c27029 100644 --- a/hw/xbox/nv2a/nv2a_regs.h +++ b/hw/xbox/nv2a/nv2a_regs.h @@ -1040,6 +1040,13 @@ # 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_DIFFUSE_COLOR4F 0x00001550 +# 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_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 3c693a8532..4647a4466d 100644 --- a/hw/xbox/nv2a/pgraph.c +++ b/hw/xbox/nv2a/pgraph.c @@ -2241,6 +2241,51 @@ DEF_METHOD_INC(NV097, SET_VERTEX4F) } } +#define SET_VERTEX_ATTRIBUTE(command, attr_index, num_params) \ + int slot = (method - (command)) / (num_params); \ + VertexAttribute *attribute = &pg->vertex_attributes[(attr_index)]; \ + pgraph_allocate_inline_buffer_vertices(pg, (attr_index)); \ + attribute->inline_value[slot] = *(float*)¶meter + +DEF_METHOD_INC(NV097, SET_NORMAL) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_NORMAL, NV2A_VERTEX_ATTR_NORMAL, 3); +} + +DEF_METHOD_INC(NV097, SET_DIFFUSE_COLOR4F) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_DIFFUSE_COLOR4F, NV2A_VERTEX_ATTR_DIFFUSE, + 4); +} + +DEF_METHOD_INC(NV097, SET_SPECULAR_COLOR4F) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_SPECULAR_COLOR4F, NV2A_VERTEX_ATTR_SPECULAR, + 4); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD0) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD0, NV2A_VERTEX_ATTR_TEXTURE0, 2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD1) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD1, NV2A_VERTEX_ATTR_TEXTURE1, 2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD2) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD2, NV2A_VERTEX_ATTR_TEXTURE2, 2); +} + +DEF_METHOD_INC(NV097, SET_TEXCOORD3) +{ + SET_VERTEX_ATTRIBUTE(NV097_SET_TEXCOORD3, NV2A_VERTEX_ATTR_TEXTURE3, 2); +} + +#undef SET_VERTEX_ATTRIBUTE + DEF_METHOD_INC(NV097, SET_VERTEX_DATA_ARRAY_FORMAT) { int slot = (method - NV097_SET_VERTEX_DATA_ARRAY_FORMAT) / 4; diff --git a/hw/xbox/nv2a/pgraph_methods.h b/hw/xbox/nv2a/pgraph_methods.h index bd058e2717..8bd6e62657 100644 --- a/hw/xbox/nv2a/pgraph_methods.h +++ b/hw/xbox/nv2a/pgraph_methods.h @@ -107,6 +107,13 @@ 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_DIFFUSE_COLOR4F, 4) +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_VERTEX_DATA_ARRAY_FORMAT, 16) DEF_METHOD_RANGE(NV097, SET_VERTEX_DATA_ARRAY_OFFSET, 16) DEF_METHOD(NV097, SET_LOGIC_OP_ENABLE)