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(
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(
ContextVk *contextVk,
const gl::ShaderType shaderType,
......@@ -1086,9 +1100,6 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
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.
const gl::State &glState = contextVk->getState();
for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex)
......@@ -1134,14 +1145,8 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
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);
VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size,
descriptorSet, descriptorType, binding, arrayElement, 0,
&bufferInfo, &writeInfo);
......@@ -1179,9 +1184,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
return angle::Result::Continue;
}
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
std::string blockName(sh::vk::kAtomicCountersBlockName);
const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName);
......@@ -1196,6 +1198,9 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
const VkDeviceSize requiredOffsetAlignment =
rendererVk->getPhysicalDeviceProperties().limits.minStorageBufferOffsetAlignment;
VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
// Write atomic counter buffers.
for (uint32_t bufferIndex = 0; bufferIndex < atomicCounterBuffers.size(); ++bufferIndex)
{
......@@ -1215,14 +1220,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
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);
WriteBufferDescriptorSetBinding(bufferHelper, bufferBinding.getOffset(), size,
descriptorSet, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
......@@ -1237,8 +1234,6 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
writtenBindings.set(binding);
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
// Bind the empty buffer to every array slot that's unused.
vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer();
emptyBuffer.retain(&contextVk->getResourceUseList());
......@@ -1283,9 +1278,6 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
return angle::Result::Continue;
}
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
const gl::ActiveTextureArray<TextureVk *> &activeImages = contextVk->getActiveImages();
angle::HashMap<std::string, uint32_t> mappedImageNameToArrayOffset;
......@@ -1302,14 +1294,8 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet(
continue;
}
// Lazily allocate the descriptor set, since we may not need one if all of the image
// uniforms are inactive.
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
std::string mappedImageName = GlslangGetMappedSamplerName(imageUniform.name);
......@@ -1451,9 +1437,6 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet(
return angle::Result::Continue;
}
VkDescriptorSet descriptorSet =
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
const uint32_t baseUniformIndex = executable.getFragmentInoutRange().low();
const gl::LinkedUniform &baseInputAttachment = uniforms.at(baseUniformIndex);
std::string baseMappedName = baseInputAttachment.mappedName;
......@@ -1462,14 +1445,8 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet(
for (size_t colorIndex : framebufferVk->getState().getColorAttachmentsMask())
{
// Lazily allocate the descriptor set, since we may not need one if all of the image
// uniforms are inactive.
if (descriptorSet == VK_NULL_HANDLE)
{
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)];
}
ASSERT(descriptorSet != VK_NULL_HANDLE);
VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &descriptorSet));
VkWriteDescriptorSet *writeInfos = contextVk->allocWriteDescriptorSets(1);
VkDescriptorImageInfo *imageInfos = contextVk->allocDescriptorImageInfos(1);
......
......@@ -222,6 +222,8 @@ class ProgramExecutableVk
ContextVk *contextVk);
void updateTransformFeedbackDescriptorSetImpl(const gl::ProgramState &programState,
ContextVk *contextVk);
angle::Result getOrAllocateShaderResourcesDescriptorSet(ContextVk *contextVk,
VkDescriptorSet *descriptorSetOut);
angle::Result updateBuffersDescriptorSet(ContextVk *contextVk,
const gl::ShaderType shaderType,
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