Commit 85b63c8e by Jamie Madill Committed by Commit Bot

D3D11: Consolidate OMSetRenderTargets calls.

There were a few calls that were using the context directly. Consolidating them in the StateManager11 class should make efficient state update after a Context switch possible. Also remove the Context parameter from the setRenderTargets methods, since these are only used internally and should be dirtying other states themselves. BUG=angleproject:2052 Change-Id: I878c99fbde7a467f30cc89f2ee5aca476b8cf506 Reviewed-on: https://chromium-review.googlesource.com/659232Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 2617eada
...@@ -1102,7 +1102,7 @@ gl::Error Blit11::swizzleTexture(const gl::Context *context, ...@@ -1102,7 +1102,7 @@ gl::Error Blit11::swizzleTexture(const gl::Context *context,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
stateManager->setOneTimeRenderTarget(context, dest.get(), nullptr); stateManager->setRenderTarget(dest.get(), nullptr);
// Set the viewport // Set the viewport
D3D11_VIEWPORT viewport; D3D11_VIEWPORT viewport;
...@@ -1236,7 +1236,7 @@ gl::Error Blit11::copyTexture(const gl::Context *context, ...@@ -1236,7 +1236,7 @@ gl::Error Blit11::copyTexture(const gl::Context *context,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
stateManager->setOneTimeRenderTarget(context, dest.get(), nullptr); stateManager->setRenderTarget(dest.get(), nullptr);
// Set the viewport // Set the viewport
D3D11_VIEWPORT viewport; D3D11_VIEWPORT viewport;
...@@ -1366,7 +1366,7 @@ gl::Error Blit11::copyDepth(const gl::Context *context, ...@@ -1366,7 +1366,7 @@ gl::Error Blit11::copyDepth(const gl::Context *context,
stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr); stateManager->setShaderResource(gl::SAMPLER_PIXEL, 0, nullptr);
// Apply render target // Apply render target
stateManager->setOneTimeRenderTarget(context, nullptr, dest.get()); stateManager->setRenderTarget(nullptr, dest.get());
// Set the viewport // Set the viewport
D3D11_VIEWPORT viewport; D3D11_VIEWPORT viewport;
...@@ -2020,7 +2020,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(const gl::Context *conte ...@@ -2020,7 +2020,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveDepth(const gl::Context *conte
&mResolveDepthPS.getObj()); &mResolveDepthPS.getObj());
deviceContext->RSSetState(nullptr); deviceContext->RSSetState(nullptr);
deviceContext->OMSetDepthStencilState(mDepthStencilState.get(), 0xFFFFFFFF); deviceContext->OMSetDepthStencilState(mDepthStencilState.get(), 0xFFFFFFFF);
deviceContext->OMSetRenderTargets(0, nullptr, mResolvedDepthDSView.get()); stateManager->setRenderTargets(nullptr, 0, mResolvedDepthDSView.get());
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF); deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
// Set the viewport // Set the viewport
...@@ -2167,8 +2167,6 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *con ...@@ -2167,8 +2167,6 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *con
// Notify the Renderer that all state should be invalidated. // Notify the Renderer that all state should be invalidated.
mRenderer->markAllStateDirty(context); mRenderer->markAllStateDirty(context);
ID3D11RenderTargetView *rtvs[] = {mResolvedDepthStencilRTView.get()};
ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer)); ANGLE_TRY(mResolveDepthStencilVS.resolve(mRenderer));
// Resolving the depth buffer works by sampling the depth in the shader using a SRV, then // Resolving the depth buffer works by sampling the depth in the shader using a SRV, then
...@@ -2192,7 +2190,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *con ...@@ -2192,7 +2190,7 @@ gl::ErrorOrResult<TextureHelper11> Blit11::resolveStencil(const gl::Context *con
stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, pixelShader); stateManager->setDrawShaders(&mResolveDepthStencilVS.getObj(), nullptr, pixelShader);
deviceContext->RSSetState(nullptr); deviceContext->RSSetState(nullptr);
deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF); deviceContext->OMSetDepthStencilState(nullptr, 0xFFFFFFFF);
deviceContext->OMSetRenderTargets(1, rtvs, nullptr); stateManager->setRenderTarget(mResolvedDepthStencilRTView.get(), nullptr);
deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF); deviceContext->OMSetBlendState(nullptr, nullptr, 0xFFFFFFF);
// Set the viewport // Set the viewport
......
...@@ -819,7 +819,7 @@ gl::Error Clear11::clearFramebuffer(const gl::Context *context, ...@@ -819,7 +819,7 @@ gl::Error Clear11::clearFramebuffer(const gl::Context *context,
stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); stateManager->setPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Apply render targets // Apply render targets
stateManager->setOneTimeRenderTargets(context, &rtvs[0], numRtvs, dsv); stateManager->setRenderTargets(&rtvs[0], numRtvs, dsv);
// If scissors are necessary to be applied, then the number of clears is the number of scissor // If scissors are necessary to be applied, then the number of clears is the number of scissor
// rects. If no scissors are necessary, then a single full-size clear is enough. // rects. If no scissors are necessary, then a single full-size clear is enough.
......
...@@ -199,7 +199,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::Context *context, ...@@ -199,7 +199,7 @@ gl::Error PixelTransfer11::copyBufferToTexture(const gl::Context *context,
deviceContext->OMSetDepthStencilState(mCopyDepthStencilState.get(), 0xFFFFFFFF); deviceContext->OMSetDepthStencilState(mCopyDepthStencilState.get(), 0xFFFFFFFF);
deviceContext->RSSetState(mCopyRasterizerState.get()); deviceContext->RSSetState(mCopyRasterizerState.get());
stateManager->setOneTimeRenderTarget(context, textureRTV.get(), nullptr); stateManager->setRenderTarget(textureRTV.get(), nullptr);
if (!StructEquals(mParamsData, shaderParams)) if (!StructEquals(mParamsData, shaderParams))
{ {
......
...@@ -1410,21 +1410,18 @@ void StateManager11::invalidateConstantBuffer(unsigned int slot) ...@@ -1410,21 +1410,18 @@ void StateManager11::invalidateConstantBuffer(unsigned int slot)
} }
} }
void StateManager11::setOneTimeRenderTarget(const gl::Context *context, void StateManager11::setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv)
ID3D11RenderTargetView *rtv,
ID3D11DepthStencilView *dsv)
{ {
mRenderer->getDeviceContext()->OMSetRenderTargets(1, &rtv, dsv); mRenderer->getDeviceContext()->OMSetRenderTargets(1, &rtv, dsv);
invalidateRenderTarget(context); mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
} }
void StateManager11::setOneTimeRenderTargets(const gl::Context *context, void StateManager11::setRenderTargets(ID3D11RenderTargetView **rtvs,
ID3D11RenderTargetView **rtvs,
UINT numRtvs, UINT numRtvs,
ID3D11DepthStencilView *dsv) ID3D11DepthStencilView *dsv)
{ {
mRenderer->getDeviceContext()->OMSetRenderTargets(numRtvs, (numRtvs > 0) ? rtvs : nullptr, dsv); mRenderer->getDeviceContext()->OMSetRenderTargets(numRtvs, (numRtvs > 0) ? rtvs : nullptr, dsv);
invalidateRenderTarget(context); mInternalDirtyBits.set(DIRTY_BIT_RENDER_TARGET);
} }
void StateManager11::onBeginQuery(Query11 *query) void StateManager11::onBeginQuery(Query11 *query)
......
...@@ -179,13 +179,8 @@ class StateManager11 final : angle::NonCopyable ...@@ -179,13 +179,8 @@ class StateManager11 final : angle::NonCopyable
// Called from VertexArray11::updateVertexAttribStorage. // Called from VertexArray11::updateVertexAttribStorage.
void invalidateCurrentValueAttrib(size_t attribIndex); void invalidateCurrentValueAttrib(size_t attribIndex);
void setOneTimeRenderTarget(const gl::Context *context, void setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv);
ID3D11RenderTargetView *rtv, void setRenderTargets(ID3D11RenderTargetView **rtvs, UINT numRtvs, ID3D11DepthStencilView *dsv);
ID3D11DepthStencilView *dsv);
void setOneTimeRenderTargets(const gl::Context *context,
ID3D11RenderTargetView **rtvs,
UINT numRtvs,
ID3D11DepthStencilView *dsv);
void onBeginQuery(Query11 *query); void onBeginQuery(Query11 *query);
void onDeleteQueryObject(Query11 *query); void onDeleteQueryObject(Query11 *query);
......
...@@ -840,7 +840,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(const gl::Context *context, ...@@ -840,7 +840,7 @@ EGLint SwapChain11::copyOffscreenToBackbuffer(const gl::Context *context,
stateManager->setDrawShaders(&mPassThroughVS, nullptr, &mPassThroughPS); stateManager->setDrawShaders(&mPassThroughVS, nullptr, &mPassThroughPS);
// Apply render targets. Use the proxy context in display. // Apply render targets. Use the proxy context in display.
stateManager->setOneTimeRenderTarget(context, mBackBufferRTView.get(), nullptr); stateManager->setRenderTarget(mBackBufferRTView.get(), nullptr);
// Set the viewport // Set the viewport
D3D11_VIEWPORT viewport; D3D11_VIEWPORT viewport;
......
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