Commit 0e4c8e73 by Dian Xiang

Using dirty bit notification for D3D11 rasterizer state

BUG=angleproject:1161 This is a continuation of the dirty bit refactor Change-Id: I78ab046aaeb7de6dd288433c86e6524dcb2d6a66 Reviewed-on: https://chromium-review.googlesource.com/312837Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tryjob-Request: Dian Xiang <dianx@google.com> Tested-by: 's avatarDian Xiang <dianx@google.com>
parent 4ed53a5a
......@@ -470,7 +470,7 @@ void Renderer11::SRVCache::clear()
Renderer11::Renderer11(egl::Display *display)
: RendererD3D(display),
mStateCache(this),
mStateManager(this),
mStateManager(),
mLastHistogramUpdateTime(ANGLEPlatformCurrent()->monotonicallyIncreasingTime()),
mDebug(nullptr)
{
......@@ -833,6 +833,8 @@ void Renderer11::initializeDevice()
ASSERT(!mPixelTransfer);
mPixelTransfer = new PixelTransfer11(this);
mStateManager.initialize(mDeviceContext, &mStateCache);
const gl::Caps &rendererCaps = getRendererCaps();
mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
......@@ -1359,23 +1361,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
gl::Error Renderer11::setRasterizerState(const gl::RasterizerState &rasterState)
{
if (mForceSetRasterState || memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0)
{
ID3D11RasterizerState *dxRasterState = NULL;
gl::Error error = mStateCache.getRasterizerState(rasterState, mScissorEnabled, &dxRasterState);
if (error.isError())
{
return error;
}
mDeviceContext->RSSetState(dxRasterState);
mCurRasterState = rasterState;
}
mForceSetRasterState = false;
return gl::Error(GL_NO_ERROR);
return mStateManager.setRasterizerState(rasterState);
}
void Renderer11::syncState(const gl::State &state, const gl::State::DirtyBits &bitmask)
......@@ -1415,11 +1401,12 @@ void Renderer11::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
if (enabled != mScissorEnabled)
{
mForceSetRasterState = true;
mStateManager.forceSetRasterState();
}
mCurScissor = scissor;
mScissorEnabled = enabled;
mStateManager.setCurScissorEnabled(mScissorEnabled);
}
mForceSetScissor = false;
......@@ -1690,7 +1677,7 @@ gl::Error Renderer11::applyRenderTarget(const gl::Framebuffer *framebuffer)
if (!mDepthStencilInitialized)
{
mForceSetRasterState = true;
mStateManager.forceSetRasterState();
}
for (size_t rtIndex = 0; rtIndex < ArraySize(framebufferRTVs); rtIndex++)
......@@ -2481,7 +2468,7 @@ void Renderer11::markAllStateDirty()
mStateManager.forceSetBlendState();
mStateManager.forceSetDepthStencilState();
mForceSetRasterState = true;
mStateManager.forceSetRasterState();
mForceSetScissor = true;
mForceSetViewport = true;
......
......@@ -413,10 +413,6 @@ class Renderer11 : public RendererD3D
StateManager11 mStateManager;
// Currently applied rasterizer state
bool mForceSetRasterState;
gl::RasterizerState mCurRasterState;
// Currently applied scissor rectangle
bool mForceSetScissor;
bool mScissorEnabled;
......
......@@ -14,7 +14,7 @@
namespace rx
{
StateManager11::StateManager11(Renderer11 *renderer11)
StateManager11::StateManager11()
: mBlendStateIsDirty(false),
mCurBlendColor(0, 0, 0, 0),
mCurSampleMask(0),
......@@ -22,7 +22,10 @@ StateManager11::StateManager11(Renderer11 *renderer11)
mCurStencilRef(0),
mCurStencilBackRef(0),
mCurStencilSize(0),
mRenderer11(renderer11)
mRasterizerStateIsDirty(false),
mCurScissorEnabled(false),
mDeviceContext(nullptr),
mStateCache(nullptr)
{
mCurBlendState.blend = false;
mCurBlendState.sourceBlendRGB = GL_ONE;
......@@ -53,12 +56,28 @@ StateManager11::StateManager11(Renderer11 *renderer11)
mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP;
mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP;
mCurDepthStencilState.stencilBackWritemask = static_cast<GLuint>(-1);
mCurRasterState.rasterizerDiscard = false;
mCurRasterState.cullFace = false;
mCurRasterState.cullMode = GL_BACK;
mCurRasterState.frontFace = GL_CCW;
mCurRasterState.polygonOffsetFill = false;
mCurRasterState.polygonOffsetFactor = 0.0f;
mCurRasterState.polygonOffsetUnits = 0.0f;
mCurRasterState.pointDrawMode = false;
mCurRasterState.multiSample = false;
}
StateManager11::~StateManager11()
{
}
void StateManager11::initialize(ID3D11DeviceContext *deviceContext, RenderStateCache *stateCache)
{
mDeviceContext = deviceContext;
mStateCache = stateCache;
}
void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized,
unsigned int stencilSize)
{
......@@ -219,6 +238,48 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
}
break;
}
case gl::State::DIRTY_BIT_CULL_FACE_ENABLED:
if (state.getRasterizerState().cullFace != mCurRasterState.cullFace)
{
mRasterizerStateIsDirty = true;
}
break;
case gl::State::DIRTY_BIT_CULL_FACE:
if (state.getRasterizerState().cullMode != mCurRasterState.cullMode)
{
mRasterizerStateIsDirty = true;
}
break;
case gl::State::DIRTY_BIT_FRONT_FACE:
if (state.getRasterizerState().frontFace != mCurRasterState.frontFace)
{
mRasterizerStateIsDirty = true;
}
break;
case gl::State::DIRTY_BIT_POLYGON_OFFSET_FILL_ENABLED:
if (state.getRasterizerState().polygonOffsetFill !=
mCurRasterState.polygonOffsetFill)
{
mRasterizerStateIsDirty = true;
}
break;
case gl::State::DIRTY_BIT_POLYGON_OFFSET:
{
const gl::RasterizerState &rasterState = state.getRasterizerState();
if (rasterState.polygonOffsetFactor != mCurRasterState.polygonOffsetFactor ||
rasterState.polygonOffsetUnits != mCurRasterState.polygonOffsetUnits)
{
mRasterizerStateIsDirty = true;
}
break;
}
case gl::State::DIRTY_BIT_RASTERIZER_DISCARD_ENABLED:
if (state.getRasterizerState().rasterizerDiscard !=
mCurRasterState.rasterizerDiscard)
{
mRasterizerStateIsDirty = true;
}
break;
default:
break;
}
......@@ -233,8 +294,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
if (mBlendStateIsDirty || sampleMask != mCurSampleMask)
{
ID3D11BlendState *dxBlendState = nullptr;
gl::Error error =
mRenderer11->getStateCache().getBlendState(framebuffer, blendState, &dxBlendState);
gl::Error error = mStateCache->getBlendState(framebuffer, blendState, &dxBlendState);
if (error.isError())
{
return error;
......@@ -261,7 +321,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
blendColors[3] = blendColor.alpha;
}
mRenderer11->getDeviceContext()->OMSetBlendState(dxBlendState, blendColors, sampleMask);
mDeviceContext->OMSetBlendState(dxBlendState, blendColors, sampleMask);
mCurBlendState = blendState;
mCurBlendColor = blendColor;
......@@ -292,8 +352,8 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
(depthStencilState.stencilBackMask & maxStencil));
ID3D11DepthStencilState *dxDepthStencilState = NULL;
gl::Error error = mRenderer11->getStateCache().getDepthStencilState(depthStencilState,
&dxDepthStencilState);
gl::Error error =
mStateCache->getDepthStencilState(depthStencilState, &dxDepthStencilState);
if (error.isError())
{
return error;
......@@ -311,7 +371,7 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
"Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK");
UINT dxStencilRef = std::min<UINT>(stencilRef, 0xFFu);
mRenderer11->getDeviceContext()->OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
mDeviceContext->OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
mCurDepthStencilState = depthStencilState;
mCurStencilRef = stencilRef;
......@@ -323,4 +383,25 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
return gl::Error(GL_NO_ERROR);
}
gl::Error StateManager11::setRasterizerState(const gl::RasterizerState &rasterState)
{
if (mRasterizerStateIsDirty)
{
ID3D11RasterizerState *dxRasterState = nullptr;
gl::Error error =
mStateCache->getRasterizerState(rasterState, mCurScissorEnabled, &dxRasterState);
if (error.isError())
{
return error;
}
mDeviceContext->RSSetState(dxRasterState);
mCurRasterState = rasterState;
mRasterizerStateIsDirty = false;
}
return gl::Error(GL_NO_ERROR);
}
} // namespace rx
......@@ -22,10 +22,11 @@ class Renderer11;
class StateManager11 final : angle::NonCopyable
{
public:
StateManager11(Renderer11 *renderer11);
StateManager11();
~StateManager11();
void initialize(ID3D11DeviceContext *deviceContext, RenderStateCache *stateCache);
void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits);
gl::Error setBlendState(const gl::Framebuffer *framebuffer,
......@@ -37,8 +38,13 @@ class StateManager11 final : angle::NonCopyable
int stencilRef,
int stencilBackRef);
gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
void forceSetBlendState() { mBlendStateIsDirty = true; }
void forceSetDepthStencilState() { mDepthStencilStateIsDirty = true; }
void forceSetRasterState() { mRasterizerStateIsDirty = true; }
void setCurScissorEnabled(bool enabled) { mCurScissorEnabled = enabled; }
void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
......@@ -58,7 +64,14 @@ class StateManager11 final : angle::NonCopyable
int mCurStencilBackRef;
unsigned int mCurStencilSize;
Renderer11 *mRenderer11;
// Currenly applied rasterizer state
bool mRasterizerStateIsDirty;
gl::RasterizerState mCurRasterState;
bool mCurScissorEnabled;
ID3D11DeviceContext *mDeviceContext;
RenderStateCache *mStateCache;
};
} // namespace rx
......
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