diff options
author | yz70s <yz70s@users.noreply.github.com> | 2016-12-18 14:31:26 +0100 |
---|---|---|
committer | yz70s <yz70s@users.noreply.github.com> | 2016-12-25 11:09:36 +0100 |
commit | 12d1f769c7e89ace99c5eab002f9eb7b33211ffa (patch) | |
tree | 71257aa9084c6e475ed2a18b8fcea7f81e8bab81 | |
parent | 4d25b92252361ad70f6418e14d28f6c221008917 (diff) |
xbox: update w clipping and disable it since it still causes problems (nw)
-rw-r--r-- | src/mame/includes/xbox_nv2a.h | 5 | ||||
-rw-r--r-- | src/mame/video/xbox_nv2a.cpp | 108 |
2 files changed, 62 insertions, 51 deletions
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h index ec3879e1a6c..2fcb38f5321 100644 --- a/src/mame/includes/xbox_nv2a.h +++ b/src/mame/includes/xbox_nv2a.h @@ -374,7 +374,9 @@ public: objectdata->data = this; combiner.used = 0; enabled_vertex_attributes = 0; + primitives_total_count = 0; indexesleft_count = 0; + triangles_bfculled = 0; vertex_pipeline = 4; color_mask = 0xffffffff; backface_culling_enabled = false; @@ -490,6 +492,7 @@ public: int read_vertices_0x1818(address_space & space, vertex_nv *destination, uint32_t address, int limit); void convert_vertices_poly(vertex_nv *source, nv2avertex_t *destination, int count); void assemble_primitive(vertex_nv *source, int count, render_delegate &renderspans); + int clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo); uint32_t render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); uint32_t render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); void clear_render_target(int what, uint32_t value); @@ -563,8 +566,10 @@ public: int rectheight; int rectwidth; } texture[4]; + uint32_t triangles_bfculled; NV2A_BEGIN_END primitive_type; uint32_t primitives_count; + uint32_t primitives_total_count; int indexesleft_count; int indexesleft_first; uint32_t indexesleft[1024]; // vertex indices sent by the software to the 3d accelerator diff --git a/src/mame/video/xbox_nv2a.cpp b/src/mame/video/xbox_nv2a.cpp index bd761a8259e..bbaa6bffcdb 100644 --- a/src/mame/video/xbox_nv2a.cpp +++ b/src/mame/video/xbox_nv2a.cpp @@ -2627,7 +2627,10 @@ uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, rende if (backface_culling_enabled == false) return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3); if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT_AND_BACK) + { + triangles_bfculled++; return 0; + } areax2 = _v1.x*(_v2.y - _v3.y) + _v2.x*(_v3.y - _v1.y) + _v3.x*(_v1.y - _v2.y); if (backface_culling_winding == NV2A_GL_FRONT_FACE::CCW) { @@ -2648,53 +2651,18 @@ uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, rende if (face == NV2A_GL_CULL_FACE::BACK) if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT) return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3); + triangles_bfculled++; return 0; } -uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) +int nv2a_renderer::clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo) { - nv2avertex_t *vi[3]; - nv2avertex_t vo[16]; int idx_prev, idx_curr; int neg_prev, neg_curr; double tfactor; int idx; - const double wthreshold = 0.00000001; + const double wthreshold = 0.000001; - if ((_v1.w > 0) && (_v2.w > 0) && (_v3.w > 0)) - return render_triangle_culling(cliprect, callback, paramcount, _v1, _v2, _v3); - // assign the elements of the array - vi[0] = &_v1; - vi[1] = &_v2; - vi[2] = &_v3; - // go back to the state before perpective divide - if (vertex_pipeline == 4) - { - for (int n = 0; n < 3; n++) - { - vi[n]->x = (vi[n]->x / (double)supersample_factor_x)*vi[n]->w; - vi[n]->y = (vi[n]->y / (double)supersample_factor_y)*vi[n]->w; - vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] * vi[n]->w; - } - } else - { - for (int n = 0; n < 3; n++) - { - // remove translate - vi[n]->x = vi[n]->x - matrix.translate[0]; - vi[n]->y = vi[n]->y - matrix.translate[1]; - vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] - matrix.translate[2]; - // remove scale - vi[n]->x = vi[n]->x / matrix.translate[0]; - vi[n]->y = vi[n]->y / matrix.translate[1]; - vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] / matrix.translate[2]; - // remove perspective divide - vi[n]->x = vi[n]->x * vi[n]->w; - vi[n]->y = vi[n]->y * vi[n]->w; - vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] * vi[n]->w; - } - } - // do the clipping idx_prev = 2; idx_curr = 0; idx = 0; @@ -2726,10 +2694,53 @@ uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, rend idx_prev = idx_curr; idx_curr++; } + return idx; +} + +uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3) +{ +#if 0 + nv2avertex_t *vi[3]; + nv2avertex_t vo[16]; + int nv; +#endif + + if ((_v1.w > 0) && (_v2.w > 0) && (_v3.w > 0)) + return render_triangle_culling(cliprect, callback, paramcount, _v1, _v2, _v3); +#if 0 + // assign the elements of the array + vi[0] = &_v1; + vi[1] = &_v2; + vi[2] = &_v3; + // go back to the state before perpective divide + if (vertex_pipeline == 4) + { + for (int n = 0; n < 3; n++) + { + vi[n]->x = (vi[n]->x / (double)supersample_factor_x)*vi[n]->w; + vi[n]->y = (vi[n]->y / (double)supersample_factor_y)*vi[n]->w; + vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] * vi[n]->w; + } + } else + { + for (int n = 0; n < 3; n++) + { + // remove translate + vi[n]->x = vi[n]->x - matrix.translate[0]; + vi[n]->y = vi[n]->y - matrix.translate[1]; + vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] - matrix.translate[2]; + // remove perspective divide + vi[n]->x = vi[n]->x * vi[n]->w; + vi[n]->y = vi[n]->y * vi[n]->w; + vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] = vi[n]->p[(int)VERTEX_PARAMETER::PARAM_Z] * vi[n]->w; + } + } + // do the clipping + nv = clip_triangle_w(vi, vo); // screen coordinates for the new points if (vertex_pipeline == 4) { - for (int n = 0; n < idx; n++) + for (int n = 0; n < nv; n++) { vo[n].x = vo[n].x*(double)supersample_factor_x / vo[n].w; vo[n].y = vo[n].y*(double)supersample_factor_y / vo[n].w; @@ -2737,34 +2748,28 @@ uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, rend } } else { - for (int n = 0; n < idx; n++) + for (int n = 0; n < nv; n++) { // apply perspective divide vo[n].x = vo[n].x / vo[n].w; vo[n].y = vo[n].y / vo[n].w; vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] = vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] / vo[n].w; - // apply scale - vo[n].x = vo[n].x * matrix.scale[0]; - vo[n].y = vo[n].y * matrix.scale[1]; - vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] = vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] * matrix.scale[2]; // apply translate vo[n].x = vo[n].x + matrix.translate[0]; vo[n].y = vo[n].y + matrix.translate[1]; vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] = vo[n].p[(int)VERTEX_PARAMETER::PARAM_Z] + matrix.translate[2]; } } - for (int n = 0; n < (idx - 2); n++) - { - if ((n & 1) == 0) - render_triangle_culling(cliprect, callback, paramcount, vo[n], vo[n + 1], vo[n + 2]); - else - render_triangle_culling(cliprect, callback, paramcount, vo[n], vo[n + 2], vo[n + 1]); - } + for (int n = 1; n <= (nv - 2); n++) + render_triangle_culling(cliprect, callback, paramcount, vo[0], vo[n], vo[n + 1]); +#endif return 0; } void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_delegate &renderspans) { + uint32_t pc = primitives_count; + for (; count > 0; count--) { if (primitive_type == NV2A_BEGIN_END::QUADS) { convert_vertices_poly(source, vertex_xy + vertex_count + vertex_accumulated, 1); @@ -2872,6 +2877,7 @@ void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_dele vertex_count++; } } + primitives_total_count += primitives_count - pc; } void nv2a_renderer::compute_limits_rendertarget(uint32_t chanel, uint32_t subchannel) |