Commit efc53d0f by Jamie Madill Committed by Commit Bot

Vulkan: Refactor to descriptor offset array.

This is in preparation for using dynamic offsets for other sets than the default descriptors. Bug: angleproject:5736 Change-Id: I546e688ad57a35b380f8d7f303ffc0c62773ac18 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2804813 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent 4640dbff
......@@ -219,7 +219,6 @@ void ProgramInfo::release(ContextVk *contextVk)
ProgramExecutableVk::ProgramExecutableVk()
: mEmptyDescriptorSets{},
mNumDefaultUniformDescriptors(0),
mDynamicBufferOffsets{},
mProgram(nullptr),
mProgramPipeline(nullptr),
mPerfCounters{},
......@@ -987,7 +986,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
contextVk, driverUniformsSetDesc, DescriptorSetIndex::Internal,
mDescriptorSetLayouts[DescriptorSetIndex::Internal].get().getHandle()));
mDynamicBufferOffsets.resize(glExecutable.getLinkedShaderStageCount());
mDynamicDescriptorOffsets.resize(glExecutable.getLinkedShaderStageCount());
return angle::Result::Continue;
}
......@@ -1046,30 +1045,16 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet(
VkWriteDescriptorSet &writeInfo = contextVk->allocWriteDescriptorSet();
VkDescriptorBufferInfo &bufferInfo = contextVk->allocDescriptorBufferInfo();
if (!defaultUniformBlock.uniformData.empty())
vk::BufferHelper *bufferHelper = defaultUniformBuffer;
if (defaultUniformBlock.uniformData.empty())
{
bufferInfo.buffer = defaultUniformBuffer->getBuffer().getHandle();
}
else
{
vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer();
emptyBuffer.retain(&contextVk->getResourceUseList());
bufferInfo.buffer = emptyBuffer.getBuffer().getHandle();
bufferHelper = &contextVk->getEmptyBuffer();
bufferHelper->retain(&contextVk->getResourceUseList());
}
bufferInfo.offset = 0;
bufferInfo.range = VK_WHOLE_SIZE;
writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeInfo.pNext = nullptr;
writeInfo.dstSet = mDescriptorSets[DescriptorSetIndex::UniformsAndXfb];
writeInfo.dstBinding = info.binding;
writeInfo.dstArrayElement = 0;
writeInfo.descriptorCount = 1;
writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
writeInfo.pImageInfo = nullptr;
writeInfo.pBufferInfo = &bufferInfo;
writeInfo.pTexelBufferView = nullptr;
WriteBufferDescriptorSetBinding(
*bufferHelper, 0, VK_WHOLE_SIZE, mDescriptorSets[DescriptorSetIndex::UniformsAndXfb],
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, info.binding, 0, 0, &bufferInfo, &writeInfo);
}
// Lazily allocate the descriptor set. We may not need one if all of the buffers are inactive.
......@@ -1244,20 +1229,10 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
size_t writeCount = 0;
for (size_t binding : ~writtenBindings)
{
bufferInfos[writeCount].buffer = emptyBuffer.getBuffer().getHandle();
bufferInfos[writeCount].offset = 0;
bufferInfos[writeCount].range = VK_WHOLE_SIZE;
writeInfos[writeCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeInfos[writeCount].pNext = nullptr;
writeInfos[writeCount].dstSet = descriptorSet;
writeInfos[writeCount].dstBinding = info.binding;
writeInfos[writeCount].dstArrayElement = static_cast<uint32_t>(binding);
writeInfos[writeCount].descriptorCount = 1;
writeInfos[writeCount].descriptorType = kStorageBufferDescriptorType;
writeInfos[writeCount].pImageInfo = nullptr;
writeInfos[writeCount].pBufferInfo = &bufferInfos[writeCount];
writeInfos[writeCount].pTexelBufferView = nullptr;
WriteBufferDescriptorSetBinding(emptyBuffer, 0, VK_WHOLE_SIZE, descriptorSet,
kStorageBufferDescriptorType, info.binding,
static_cast<uint32_t>(binding), 0, &bufferInfos[writeCount],
&writeInfos[writeCount]);
writeCount++;
}
......@@ -1758,15 +1733,18 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk,
// Default uniforms are encompassed in a block per shader stage, and they are assigned
// through dynamic uniform buffers (requiring dynamic offsets). No other descriptor
// requires a dynamic offset.
const uint32_t uniformBlockOffsetCount =
descriptorSetIndex == DescriptorSetIndex::UniformsAndXfb
? static_cast<uint32_t>(mNumDefaultUniformDescriptors)
: 0;
commandBuffer->bindDescriptorSets(getPipelineLayout(), pipelineBindPoint,
static_cast<DescriptorSetIndex>(descriptorSetIndex), 1,
&descSet, uniformBlockOffsetCount,
mDynamicBufferOffsets.data());
if (descriptorSetIndex == DescriptorSetIndex::UniformsAndXfb)
{
commandBuffer->bindDescriptorSets(
getPipelineLayout(), pipelineBindPoint, descriptorSetIndex, 1, &descSet,
static_cast<uint32_t>(mDynamicDescriptorOffsets.size()),
mDynamicDescriptorOffsets.data());
}
else
{
commandBuffer->bindDescriptorSets(getPipelineLayout(), pipelineBindPoint,
descriptorSetIndex, 1, &descSet, 0, nullptr);
}
}
return angle::Result::Continue;
......
......@@ -245,8 +245,8 @@ class ProgramExecutableVk
void outputCumulativePerfCounters();
// Descriptor sets for uniform blocks and textures for this program.
vk::DescriptorSetLayoutArray<VkDescriptorSet> mDescriptorSets;
vk::DescriptorSetLayoutArray<VkDescriptorSet> mEmptyDescriptorSets;
vk::DescriptorSetArray<VkDescriptorSet> mDescriptorSets;
vk::DescriptorSetArray<VkDescriptorSet> mEmptyDescriptorSets;
size_t mNumDefaultUniformDescriptors;
vk::BufferSerial mCurrentDefaultUniformBufferSerial;
......@@ -262,14 +262,15 @@ class ProgramExecutableVk
// Keep bindings to the descriptor pools. This ensures the pools stay valid while the Program
// is in use.
vk::DescriptorSetLayoutArray<vk::RefCountedDescriptorPoolBinding> mDescriptorPoolBindings;
vk::DescriptorSetArray<vk::RefCountedDescriptorPoolBinding> mDescriptorPoolBindings;
// Store descriptor pools here. We store the descriptors in the Program to facilitate descriptor
// cache management. It can also allow fewer descriptors for shaders which use fewer
// textures/buffers.
vk::DescriptorSetLayoutArray<vk::DynamicDescriptorPool> mDynamicDescriptorPools;
vk::DescriptorSetArray<vk::DynamicDescriptorPool> mDynamicDescriptorPools;
gl::ShaderVector<uint32_t> mDynamicBufferOffsets;
// A set of dynamic offsets used with vkCmdBindDescriptorSets for the default uniform buffers.
gl::ShaderVector<uint32_t> mDynamicDescriptorOffsets;
// TODO: http://anglebug.com/4524: Need a different hash key than a string,
// since that's slow to calculate.
......
......@@ -179,7 +179,7 @@ angle::Result ProgramPipelineVk::updateUniforms(ContextVk *contextVk)
const angle::MemoryBuffer &uniformData =
programVk->getDefaultUniformBlocks()[shaderType].uniformData;
memcpy(&bufferData[offsets[shaderType]], uniformData.data(), uniformData.size());
mExecutable.mDynamicBufferOffsets[offsetIndex] =
mExecutable.mDynamicDescriptorOffsets[offsetIndex] =
static_cast<uint32_t>(bufferOffset + offsets[shaderType]);
programVk->clearShaderUniformDirtyBit(shaderType);
}
......
......@@ -758,7 +758,7 @@ angle::Result ProgramVk::updateUniforms(ContextVk *contextVk)
{
const angle::MemoryBuffer &uniformData = mDefaultUniformBlocks[shaderType].uniformData;
memcpy(&bufferData[offsets[shaderType]], uniformData.data(), uniformData.size());
mExecutable.mDynamicBufferOffsets[offsetIndex] =
mExecutable.mDynamicDescriptorOffsets[offsetIndex] =
static_cast<uint32_t>(bufferOffset + offsets[shaderType]);
mDefaultUniformBlocksDirty.reset(shaderType);
}
......
......@@ -827,9 +827,8 @@ struct PackedPushConstantRange
};
template <typename T>
using DescriptorSetLayoutArray = angle::PackedEnumMap<DescriptorSetIndex, T>;
using DescriptorSetLayoutPointerArray =
DescriptorSetLayoutArray<BindingPointer<DescriptorSetLayout>>;
using DescriptorSetArray = angle::PackedEnumMap<DescriptorSetIndex, T>;
using DescriptorSetLayoutPointerArray = DescriptorSetArray<BindingPointer<DescriptorSetLayout>>;
template <typename T>
using PushConstantRangeArray = gl::ShaderMap<T>;
......@@ -851,7 +850,7 @@ class PipelineLayoutDesc final
const PushConstantRangeArray<PackedPushConstantRange> &getPushConstantRanges() const;
private:
DescriptorSetLayoutArray<DescriptorSetLayoutDesc> mDescriptorSetLayouts;
DescriptorSetArray<DescriptorSetLayoutDesc> mDescriptorSetLayouts;
PushConstantRangeArray<PackedPushConstantRange> mPushConstantRanges;
// Verify the arrays are properly packed.
......@@ -864,9 +863,8 @@ class PipelineLayoutDesc final
};
// Verify the structure is properly packed.
static_assert(sizeof(PipelineLayoutDesc) ==
(sizeof(DescriptorSetLayoutArray<DescriptorSetLayoutDesc>) +
sizeof(gl::ShaderMap<PackedPushConstantRange>)),
static_assert(sizeof(PipelineLayoutDesc) == (sizeof(DescriptorSetArray<DescriptorSetLayoutDesc>) +
sizeof(gl::ShaderMap<PackedPushConstantRange>)),
"Unexpected Size");
// Packed sampler description for the sampler cache.
......
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