Vulkan: Refactor for draw call shader patching.
This refactors a few methods to enable draw call shader patching. The
shader serials in the Pipeline description are inserted right before
we query the pipeline cache. This is done during a draw call. Also
renames the 'QueueSerial' member of the ObjectAndSerial class to just
'Serial' to more accurately reflect it usage in ShaderAndSerial.
Also changes the GlslangWrapper class to have all static methods. If we
need to store state we can revert these changes at some point.
Also splits the GlslangWrapper link call into two static calls. One
call is called to get the linked source code. The second call compiles
the linked sources into shader code. Only the second call will be
necessary for draw call shader patching to implement OpenGL line
rasterization in Vulkan.
Bug: angleproject:2598
Change-Id: I7bad3c3eeab1fb062c15a840836db4a28f841a26
Reviewed-on: https://chromium-review.googlesource.com/1127158
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index b30d58a..9eb847e 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -186,10 +186,8 @@
renderer->releaseObject(currentSerial, &mEmptyUniformBlockStorage.memory);
renderer->releaseObject(currentSerial, &mEmptyUniformBlockStorage.buffer);
- mLinkedFragmentModule.destroy(device);
- mLinkedVertexModule.destroy(device);
- mVertexModuleSerial = Serial();
- mFragmentModuleSerial = Serial();
+ mDefaultVertexShaderAndSerial.destroy(device);
+ mDefaultFragmentShaderAndSerial.destroy(device);
mDescriptorSets.clear();
mUsedDescriptorSetRange.invalidate();
@@ -225,17 +223,20 @@
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
{
- ContextVk *contextVk = vk::GetImpl(glContext);
- RendererVk *renderer = contextVk->getRenderer();
- GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
+ ContextVk *contextVk = vk::GetImpl(glContext);
+ RendererVk *renderer = contextVk->getRenderer();
ANGLE_TRY(reset(contextVk));
+ std::string vertexSource;
+ std::string fragmentSource;
+ GlslangWrapper::GetShaderSource(glContext, mState, resources, &vertexSource, &fragmentSource);
+
std::vector<uint32_t> vertexCode;
std::vector<uint32_t> fragmentCode;
bool linkSuccess = false;
- ANGLE_TRY_RESULT(glslangWrapper->linkProgram(glContext, mState, resources, glContext->getCaps(),
- &vertexCode, &fragmentCode),
+ ANGLE_TRY_RESULT(GlslangWrapper::GetShaderCode(glContext->getCaps(), vertexSource,
+ fragmentSource, &vertexCode, &fragmentCode),
linkSuccess);
if (!linkSuccess)
{
@@ -250,8 +251,8 @@
vertexShaderInfo.codeSize = vertexCode.size() * sizeof(uint32_t);
vertexShaderInfo.pCode = vertexCode.data();
- ANGLE_TRY(mLinkedVertexModule.init(contextVk, vertexShaderInfo));
- mVertexModuleSerial = renderer->issueShaderSerial();
+ ANGLE_TRY(mDefaultVertexShaderAndSerial.get().init(contextVk, vertexShaderInfo));
+ mDefaultVertexShaderAndSerial.updateSerial(renderer->issueShaderSerial());
}
{
@@ -262,8 +263,8 @@
fragmentShaderInfo.codeSize = fragmentCode.size() * sizeof(uint32_t);
fragmentShaderInfo.pCode = fragmentCode.data();
- ANGLE_TRY(mLinkedFragmentModule.init(contextVk, fragmentShaderInfo));
- mFragmentModuleSerial = renderer->issueShaderSerial();
+ ANGLE_TRY(mDefaultFragmentShaderAndSerial.get().init(contextVk, fragmentShaderInfo));
+ mDefaultFragmentShaderAndSerial.updateSerial(renderer->issueShaderSerial());
}
ANGLE_TRY(initDefaultUniformBlocks(glContext));
@@ -717,26 +718,18 @@
UNIMPLEMENTED();
}
-const vk::ShaderModule &ProgramVk::getLinkedVertexModule() const
+gl::Error ProgramVk::initShaders(const ContextVk *contextVk,
+ const gl::DrawCallParams &drawCallParams,
+ const vk::ShaderAndSerial **vertexShaderAndSerialOut,
+ const vk::ShaderAndSerial **fragmentShaderAndSerialOut)
{
- ASSERT(mLinkedVertexModule.getHandle() != VK_NULL_HANDLE);
- return mLinkedVertexModule;
-}
-
-Serial ProgramVk::getVertexModuleSerial() const
-{
- return mVertexModuleSerial;
-}
-
-const vk::ShaderModule &ProgramVk::getLinkedFragmentModule() const
-{
- ASSERT(mLinkedFragmentModule.getHandle() != VK_NULL_HANDLE);
- return mLinkedFragmentModule;
-}
-
-Serial ProgramVk::getFragmentModuleSerial() const
-{
- return mFragmentModuleSerial;
+ // TODO(jmadill): Move more init into this method. http://anglebug.com/2598
+ // TODO(jmadill): Line rasterization emulation shaders. http://anglebug.com/2598
+ ASSERT(mDefaultVertexShaderAndSerial.valid());
+ ASSERT(mDefaultFragmentShaderAndSerial.valid());
+ *vertexShaderAndSerialOut = &mDefaultVertexShaderAndSerial;
+ *fragmentShaderAndSerialOut = &mDefaultFragmentShaderAndSerial;
+ return gl::NoError();
}
angle::Result ProgramVk::allocateDescriptorSet(ContextVk *contextVk, uint32_t descriptorSetIndex)