aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-07-05 18:11:00 +0200
committerStapleButter <thetotalworm@gmail.com>2017-07-05 18:11:00 +0200
commit01404ac6c37c8dc9e85d92c629293c654bc4a503 (patch)
treecac75b90bdd4d85873767c034ad935784839bb66 /src
parent1acf355d99c3afbc17d5ddfbd2392369eda2dad7 (diff)
3D: move opaque/translucent sorting to GPU3D.cpp
Diffstat (limited to 'src')
-rw-r--r--src/GPU3D.cpp22
-rw-r--r--src/GPU3D.h5
-rw-r--r--src/GPU3D_Soft.cpp19
3 files changed, 26 insertions, 20 deletions
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index 25d0476..d91daaa 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -248,6 +248,7 @@ u32 VertexNum;
u32 VertexNumInPoly;
u32 NumConsecutivePolygons;
Polygon* LastStripPolygon;
+u32 NumOpaquePolygons;
Vertex VertexRAM[6144 * 2];
Polygon PolygonRAM[2048 * 2];
@@ -257,8 +258,7 @@ Polygon* CurPolygonRAM;
u32 NumVertices, NumPolygons;
u32 CurRAMBank;
-Vertex* RenderVertexRAM;
-Polygon* RenderPolygonRAM;
+std::array<Polygon*,2048> RenderPolygonRAM;
u32 RenderNumPolygons;
u32 FlushRequest;
@@ -338,6 +338,7 @@ void Reset()
CurPolygonRAM = &PolygonRAM[0];
NumVertices = 0;
NumPolygons = 0;
+ NumOpaquePolygons = 0;
// TODO: confirm initial polyid/color/fog values
ClearAttr1 = 0x3F000000;
@@ -754,6 +755,8 @@ void SubmitPolygon()
poly->IsShadowMask = ((CurPolygonAttr & 0x3F000030) == 0x00000030);
poly->IsShadow = ((CurPolygonAttr & 0x30) == 0x30) && !poly->IsShadowMask;
+ if (!poly->Translucent) NumOpaquePolygons++;
+
if (LastStripPolygon && clipstart > 0)
{
if (nverts == lastpolyverts)
@@ -1792,8 +1795,18 @@ void VBlank()
{
if (FlushRequest)
{
- RenderVertexRAM = CurVertexRAM;
- RenderPolygonRAM = CurPolygonRAM;
+ // separate translucent polygons from opaque ones
+
+ u32 io = 0, it = NumOpaquePolygons;
+ for (u32 i = 0; i < NumPolygons; i++)
+ {
+ Polygon* poly = &CurPolygonRAM[i];
+ if (poly->Translucent)
+ RenderPolygonRAM[it++] = poly;
+ else
+ RenderPolygonRAM[io++] = poly;
+ }
+
RenderNumPolygons = NumPolygons;
RenderDispCnt = DispCnt;
@@ -1817,6 +1830,7 @@ void VBlank()
NumVertices = 0;
NumPolygons = 0;
+ NumOpaquePolygons = 0;
FlushRequest = 0;
}
diff --git a/src/GPU3D.h b/src/GPU3D.h
index 91a745f..8a6beec 100644
--- a/src/GPU3D.h
+++ b/src/GPU3D.h
@@ -19,6 +19,8 @@
#ifndef GPU3D_H
#define GPU3D_H
+#include <array>
+
namespace GPU3D
{
@@ -77,8 +79,7 @@ extern u8 RenderFogDensityTable[34];
extern u32 RenderClearAttr1, RenderClearAttr2;
-extern Vertex* RenderVertexRAM;
-extern Polygon* RenderPolygonRAM;
+extern std::array<Polygon*,2048> RenderPolygonRAM;
extern u32 RenderNumPolygons;
bool Init();
diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp
index b12ed8c..c55ee1e 100644
--- a/src/GPU3D_Soft.cpp
+++ b/src/GPU3D_Soft.cpp
@@ -1675,7 +1675,7 @@ void ClearBuffers()
}
}
-void RenderPolygons(bool threaded, Polygon* polygons, int npolys)
+void RenderPolygons(bool threaded, Polygon** polygons, int npolys)
{
// sort polygons
// TODO: Y-sorting for translucent polygons
@@ -1686,17 +1686,8 @@ void RenderPolygons(bool threaded, Polygon* polygons, int npolys)
int j = 0;
for (int i = 0; i < npolys; i++)
{
- if (polygons[i].Translucent) continue;
-
- if (polygons[i].YBottom > 192) continue;
- SetupPolygon(&PolygonList[j++], &polygons[i]);
- }
- for (int i = 0; i < npolys; i++)
- {
- if (!polygons[i].Translucent) continue;
-
- if (polygons[i].YBottom > 192) continue;
- SetupPolygon(&PolygonList[j++], &polygons[i]);
+ if (polygons[i]->YBottom > 192) continue;
+ SetupPolygon(&PolygonList[j++], polygons[i]);
}
RenderScanline(0, j);
@@ -1731,7 +1722,7 @@ void RenderFrame()
else
{
ClearBuffers();
- RenderPolygons(false, RenderPolygonRAM, RenderNumPolygons);
+ RenderPolygons(false, &RenderPolygonRAM[0], RenderNumPolygons);
}
}
@@ -1744,7 +1735,7 @@ void RenderThreadFunc()
RenderThreadRendering = true;
ClearBuffers();
- RenderPolygons(true, RenderPolygonRAM, RenderNumPolygons);
+ RenderPolygons(true, &RenderPolygonRAM[0], RenderNumPolygons);
Platform::Semaphore_Post(Sema_RenderDone);
RenderThreadRendering = false;