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