Commit 1b08cfcb by Jamie Madill Committed by Commit Bot

Vulkan: Clean up shader buffer DS allocation.

We were using repeated code patterns in several places. Bug: angleproject:5736 Change-Id: I206783dd792c3b0f9d38027235445ec600a60d88 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2773320Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 378b3261
...@@ -1070,6 +1070,20 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet( ...@@ -1070,6 +1070,20 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet(
writeInfo.pTexelBufferView = nullptr; writeInfo.pTexelBufferView = nullptr;
} }
// Lazily allocate the descriptor set. We may not need one if all of the buffers are inactive.
angle::Result ProgramExecutableVk::getOrAllocateShaderResourcesDescriptorSet(
ContextVk *contextVk,
VkDescriptorSet *descriptorSetOut)
{
if (mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)] == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
}
*descriptorSetOut = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
ASSERT(*descriptorSetOut != VK_NULL_HANDLE);
return angle::Result::Continue;
}
angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
ContextVk *contextVk, ContextVk *contextVk,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
...@@ -1086,9 +1100,6 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( ...@@ -1086,9 +1100,6 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER); descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
const bool isStorageBuffer = descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; const bool isStorageBuffer = descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
// Write uniform or storage buffers. // Write uniform or storage buffers.
const gl::State &glState = contextVk->getState(); const gl::State &glState = contextVk->getState();
for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex) for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex)
...@@ -1134,14 +1145,8 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( ...@@ -1134,14 +1145,8 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get()); BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
// Lazily allocate the descriptor set, since we may not need one if all of the buffers are VkDescriptorSet descriptorSet;
// inactive. ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size, WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size,
descriptorSet, descriptorType, binding, arrayElement, 0, descriptorSet, descriptorType, binding, arrayElement, 0,
&bufferInfo, &writeInfo); &bufferInfo, &writeInfo);
...@@ -1179,9 +1184,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1179,9 +1184,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
return angle::Result::Continue; return angle::Result::Continue;
} }
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
std::string blockName(sh::vk::kAtomicCountersBlockName); std::string blockName(sh::vk::kAtomicCountersBlockName);
const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName); const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
...@@ -1196,6 +1198,9 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1196,6 +1198,9 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
const VkDeviceSize requiredOffsetAlignment = const VkDeviceSize requiredOffsetAlignment =
rendererVk->getPhysicalDeviceProperties().limits.minStorageBufferOffsetAlignment; rendererVk->getPhysicalDeviceProperties().limits.minStorageBufferOffsetAlignment;
VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
// Write atomic counter buffers. // Write atomic counter buffers.
for (uint32_t bufferIndex = 0; bufferIndex < atomicCounterBuffers.size(); ++bufferIndex) for (uint32_t bufferIndex = 0; bufferIndex < atomicCounterBuffers.size(); ++bufferIndex)
{ {
...@@ -1215,14 +1220,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1215,14 +1220,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get()); BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
// Lazily allocate the descriptor set, since we may not need one if all of the buffers are
// inactive.
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
VkDeviceSize size = gl::GetBoundBufferAvailableSize(bufferBinding); VkDeviceSize size = gl::GetBoundBufferAvailableSize(bufferBinding);
WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size, WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size,
descriptorSet, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, descriptorSet, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
...@@ -1237,8 +1234,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1237,8 +1234,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
writtenBindings.set(binding); writtenBindings.set(binding);
} }
ASSERT(descriptorSet != VK_NULL_HANDLE);
// Bind the empty buffer to every array slot that's unused. // Bind the empty buffer to every array slot that's unused.
vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer(); vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer();
emptyBuffer.retain(&contextVk->getResourceUseList()); emptyBuffer.retain(&contextVk->getResourceUseList());
...@@ -1283,9 +1278,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1283,9 +1278,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
return angle::Result::Continue; return angle::Result::Continue;
} }
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages(); const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages();
angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset; angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset;
...@@ -1302,14 +1294,8 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( ...@@ -1302,14 +1294,8 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
continue; continue;
} }
// Lazily allocate the descriptor set, since we may not need one if all of the image VkDescriptorSet descriptorSet;
// uniforms are inactive. ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
std::string mappedImageName = GlslangGetMappedSamplerName(imageUniform.name); std::string mappedImageName = GlslangGetMappedSamplerName(imageUniform.name);
...@@ -1451,9 +1437,6 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet( ...@@ -1451,9 +1437,6 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet(
return angle::Result::Continue; return angle::Result::Continue;
} }
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
const uint32_t baseUniformIndex = executable.getFragmentInoutRange().low(); const uint32_t baseUniformIndex = executable.getFragmentInoutRange().low();
const gl::LinkedUniform &baseInputAttachment = uniforms.at(baseUniformIndex); const gl::LinkedUniform &baseInputAttachment = uniforms.at(baseUniformIndex);
std::string baseMappedName = baseInputAttachment.mappedName; std::string baseMappedName = baseInputAttachment.mappedName;
...@@ -1462,14 +1445,8 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet( ...@@ -1462,14 +1445,8 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet(
for (size_t colorIndex : framebufferVk->getState().getColorAttachmentsMask()) for (size_t colorIndex : framebufferVk->getState().getColorAttachmentsMask())
{ {
// Lazily allocate the descriptor set, since we may not need one if all of the image VkDescriptorSet descriptorSet;
// uniforms are inactive. ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(1); VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(1);
VkDescriptorImageInfo *imageInfos = contextVk->allocDescriptorImageInfos(1); VkDescriptorImageInfo *imageInfos = contextVk->allocDescriptorImageInfos(1);
......
...@@ -222,6 +222,8 @@ class ProgramExecutableVk ...@@ -222,6 +222,8 @@ class ProgramExecutableVk
ContextVk *contextVk); ContextVk *contextVk);
void updateTransformFeedbackDescriptorSetImpl(const gl::ProgramState &programState, void updateTransformFeedbackDescriptorSetImpl(const gl::ProgramState &programState,
ContextVk *contextVk); ContextVk *contextVk);
angle::Result getOrAllocateShaderResourcesDescriptorSet(ContextVk *contextVk,
VkDescriptorSet *descriptorSetOut);
angle::Result updateBuffersDescriptorSet(ContextVk *contextVk, angle::Result updateBuffersDescriptorSet(ContextVk *contextVk,
const gl::ShaderType shaderType, const gl::ShaderType shaderType,
vk::CommandBufferHelper *commandBufferHelper, vk::CommandBufferHelper *commandBufferHelper,
......
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