Commit b0f247f5 by Alexis Hetu Committed by Alexis Hétu

Rasterizer discard implementation

Implemented rasterizer discard by not using the SetupRoutine and always returning 0 when rasterizer discard is enabled. Also guarded all clear calls with a check for rasterizer discard. Passes all rasterizer discard related dEQP tests. Change-Id: I1e5c107e3dba550f7a5b01eb302ff51bdac303dc Reviewed-on: https://swiftshader-review.googlesource.com/4876Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent c0ebd09c
...@@ -635,7 +635,6 @@ bool Context::isPrimitiveRestartFixedIndexEnabled() const ...@@ -635,7 +635,6 @@ bool Context::isPrimitiveRestartFixedIndexEnabled() const
void Context::setRasterizerDiscardEnabled(bool enabled) void Context::setRasterizerDiscardEnabled(bool enabled)
{ {
UNIMPLEMENTED();
mState.rasterizerDiscardEnabled = enabled; mState.rasterizerDiscardEnabled = enabled;
} }
...@@ -3019,6 +3018,8 @@ void Context::applyState(GLenum drawMode) ...@@ -3019,6 +3018,8 @@ void Context::applyState(GLenum drawMode)
mDitherStateDirty = false; mDitherStateDirty = false;
} }
device->setRasterizerDiscard(mState.rasterizerDiscardEnabled);
} }
GLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count, GLsizei instanceId) GLenum Context::applyVertexBuffer(GLint base, GLint first, GLsizei count, GLsizei instanceId)
...@@ -3356,6 +3357,11 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -3356,6 +3357,11 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
void Context::clear(GLbitfield mask) void Context::clear(GLbitfield mask)
{ {
if(mState.rasterizerDiscardEnabled)
{
return;
}
Framebuffer *framebuffer = getDrawFramebuffer(); Framebuffer *framebuffer = getDrawFramebuffer();
if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
...@@ -3400,7 +3406,7 @@ void Context::clear(GLbitfield mask) ...@@ -3400,7 +3406,7 @@ void Context::clear(GLbitfield mask)
void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format) void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format)
{ {
unsigned int rgbaMask = getColorMask(); unsigned int rgbaMask = getColorMask();
if(device && rgbaMask) if(device && rgbaMask && !mState.rasterizerDiscardEnabled)
{ {
int x0(0), y0(0), width(0), height(0); int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, false); egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, false);
...@@ -3432,7 +3438,7 @@ void Context::clearColorBuffer(GLint drawbuffer, const GLfloat *value) ...@@ -3432,7 +3438,7 @@ void Context::clearColorBuffer(GLint drawbuffer, const GLfloat *value)
void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value) void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value)
{ {
if(device && mState.depthMask) if(device && mState.depthMask && !mState.rasterizerDiscardEnabled)
{ {
int x0(0), y0(0), width(0), height(0); int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true); egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
...@@ -3446,7 +3452,7 @@ void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value) ...@@ -3446,7 +3452,7 @@ void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *value)
void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value) void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value)
{ {
if(device && mState.stencilWritemask) if(device && mState.stencilWritemask && !mState.rasterizerDiscardEnabled)
{ {
int x0(0), y0(0), width(0), height(0); int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true); egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
...@@ -3460,7 +3466,7 @@ void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value) ...@@ -3460,7 +3466,7 @@ void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value)
void Context::clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil) void Context::clearDepthStencilBuffer(GLint drawbuffer, GLfloat depth, GLint stencil)
{ {
if(device && (mState.depthMask || mState.stencilWritemask)) if(device && (mState.depthMask || mState.stencilWritemask) && !mState.rasterizerDiscardEnabled)
{ {
int x0(0), y0(0), width(0), height(0); int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true); egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
......
...@@ -253,6 +253,8 @@ namespace sw ...@@ -253,6 +253,8 @@ namespace sw
fillMode = FILL_SOLID; fillMode = FILL_SOLID;
shadingMode = SHADING_GOURAUD; shadingMode = SHADING_GOURAUD;
rasterizerDiscard = false;
depthCompareMode = DEPTH_LESS; depthCompareMode = DEPTH_LESS;
depthBufferEnable = true; depthBufferEnable = true;
depthWriteEnable = true; depthWriteEnable = true;
......
...@@ -494,6 +494,7 @@ namespace sw ...@@ -494,6 +494,7 @@ namespace sw
bool occlusionEnabled; bool occlusionEnabled;
// Pixel processor states // Pixel processor states
bool rasterizerDiscard;
bool depthBufferEnable; bool depthBufferEnable;
DepthCompareMode depthCompareMode; DepthCompareMode depthCompareMode;
bool depthWriteEnable; bool depthWriteEnable;
......
...@@ -821,7 +821,7 @@ namespace sw ...@@ -821,7 +821,7 @@ namespace sw
startTick = time; startTick = time;
#endif #endif
int visible = setupPrimitives(this, unit, count); int visible = draw->setupState.rasterizerDiscard ? 0 : setupPrimitives(this, unit, count);
primitiveProgress[unit].visible = visible; primitiveProgress[unit].visible = visible;
primitiveProgress[unit].references = clusterCount; primitiveProgress[unit].references = clusterCount;
...@@ -2315,6 +2315,11 @@ namespace sw ...@@ -2315,6 +2315,11 @@ namespace sw
slopeDepthBias = slopeBias; slopeDepthBias = slopeBias;
} }
void Renderer::setRasterizerDiscard(bool rasterizerDiscard)
{
context->rasterizerDiscard = rasterizerDiscard;
}
void Renderer::setPixelShader(const PixelShader *shader) void Renderer::setPixelShader(const PixelShader *shader)
{ {
context->pixelShader = shader; context->pixelShader = shader;
......
...@@ -340,6 +340,8 @@ namespace sw ...@@ -340,6 +340,8 @@ namespace sw
virtual void setDepthBias(float bias); virtual void setDepthBias(float bias);
virtual void setSlopeDepthBias(float slopeBias); virtual void setSlopeDepthBias(float slopeBias);
virtual void setRasterizerDiscard(bool rasterizerDiscard);
// Programmable pipelines // Programmable pipelines
virtual void setPixelShader(const PixelShader *shader); virtual void setPixelShader(const PixelShader *shader);
virtual void setVertexShader(const VertexShader *shader); virtual void setVertexShader(const VertexShader *shader);
......
...@@ -89,6 +89,7 @@ namespace sw ...@@ -89,6 +89,7 @@ namespace sw
state.pointSizeRegister = 0xF; // No vertex point size state.pointSizeRegister = 0xF; // No vertex point size
state.multiSample = context->getMultiSampleCount(); state.multiSample = context->getMultiSampleCount();
state.rasterizerDiscard = context->rasterizerDiscard;
if(context->vertexShader) if(context->vertexShader)
{ {
......
...@@ -49,6 +49,7 @@ namespace sw ...@@ -49,6 +49,7 @@ namespace sw
bool slopeDepthBias : 1; bool slopeDepthBias : 1;
bool vFace : 1; bool vFace : 1;
unsigned int multiSample : 3; // 1, 2 or 4 unsigned int multiSample : 3; // 1, 2 or 4
bool rasterizerDiscard : 1;
struct Gradient struct Gradient
{ {
......
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