Commit 177d85d2 by Nicolas Capens Committed by Nicolas Capens

Use pixel centers for non-multisampled rasterization

Previously the rasterizer was just using sample location 0. The Vulkan 1.1.130 spec states that "When VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT lines are being rasterized, sample locations may all be treated as being at the pixel center". And also "Do we need to support Bresenham-style and smooth lines with more than one rasterization sample? RESOLVED: Yes. For simplicity, Bresenham line rasterization carries forward a few restrictions from OpenGL, such as not supporting per-sample shading, alpha to coverage, or alpha to one." Bug: b/142965928 Change-Id: I586ffbaa92d506595d6fecfa2dbd64f10bdee0c8 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/40188 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent f324fe10
...@@ -79,6 +79,8 @@ SetupProcessor::State SetupProcessor::update(const sw::Context *context) const ...@@ -79,6 +79,8 @@ SetupProcessor::State SetupProcessor::update(const sw::Context *context) const
state.cullMode = context->cullMode; state.cullMode = context->cullMode;
state.multiSampleCount = context->sampleCount; state.multiSampleCount = context->sampleCount;
state.enableMultiSampling = (state.multiSampleCount > 1) &&
!(context->isDrawLine(true) && (context->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
state.rasterizerDiscard = context->rasterizerDiscard; state.rasterizerDiscard = context->rasterizerDiscard;
state.numClipDistances = context->vertexShader->getNumOutputClipDistances(); state.numClipDistances = context->vertexShader->getNumOutputClipDistances();
......
...@@ -52,6 +52,7 @@ public: ...@@ -52,6 +52,7 @@ public:
VkFrontFace frontFace : BITS(VK_FRONT_FACE_MAX_ENUM); VkFrontFace frontFace : BITS(VK_FRONT_FACE_MAX_ENUM);
VkCullModeFlags cullMode : BITS(VK_CULL_MODE_FLAG_BITS_MAX_ENUM); VkCullModeFlags cullMode : BITS(VK_CULL_MODE_FLAG_BITS_MAX_ENUM);
unsigned int multiSampleCount : 3; // 1, 2 or 4 unsigned int multiSampleCount : 3; // 1, 2 or 4
bool enableMultiSampling : 1;
bool rasterizerDiscard : 1; bool rasterizerDiscard : 1;
unsigned int numClipDistances : 4; // [0 - 8] unsigned int numClipDistances : 4; // [0 - 8]
unsigned int numCullDistances : 4; // [0 - 8] unsigned int numCullDistances : 4; // [0 - 8]
......
...@@ -166,7 +166,7 @@ void SetupRoutine::generate() ...@@ -166,7 +166,7 @@ void SetupRoutine::generate()
constexpr int subPixM = vk::SUBPIXEL_PRECISION_MASK; constexpr int subPixM = vk::SUBPIXEL_PRECISION_MASK;
constexpr float subPixF = vk::SUBPIXEL_PRECISION_FACTOR; constexpr float subPixF = vk::SUBPIXEL_PRECISION_FACTOR;
if(state.multiSampleCount > 1) if(state.enableMultiSampling)
{ {
yMin = (yMin + Constants::yMinMultiSampleOffset) >> subPixB; yMin = (yMin + Constants::yMinMultiSampleOffset) >> subPixB;
yMax = (yMax + Constants::yMaxMultiSampleOffset) >> subPixB; yMax = (yMax + Constants::yMaxMultiSampleOffset) >> subPixB;
...@@ -200,7 +200,7 @@ void SetupRoutine::generate() ...@@ -200,7 +200,7 @@ void SetupRoutine::generate()
Xq[i] = X[i]; Xq[i] = X[i];
Yq[i] = Y[i]; Yq[i] = Y[i];
if(state.multiSampleCount > 1) if(state.enableMultiSampling)
{ {
Xq[i] = Xq[i] + *Pointer<Int>(constants + OFFSET(Constants, Xf) + q * sizeof(int)); Xq[i] = Xq[i] + *Pointer<Int>(constants + OFFSET(Constants, Xf) + q * sizeof(int));
Yq[i] = Yq[i] + *Pointer<Int>(constants + OFFSET(Constants, Yf) + q * sizeof(int)); Yq[i] = Yq[i] + *Pointer<Int>(constants + OFFSET(Constants, Yf) + q * sizeof(int));
...@@ -213,7 +213,7 @@ void SetupRoutine::generate() ...@@ -213,7 +213,7 @@ void SetupRoutine::generate()
Pointer<Byte> leftEdge = Pointer<Byte>(primitive + OFFSET(Primitive, outline->left)) + q * sizeof(Primitive); Pointer<Byte> leftEdge = Pointer<Byte>(primitive + OFFSET(Primitive, outline->left)) + q * sizeof(Primitive);
Pointer<Byte> rightEdge = Pointer<Byte>(primitive + OFFSET(Primitive, outline->right)) + q * sizeof(Primitive); Pointer<Byte> rightEdge = Pointer<Byte>(primitive + OFFSET(Primitive, outline->right)) + q * sizeof(Primitive);
if(state.multiSampleCount > 1) if(state.enableMultiSampling)
{ {
Int xMin = *Pointer<Int>(data + OFFSET(DrawData, scissorX0)); Int xMin = *Pointer<Int>(data + OFFSET(DrawData, scissorX0));
Int xMax = *Pointer<Int>(data + OFFSET(DrawData, scissorX1)); Int xMax = *Pointer<Int>(data + OFFSET(DrawData, scissorX1));
...@@ -242,7 +242,7 @@ void SetupRoutine::generate() ...@@ -242,7 +242,7 @@ void SetupRoutine::generate()
Until(i >= n); Until(i >= n);
} }
if(state.multiSampleCount == 1) if(!state.enableMultiSampling)
{ {
For(, yMin < yMax && *Pointer<Short>(leftEdge + yMin * sizeof(Primitive::Span)) == *Pointer<Short>(rightEdge + yMin * sizeof(Primitive::Span)), yMin++) For(, yMin < yMax && *Pointer<Short>(leftEdge + yMin * sizeof(Primitive::Span)) == *Pointer<Short>(rightEdge + yMin * sizeof(Primitive::Span)), yMin++)
{ {
......
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