Vulkan: Optimize VBO state changes.
Also has some minor optimizations for the front-end.
12% improvement on the Vulkan VBO change test.
Bug: angleproject:3014
Change-Id: I38e1a8194edfc14bfe57424be348cb9688e928f4
Reviewed-on: https://chromium-review.googlesource.com/c/1369286
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 7e81771..0c47c5b 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -10,7 +10,6 @@
#include "libANGLE/renderer/vulkan/ProgramVk.h"
#include "common/debug.h"
-#include "common/utilities.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/renderer_utils.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
@@ -132,11 +131,6 @@
ANGLE_TRY(dynamicBuffer->flush(contextVk));
return angle::Result::Continue;
}
-
-bool UseLineRaster(const ContextVk *contextVk, gl::PrimitiveMode mode)
-{
- return contextVk->getFeatures().basicGLLineRasterization && gl::IsLineMode(mode);
-}
} // anonymous namespace
// ProgramVk::ShaderInfo implementation.
@@ -149,23 +143,21 @@
const std::string &fragmentSource,
bool enableLineRasterEmulation)
{
- if (!valid())
- {
- std::vector<uint32_t> vertexCode;
- std::vector<uint32_t> fragmentCode;
- ANGLE_TRY(GlslangWrapper::GetShaderCode(contextVk, contextVk->getCaps(),
- enableLineRasterEmulation, vertexSource,
- fragmentSource, &vertexCode, &fragmentCode));
+ ASSERT(!valid());
- ANGLE_TRY(vk::InitShaderAndSerial(contextVk, &mShaders[gl::ShaderType::Vertex].get(),
- vertexCode.data(), vertexCode.size() * sizeof(uint32_t)));
- ANGLE_TRY(vk::InitShaderAndSerial(contextVk, &mShaders[gl::ShaderType::Fragment].get(),
- fragmentCode.data(),
- fragmentCode.size() * sizeof(uint32_t)));
+ std::vector<uint32_t> vertexCode;
+ std::vector<uint32_t> fragmentCode;
+ ANGLE_TRY(GlslangWrapper::GetShaderCode(contextVk, contextVk->getCaps(),
+ enableLineRasterEmulation, vertexSource, fragmentSource,
+ &vertexCode, &fragmentCode));
- mProgramHelper.setShader(gl::ShaderType::Vertex, &mShaders[gl::ShaderType::Vertex]);
- mProgramHelper.setShader(gl::ShaderType::Fragment, &mShaders[gl::ShaderType::Fragment]);
- }
+ ANGLE_TRY(vk::InitShaderAndSerial(contextVk, &mShaders[gl::ShaderType::Vertex].get(),
+ vertexCode.data(), vertexCode.size() * sizeof(uint32_t)));
+ ANGLE_TRY(vk::InitShaderAndSerial(contextVk, &mShaders[gl::ShaderType::Fragment].get(),
+ fragmentCode.data(), fragmentCode.size() * sizeof(uint32_t)));
+
+ mProgramHelper.setShader(gl::ShaderType::Vertex, &mShaders[gl::ShaderType::Vertex]);
+ mProgramHelper.setShader(gl::ShaderType::Fragment, &mShaders[gl::ShaderType::Fragment]);
return angle::Result::Continue;
}
@@ -180,11 +172,6 @@
}
}
-bool ProgramVk::ShaderInfo::valid() const
-{
- return mShaders[gl::ShaderType::Vertex].get().valid();
-}
-
// ProgramVk implementation.
ProgramVk::DefaultUniformBlock::DefaultUniformBlock()
: storage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
@@ -727,27 +714,6 @@
UNIMPLEMENTED();
}
-angle::Result ProgramVk::initShaders(ContextVk *contextVk,
- gl::PrimitiveMode mode,
- vk::ShaderProgramHelper **programOut)
-{
- if (UseLineRaster(contextVk, mode))
- {
- ANGLE_TRY(
- mLineRasterShaderInfo.initShaders(contextVk, mVertexSource, mFragmentSource, true));
- ASSERT(mLineRasterShaderInfo.valid());
- *programOut = &mLineRasterShaderInfo.getShaderProgram();
- }
- else
- {
- ANGLE_TRY(mDefaultShaderInfo.initShaders(contextVk, mVertexSource, mFragmentSource, false));
- ASSERT(mDefaultShaderInfo.valid());
- *programOut = &mDefaultShaderInfo.getShaderProgram();
- }
-
- return angle::Result::Continue;
-}
-
angle::Result ProgramVk::allocateDescriptorSet(ContextVk *contextVk, uint32_t descriptorSetIndex)
{
// Write out to a new a descriptor set.
@@ -886,8 +852,8 @@
for (uint32_t arrayElement = 0; arrayElement < samplerBinding.boundTextureUnits.size();
++arrayElement)
{
- GLuint textureUnit = samplerBinding.boundTextureUnits[arrayElement];
- TextureVk *textureVk = activeTextures[textureUnit];
+ GLuint textureUnit = samplerBinding.boundTextureUnits[arrayElement];
+ TextureVk *textureVk = activeTextures[textureUnit];
// Ensure any writes to the textures are flushed before we read from them.
ANGLE_TRY(textureVk->ensureImageInitialized(contextVk));