mirror of https://github.com/xemu-project/xemu.git
nv2a: Add missing vertex attribute setters
This commit is contained in:
parent
1adc52c136
commit
8689e640bd
hw/xbox/nv2a
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue