Commit 9603a956 by Jamie Madill Committed by Commit Bot

D3D11: Move applyShaders to StateManager11.

This also moves the shader application to happen before any of the other state sync work. In order to do this, we must split off the uniform application to happen after the viewport sync, because the driver uniforms for the viewport size can change. This prepares the D3D11 back-end for updating the programs before a draw call, including refreshing binary cache entries. BUG=angleproject:1156 Change-Id: Ie491e8ddb69ff44ebe076c56ebd39c4b46a4d2b2 Reviewed-on: https://chromium-review.googlesource.com/531797 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 253daa56
...@@ -288,9 +288,8 @@ bool RendererD3D::isRobustResourceInitEnabled() const ...@@ -288,9 +288,8 @@ bool RendererD3D::isRobustResourceInitEnabled() const
return mDisplay->isRobustResourceInitEnabled(); return mDisplay->isRobustResourceInitEnabled();
} }
unsigned int GetBlendSampleMask(const gl::ContextState &data, int samples) unsigned int GetBlendSampleMask(const gl::State &glState, int samples)
{ {
const auto &glState = data.getState();
unsigned int mask = 0; unsigned int mask = 0;
if (glState.isSampleCoverageEnabled()) if (glState.isSampleCoverageEnabled())
{ {
......
...@@ -367,7 +367,7 @@ class RendererD3D : public BufferFactoryD3D ...@@ -367,7 +367,7 @@ class RendererD3D : public BufferFactoryD3D
angle::WorkerThreadPool mWorkerThreadPool; angle::WorkerThreadPool mWorkerThreadPool;
}; };
unsigned int GetBlendSampleMask(const gl::ContextState &data, int samples); unsigned int GetBlendSampleMask(const gl::State &glState, int samples);
} // namespace rx } // namespace rx
......
...@@ -2190,56 +2190,6 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data, ...@@ -2190,56 +2190,6 @@ gl::Error Renderer11::drawTriangleFan(const gl::ContextState &data,
return gl::NoError(); return gl::NoError();
} }
gl::Error Renderer11::applyShaders(const gl::Context *context, GLenum drawMode)
{
// This method is called single-threaded.
ANGLE_TRY(ensureHLSLCompilerInitialized());
const auto &data = context->getContextState();
const auto &glState = data.getState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
programD3D->updateCachedInputLayout(glState);
const auto &inputLayout = programD3D->getCachedInputLayout();
ShaderExecutableD3D *vertexExe = nullptr;
ANGLE_TRY(programD3D->getVertexExecutableForInputLayout(inputLayout, &vertexExe, nullptr));
const gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
ShaderExecutableD3D *pixelExe = nullptr;
ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(context, drawFramebuffer, &pixelExe));
ShaderExecutableD3D *geometryExe = nullptr;
ANGLE_TRY(
programD3D->getGeometryExecutableForPrimitiveType(data, drawMode, &geometryExe, nullptr));
const d3d11::VertexShader *vertexShader =
(vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr);
// Skip pixel shader if we're doing rasterizer discard.
const d3d11::PixelShader *pixelShader = nullptr;
if (!glState.getRasterizerState().rasterizerDiscard)
{
pixelShader = (pixelExe ? &GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr);
}
const d3d11::GeometryShader *geometryShader = nullptr;
if (glState.isTransformFeedbackActiveUnpaused())
{
geometryShader =
(vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr);
}
else
{
geometryShader =
(geometryExe ? &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
}
mStateManager.setDrawShaders(vertexShader, geometryShader, pixelShader);
return programD3D->applyUniforms(drawMode);
}
// TODO(jmadill): Move to StateManager11. // TODO(jmadill): Move to StateManager11.
gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D, gl::Error Renderer11::applyUniforms(const ProgramD3D &programD3D,
GLenum drawMode, GLenum drawMode,
...@@ -4313,7 +4263,6 @@ gl::Error Renderer11::genericDrawElements(const gl::Context *context, ...@@ -4313,7 +4263,6 @@ gl::Error Renderer11::genericDrawElements(const gl::Context *context,
size_t vertexCount = indexInfo.indexRange.vertexCount(); size_t vertexCount = indexInfo.indexRange.vertexCount();
ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexInfo.indexRange.start), ANGLE_TRY(applyVertexBuffer(context, mode, static_cast<GLsizei>(indexInfo.indexRange.start),
static_cast<GLsizei>(vertexCount), instances, &indexInfo)); static_cast<GLsizei>(vertexCount), instances, &indexInfo));
ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data)); ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode)) if (!skipDraw(data, mode))
...@@ -4348,7 +4297,6 @@ gl::Error Renderer11::genericDrawArrays(const gl::Context *context, ...@@ -4348,7 +4297,6 @@ gl::Error Renderer11::genericDrawArrays(const gl::Context *context,
ANGLE_TRY(mStateManager.updateState(context, mode)); ANGLE_TRY(mStateManager.updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(data)); ANGLE_TRY(applyTransformFeedbackBuffers(data));
ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr)); ANGLE_TRY(applyVertexBuffer(context, mode, first, count, instances, nullptr));
ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data)); ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode)) if (!skipDraw(data, mode))
...@@ -4382,7 +4330,6 @@ gl::Error Renderer11::genericDrawIndirect(const gl::Context *context, ...@@ -4382,7 +4330,6 @@ gl::Error Renderer11::genericDrawIndirect(const gl::Context *context,
ANGLE_TRY(mStateManager.updateState(context, mode)); ANGLE_TRY(mStateManager.updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(contextState)); ANGLE_TRY(applyTransformFeedbackBuffers(contextState));
ASSERT(!glState.isTransformFeedbackActiveUnpaused()); ASSERT(!glState.isTransformFeedbackActiveUnpaused());
ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(contextState)); ANGLE_TRY(programD3D->applyUniformBuffers(contextState));
if (type == GL_NONE) if (type == GL_NONE)
......
...@@ -513,7 +513,6 @@ class Renderer11 : public RendererD3D ...@@ -513,7 +513,6 @@ class Renderer11 : public RendererD3D
int baseVertex, int baseVertex,
int instances); int instances);
gl::Error applyShaders(const gl::Context *context, GLenum drawMode);
gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture); gl::Error generateSwizzle(const gl::Context *context, gl::Texture *texture);
gl::Error generateSwizzles(const gl::Context *context, gl::SamplerType type); gl::Error generateSwizzles(const gl::Context *context, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Context *context); gl::Error generateSwizzles(const gl::Context *context);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h" #include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h" #include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
#include "libANGLE/renderer/d3d/d3d11/Renderer11.h" #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
#include "libANGLE/renderer/d3d/d3d11/ShaderExecutable11.h"
#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h" #include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
namespace rx namespace rx
...@@ -1371,8 +1372,10 @@ void StateManager11::setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT str ...@@ -1371,8 +1372,10 @@ void StateManager11::setSingleVertexBuffer(const d3d11::Buffer *buffer, UINT str
gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMode) gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMode)
{ {
const auto &data = context->getContextState(); const auto &glState = context->getGLState();
const auto &glState = data.getState();
// TODO(jmadill): Use dirty bits.
ANGLE_TRY(syncProgram(context, drawMode));
gl::Framebuffer *framebuffer = glState.getDrawFramebuffer(); gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer); Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer);
...@@ -1393,7 +1396,7 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod ...@@ -1393,7 +1396,7 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod
// TODO(jmadill): This can be recomputed only on framebuffer changes. // TODO(jmadill): This can be recomputed only on framebuffer changes.
RenderTarget11 *firstRT = framebuffer11->getFirstRenderTarget(); RenderTarget11 *firstRT = framebuffer11->getFirstRenderTarget();
int samples = (firstRT ? firstRT->getSamples() : 0); int samples = (firstRT ? firstRT->getSamples() : 0);
unsigned int sampleMask = GetBlendSampleMask(data, samples); unsigned int sampleMask = GetBlendSampleMask(glState, samples);
if (sampleMask != mCurSampleMask) if (sampleMask != mCurSampleMask)
{ {
mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE); mInternalDirtyBits.set(DIRTY_BIT_BLEND_STATE);
...@@ -1410,7 +1413,7 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod ...@@ -1410,7 +1413,7 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod
ANGLE_TRY(syncFramebuffer(context, framebuffer)); ANGLE_TRY(syncFramebuffer(context, framebuffer));
break; break;
case DIRTY_BIT_VIEWPORT_STATE: case DIRTY_BIT_VIEWPORT_STATE:
syncViewport(&data.getCaps(), glState.getViewport(), glState.getNearPlane(), syncViewport(&context->getCaps(), glState.getViewport(), glState.getNearPlane(),
glState.getFarPlane()); glState.getFarPlane());
break; break;
case DIRTY_BIT_SCISSOR_STATE: case DIRTY_BIT_SCISSOR_STATE:
...@@ -1435,6 +1438,11 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod ...@@ -1435,6 +1438,11 @@ gl::Error StateManager11::updateState(const gl::Context *context, GLenum drawMod
// TODO(jmadill): Use dirty bits. // TODO(jmadill): Use dirty bits.
ANGLE_TRY(syncTextures(context)); ANGLE_TRY(syncTextures(context));
// This must happen after viewport sync, because the viewport affects builtin uniforms.
// TODO(jmadill): Use dirty bits.
auto *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
ANGLE_TRY(programD3D->applyUniforms(drawMode));
// Check that we haven't set any dirty bits in the flushing of the dirty bits loop. // Check that we haven't set any dirty bits in the flushing of the dirty bits loop.
ASSERT(mInternalDirtyBits.none()); ASSERT(mInternalDirtyBits.none());
...@@ -1717,7 +1725,54 @@ gl::Error StateManager11::setTexture(const gl::Context *context, ...@@ -1717,7 +1725,54 @@ gl::Error StateManager11::setTexture(const gl::Context *context,
static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxVertexTextureImageUnits)); static_cast<unsigned int>(index) < mRenderer->getNativeCaps().maxVertexTextureImageUnits));
setShaderResource(type, index, textureSRV->get()); setShaderResource(type, index, textureSRV->get());
return gl::NoError();
}
gl::Error StateManager11::syncProgram(const gl::Context *context, GLenum drawMode)
{
// This method is called single-threaded.
ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized());
const auto &glState = context->getGLState();
ProgramD3D *programD3D = GetImplAs<ProgramD3D>(glState.getProgram());
programD3D->updateCachedInputLayout(glState);
const auto &inputLayout = programD3D->getCachedInputLayout();
ShaderExecutableD3D *vertexExe = nullptr;
ANGLE_TRY(programD3D->getVertexExecutableForInputLayout(inputLayout, &vertexExe, nullptr));
const gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
ShaderExecutableD3D *pixelExe = nullptr;
ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(context, drawFramebuffer, &pixelExe));
ShaderExecutableD3D *geometryExe = nullptr;
ANGLE_TRY(programD3D->getGeometryExecutableForPrimitiveType(context->getContextState(),
drawMode, &geometryExe, nullptr));
const d3d11::VertexShader *vertexShader =
(vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getVertexShader() : nullptr);
// Skip pixel shader if we're doing rasterizer discard.
const d3d11::PixelShader *pixelShader = nullptr;
if (!glState.getRasterizerState().rasterizerDiscard)
{
pixelShader = (pixelExe ? &GetAs<ShaderExecutable11>(pixelExe)->getPixelShader() : nullptr);
}
const d3d11::GeometryShader *geometryShader = nullptr;
if (glState.isTransformFeedbackActiveUnpaused())
{
geometryShader =
(vertexExe ? &GetAs<ShaderExecutable11>(vertexExe)->getStreamOutShader() : nullptr);
}
else
{
geometryShader =
(geometryExe ? &GetAs<ShaderExecutable11>(geometryExe)->getGeometryShader() : nullptr);
}
setDrawShaders(vertexShader, geometryShader, pixelShader);
return gl::NoError(); return gl::NoError();
} }
......
...@@ -179,6 +179,7 @@ class StateManager11 final : angle::NonCopyable ...@@ -179,6 +179,7 @@ class StateManager11 final : angle::NonCopyable
void checkPresentPath(const gl::Context *context); void checkPresentPath(const gl::Context *context);
gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer); gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer);
gl::Error syncProgram(const gl::Context *context, GLenum drawMode);
gl::Error syncTextures(const gl::Context *context); gl::Error syncTextures(const gl::Context *context);
gl::Error applyTextures(const gl::Context *context, gl::Error applyTextures(const gl::Context *context,
......
...@@ -1037,8 +1037,7 @@ gl::Error Renderer9::setUniformBuffers(const gl::ContextState & /*data*/, ...@@ -1037,8 +1037,7 @@ gl::Error Renderer9::setUniformBuffers(const gl::ContextState & /*data*/,
gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode) gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode)
{ {
const auto &data = context->getContextState(); const auto &glState = context->getGLState();
const auto &glState = data.getState();
// Applies the render target surface, depth stencil surface, viewport rectangle and // Applies the render target surface, depth stencil surface, viewport rectangle and
// scissor rectangle to the renderer // scissor rectangle to the renderer
...@@ -1071,7 +1070,7 @@ gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode) ...@@ -1071,7 +1070,7 @@ gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode)
rasterizer.pointDrawMode = (drawMode == GL_POINTS); rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0); rasterizer.multiSample = (samples != 0);
unsigned int mask = GetBlendSampleMask(data, samples); unsigned int mask = GetBlendSampleMask(glState, samples);
ANGLE_TRY(setBlendDepthRasterStates(context, mask)); ANGLE_TRY(setBlendDepthRasterStates(context, mask));
mStateManager.resetDirtyBits(); mStateManager.resetDirtyBits();
...@@ -1105,7 +1104,7 @@ gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenu ...@@ -1105,7 +1104,7 @@ gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenu
rasterizer.pointDrawMode = (drawMode == GL_POINTS); rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0); rasterizer.multiSample = (samples != 0);
unsigned int mask = GetBlendSampleMask(context->getContextState(), samples); unsigned int mask = GetBlendSampleMask(glState, samples);
return mStateManager.setBlendDepthRasterStates(glState, mask); return mStateManager.setBlendDepthRasterStates(glState, mask);
} }
......
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