mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
xbox_nv2a.cpp: some refactoring before modifying vertex data reading (nw)
This commit is contained in:
parent
095e965492
commit
a6d70ee246
@ -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;
|
||||
|
@ -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--;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user