---
src/gallium/drivers/swr/rasterizer/core/api.cpp| 13 +-
src/gallium/drivers/swr/rasterizer/core/clip.h | 4 +-
.../drivers/swr/rasterizer/core/conservativeRast.h | 120 +++
src/gallium/drivers/swr/rasterizer/core/context.h | 2 +
.../drivers/swr/rasterizer/core/frontend.cpp | 163 +++--
src/gallium/drivers/swr/rasterizer/core/frontend.h | 43 +-
.../drivers/swr/rasterizer/core/rasterizer.h | 8 +
src/gallium/drivers/swr/rasterizer/core/state.h| 4 +-
src/gallium/drivers/swr/rasterizer/core/utils.h| 30
9 files changed, 324 insertions(+), 63 deletions(-)
create mode 100644 src/gallium/drivers/swr/rasterizer/core/conservativeRast.h
diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp
b/src/gallium/drivers/swr/rasterizer/core/api.cpp
index 22a94fb..cec4519 100644
--- a/src/gallium/drivers/swr/rasterizer/core/api.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp
@@ -780,10 +780,7 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
const bool bMultisampleEnable = ((rastState.sampleCount >
SWR_MULTISAMPLE_1X) || rastState.forcedSampleCount) ? 1 : 0;
const uint32_t centroid = ((psState.barycentricsMask &
SWR_BARYCENTRIC_CENTROID_MASK) > 0) ? 1 : 0;
const uint32_t canEarlyZ = (psState.forceEarlyZ ||
(!psState.writesODepth && !psState.usesSourceDepth && !psState.usesUAV)) ? 1 :
0;
-
-// currently only support 'normal' input coverage
-SWR_ASSERT(psState.inputCoverage == SWR_INPUT_COVERAGE_NORMAL ||
- psState.inputCoverage == SWR_INPUT_COVERAGE_NONE);
+const uint32_t inputCoverage = (psState.inputCoverage !=
SWR_INPUT_COVERAGE_NONE);
SWR_BARYCENTRICS_MASK barycentricsMask =
(SWR_BARYCENTRICS_MASK)psState.barycentricsMask;
@@ -795,20 +792,20 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
{
// always need to generate I & J per sample for Z interpolation
barycentricsMask = (SWR_BARYCENTRICS_MASK)(barycentricsMask |
SWR_BARYCENTRIC_PER_SAMPLE_MASK);
-backendFuncs.pfnBackend =
gBackendPixelRateTable[rastState.sampleCount][rastState.samplePattern][psState.inputCoverage][centroid][forcedSampleCount][canEarlyZ];
+backendFuncs.pfnBackend =
gBackendPixelRateTable[rastState.sampleCount][rastState.samplePattern][inputCoverage][centroid][forcedSampleCount][canEarlyZ];
}
else
{
// always need to generate I & J per pixel for Z interpolation
barycentricsMask = (SWR_BARYCENTRICS_MASK)(barycentricsMask |
SWR_BARYCENTRIC_PER_PIXEL_MASK);
-backendFuncs.pfnBackend =
gBackendSingleSample[psState.inputCoverage][centroid][canEarlyZ];
+backendFuncs.pfnBackend =
gBackendSingleSample[inputCoverage][centroid][canEarlyZ];
}
break;
case SWR_SHADING_RATE_SAMPLE:
SWR_ASSERT(rastState.samplePattern == SWR_MSAA_STANDARD_PATTERN);
// always need to generate I & J per sample for Z interpolation
barycentricsMask = (SWR_BARYCENTRICS_MASK)(barycentricsMask |
SWR_BARYCENTRIC_PER_SAMPLE_MASK);
-backendFuncs.pfnBackend =
gBackendSampleRateTable[rastState.sampleCount][psState.inputCoverage][centroid][canEarlyZ];
+backendFuncs.pfnBackend =
gBackendSampleRateTable[rastState.sampleCount][inputCoverage][centroid][canEarlyZ];
break;
default:
SWR_ASSERT(0 && "Invalid shading rate");
@@ -833,7 +830,7 @@ void SetupPipeline(DRAW_CONTEXT *pDC)
break;
default:
pState->pfnProcessPrims = ClipTriangles;
-pfnBinner = BinTriangles;
+pfnBinner = GetBinTrianglesFunc((rastState.conservativeRast > 0));
break;
};
diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h
b/src/gallium/drivers/swr/rasterizer/core/clip.h
index 67a4c4f..1a6fc6d 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.h
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.h
@@ -385,7 +385,7 @@ public:
PRIMITIVE_TOPOLOGY clipTopology = TOP_UNKNOWN;
if (NumVertsPerPrim == 3)
{
-pfnBinFunc = BinTriangles;
+pfnBinFunc =
GetBinTrianglesFunc((pa.pDC->pState->state.rastState.conservativeRast > 0));
clipTopology = TOP_TRIANGLE_FAN;
// so that the binner knows to bloat wide points later
@@ -519,7 +519,7 @@ public:
pfnBinner = BinLines;
break;
default:
-pfnBinner = BinTriangles;
+pfnBinner =
GetBinTrianglesFunc((pa.pDC->pState->state.rastState.conservativeRast > 0));
break;
};
diff --git a/src/gallium/drivers/swr/rasterizer/core/conservativeRast.h
b/src/gallium/drivers/swr/rasterizer/core/conservativeRast.h
new file mode 100644
index 000..f8aa8df
--- /dev/null
+++