From a6d70ee24662d6356e9a7ad2d395f961b301cea4 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sun, 24 May 2020 17:20:19 +0200 Subject: [PATCH] xbox_nv2a.cpp: some refactoring before modifying vertex data reading (nw) --- src/mame/includes/xbox_nv2a.h | 21 ++++++------- src/mame/video/xbox_nv2a.cpp | 55 ++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h index c16e009ed7d..90c8fff55e7 100644 --- a/src/mame/includes/xbox_nv2a.h +++ b/src/mame/includes/xbox_nv2a.h @@ -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; diff --git a/src/mame/video/xbox_nv2a.cpp b/src/mame/video/xbox_nv2a.cpp index d858f2b9856..2d1132b13bd 100644 --- a/src/mame/video/xbox_nv2a.cpp +++ b/src/mame/video/xbox_nv2a.cpp @@ -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--; }