softgpu: Compute func IDs once per batch of verts.

This saves a decent chunk of time, especially when many verts are being
drawn.
This commit is contained in:
Unknown W. Brackets committed 2022-01-10 22:12:35 -08:00
1 parent c8247401be
commit d7a82ab7b8
7 files changed
+81 -89

No files matched your search

+26 -20
View File
@@ -30,6 +30,7 @@
#include "GPU/Debugger/Debugger.h"
#include "GPU/Software/TransformUnit.h"
#include "GPU/Software/Clipper.h"
#include "GPU/Software/FuncId.h"
#include "GPU/Software/Lighting.h"
#include "GPU/Software/RasterizerRectangle.h"
@@ -339,6 +340,11 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
// TODO: Do this in two passes - first process the vertices (before indexing/stripping),
// then resolve the indices. This lets us avoid transforming shared vertices twice.
PixelFuncID pixelID;
ComputePixelFuncID(&pixelID);
SamplerID samplerID;
ComputeSamplerID(&samplerID);
bool outside_range_flag = false;
switch (prim_type) {
case GE_PRIM_POINTS:
@@ -370,22 +376,22 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
case GE_PRIM_TRIANGLES:
{
if (!gstate.isCullEnabled() || gstate.isModeClear()) {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[2]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[2]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[2], pixelID, samplerID);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[2], pixelID, samplerID);
} else if (!gstate.getCullMode()) {
Clipper::ProcessTriangle(data[2], data[1], data[0], data[2]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[2], pixelID, samplerID);
} else {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[2]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[2], pixelID, samplerID);
}
break;
}
case GE_PRIM_LINES:
Clipper::ProcessLine(data[0], data[1]);
Clipper::ProcessLine(data[0], data[1], pixelID, samplerID);
break;
case GE_PRIM_POINTS:
Clipper::ProcessPoint(data[0]);
Clipper::ProcessPoint(data[0], pixelID, samplerID);
break;
default:
@@ -425,14 +431,14 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
}
if (data_index == 4) {
Clipper::ProcessRect(data[0], data[1]);
Clipper::ProcessRect(data[2], data[3]);
Clipper::ProcessRect(data[0], data[1], pixelID, samplerID);
Clipper::ProcessRect(data[2], data[3], pixelID, samplerID);
data_index = 0;
}
}
if (data_index >= 2) {
Clipper::ProcessRect(data[0], data[1]);
Clipper::ProcessRect(data[0], data[1], pixelID, samplerID);
data_index -= 2;
}
break;
@@ -461,7 +467,7 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
--skip_count;
} else {
// We already incremented data_index, so data_index & 1 is previous one.
Clipper::ProcessLine(data[data_index & 1], data[(data_index & 1) ^ 1]);
Clipper::ProcessLine(data[data_index & 1], data[(data_index & 1) ^ 1], pixelID, samplerID);
}
}
break;
@@ -487,7 +493,7 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
// If a strip is effectively a rectangle, draw it as such!
if (!outside_range_flag && Rasterizer::DetectRectangleFromThroughModeStrip(data)) {
Clipper::ProcessRect(data[0], data[3]);
Clipper::ProcessRect(data[0], data[3], pixelID, samplerID);
break;
}
}
@@ -515,14 +521,14 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
}
if (!gstate.isCullEnabled() || gstate.isModeClear()) {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index], pixelID, samplerID);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index], pixelID, samplerID);
} else if ((!gstate.getCullMode()) ^ ((data_index - 1) % 2)) {
// We need to reverse the vertex order for each second primitive,
// but we additionally need to do that for every primitive if CCW cullmode is used.
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index], pixelID, samplerID);
} else {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index], pixelID, samplerID);
}
}
break;
@@ -563,7 +569,7 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
int tl = -1, br = -1;
if (!outside_range_flag && Rasterizer::DetectRectangleFromThroughModeFan(data, vertex_count, &tl, &br)) {
Clipper::ProcessRect(data[tl], data[br]);
Clipper::ProcessRect(data[tl], data[br], pixelID, samplerID);
break;
}
}
@@ -591,14 +597,14 @@ void TransformUnit::SubmitPrimitive(void* vertices, void* indices, GEPrimitiveTy
}
if (!gstate.isCullEnabled() || gstate.isModeClear()) {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index], pixelID, samplerID);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index], pixelID, samplerID);
} else if ((!gstate.getCullMode()) ^ ((data_index - 1) % 2)) {
// We need to reverse the vertex order for each second primitive,
// but we additionally need to do that for every primitive if CCW cullmode is used.
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index]);
Clipper::ProcessTriangle(data[2], data[1], data[0], data[provoking_index], pixelID, samplerID);
} else {
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index]);
Clipper::ProcessTriangle(data[0], data[1], data[2], data[provoking_index], pixelID, samplerID);
}
}
break;