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() ...@@ -470,7 +470,7 @@ void Renderer11::SRVCache::clear()
Renderer11::Renderer11(egl::Display *display) Renderer11::Renderer11(egl::Display *display)
: RendererD3D(display), : RendererD3D(display),
mStateCache(this), mStateCache(this),
mStateManager(this), mStateManager(),
mLastHistogramUpdateTime(ANGLEPlatformCurrent()->monotonicallyIncreasingTime()), mLastHistogramUpdateTime(ANGLEPlatformCurrent()->monotonicallyIncreasingTime()),
mDebug(nullptr) mDebug(nullptr)
{ {
...@@ -833,6 +833,8 @@ void Renderer11::initializeDevice() ...@@ -833,6 +833,8 @@ void Renderer11::initializeDevice()
ASSERT(!mPixelTransfer); ASSERT(!mPixelTransfer);
mPixelTransfer = new PixelTransfer11(this); mPixelTransfer = new PixelTransfer11(this);
mStateManager.initialize(mDeviceContext, &mStateCache);
const gl::Caps &rendererCaps = getRendererCaps(); const gl::Caps &rendererCaps = getRendererCaps();
mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits); mForceSetVertexSamplerStates.resize(rendererCaps.maxVertexTextureImageUnits);
...@@ -1359,23 +1361,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -1359,23 +1361,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
gl::Error Renderer11::setRasterizerState(const gl::RasterizerState &rasterState) gl::Error Renderer11::setRasterizerState(const gl::RasterizerState &rasterState)
{ {
if (mForceSetRasterState || memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0) return mStateManager.setRasterizerState(rasterState);
{
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);
} }
void Renderer11::syncState(const gl::State &state, const gl::State::DirtyBits &bitmask) 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) ...@@ -1415,11 +1401,12 @@ void Renderer11::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
if (enabled != mScissorEnabled) if (enabled != mScissorEnabled)
{ {
mForceSetRasterState = true; mStateManager.forceSetRasterState();
} }
mCurScissor = scissor; mCurScissor = scissor;
mScissorEnabled = enabled; mScissorEnabled = enabled;
mStateManager.setCurScissorEnabled(mScissorEnabled);
} }
mForceSetScissor = false; mForceSetScissor = false;
...@@ -1690,7 +1677,7 @@ gl::Error Renderer11::applyRenderTarget(const gl::Framebuffer *framebuffer) ...@@ -1690,7 +1677,7 @@ gl::Error Renderer11::applyRenderTarget(const gl::Framebuffer *framebuffer)
if (!mDepthStencilInitialized) if (!mDepthStencilInitialized)
{ {
mForceSetRasterState = true; mStateManager.forceSetRasterState();
} }
for (size_t rtIndex = 0; rtIndex < ArraySize(framebufferRTVs); rtIndex++) for (size_t rtIndex = 0; rtIndex < ArraySize(framebufferRTVs); rtIndex++)
...@@ -2481,7 +2468,7 @@ void Renderer11::markAllStateDirty() ...@@ -2481,7 +2468,7 @@ void Renderer11::markAllStateDirty()
mStateManager.forceSetBlendState(); mStateManager.forceSetBlendState();
mStateManager.forceSetDepthStencilState(); mStateManager.forceSetDepthStencilState();
mForceSetRasterState = true; mStateManager.forceSetRasterState();
mForceSetScissor = true; mForceSetScissor = true;
mForceSetViewport = true; mForceSetViewport = true;
......
...@@ -413,10 +413,6 @@ class Renderer11 : public RendererD3D ...@@ -413,10 +413,6 @@ class Renderer11 : public RendererD3D
StateManager11 mStateManager; StateManager11 mStateManager;
// Currently applied rasterizer state
bool mForceSetRasterState;
gl::RasterizerState mCurRasterState;
// Currently applied scissor rectangle // Currently applied scissor rectangle
bool mForceSetScissor; bool mForceSetScissor;
bool mScissorEnabled; bool mScissorEnabled;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
namespace rx namespace rx
{ {
StateManager11::StateManager11(Renderer11 *renderer11) StateManager11::StateManager11()
: mBlendStateIsDirty(false), : mBlendStateIsDirty(false),
mCurBlendColor(0, 0, 0, 0), mCurBlendColor(0, 0, 0, 0),
mCurSampleMask(0), mCurSampleMask(0),
...@@ -22,7 +22,10 @@ StateManager11::StateManager11(Renderer11 *renderer11) ...@@ -22,7 +22,10 @@ StateManager11::StateManager11(Renderer11 *renderer11)
mCurStencilRef(0), mCurStencilRef(0),
mCurStencilBackRef(0), mCurStencilBackRef(0),
mCurStencilSize(0), mCurStencilSize(0),
mRenderer11(renderer11) mRasterizerStateIsDirty(false),
mCurScissorEnabled(false),
mDeviceContext(nullptr),
mStateCache(nullptr)
{ {
mCurBlendState.blend = false; mCurBlendState.blend = false;
mCurBlendState.sourceBlendRGB = GL_ONE; mCurBlendState.sourceBlendRGB = GL_ONE;
...@@ -53,12 +56,28 @@ StateManager11::StateManager11(Renderer11 *renderer11) ...@@ -53,12 +56,28 @@ StateManager11::StateManager11(Renderer11 *renderer11)
mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP; mCurDepthStencilState.stencilBackPassDepthFail = GL_KEEP;
mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP; mCurDepthStencilState.stencilBackPassDepthPass = GL_KEEP;
mCurDepthStencilState.stencilBackWritemask = static_cast<GLuint>(-1); 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() StateManager11::~StateManager11()
{ {
} }
void StateManager11::initialize(ID3D11DeviceContext *deviceContext, RenderStateCache *stateCache)
{
mDeviceContext = deviceContext;
mStateCache = stateCache;
}
void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized, void StateManager11::updateStencilSizeIfChanged(bool depthStencilInitialized,
unsigned int stencilSize) unsigned int stencilSize)
{ {
...@@ -219,6 +238,48 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit ...@@ -219,6 +238,48 @@ void StateManager11::syncState(const gl::State &state, const gl::State::DirtyBit
} }
break; 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: default:
break; break;
} }
...@@ -233,8 +294,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer, ...@@ -233,8 +294,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
if (mBlendStateIsDirty || sampleMask != mCurSampleMask) if (mBlendStateIsDirty || sampleMask != mCurSampleMask)
{ {
ID3D11BlendState *dxBlendState = nullptr; ID3D11BlendState *dxBlendState = nullptr;
gl::Error error = gl::Error error = mStateCache->getBlendState(framebuffer, blendState, &dxBlendState);
mRenderer11->getStateCache().getBlendState(framebuffer, blendState, &dxBlendState);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -261,7 +321,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer, ...@@ -261,7 +321,7 @@ gl::Error StateManager11::setBlendState(const gl::Framebuffer *framebuffer,
blendColors[3] = blendColor.alpha; blendColors[3] = blendColor.alpha;
} }
mRenderer11->getDeviceContext()->OMSetBlendState(dxBlendState, blendColors, sampleMask); mDeviceContext->OMSetBlendState(dxBlendState, blendColors, sampleMask);
mCurBlendState = blendState; mCurBlendState = blendState;
mCurBlendColor = blendColor; mCurBlendColor = blendColor;
...@@ -292,8 +352,8 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept ...@@ -292,8 +352,8 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
(depthStencilState.stencilBackMask & maxStencil)); (depthStencilState.stencilBackMask & maxStencil));
ID3D11DepthStencilState *dxDepthStencilState = NULL; ID3D11DepthStencilState *dxDepthStencilState = NULL;
gl::Error error = mRenderer11->getStateCache().getDepthStencilState(depthStencilState, gl::Error error =
&dxDepthStencilState); mStateCache->getDepthStencilState(depthStencilState, &dxDepthStencilState);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -311,7 +371,7 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept ...@@ -311,7 +371,7 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
"Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK"); "Unexpected value of D3D11_DEFAULT_STENCIL_WRITE_MASK");
UINT dxStencilRef = std::min<UINT>(stencilRef, 0xFFu); UINT dxStencilRef = std::min<UINT>(stencilRef, 0xFFu);
mRenderer11->getDeviceContext()->OMSetDepthStencilState(dxDepthStencilState, dxStencilRef); mDeviceContext->OMSetDepthStencilState(dxDepthStencilState, dxStencilRef);
mCurDepthStencilState = depthStencilState; mCurDepthStencilState = depthStencilState;
mCurStencilRef = stencilRef; mCurStencilRef = stencilRef;
...@@ -323,4 +383,25 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept ...@@ -323,4 +383,25 @@ gl::Error StateManager11::setDepthStencilState(const gl::DepthStencilState &dept
return gl::Error(GL_NO_ERROR); 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 } // namespace rx
...@@ -22,10 +22,11 @@ class Renderer11; ...@@ -22,10 +22,11 @@ class Renderer11;
class StateManager11 final : angle::NonCopyable class StateManager11 final : angle::NonCopyable
{ {
public: public:
StateManager11(Renderer11 *renderer11); StateManager11();
~StateManager11(); ~StateManager11();
void initialize(ID3D11DeviceContext *deviceContext, RenderStateCache *stateCache);
void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits); void syncState(const gl::State &state, const gl::State::DirtyBits &dirtyBits);
gl::Error setBlendState(const gl::Framebuffer *framebuffer, gl::Error setBlendState(const gl::Framebuffer *framebuffer,
...@@ -37,8 +38,13 @@ class StateManager11 final : angle::NonCopyable ...@@ -37,8 +38,13 @@ class StateManager11 final : angle::NonCopyable
int stencilRef, int stencilRef,
int stencilBackRef); int stencilBackRef);
gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
void forceSetBlendState() { mBlendStateIsDirty = true; } void forceSetBlendState() { mBlendStateIsDirty = true; }
void forceSetDepthStencilState() { mDepthStencilStateIsDirty = true; } void forceSetDepthStencilState() { mDepthStencilStateIsDirty = true; }
void forceSetRasterState() { mRasterizerStateIsDirty = true; }
void setCurScissorEnabled(bool enabled) { mCurScissorEnabled = enabled; }
void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize); void updateStencilSizeIfChanged(bool depthStencilInitialized, unsigned int stencilSize);
...@@ -58,7 +64,14 @@ class StateManager11 final : angle::NonCopyable ...@@ -58,7 +64,14 @@ class StateManager11 final : angle::NonCopyable
int mCurStencilBackRef; int mCurStencilBackRef;
unsigned int mCurStencilSize; unsigned int mCurStencilSize;
Renderer11 *mRenderer11; // Currenly applied rasterizer state
bool mRasterizerStateIsDirty;
gl::RasterizerState mCurRasterState;
bool mCurScissorEnabled;
ID3D11DeviceContext *mDeviceContext;
RenderStateCache *mStateCache;
}; };
} // namespace rx } // 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