Vulkan: Take serials in PipelineDesc::updateShaders.
This makes the API easy to use with internal shaders and pipelines.
This is useful for the implementation of masked color clear.
Also renames the serials as shader serials. This is more precise than
program serials.
Bug: angleproject:2455
Change-Id: Ie6247d1212ed4df856b561a5e9f16c0378202588
Reviewed-on: https://chromium-review.googlesource.com/1032857
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 941fd5b..3dea649 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -534,7 +534,8 @@
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
{
ProgramVk *programVk = vk::GetImpl(glState.getProgram());
- mPipelineDesc->updateShaders(programVk);
+ mPipelineDesc->updateShaders(programVk->getVertexModuleSerial(),
+ programVk->getFragmentModuleSerial());
dirtyTextures = true;
break;
}
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index b4df3cd..714ffd4 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -245,7 +245,7 @@
vertexShaderInfo.pCode = vertexCode.data();
ANGLE_TRY(mLinkedVertexModule.init(device, vertexShaderInfo));
- mVertexModuleSerial = renderer->issueProgramSerial();
+ mVertexModuleSerial = renderer->issueShaderSerial();
}
{
@@ -257,7 +257,7 @@
fragmentShaderInfo.pCode = fragmentCode.data();
ANGLE_TRY(mLinkedFragmentModule.init(device, fragmentShaderInfo));
- mFragmentModuleSerial = renderer->issueProgramSerial();
+ mFragmentModuleSerial = renderer->issueShaderSerial();
}
ANGLE_TRY(initDefaultUniformBlocks(glContext));
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index e79be60..b601a9b 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -951,9 +951,9 @@
return vk::NoError();
}
-Serial RendererVk::issueProgramSerial()
+Serial RendererVk::issueShaderSerial()
{
- return mProgramSerialFactory.generate();
+ return mShaderSerialFactory.generate();
}
vk::Error RendererVk::getPipeline(const ProgramVk *programVk,
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h
index 6a86b0c..cac4e62 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -126,7 +126,7 @@
const std::vector<vk::DescriptorSetLayout> &getGraphicsDescriptorSetLayouts() const;
// Issues a new serial for linked shader modules. Used in the pipeline cache.
- Serial issueProgramSerial();
+ Serial issueShaderSerial();
vk::ShaderLibrary *getShaderLibrary();
@@ -157,7 +157,7 @@
vk::CommandPool mCommandPool;
GlslangWrapper *mGlslangWrapper;
SerialFactory mQueueSerialFactory;
- SerialFactory mProgramSerialFactory;
+ SerialFactory mShaderSerialFactory;
Serial mLastCompletedQueueSerial;
Serial mCurrentQueueSerial;
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index a5d64a7..6348edb 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -631,14 +631,14 @@
return mShaderStageInfo;
}
-void PipelineDesc::updateShaders(ProgramVk *programVk)
+void PipelineDesc::updateShaders(Serial vertexSerial, Serial fragmentSerial)
{
- ASSERT(programVk->getVertexModuleSerial() < std::numeric_limits<uint32_t>::max());
+ ASSERT(vertexSerial < std::numeric_limits<uint32_t>::max());
mShaderStageInfo[ShaderType::VertexShader].moduleSerial =
- static_cast<uint32_t>(programVk->getVertexModuleSerial().getValue());
- ASSERT(programVk->getFragmentModuleSerial() < std::numeric_limits<uint32_t>::max());
+ static_cast<uint32_t>(vertexSerial.getValue());
+ ASSERT(fragmentSerial < std::numeric_limits<uint32_t>::max());
mShaderStageInfo[ShaderType::FragmentShader].moduleSerial =
- static_cast<uint32_t>(programVk->getFragmentModuleSerial().getValue());
+ static_cast<uint32_t>(fragmentSerial.getValue());
}
void PipelineDesc::updateViewport(const gl::Rectangle &viewport, float nearPlane, float farPlane)
diff --git a/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index 6d9c23f..a1f1193 100644
--- a/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -273,7 +273,7 @@
// Shader stage info
const ShaderStageInfo &getShaderStageInfo() const;
- void updateShaders(ProgramVk *programVk);
+ void updateShaders(Serial vertexSerial, Serial fragmentSerial);
// Vertex input state
void updateVertexInputInfo(const VertexInputBindings &bindings,
@@ -315,7 +315,7 @@
void updateStencilBackWriteMask(const gl::DepthStencilState &depthStencilState);
private:
- // TODO(jmadill): Handle Geometry/Compute shaders when necessary.
+ // TODO(jmadill): Use gl::ShaderMap when we can pack into fewer bits. http://anglebug.com/2522
ShaderStageInfo mShaderStageInfo;
VertexInputBindings mVertexInputBindings;
VertexInputAttributes mVertexInputAttribs;
diff --git a/src/libANGLE/renderer/vulkan/vk_internal_shaders.cpp b/src/libANGLE/renderer/vulkan/vk_internal_shaders.cpp
index 9d63890..a145a59 100644
--- a/src/libANGLE/renderer/vulkan/vk_internal_shaders.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_internal_shaders.cpp
@@ -53,7 +53,7 @@
createInfo.pCode = shaderCode.code;
ANGLE_TRY(shader.get().init(renderer->getDevice(), createInfo));
- shader.updateSerial(renderer->issueProgramSerial());
+ shader.updateSerial(renderer->issueShaderSerial());
return NoError();
}
} // namespace vk