xbox_nv2a.cpp: some refactoring before modifying vertex data reading (nw)

This commit is contained in:
yz70s 2020-05-24 17:20:19 +02:00
parent 095e965492
commit a6d70ee246
2 changed files with 39 additions and 37 deletions

View File

@ -412,7 +412,6 @@ public:
objectdata = &(rasterizer.object_data_alloc());
objectdata->data = this;
combiner.used = 0;
enabled_vertex_attributes = 0;
primitives_total_count = 0;
indexesleft_count = 0;
triangles_bfculled = 0;
@ -469,8 +468,7 @@ public:
debug_grab_textfile = nullptr;
enable_waitvblank = true;
enable_clipping_w = false;
memset(vertex_attribute_words, 0, sizeof(vertex_attribute_words));
memset(vertex_attribute_offset, 0, sizeof(vertex_attribute_offset));
memset(&vertexbuffer, 0, sizeof(vertexbuffer));
memset(&persistvertexattr, 0, sizeof(persistvertexattr));
for (int n = 0; n < 16; n++)
persistvertexattr.attribute[n].fv[3] = 1;
@ -592,10 +590,16 @@ public:
uint32_t *rendertarget;
uint32_t *depthbuffer;
uint32_t *displayedtarget;
uint32_t vertexbuffer_address[16];
int vertexbuffer_stride[16];
NV2A_VTXBUF_TYPE vertexbuffer_kind[16];
int vertexbuffer_size[16];
struct {
uint32_t address[16];
int type[16];
int stride[16];
NV2A_VTXBUF_TYPE kind[16];
int size[16];
int words[16];
int offset[16];
int enabled; // bitmask
} vertexbuffer;
struct {
int enabled;
int sizeu;
@ -780,9 +784,6 @@ public:
int upload_parameter_component;
} vertexprogram;
int vertex_pipeline;
int enabled_vertex_attributes;
int vertex_attribute_words[16];
int vertex_attribute_offset[16];
struct {
int format;

View File

@ -2326,8 +2326,8 @@ void nv2a_renderer::read_vertex(address_space &space, offs_t address, vertex_nv
uint32_t u;
int c, d, l;
l = vertexbuffer_size[attrib];
switch (vertexbuffer_kind[attrib]) {
l = vertexbuffer.size[attrib];
switch (vertexbuffer.kind[attrib]) {
case NV2A_VTXBUF_TYPE::FLOAT:
vertex.attribute[attrib].fv[0] = 0;
vertex.attribute[attrib].fv[1] = 0;
@ -2377,10 +2377,10 @@ int nv2a_renderer::read_vertices_0x180x(address_space &space, vertex_nv *destina
#endif
for (m = 0; m < limit; m++) {
memcpy(&destination[m], &persistvertexattr, sizeof(persistvertexattr));
b = enabled_vertex_attributes;
b = vertexbuffer.enabled;
for (a = 0; a < 16; a++) {
if (b & 1) {
read_vertex(space, vertexbuffer_address[a] + vertex_indexes[indexesleft_first] * vertexbuffer_stride[a], destination[m], a);
read_vertex(space, vertexbuffer.address[a] + vertex_indexes[indexesleft_first] * vertexbuffer.stride[a], destination[m], a);
}
b = b >> 1;
}
@ -2401,10 +2401,10 @@ int nv2a_renderer::read_vertices_0x1810(address_space &space, vertex_nv *destina
#endif
for (m = 0; m < limit; m++) {
memcpy(&destination[m], &persistvertexattr, sizeof(persistvertexattr));
b = enabled_vertex_attributes;
b = vertexbuffer.enabled;
for (a = 0; a < 16; a++) {
if (b & 1) {
read_vertex(space, vertexbuffer_address[a] + (m + offset)*vertexbuffer_stride[a], destination[m], a);
read_vertex(space, vertexbuffer.address[a] + (m + offset) * vertexbuffer.stride[a], destination[m], a);
}
b = b >> 1;
}
@ -2421,13 +2421,13 @@ int nv2a_renderer::read_vertices_0x1818(address_space &space, vertex_nv *destina
#ifdef MAME_DEBUG
memset(destination, 0, sizeof(vertex_nv)*limit);
#endif
vwords = vertex_attribute_words[15] + vertex_attribute_offset[15];
vwords = vertexbuffer.words[15] + vertexbuffer.offset[15];
for (m = 0; m < limit; m++) {
memcpy(&destination[m], &persistvertexattr, sizeof(persistvertexattr));
b = enabled_vertex_attributes;
b = vertexbuffer.enabled;
for (a = 0; a < 16; a++) {
if (b & 1) {
read_vertex(space, address + vertex_attribute_offset[a] * 4, destination[m], a);
read_vertex(space, address + vertexbuffer.offset[a] * 4, destination[m], a);
}
b = b >> 1;
}
@ -3232,44 +3232,45 @@ int nv2a_renderer::execute_method_3d(address_space& space, uint32_t chanel, uint
int bit = maddress / 4 - 0x1720 / 4;
if (data & 0x80000000)
vertexbuffer_address[bit] = (data & 0x0fffffff) + dma_offset[7];
vertexbuffer.address[bit] = (data & 0x0fffffff) + dma_offset[7];
else
vertexbuffer_address[bit] = (data & 0x0fffffff) + dma_offset[6];
vertexbuffer.address[bit] = (data & 0x0fffffff) + dma_offset[6];
}
if ((maddress >= 0x1760) && (maddress < 0x17A0)) {
int bit = maddress / 4 - 0x1760 / 4;
vertexbuffer_stride[bit] = (data >> 8) & 255;
vertexbuffer_kind[bit] = (NV2A_VTXBUF_TYPE)(data & 15);
vertexbuffer_size[bit] = (data >> 4) & 15;
switch (vertexbuffer_kind[bit]) {
vertexbuffer.type[bit] = data & 255;
vertexbuffer.stride[bit] = (data >> 8) & 255;
vertexbuffer.kind[bit] = (NV2A_VTXBUF_TYPE)(vertexbuffer.type[bit] & 15);
vertexbuffer.size[bit] = (vertexbuffer.type[bit] >> 4) & 15;
switch (vertexbuffer.kind[bit]) {
case NV2A_VTXBUF_TYPE::UBYTE_D3D:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 1) >> 2;
vertexbuffer.words[bit] = (vertexbuffer.size[bit] * 1) >> 2;
break;
case NV2A_VTXBUF_TYPE::FLOAT:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 4) >> 2;
vertexbuffer.words[bit] = (vertexbuffer.size[bit] * 4) >> 2;
break;
case NV2A_VTXBUF_TYPE::UBYTE_OGL:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 1) >> 2;
vertexbuffer.words[bit] = (vertexbuffer.size[bit] * 1) >> 2;
break;
case NV2A_VTXBUF_TYPE::USHORT:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 2) >> 2;
vertexbuffer.words[bit] = (vertexbuffer.size[bit] * 2) >> 2;
break;
case NV2A_VTXBUF_TYPE::FLOAT_PACKED:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 4) >> 2;
vertexbuffer.words[bit] = (vertexbuffer.size[bit] * 4) >> 2;
break;
default:
vertex_attribute_words[bit] = 0;
vertexbuffer.words[bit] = 0;
}
if (vertexbuffer_size[bit] > 0)
enabled_vertex_attributes |= (1 << bit);
if (vertexbuffer.size[bit] > 0)
vertexbuffer.enabled |= (1 << bit);
else
enabled_vertex_attributes &= ~(1 << bit);
vertexbuffer.enabled &= ~(1 << bit);
for (int n = bit + 1; n < 16; n++) {
if ((enabled_vertex_attributes & (1 << (n - 1))) != 0)
vertex_attribute_offset[n] = vertex_attribute_offset[n - 1] + vertex_attribute_words[n - 1];
if ((vertexbuffer.enabled & (1 << (n - 1))) != 0)
vertexbuffer.offset[n] = vertexbuffer.offset[n - 1] + vertexbuffer.words[n - 1];
else
vertex_attribute_offset[n] = vertex_attribute_offset[n - 1];
vertexbuffer.offset[n] = vertexbuffer.offset[n - 1];
}
countlen--;
}