mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-19 09:19:05 +02:00
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:
1 parent
c8247401be
commit
d7a82ab7b8
7 files changed
+81
-89
No files matched your search
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user