Commit 02bbec19 by Dian Xiang

Refactoring RendererD3D to not have virtual functions for state calls

BUG=angleproject:1242 Draw calls get called many times. Eliminating the number of virtual function calls will help with performance. Renderer9 and Renderer11 now have diverging paths for managing state with the dirty bits. Hence, we can remove some of the virtual calls. Change-Id: Ic5d69e744826f1c4f4ae168bca058f4743ff0843 Reviewed-on: https://chromium-review.googlesource.com/315229Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tryjob-Request: Jamie Madill <jmadill@chromium.org> Tested-by: 's avatarDian Xiang <dianx@google.com>
parent d3754d82
...@@ -153,13 +153,7 @@ gl::Error RendererD3D::genericDrawElements(const gl::Data &data, ...@@ -153,13 +153,7 @@ gl::Error RendererD3D::genericDrawElements(const gl::Data &data,
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
error = applyRenderTarget(data, mode, false); error = updateState(data, mode);
if (error.isError())
{
return error;
}
error = applyState(data, mode);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -243,13 +237,7 @@ gl::Error RendererD3D::genericDrawArrays(const gl::Data &data, ...@@ -243,13 +237,7 @@ gl::Error RendererD3D::genericDrawArrays(const gl::Data &data,
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
error = applyRenderTarget(data, mode, false); error = updateState(data, mode);
if (error.isError())
{
return error;
}
error = applyState(data, mode);
if (error.isError()) if (error.isError())
{ {
return error; return error;
...@@ -343,45 +331,8 @@ gl::Error RendererD3D::generateSwizzles(const gl::Data &data) ...@@ -343,45 +331,8 @@ gl::Error RendererD3D::generateSwizzles(const gl::Data &data)
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
// Applies the render target surface, depth stencil surface, viewport rectangle and unsigned int RendererD3D::GetBlendSampleMask(const gl::Data &data, int samples)
// scissor rectangle to the renderer
gl::Error RendererD3D::applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport)
{ {
const gl::Framebuffer *framebufferObject = data.state->getDrawFramebuffer();
ASSERT(framebufferObject && framebufferObject->checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
gl::Error error = applyRenderTarget(framebufferObject);
if (error.isError())
{
return error;
}
float nearZ = data.state->getNearPlane();
float farZ = data.state->getFarPlane();
setViewport(data.caps, data.state->getViewport(), nearZ, farZ, drawMode,
data.state->getRasterizerState().frontFace, ignoreViewport);
setScissorRectangle(data.state->getScissor(), data.state->isScissorTestEnabled());
return gl::Error(GL_NO_ERROR);
}
// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D device
gl::Error RendererD3D::applyState(const gl::Data &data, GLenum drawMode)
{
const gl::Framebuffer *framebufferObject = data.state->getDrawFramebuffer();
int samples = framebufferObject->getSamples(data);
gl::RasterizerState rasterizer = data.state->getRasterizerState();
rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0);
gl::Error error = setRasterizerState(rasterizer);
if (error.isError())
{
return error;
}
unsigned int mask = 0; unsigned int mask = 0;
if (data.state->isSampleCoverageEnabled()) if (data.state->isSampleCoverageEnabled())
{ {
...@@ -412,20 +363,8 @@ gl::Error RendererD3D::applyState(const gl::Data &data, GLenum drawMode) ...@@ -412,20 +363,8 @@ gl::Error RendererD3D::applyState(const gl::Data &data, GLenum drawMode)
{ {
mask = 0xFFFFFFFF; mask = 0xFFFFFFFF;
} }
error = setBlendState(framebufferObject, data.state->getBlendState(),
data.state->getBlendColor(), mask);
if (error.isError())
{
return error;
}
error = setDepthStencilState(*data.state); return mask;
if (error.isError())
{
return error;
}
return gl::Error(GL_NO_ERROR);
} }
// Applies the shaders and shader constants to the Direct3D device // Applies the shaders and shader constants to the Direct3D device
......
...@@ -153,22 +153,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -153,22 +153,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
const std::vector<GLint> &vertexUniformBuffers, const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) = 0; const std::vector<GLint> &fragmentUniformBuffers) = 0;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState) = 0; virtual gl::Error updateState(const gl::Data &data, GLenum drawMode) = 0;
virtual gl::Error setBlendState(const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState,
const gl::ColorF &blendColor,
unsigned int sampleMask) = 0;
virtual gl::Error setDepthStencilState(const gl::State &glState) = 0;
virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled) = 0;
virtual void setViewport(const gl::Caps *caps,
const gl::Rectangle &viewport,
float zNear,
float zFar,
GLenum drawMode,
GLenum frontFace,
bool ignoreViewport) = 0;
virtual gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) = 0; virtual gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) = 0;
virtual gl::Error applyUniforms(const ProgramD3D &programD3D, virtual gl::Error applyUniforms(const ProgramD3D &programD3D,
...@@ -269,6 +254,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -269,6 +254,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
virtual void createAnnotator() = 0; virtual void createAnnotator() = 0;
static unsigned int GetBlendSampleMask(const gl::Data &data, int samples);
// dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state. // dirtyPointer is a special value that will make the comparison with any valid pointer fail and force the renderer to re-apply the state.
static const uintptr_t DirtyPointer; static const uintptr_t DirtyPointer;
...@@ -313,7 +299,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -313,7 +299,6 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
gl::Error generateSwizzles(const gl::Data &data, gl::SamplerType type); gl::Error generateSwizzles(const gl::Data &data, gl::SamplerType type);
gl::Error generateSwizzles(const gl::Data &data); gl::Error generateSwizzles(const gl::Data &data);
gl::Error applyRenderTarget(const gl::Data &data, GLenum drawMode, bool ignoreViewport);
gl::Error applyState(const gl::Data &data, GLenum drawMode); gl::Error applyState(const gl::Data &data, GLenum drawMode);
gl::Error applyShaders(const gl::Data &data, GLenum drawMode); gl::Error applyShaders(const gl::Data &data, GLenum drawMode);
gl::Error applyTextures(const gl::Data &data, gl::SamplerType shaderType, gl::Error applyTextures(const gl::Data &data, gl::SamplerType shaderType,
......
...@@ -1416,43 +1416,54 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -1416,43 +1416,54 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
gl::Error Renderer11::setRasterizerState(const gl::RasterizerState &rasterState) gl::Error Renderer11::updateState(const gl::Data &data, GLenum drawMode)
{ {
return mStateManager.setRasterizerState(rasterState); // Applies the render target surface, depth stencil surface, viewport rectangle and
} // scissor rectangle to the renderer
const gl::Framebuffer *framebufferObject = data.state->getDrawFramebuffer();
ASSERT(framebufferObject && framebufferObject->checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
gl::Error error = applyRenderTarget(framebufferObject);
if (error.isError())
{
return error;
}
void Renderer11::syncState(const gl::State &state, const gl::State::DirtyBits &bitmask) // Setting viewport state
{ mStateManager.setViewport(data.caps, data.state->getViewport(), data.state->getNearPlane(),
mStateManager.syncState(state, bitmask); data.state->getFarPlane());
}
gl::Error Renderer11::setBlendState(const gl::Framebuffer *framebuffer, // Setting scissor state
const gl::BlendState &blendState, mStateManager.setScissorRectangle(data.state->getScissor(), data.state->isScissorTestEnabled());
const gl::ColorF &blendColor,
unsigned int sampleMask)
{
return mStateManager.setBlendState(framebuffer, blendState, blendColor, sampleMask);
}
gl::Error Renderer11::setDepthStencilState(const gl::State &glState) // Applying rasterizer state to D3D11 device
{ int samples = framebufferObject->getSamples(data);
return mStateManager.setDepthStencilState(glState); gl::RasterizerState rasterizer = data.state->getRasterizerState();
} rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0);
void Renderer11::setScissorRectangle(const gl::Rectangle &scissor, bool enabled) error = mStateManager.setRasterizerState(rasterizer);
{ if (error.isError())
mStateManager.setScissorRectangle(scissor, enabled); {
return error;
}
// Setting blend state
unsigned int mask = GetBlendSampleMask(data, samples);
error = mStateManager.setBlendState(framebufferObject, data.state->getBlendState(),
data.state->getBlendColor(), mask);
if (error.isError())
{
return error;
}
// Setting depth stencil state
error = mStateManager.setDepthStencilState(*data.state);
return error;
} }
void Renderer11::setViewport(const gl::Caps *caps, void Renderer11::syncState(const gl::State &state, const gl::State::DirtyBits &bitmask)
const gl::Rectangle &viewport,
float zNear,
float zFar,
GLenum drawMode,
GLenum frontFace,
bool ignoreViewport)
{ {
mStateManager.setViewport(caps, viewport, zNear, zFar); mStateManager.syncState(state, bitmask);
} }
bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize) bool Renderer11::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize)
......
...@@ -121,22 +121,7 @@ class Renderer11 : public RendererD3D ...@@ -121,22 +121,7 @@ class Renderer11 : public RendererD3D
const std::vector<GLint> &vertexUniformBuffers, const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) override; const std::vector<GLint> &fragmentUniformBuffers) override;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState); gl::Error updateState(const gl::Data &data, GLenum drawMode) override;
gl::Error setBlendState(const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState,
const gl::ColorF &blendColor,
unsigned int sampleMask) override;
gl::Error setDepthStencilState(const gl::State &glState) override;
virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
virtual void setViewport(const gl::Caps *caps,
const gl::Rectangle &viewport,
float zNear,
float zFar,
GLenum drawMode,
GLenum frontFace,
bool ignoreViewport);
virtual bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize); virtual bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override; gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override;
......
...@@ -886,6 +886,53 @@ gl::Error Renderer9::setUniformBuffers(const gl::Data &/*data*/, ...@@ -886,6 +886,53 @@ gl::Error Renderer9::setUniformBuffers(const gl::Data &/*data*/,
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
gl::Error Renderer9::updateState(const gl::Data &data, GLenum drawMode)
{
// Applies the render target surface, depth stencil surface, viewport rectangle and
// scissor rectangle to the renderer
const gl::Framebuffer *framebufferObject = data.state->getDrawFramebuffer();
ASSERT(framebufferObject && framebufferObject->checkStatus(data) == GL_FRAMEBUFFER_COMPLETE);
gl::Error error = applyRenderTarget(framebufferObject);
if (error.isError())
{
return error;
}
// Setting viewport state
setViewport(data.caps, data.state->getViewport(), data.state->getNearPlane(),
data.state->getFarPlane(), drawMode, data.state->getRasterizerState().frontFace,
false);
// Setting scissors state
setScissorRectangle(data.state->getScissor(), data.state->isScissorTestEnabled());
// Setting rasterizer state
int samples = framebufferObject->getSamples(data);
gl::RasterizerState rasterizer = data.state->getRasterizerState();
rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0);
error = setRasterizerState(rasterizer);
if (error.isError())
{
return error;
}
// Setting blend state
unsigned int mask = GetBlendSampleMask(data, samples);
error = setBlendState(framebufferObject, data.state->getBlendState(),
data.state->getBlendColor(), mask);
if (error.isError())
{
return error;
}
// Setting depth stencil state
error = setDepthStencilState(*data.state);
return error;
}
gl::Error Renderer9::setRasterizerState(const gl::RasterizerState &rasterState) gl::Error Renderer9::setRasterizerState(const gl::RasterizerState &rasterState)
{ {
bool rasterStateChanged = mForceSetRasterState || memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0; bool rasterStateChanged = mForceSetRasterState || memcmp(&rasterState, &mCurRasterState, sizeof(gl::RasterizerState)) != 0;
......
...@@ -96,21 +96,16 @@ class Renderer9 : public RendererD3D ...@@ -96,21 +96,16 @@ class Renderer9 : public RendererD3D
const std::vector<GLint> &vertexUniformBuffers, const std::vector<GLint> &vertexUniformBuffers,
const std::vector<GLint> &fragmentUniformBuffers) override; const std::vector<GLint> &fragmentUniformBuffers) override;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState); gl::Error updateState(const gl::Data &data, GLenum drawMode) override;
gl::Error setBlendState(const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState, void setScissorRectangle(const gl::Rectangle &scissor, bool enabled);
const gl::ColorF &blendColor, void setViewport(const gl::Caps *caps,
unsigned int sampleMask) override; const gl::Rectangle &viewport,
virtual gl::Error setDepthStencilState(const gl::State &glState); float zNear,
float zFar,
virtual void setScissorRectangle(const gl::Rectangle &scissor, bool enabled); GLenum drawMode,
virtual void setViewport(const gl::Caps *caps, GLenum frontFace,
const gl::Rectangle &viewport, bool ignoreViewport);
float zNear,
float zFar,
GLenum drawMode,
GLenum frontFace,
bool ignoreViewport);
gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override; gl::Error applyRenderTarget(const gl::Framebuffer *frameBuffer) override;
gl::Error applyRenderTarget(const gl::FramebufferAttachment *colorAttachment, gl::Error applyRenderTarget(const gl::FramebufferAttachment *colorAttachment,
...@@ -282,6 +277,13 @@ class Renderer9 : public RendererD3D ...@@ -282,6 +277,13 @@ class Renderer9 : public RendererD3D
WorkaroundsD3D generateWorkarounds() const override; WorkaroundsD3D generateWorkarounds() const override;
gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
gl::Error setBlendState(const gl::Framebuffer *framebuffer,
const gl::BlendState &blendState,
const gl::ColorF &blendColor,
unsigned int sampleMask);
gl::Error setDepthStencilState(const gl::State &glState);
void release(); void release();
void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v); void applyUniformnfv(const D3DUniform *targetUniform, const GLfloat *v);
......
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