Commit 734392e6 by Nicolas Capens

Refactor primitive setup functions.

Use a pointer to member function to not explicitly pass the renderer pointer. Change-Id: Iaccc1d7a1833fbdb433c56063c89b6178e9e2333 Reviewed-on: https://swiftshader-review.googlesource.com/5422Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 234c9a9e
...@@ -251,21 +251,21 @@ namespace sw ...@@ -251,21 +251,21 @@ namespace sw
int batch = batchSize / ms; int batch = batchSize / ms;
int (*setupPrimitives)(Renderer *renderer, int batch, int count); int (Renderer::*setupPrimitives)(int batch, int count);
if(context->isDrawTriangle()) if(context->isDrawTriangle())
{ {
switch(context->fillMode) switch(context->fillMode)
{ {
case FILL_SOLID: case FILL_SOLID:
setupPrimitives = setupSolidTriangles; setupPrimitives = &Renderer::setupSolidTriangles;
break; break;
case FILL_WIREFRAME: case FILL_WIREFRAME:
setupPrimitives = setupWireframeTriangle; setupPrimitives = &Renderer::setupWireframeTriangle;
batch = 1; batch = 1;
break; break;
case FILL_VERTEX: case FILL_VERTEX:
setupPrimitives = setupVertexTriangle; setupPrimitives = &Renderer::setupVertexTriangle;
batch = 1; batch = 1;
break; break;
default: ASSERT(false); default: ASSERT(false);
...@@ -273,11 +273,11 @@ namespace sw ...@@ -273,11 +273,11 @@ namespace sw
} }
else if(context->isDrawLine()) else if(context->isDrawLine())
{ {
setupPrimitives = setupLines; setupPrimitives = &Renderer::setupLines;
} }
else // Point draw else // Point draw
{ {
setupPrimitives = setupPoints; setupPrimitives = &Renderer::setupPoints;
} }
DrawCall *draw = 0; DrawCall *draw = 0;
...@@ -841,7 +841,7 @@ namespace sw ...@@ -841,7 +841,7 @@ namespace sw
int input = primitiveProgress[unit].firstPrimitive; int input = primitiveProgress[unit].firstPrimitive;
int count = primitiveProgress[unit].primitiveCount; int count = primitiveProgress[unit].primitiveCount;
DrawCall *draw = drawList[primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall *draw = drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
int (*setupPrimitives)(Renderer *renderer, int batch, int count) = draw->setupPrimitives; int (Renderer::*setupPrimitives)(int batch, int count) = draw->setupPrimitives;
processPrimitiveVertices(unit, input, count, draw->count, threadIndex); processPrimitiveVertices(unit, input, count, draw->count, threadIndex);
...@@ -851,7 +851,12 @@ namespace sw ...@@ -851,7 +851,12 @@ namespace sw
startTick = time; startTick = time;
#endif #endif
int visible = draw->setupState.rasterizerDiscard ? 0 : setupPrimitives(this, unit, count); int visible = 0;
if(!draw->setupState.rasterizerDiscard)
{
visible = (this->*setupPrimitives)(unit, count);
}
primitiveProgress[unit].visible = visible; primitiveProgress[unit].visible = visible;
primitiveProgress[unit].references = clusterCount; primitiveProgress[unit].references = clusterCount;
...@@ -1465,12 +1470,12 @@ namespace sw ...@@ -1465,12 +1470,12 @@ namespace sw
vertexRoutine(&triangle->v0, (unsigned int*)&batch, task, data); vertexRoutine(&triangle->v0, (unsigned int*)&batch, task, data);
} }
int Renderer::setupSolidTriangles(Renderer *renderer, int unit, int count) int Renderer::setupSolidTriangles(int unit, int count)
{ {
Triangle *triangle = renderer->triangleBatch[unit]; Triangle *triangle = triangleBatch[unit];
Primitive *primitive = renderer->primitiveBatch[unit]; Primitive *primitive = primitiveBatch[unit];
DrawCall &draw = *renderer->drawList[renderer->primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall &draw = *drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
SetupProcessor::State &state = draw.setupState; SetupProcessor::State &state = draw.setupState;
const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer; const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer;
...@@ -1493,7 +1498,7 @@ namespace sw ...@@ -1493,7 +1498,7 @@ namespace sw
if(clipFlagsOr != Clipper::CLIP_FINITE) if(clipFlagsOr != Clipper::CLIP_FINITE)
{ {
if(!renderer->clipper->clip(polygon, clipFlagsOr, draw)) if(!clipper->clip(polygon, clipFlagsOr, draw))
{ {
continue; continue;
} }
...@@ -1510,13 +1515,13 @@ namespace sw ...@@ -1510,13 +1515,13 @@ namespace sw
return visible; return visible;
} }
int Renderer::setupWireframeTriangle(Renderer *renderer, int unit, int count) int Renderer::setupWireframeTriangle(int unit, int count)
{ {
Triangle *triangle = renderer->triangleBatch[unit]; Triangle *triangle = triangleBatch[unit];
Primitive *primitive = renderer->primitiveBatch[unit]; Primitive *primitive = primitiveBatch[unit];
int visible = 0; int visible = 0;
DrawCall &draw = *renderer->drawList[renderer->primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall &draw = *drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
SetupProcessor::State &state = draw.setupState; SetupProcessor::State &state = draw.setupState;
SetupProcessor::RoutinePointer setupRoutine = draw.setupPointer; SetupProcessor::RoutinePointer setupRoutine = draw.setupPointer;
...@@ -1554,7 +1559,7 @@ namespace sw ...@@ -1554,7 +1559,7 @@ namespace sw
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
{ {
if(setupLine(renderer, *primitive, *triangle, draw)) if(setupLine(*primitive, *triangle, draw))
{ {
primitive->area = 0.5f * d; primitive->area = 0.5f * d;
...@@ -1568,13 +1573,13 @@ namespace sw ...@@ -1568,13 +1573,13 @@ namespace sw
return visible; return visible;
} }
int Renderer::setupVertexTriangle(Renderer *renderer, int unit, int count) int Renderer::setupVertexTriangle(int unit, int count)
{ {
Triangle *triangle = renderer->triangleBatch[unit]; Triangle *triangle = triangleBatch[unit];
Primitive *primitive = renderer->primitiveBatch[unit]; Primitive *primitive = primitiveBatch[unit];
int visible = 0; int visible = 0;
DrawCall &draw = *renderer->drawList[renderer->primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall &draw = *drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
SetupProcessor::State &state = draw.setupState; SetupProcessor::State &state = draw.setupState;
const Vertex &v0 = triangle[0].v0; const Vertex &v0 = triangle[0].v0;
...@@ -1598,7 +1603,7 @@ namespace sw ...@@ -1598,7 +1603,7 @@ namespace sw
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
{ {
if(setupPoint(renderer, *primitive, *triangle, draw)) if(setupPoint(*primitive, *triangle, draw))
{ {
primitive->area = 0.5f * d; primitive->area = 0.5f * d;
...@@ -1612,20 +1617,20 @@ namespace sw ...@@ -1612,20 +1617,20 @@ namespace sw
return visible; return visible;
} }
int Renderer::setupLines(Renderer *renderer, int unit, int count) int Renderer::setupLines(int unit, int count)
{ {
Triangle *triangle = renderer->triangleBatch[unit]; Triangle *triangle = triangleBatch[unit];
Primitive *primitive = renderer->primitiveBatch[unit]; Primitive *primitive = primitiveBatch[unit];
int visible = 0; int visible = 0;
DrawCall &draw = *renderer->drawList[renderer->primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall &draw = *drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
SetupProcessor::State &state = draw.setupState; SetupProcessor::State &state = draw.setupState;
int ms = state.multiSample; int ms = state.multiSample;
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
if(setupLine(renderer, *primitive, *triangle, draw)) if(setupLine(*primitive, *triangle, draw))
{ {
primitive += ms; primitive += ms;
visible++; visible++;
...@@ -1637,20 +1642,20 @@ namespace sw ...@@ -1637,20 +1642,20 @@ namespace sw
return visible; return visible;
} }
int Renderer::setupPoints(Renderer *renderer, int unit, int count) int Renderer::setupPoints(int unit, int count)
{ {
Triangle *triangle = renderer->triangleBatch[unit]; Triangle *triangle = triangleBatch[unit];
Primitive *primitive = renderer->primitiveBatch[unit]; Primitive *primitive = primitiveBatch[unit];
int visible = 0; int visible = 0;
DrawCall &draw = *renderer->drawList[renderer->primitiveProgress[unit].drawCall % DRAW_COUNT]; DrawCall &draw = *drawList[primitiveProgress[unit].drawCall % DRAW_COUNT];
SetupProcessor::State &state = draw.setupState; SetupProcessor::State &state = draw.setupState;
int ms = state.multiSample; int ms = state.multiSample;
for(int i = 0; i < count; i++) for(int i = 0; i < count; i++)
{ {
if(setupPoint(renderer, *primitive, *triangle, draw)) if(setupPoint(*primitive, *triangle, draw))
{ {
primitive += ms; primitive += ms;
visible++; visible++;
...@@ -1662,7 +1667,7 @@ namespace sw ...@@ -1662,7 +1667,7 @@ namespace sw
return visible; return visible;
} }
bool Renderer::setupLine(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw) bool Renderer::setupLine(Primitive &primitive, Triangle &triangle, const DrawCall &draw)
{ {
const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer; const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer;
const SetupProcessor::State &state = draw.setupState; const SetupProcessor::State &state = draw.setupState;
...@@ -1743,7 +1748,7 @@ namespace sw ...@@ -1743,7 +1748,7 @@ namespace sw
if(clipFlagsOr != Clipper::CLIP_FINITE) if(clipFlagsOr != Clipper::CLIP_FINITE)
{ {
if(!renderer->clipper->clip(polygon, clipFlagsOr, draw)) if(!clipper->clip(polygon, clipFlagsOr, draw))
{ {
return false; return false;
} }
...@@ -1849,7 +1854,7 @@ namespace sw ...@@ -1849,7 +1854,7 @@ namespace sw
if(clipFlagsOr != Clipper::CLIP_FINITE) if(clipFlagsOr != Clipper::CLIP_FINITE)
{ {
if(!renderer->clipper->clip(polygon, clipFlagsOr, draw)) if(!clipper->clip(polygon, clipFlagsOr, draw))
{ {
return false; return false;
} }
...@@ -1862,7 +1867,7 @@ namespace sw ...@@ -1862,7 +1867,7 @@ namespace sw
return false; return false;
} }
bool Renderer::setupPoint(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw) bool Renderer::setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw)
{ {
const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer; const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer;
const SetupProcessor::State &state = draw.setupState; const SetupProcessor::State &state = draw.setupState;
...@@ -1928,7 +1933,7 @@ namespace sw ...@@ -1928,7 +1933,7 @@ namespace sw
if(clipFlagsOr != Clipper::CLIP_FINITE) if(clipFlagsOr != Clipper::CLIP_FINITE)
{ {
if(!renderer->clipper->clip(polygon, clipFlagsOr, draw)) if(!clipper->clip(polygon, clipFlagsOr, draw))
{ {
return false; return false;
} }
......
...@@ -221,7 +221,7 @@ namespace sw ...@@ -221,7 +221,7 @@ namespace sw
SetupProcessor::RoutinePointer setupPointer; SetupProcessor::RoutinePointer setupPointer;
PixelProcessor::RoutinePointer pixelPointer; PixelProcessor::RoutinePointer pixelPointer;
int (*setupPrimitives)(Renderer *renderer, int batch, int count); int (Renderer::*setupPrimitives)(int batch, int count);
SetupProcessor::State setupState; SetupProcessor::State setupState;
Resource *vertexStream[MAX_VERTEX_INPUTS]; Resource *vertexStream[MAX_VERTEX_INPUTS];
...@@ -404,14 +404,14 @@ namespace sw ...@@ -404,14 +404,14 @@ namespace sw
void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread); void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread);
static int setupSolidTriangles(Renderer *renderer, int batch, int count); int setupSolidTriangles(int batch, int count);
static int setupWireframeTriangle(Renderer *renderer, int batch, int count); int setupWireframeTriangle(int batch, int count);
static int setupVertexTriangle(Renderer *renderer, int batch, int count); int setupVertexTriangle(int batch, int count);
static int setupLines(Renderer *renderer, int batch, int count); int setupLines(int batch, int count);
static int setupPoints(Renderer *renderer, int batch, int count); int setupPoints(int batch, int count);
static bool setupLine(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); bool setupLine(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
static bool setupPoint(Renderer *renderer, Primitive &primitive, Triangle &triangle, const DrawCall &draw); bool setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
bool isReadWriteTexture(int sampler); bool isReadWriteTexture(int sampler);
void updateClipper(); void updateClipper();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment