1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Use software render to calculate frame buffer height.

This commit is contained in:
Sergey Lipskiy 2017-03-02 21:56:40 +07:00
parent 483212f382
commit c8e6644bd7
4 changed files with 39 additions and 35 deletions

View File

@ -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;
}
}
}

View File

@ -1,9 +1,11 @@
#include <assert.h>
#include <algorithm>
#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;
}

View File

@ -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

View File

@ -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)