Cache std::vectors in ProgramD3D to avoid allocations during draw calls.
BUG=angleproject:959
Change-Id: Ie08e68ae27372a97bd118e61478201b0d3dad955
Reviewed-on: https://chromium-review.googlesource.com/262337
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nicolas Capens <capn@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index a94f6c0..e22db3b 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -184,6 +184,7 @@
mUsedVertexSamplerRange(0),
mUsedPixelSamplerRange(0),
mDirtySamplerMapping(true),
+ mTextureUnitTypesCache(renderer->getRendererCaps().maxCombinedTextureImageUnits),
mShaderVersion(100),
mSerial(issueSerial())
{
@@ -340,7 +341,7 @@
// DrawArrays and DrawElements will issue the INVALID_OPERATION error.
updateSamplerMapping();
- std::vector<GLenum> textureUnitTypes(caps.maxCombinedTextureImageUnits, GL_NONE);
+ std::fill(mTextureUnitTypesCache.begin(), mTextureUnitTypesCache.end(), GL_NONE);
for (unsigned int i = 0; i < mUsedPixelSamplerRange; ++i)
{
@@ -348,19 +349,19 @@
{
unsigned int unit = mSamplersPS[i].logicalTextureUnit;
- if (unit >= textureUnitTypes.size())
+ if (unit >= caps.maxCombinedTextureImageUnits)
{
if (infoLog)
{
- infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, textureUnitTypes.size());
+ infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, caps.maxCombinedTextureImageUnits);
}
return false;
}
- if (textureUnitTypes[unit] != GL_NONE)
+ if (mTextureUnitTypesCache[unit] != GL_NONE)
{
- if (mSamplersPS[i].textureType != textureUnitTypes[unit])
+ if (mSamplersPS[i].textureType != mTextureUnitTypesCache[unit])
{
if (infoLog)
{
@@ -372,7 +373,7 @@
}
else
{
- textureUnitTypes[unit] = mSamplersPS[i].textureType;
+ mTextureUnitTypesCache[unit] = mSamplersPS[i].textureType;
}
}
}
@@ -383,19 +384,19 @@
{
unsigned int unit = mSamplersVS[i].logicalTextureUnit;
- if (unit >= textureUnitTypes.size())
+ if (unit >= caps.maxCombinedTextureImageUnits)
{
if (infoLog)
{
- infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, textureUnitTypes.size());
+ infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, caps.maxCombinedTextureImageUnits);
}
return false;
}
- if (textureUnitTypes[unit] != GL_NONE)
+ if (mTextureUnitTypesCache[unit] != GL_NONE)
{
- if (mSamplersVS[i].textureType != textureUnitTypes[unit])
+ if (mSamplersVS[i].textureType != mTextureUnitTypesCache[unit])
{
if (infoLog)
{
@@ -407,7 +408,7 @@
}
else
{
- textureUnitTypes[unit] = mSamplersVS[i].textureType;
+ mTextureUnitTypesCache[unit] = mSamplersVS[i].textureType;
}
}
}
@@ -838,7 +839,7 @@
gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, ShaderExecutableD3D **outExecutable)
{
- std::vector<GLenum> outputs;
+ mPixelShaderOutputFormatCache.clear();
const FramebufferD3D *fboD3D = GetImplAs<FramebufferD3D>(fbo);
const gl::AttachmentList &colorbuffers = fboD3D->getColorAttachmentsForRender(mRenderer->getWorkarounds());
@@ -849,15 +850,15 @@
if (colorbuffer)
{
- outputs.push_back(colorbuffer->getBinding() == GL_BACK ? GL_COLOR_ATTACHMENT0 : colorbuffer->getBinding());
+ mPixelShaderOutputFormatCache.push_back(colorbuffer->getBinding() == GL_BACK ? GL_COLOR_ATTACHMENT0 : colorbuffer->getBinding());
}
else
{
- outputs.push_back(GL_NONE);
+ mPixelShaderOutputFormatCache.push_back(GL_NONE);
}
}
- return getPixelExecutableForOutputLayout(outputs, outExecutable, nullptr);
+ return getPixelExecutableForOutputLayout(mPixelShaderOutputFormatCache, outExecutable, nullptr);
}
gl::Error ProgramD3D::getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputSignature,