Commit 4b3f4169 by Geoff Lang

Sync the entire rasterizer state before drawing in RendererGL.

BUG=angleproject:883 Change-Id: I721c198f33caa18ec04899d6323faa9dbd4aa100 Reviewed-on: https://chromium-review.googlesource.com/266035Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent b8517346
...@@ -527,6 +527,11 @@ void State::setLineWidth(GLfloat width) ...@@ -527,6 +527,11 @@ void State::setLineWidth(GLfloat width)
mLineWidth = width; mLineWidth = width;
} }
float State::getLineWidth() const
{
return mLineWidth;
}
void State::setGenerateMipmapHint(GLenum hint) void State::setGenerateMipmapHint(GLenum hint)
{ {
mGenerateMipmapHint = hint; mGenerateMipmapHint = hint;
......
...@@ -127,6 +127,7 @@ class State : angle::NonCopyable ...@@ -127,6 +127,7 @@ class State : angle::NonCopyable
// Line width state setter // Line width state setter
void setLineWidth(GLfloat width); void setLineWidth(GLfloat width);
float getLineWidth() const;
// Hint setters // Hint setters
void setGenerateMipmapHint(GLenum hint); void setGenerateMipmapHint(GLenum hint);
......
...@@ -66,6 +66,15 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren ...@@ -66,6 +66,15 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions, const gl::Caps &ren
mStencilBackStencilPassDepthFailOp(GL_KEEP), mStencilBackStencilPassDepthFailOp(GL_KEEP),
mStencilBackStencilPassDepthPassOp(GL_KEEP), mStencilBackStencilPassDepthPassOp(GL_KEEP),
mStencilBackWritemask(static_cast<GLuint>(-1)), mStencilBackWritemask(static_cast<GLuint>(-1)),
mCullFaceEnabled(false),
mCullFace(GL_BACK),
mFrontFace(GL_CCW),
mPolygonOffsetFillEnabled(false),
mPolygonOffsetFactor(0.0f),
mPolygonOffsetUnits(0.0f),
mMultisampleEnabled(true),
mRasterizerDiscardEnabled(false),
mLineWidth(1.0f),
mClearDepth(1.0f), mClearDepth(1.0f),
mClearStencil(0) mClearStencil(0)
{ {
...@@ -162,28 +171,33 @@ void StateManagerGL::bindRenderbuffer(GLenum type, GLuint renderbuffer) ...@@ -162,28 +171,33 @@ void StateManagerGL::bindRenderbuffer(GLenum type, GLuint renderbuffer)
void StateManagerGL::setClearState(const gl::State &state, GLbitfield mask) void StateManagerGL::setClearState(const gl::State &state, GLbitfield mask)
{ {
// Only apply the state required to do a clear // Only apply the state required to do a clear
setScissor(state.getScissor()); const gl::RasterizerState &rasterizerState = state.getRasterizerState();
setViewport(state.getViewport()); setRasterizerDiscardEnabled(rasterizerState.rasterizerDiscard);
if (!rasterizerState.rasterizerDiscard)
if ((mask & GL_COLOR_BUFFER_BIT) != 0)
{ {
setClearColor(state.getColorClearValue()); setScissor(state.getScissor());
setViewport(state.getViewport());
const gl::BlendState &blendState = state.getBlendState(); if ((mask & GL_COLOR_BUFFER_BIT) != 0)
setColorMask(blendState.colorMaskRed, blendState.colorMaskGreen, blendState.colorMaskBlue, blendState.colorMaskAlpha); {
} setClearColor(state.getColorClearValue());
if ((mask & GL_DEPTH_BUFFER_BIT) != 0) const gl::BlendState &blendState = state.getBlendState();
{ setColorMask(blendState.colorMaskRed, blendState.colorMaskGreen, blendState.colorMaskBlue, blendState.colorMaskAlpha);
setClearDepth(state.getDepthClearValue()); }
setDepthMask(state.getDepthStencilState().depthMask);
}
if ((mask & GL_STENCIL_BUFFER_BIT) != 0) if ((mask & GL_DEPTH_BUFFER_BIT) != 0)
{ {
setClearStencil(state.getStencilClearValue()); setClearDepth(state.getDepthClearValue());
setStencilFrontWritemask(state.getDepthStencilState().stencilWritemask); setDepthMask(state.getDepthStencilState().depthMask);
setStencilBackWritemask(state.getDepthStencilState().stencilBackWritemask); }
if ((mask & GL_STENCIL_BUFFER_BIT) != 0)
{
setClearStencil(state.getStencilClearValue());
setStencilFrontWritemask(state.getDepthStencilState().stencilWritemask);
setStencilBackWritemask(state.getDepthStencilState().stencilBackWritemask);
}
} }
} }
...@@ -311,6 +325,24 @@ gl::Error StateManagerGL::setGenericDrawState(const gl::Data &data) ...@@ -311,6 +325,24 @@ gl::Error StateManagerGL::setGenericDrawState(const gl::Data &data)
setStencilBackOps(depthStencilState.stencilBackFail, depthStencilState.stencilBackPassDepthFail, depthStencilState.stencilBackPassDepthPass); setStencilBackOps(depthStencilState.stencilBackFail, depthStencilState.stencilBackPassDepthFail, depthStencilState.stencilBackPassDepthPass);
} }
const gl::RasterizerState &rasterizerState = state.getRasterizerState();
setCullFaceEnabled(rasterizerState.cullFace);
if (rasterizerState.cullFace)
{
setCullFace(rasterizerState.cullMode);
setFrontFace(rasterizerState.frontFace);
}
setPolygonOffsetFillEnabled(rasterizerState.polygonOffsetFill);
if (rasterizerState.polygonOffsetFill)
{
setPolygonOffset(rasterizerState.polygonOffsetFactor, rasterizerState.polygonOffsetUnits);
}
setMultisampleEnabled(rasterizerState.multiSample);
setRasterizerDiscardEnabled(rasterizerState.rasterizerDiscard);
setLineWidth(state.getLineWidth());
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
...@@ -558,6 +590,107 @@ void StateManagerGL::setStencilBackOps(GLenum sfail, GLenum dpfail, GLenum dppas ...@@ -558,6 +590,107 @@ void StateManagerGL::setStencilBackOps(GLenum sfail, GLenum dpfail, GLenum dppas
} }
} }
void StateManagerGL::setCullFaceEnabled(bool enabled)
{
if (mCullFaceEnabled != enabled)
{
mCullFaceEnabled = enabled;
if (mCullFaceEnabled)
{
mFunctions->enable(GL_CULL_FACE);
}
else
{
mFunctions->disable(GL_CULL_FACE);
}
}
}
void StateManagerGL::setCullFace(GLenum cullFace)
{
if (mCullFace != cullFace)
{
mCullFace = cullFace;
mFunctions->cullFace(mCullFace);
}
}
void StateManagerGL::setFrontFace(GLenum frontFace)
{
if (mFrontFace != frontFace)
{
mFrontFace = frontFace;
mFunctions->frontFace(mFrontFace);
}
}
void StateManagerGL::setPolygonOffsetFillEnabled(bool enabled)
{
if (mPolygonOffsetFillEnabled != enabled)
{
mPolygonOffsetFillEnabled = enabled;
if (mPolygonOffsetFillEnabled)
{
mFunctions->enable(GL_POLYGON_OFFSET_FILL);
}
else
{
mFunctions->disable(GL_POLYGON_OFFSET_FILL);
}
}
}
void StateManagerGL::setPolygonOffset(float factor, float units)
{
if (mPolygonOffsetFactor != factor || mPolygonOffsetUnits != units)
{
mPolygonOffsetFactor = factor;
mPolygonOffsetUnits = units;
mFunctions->polygonOffset(mPolygonOffsetFactor, mPolygonOffsetUnits);
}
}
void StateManagerGL::setMultisampleEnabled(bool enabled)
{
if (mMultisampleEnabled != enabled)
{
mMultisampleEnabled = enabled;
if (mMultisampleEnabled)
{
mFunctions->enable(GL_MULTISAMPLE);
}
else
{
mFunctions->disable(GL_MULTISAMPLE);
}
}
}
void StateManagerGL::setRasterizerDiscardEnabled(bool enabled)
{
if (mRasterizerDiscardEnabled != enabled)
{
mRasterizerDiscardEnabled = enabled;
if (mRasterizerDiscardEnabled)
{
mFunctions->enable(GL_RASTERIZER_DISCARD);
}
else
{
mFunctions->disable(GL_RASTERIZER_DISCARD);
}
}
}
void StateManagerGL::setLineWidth(float width)
{
if (mLineWidth != width)
{
mLineWidth = width;
mFunctions->lineWidth(mLineWidth);
}
}
void StateManagerGL::setClearDepth(float clearDepth) void StateManagerGL::setClearDepth(float clearDepth)
{ {
if (mClearDepth != clearDepth) if (mClearDepth != clearDepth)
......
...@@ -75,6 +75,15 @@ class StateManagerGL : angle::NonCopyable ...@@ -75,6 +75,15 @@ class StateManagerGL : angle::NonCopyable
void setStencilFrontOps(GLenum sfail, GLenum dpfail, GLenum dppass); void setStencilFrontOps(GLenum sfail, GLenum dpfail, GLenum dppass);
void setStencilBackOps(GLenum sfail, GLenum dpfail, GLenum dppass); void setStencilBackOps(GLenum sfail, GLenum dpfail, GLenum dppass);
void setCullFaceEnabled(bool enabled);
void setCullFace(GLenum cullFace);
void setFrontFace(GLenum frontFace);
void setPolygonOffsetFillEnabled(bool enabled);
void setPolygonOffset(float factor, float units);
void setMultisampleEnabled(bool enabled);
void setRasterizerDiscardEnabled(bool enabled);
void setLineWidth(float width);
void setClearDepth(float clearDepth); void setClearDepth(float clearDepth);
void setClearStencil(GLint clearStencil); void setClearStencil(GLint clearStencil);
...@@ -134,6 +143,16 @@ class StateManagerGL : angle::NonCopyable ...@@ -134,6 +143,16 @@ class StateManagerGL : angle::NonCopyable
GLenum mStencilBackStencilPassDepthPassOp; GLenum mStencilBackStencilPassDepthPassOp;
GLuint mStencilBackWritemask; GLuint mStencilBackWritemask;
bool mCullFaceEnabled;
GLenum mCullFace;
GLenum mFrontFace;
bool mPolygonOffsetFillEnabled;
GLfloat mPolygonOffsetFactor;
GLfloat mPolygonOffsetUnits;
bool mMultisampleEnabled;
bool mRasterizerDiscardEnabled;
float mLineWidth;
float mClearDepth; float mClearDepth;
GLint mClearStencil; GLint mClearStencil;
}; };
......
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