Commit 03260faa by Jamie Madill

D3D11: Optimize checks for active UBOs.

We can reduce the amount of iterations we use by using std::vectors for storing UBO indexes, and resizing them to the max active index. This allows us to skip inactive ranges. Reduces draw call overhead. BUG=angleproject:959 Change-Id: I2577e5dbdce0e5ab102ca916eb7f1f35cf03f9ad Reviewed-on: https://chromium-review.googlesource.com/277287Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent f33ab835
...@@ -1143,18 +1143,8 @@ gl::Error ProgramD3D::applyUniforms() ...@@ -1143,18 +1143,8 @@ gl::Error ProgramD3D::applyUniforms()
gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[]) gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data, GLuint uniformBlockBindings[])
{ {
GLint vertexUniformBuffers[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS]; mVertexUBOCache.clear();
GLint fragmentUniformBuffers[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS]; mFragmentUBOCache.clear();
for (unsigned int registerIndex = 0; registerIndex < gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS; ++registerIndex)
{
vertexUniformBuffers[registerIndex] = -1;
}
for (unsigned int registerIndex = 0; registerIndex < gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS; ++registerIndex)
{
fragmentUniformBuffers[registerIndex] = -1;
}
const unsigned int reservedBuffersInVS = mRenderer->getReservedVertexUniformBuffers(); const unsigned int reservedBuffersInVS = mRenderer->getReservedVertexUniformBuffers();
const unsigned int reservedBuffersInFS = mRenderer->getReservedFragmentUniformBuffers(); const unsigned int reservedBuffersInFS = mRenderer->getReservedFragmentUniformBuffers();
...@@ -1175,21 +1165,33 @@ gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data, GLuint uniformBl ...@@ -1175,21 +1165,33 @@ gl::Error ProgramD3D::applyUniformBuffers(const gl::Data &data, GLuint uniformBl
if (uniformBlock->isReferencedByVertexShader()) if (uniformBlock->isReferencedByVertexShader())
{ {
unsigned int registerIndex = uniformBlock->vsRegisterIndex - reservedBuffersInVS; unsigned int registerIndex = uniformBlock->vsRegisterIndex - reservedBuffersInVS;
ASSERT(vertexUniformBuffers[registerIndex] == -1);
ASSERT(registerIndex < data.caps->maxVertexUniformBlocks); ASSERT(registerIndex < data.caps->maxVertexUniformBlocks);
vertexUniformBuffers[registerIndex] = blockBinding;
if (mFragmentUBOCache.size() <= registerIndex)
{
mVertexUBOCache.resize(registerIndex + 1, -1);
}
ASSERT(mVertexUBOCache[registerIndex] == -1);
mVertexUBOCache[registerIndex] = blockBinding;
} }
if (uniformBlock->isReferencedByFragmentShader()) if (uniformBlock->isReferencedByFragmentShader())
{ {
unsigned int registerIndex = uniformBlock->psRegisterIndex - reservedBuffersInFS; unsigned int registerIndex = uniformBlock->psRegisterIndex - reservedBuffersInFS;
ASSERT(fragmentUniformBuffers[registerIndex] == -1);
ASSERT(registerIndex < data.caps->maxFragmentUniformBlocks); ASSERT(registerIndex < data.caps->maxFragmentUniformBlocks);
fragmentUniformBuffers[registerIndex] = blockBinding;
if (mFragmentUBOCache.size() <= registerIndex)
{
mFragmentUBOCache.resize(registerIndex + 1, -1);
}
ASSERT(mFragmentUBOCache[registerIndex] == -1);
mFragmentUBOCache[registerIndex] = blockBinding;
} }
} }
return mRenderer->setUniformBuffers(data, vertexUniformBuffers, fragmentUniformBuffers); return mRenderer->setUniformBuffers(data, mVertexUBOCache, mFragmentUBOCache);
} }
bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader, bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlock *uniformBlock, GLenum shader,
......
...@@ -241,6 +241,9 @@ class ProgramD3D : public ProgramImpl ...@@ -241,6 +241,9 @@ class ProgramD3D : public ProgramImpl
Optional<bool> mCachedValidateSamplersResult; Optional<bool> mCachedValidateSamplersResult;
std::vector<GLint> mVertexUBOCache;
std::vector<GLint> mFragmentUBOCache;
static unsigned int issueSerial(); static unsigned int issueSerial();
static unsigned int mCurrentSerial; static unsigned int mCurrentSerial;
}; };
......
...@@ -116,8 +116,8 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -116,8 +116,8 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0; virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0;
virtual gl::Error setUniformBuffers(const gl::Data &data, virtual gl::Error setUniformBuffers(const gl::Data &data,
const GLint vertexUniformBuffers[], const std::vector<GLint> &vertexUniformBuffers,
const GLint fragmentUniformBuffers[]) = 0; const std::vector<GLint> &fragmentUniformBuffers) = 0;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState) = 0; virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState) = 0;
virtual gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor, virtual gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor,
......
...@@ -981,10 +981,10 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t ...@@ -981,10 +981,10 @@ gl::Error Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *t
} }
gl::Error Renderer11::setUniformBuffers(const gl::Data &data, gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
const GLint vertexUniformBuffers[], const std::vector<GLint> &vertexUniformBuffers,
const GLint fragmentUniformBuffers[]) const std::vector<GLint> &fragmentUniformBuffers)
{ {
for (unsigned int uniformBufferIndex = 0; uniformBufferIndex < data.caps->maxVertexUniformBlocks; uniformBufferIndex++) for (size_t uniformBufferIndex = 0; uniformBufferIndex < vertexUniformBuffers.size(); uniformBufferIndex++)
{ {
GLint binding = vertexUniformBuffers[uniformBufferIndex]; GLint binding = vertexUniformBuffers[uniformBufferIndex];
...@@ -1040,7 +1040,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data, ...@@ -1040,7 +1040,7 @@ gl::Error Renderer11::setUniformBuffers(const gl::Data &data,
} }
} }
for (unsigned int uniformBufferIndex = 0; uniformBufferIndex < data.caps->maxFragmentUniformBlocks; uniformBufferIndex++) for (size_t uniformBufferIndex = 0; uniformBufferIndex < fragmentUniformBuffers.size(); uniformBufferIndex++)
{ {
GLint binding = fragmentUniformBuffers[uniformBufferIndex]; GLint binding = fragmentUniformBuffers[uniformBufferIndex];
......
...@@ -115,8 +115,8 @@ class Renderer11 : public RendererD3D ...@@ -115,8 +115,8 @@ class Renderer11 : public RendererD3D
virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture); virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture);
gl::Error setUniformBuffers(const gl::Data &data, gl::Error setUniformBuffers(const gl::Data &data,
const GLint vertexUniformBuffers[], const std::vector<GLint> &vertexUniformBuffers,
const GLint fragmentUniformBuffers[]) override; const std::vector<GLint> &fragmentUniformBuffers) override;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState); virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor, gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor,
......
...@@ -857,8 +857,8 @@ gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *te ...@@ -857,8 +857,8 @@ gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *te
} }
gl::Error Renderer9::setUniformBuffers(const gl::Data &/*data*/, gl::Error Renderer9::setUniformBuffers(const gl::Data &/*data*/,
const GLint /*vertexUniformBuffers*/[], const std::vector<GLint> &/*vertexUniformBuffers*/,
const GLint /*fragmentUniformBuffers*/[]) const std::vector<GLint> &/*fragmentUniformBuffers*/)
{ {
// No effect in ES2/D3D9 // No effect in ES2/D3D9
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
......
...@@ -90,8 +90,8 @@ class Renderer9 : public RendererD3D ...@@ -90,8 +90,8 @@ class Renderer9 : public RendererD3D
virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture); virtual gl::Error setTexture(gl::SamplerType type, int index, gl::Texture *texture);
gl::Error setUniformBuffers(const gl::Data &data, gl::Error setUniformBuffers(const gl::Data &data,
const GLint vertexUniformBuffers[], const std::vector<GLint> &vertexUniformBuffers,
const GLint fragmentUniformBuffers[]) override; const std::vector<GLint> &fragmentUniformBuffers) override;
virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState); virtual gl::Error setRasterizerState(const gl::RasterizerState &rasterState);
gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor, gl::Error setBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState, const gl::ColorF &blendColor,
......
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