From c8e6644bd72a4af5cd6649c26b0c4e7ecb7d461c Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Thu, 2 Mar 2017 21:56:40 +0700 Subject: [PATCH] Use software render to calculate frame buffer height. --- src/GraphicsDrawer.cpp | 33 +++++++++++++++++++-------------- src/SoftwareRender.cpp | 20 ++++++++++++++------ src/SoftwareRender.h | 2 +- src/gDP.cpp | 19 +++++-------------- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/GraphicsDrawer.cpp b/src/GraphicsDrawer.cpp index eec5a3dd..0749d22f 100644 --- a/src/GraphicsDrawer.cpp +++ b/src/GraphicsDrawer.cpp @@ -660,13 +660,15 @@ void GraphicsDrawer::drawTriangles() triParams.combiner = currentCombiner(); gfxContext.drawTriangles(triParams); - if (config.frameBufferEmulation.enable != 0 && - config.frameBufferEmulation.copyDepthToRDRAM == Config::cdSoftwareRender && - gDP.otherMode.depthUpdate != 0) { - renderTriangles(triangles.vertices.data(), triangles.elements.data(), triangles.num); - FrameBuffer * pCurrentDepthBuffer = frameBufferList().findBuffer(gDP.depthImageAddress); - if (pCurrentDepthBuffer != nullptr) - pCurrentDepthBuffer->m_cleared = false; + if (config.frameBufferEmulation.enable != 0) { + const f32 maxY = renderTriangles(triangles.vertices.data(), triangles.elements.data(), triangles.num); + gDP.colorImage.height = std::max(gDP.colorImage.height, (u32)maxY); + if (config.frameBufferEmulation.copyDepthToRDRAM == Config::cdSoftwareRender && + gDP.otherMode.depthUpdate != 0) { + FrameBuffer * pCurrentDepthBuffer = frameBufferList().findBuffer(gDP.depthImageAddress); + if (pCurrentDepthBuffer != nullptr) + pCurrentDepthBuffer->m_cleared = false; + } } triangles.num = 0; @@ -681,6 +683,7 @@ void GraphicsDrawer::drawScreenSpaceTriangle(u32 _numVtx) for (u32 i = 0; i < _numVtx; ++i) { SPVertex & vtx = m_dmaVertices[i]; vtx.modify = MODIFY_ALL; + gDP.colorImage.height = std::max(gDP.colorImage.height, (u32)vtx.y); } m_modifyVertices = MODIFY_ALL; @@ -715,13 +718,15 @@ void GraphicsDrawer::drawDMATriangles(u32 _numVtx) triParams.combiner = currentCombiner(); gfxContext.drawTriangles(triParams); - if (config.frameBufferEmulation.enable != 0 && - config.frameBufferEmulation.copyDepthToRDRAM == Config::cdSoftwareRender && - gDP.otherMode.depthUpdate != 0) { - renderTriangles(m_dmaVertices.data(), nullptr, _numVtx); - FrameBuffer * pCurrentDepthBuffer = frameBufferList().findBuffer(gDP.depthImageAddress); - if (pCurrentDepthBuffer != nullptr) - pCurrentDepthBuffer->m_cleared = false; + if (config.frameBufferEmulation.enable != 0) { + const f32 maxY = renderTriangles(m_dmaVertices.data(), nullptr, _numVtx); + gDP.colorImage.height = std::max(gDP.colorImage.height, (u32)maxY); + if (config.frameBufferEmulation.copyDepthToRDRAM == Config::cdSoftwareRender && + gDP.otherMode.depthUpdate != 0) { + FrameBuffer * pCurrentDepthBuffer = frameBufferList().findBuffer(gDP.depthImageAddress); + if (pCurrentDepthBuffer != nullptr) + pCurrentDepthBuffer->m_cleared = false; + } } } diff --git a/src/SoftwareRender.cpp b/src/SoftwareRender.cpp index b478be8e..f3e78c50 100644 --- a/src/SoftwareRender.cpp +++ b/src/SoftwareRender.cpp @@ -1,9 +1,11 @@ #include +#include #include "DepthBufferRender/ClipPolygon.h" #include "DepthBufferRender/DepthBufferRender.h" #include "gSP.h" #include "SoftwareRender.h" #include "DepthBuffer.h" +#include "Config.h" inline void clipTest(vertexclip & _vtx) @@ -162,16 +164,13 @@ int clipW(const SPVertex ** _vsrc, SPVertex * _vdst) return dsti; } -void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _numElements) +f32 renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _numElements) { - //Current depth buffer can be null if we are loading from a save state - if(depthBufferList().getCurrent() == nullptr) - return; - vertexclip vclip[16]; vertexi vdraw[12]; const SPVertex * vsrc[4]; SPVertex vdata[6]; + f32 maxY = 0.0f; for (u32 i = 0; i < _numElements; i += 3) { u32 orbits = 0; if (_pElements != nullptr) { @@ -198,6 +197,7 @@ void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _nu assert(numVertex == 3); if ((gSP.geometryMode & G_CULL_BACK) != 0) { for (int k = 0; k < 3; ++k) { + maxY = std::max(maxY, vclip[k].y); vdraw[k].x = floatToFixed16(vclip[k].x); vdraw[k].y = floatToFixed16(vclip[k].y); vdraw[k].z = floatToFixed16(vclip[k].z); @@ -205,6 +205,7 @@ void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _nu } else { for (int k = 0; k < 3; ++k) { const u32 idx = 3 - k - 1; + maxY = std::max(maxY, vclip[idx].y); vdraw[k].x = floatToFixed16(vclip[idx].x); vdraw[k].y = floatToFixed16(vclip[idx].y); vdraw[k].z = floatToFixed16(vclip[idx].z); @@ -218,6 +219,7 @@ void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _nu if ((gSP.geometryMode & G_CULL_BACK) != 0) { for (int k = 0; k < numVertex; ++k) { + maxY = std::max(maxY, vtx[k]->y); vdraw[k].x = floatToFixed16(vtx[k]->x); vdraw[k].y = floatToFixed16(vtx[k]->y); vdraw[k].z = floatToFixed16(vtx[k]->z); @@ -225,6 +227,7 @@ void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _nu } else { for (int k = 0; k < numVertex; ++k) { const u32 idx = numVertex - k - 1; + maxY = std::max(maxY, vtx[idx]->y); vdraw[k].x = floatToFixed16(vtx[idx]->x); vdraw[k].y = floatToFixed16(vtx[idx]->y); vdraw[k].z = floatToFixed16(vtx[idx]->z); @@ -232,6 +235,11 @@ void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _nu } } - Rasterize(vdraw, numVertex, dzdx); + //Current depth buffer can be null if we are loading from a save state + if (depthBufferList().getCurrent() != nullptr && + config.frameBufferEmulation.copyDepthToRDRAM == Config::cdSoftwareRender && + gDP.otherMode.depthUpdate != 0) + Rasterize(vdraw, numVertex, dzdx); } + return maxY; } diff --git a/src/SoftwareRender.h b/src/SoftwareRender.h index 99ed7d73..2c1ca9ac 100644 --- a/src/SoftwareRender.h +++ b/src/SoftwareRender.h @@ -3,6 +3,6 @@ #include "gSP.h" -void renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _numElements); +f32 renderTriangles(const SPVertex * _pVertices, const u8 * _pElements, u32 _numElements); #endif // SOFTWARE_RENDER_H diff --git a/src/gDP.cpp b/src/gDP.cpp index accc8461..88213a82 100644 --- a/src/gDP.cpp +++ b/src/gDP.cpp @@ -801,16 +801,10 @@ void gDPFillRectangle( s32 ulx, s32 uly, s32 lrx, s32 lry ) } } - if (lrx == gDP.colorImage.width) { - if (gDP.otherMode.cycleType == G_CYC_FILL) { - if (lry > (u32)gDP.scissor.lry) - gDP.colorImage.height = (u32)max(gDP.colorImage.height, (u32)gDP.scissor.lry); - else - gDP.colorImage.height = (u32)max((s32)gDP.colorImage.height, lry); - } - else - gDP.colorImage.height = max(gDP.colorImage.height, (u32)gDP.scissor.lry); - } + if (lry > (u32)gDP.scissor.lry) + gDP.colorImage.height = max(gDP.colorImage.height, (u32)gDP.scissor.lry); + else + gDP.colorImage.height = max(gDP.colorImage.height, (u32)lry); #ifdef DEBUG DebugMsg( DEBUG_HIGH | DEBUG_HANDLED, "gDPFillRectangle( %i, %i, %i, %i );\n", @@ -894,10 +888,7 @@ void gDPTextureRectangle(f32 ulx, f32 uly, f32 lrx, f32 lry, s32 tile, f32 s, f3 gSP.textureTile[1] = textureTileOrg[1]; frameBufferList().setBufferChanged(); - if (gDP.colorImage.width < 64) - gDP.colorImage.height = (u32)max( (f32)gDP.colorImage.height, lry ); - else - gDP.colorImage.height = max( gDP.colorImage.height, (u32)gDP.scissor.lry ); + gDP.colorImage.height = max(gDP.colorImage.height, (u32)lry); #ifdef DEBUG if (flip)