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
void Context::setRasterizerDiscardEnabled(bool enabled)
{
UNIMPLEMENTED();
mState.rasterizerDiscardEnabled = enabled;
}
......@@ -3019,6 +3018,8 @@ void Context::applyState(GLenum drawMode)
mDitherStateDirty = false;
}
device->setRasterizerDiscard(mState.rasterizerDiscardEnabled);
}
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,
void Context::clear(GLbitfield mask)
{
if(mState.rasterizerDiscardEnabled)
{
return;
}
Framebuffer *framebuffer = getDrawFramebuffer();
if(!framebuffer || framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
......@@ -3400,7 +3406,7 @@ void Context::clear(GLbitfield mask)
void Context::clearColorBuffer(GLint drawbuffer, void *value, sw::Format format)
{
unsigned int rgbaMask = getColorMask();
if(device && rgbaMask)
if(device && rgbaMask && !mState.rasterizerDiscardEnabled)
{
int x0(0), y0(0), width(0), height(0);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, false);
......@@ -3432,7 +3438,7 @@ void Context::clearColorBuffer(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);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
......@@ -3446,7 +3452,7 @@ void Context::clearDepthBuffer(GLint drawbuffer, const GLfloat *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);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
......@@ -3460,7 +3466,7 @@ void Context::clearStencilBuffer(GLint drawbuffer, const GLint *value)
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);
egl::Image* image = getScissoredImage(drawbuffer, x0, y0, width, height, true);
......
......@@ -253,6 +253,8 @@ namespace sw
fillMode = FILL_SOLID;
shadingMode = SHADING_GOURAUD;
rasterizerDiscard = false;
depthCompareMode = DEPTH_LESS;
depthBufferEnable = true;
depthWriteEnable = true;
......
......@@ -494,6 +494,7 @@ namespace sw
bool occlusionEnabled;
// Pixel processor states
bool rasterizerDiscard;
bool depthBufferEnable;
DepthCompareMode depthCompareMode;
bool depthWriteEnable;
......
......@@ -821,7 +821,7 @@ namespace sw
startTick = time;
#endif
int visible = setupPrimitives(this, unit, count);
int visible = draw->setupState.rasterizerDiscard ? 0 : setupPrimitives(this, unit, count);
primitiveProgress[unit].visible = visible;
primitiveProgress[unit].references = clusterCount;
......@@ -2315,6 +2315,11 @@ namespace sw
slopeDepthBias = slopeBias;
}
void Renderer::setRasterizerDiscard(bool rasterizerDiscard)
{
context->rasterizerDiscard = rasterizerDiscard;
}
void Renderer::setPixelShader(const PixelShader *shader)
{
context->pixelShader = shader;
......
......@@ -340,6 +340,8 @@ namespace sw
virtual void setDepthBias(float bias);
virtual void setSlopeDepthBias(float slopeBias);
virtual void setRasterizerDiscard(bool rasterizerDiscard);
// Programmable pipelines
virtual void setPixelShader(const PixelShader *shader);
virtual void setVertexShader(const VertexShader *shader);
......
......@@ -89,6 +89,7 @@ namespace sw
state.pointSizeRegister = 0xF; // No vertex point size
state.multiSample = context->getMultiSampleCount();
state.rasterizerDiscard = context->rasterizerDiscard;
if(context->vertexShader)
{
......
......@@ -49,6 +49,7 @@ namespace sw
bool slopeDepthBias : 1;
bool vFace : 1;
unsigned int multiSample : 3; // 1, 2 or 4
bool rasterizerDiscard : 1;
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