Commit 002b7c19 by Nicolas Capens Committed by Nicolas Capens

Record vkCmdBindDescriptorSets() as a single command

Previously we split it up into multiple commands to bind each descriptor set individually. This required knowing how many dynamic offsets buffers exist in each set, and some of the work happened at the time of the command execution. Now it's just a single simple data copying operation which doesn't need to know how the dynamic offsets are distributed between the sets. Bug: b/154522740 Change-Id: I0f094a7f91abc16e6bf971994426c104e8582c00 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/44329Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 026f7d07
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
// limitations under the License. // limitations under the License.
#include "VkCommandBuffer.hpp" #include "VkCommandBuffer.hpp"
#include "VkBuffer.hpp" #include "VkBuffer.hpp"
#include "VkConfig.h"
#include "VkDevice.hpp" #include "VkDevice.hpp"
#include "VkEvent.hpp" #include "VkEvent.hpp"
#include "VkFence.hpp" #include "VkFence.hpp"
...@@ -1084,45 +1086,58 @@ private: ...@@ -1084,45 +1086,58 @@ private:
vk::Event *ev; vk::Event *ev;
}; };
class CmdBindDescriptorSet : public vk::CommandBuffer::Command class CmdBindDescriptorSets : public vk::CommandBuffer::Command
{ {
public: public:
CmdBindDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const vk::PipelineLayout *pipelineLayout, uint32_t setNumber, vk::DescriptorSet *descriptorSet, CmdBindDescriptorSets(VkPipelineBindPoint pipelineBindPoint,
uint32_t dynamicOffsetCount, uint32_t const *dynamicOffsets) uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
uint32_t firstDynamicOffset, uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets)
: pipelineBindPoint(pipelineBindPoint) : pipelineBindPoint(pipelineBindPoint)
, pipelineLayout(pipelineLayout) , firstSet(firstSet)
, setNumber(setNumber) , descriptorSetCount(descriptorSetCount)
, descriptorSet(descriptorSet) , firstDynamicOffset(firstDynamicOffset)
, dynamicOffsetCount(dynamicOffsetCount) , dynamicOffsetCount(dynamicOffsetCount)
{ {
for(uint32_t i = 0; i < descriptorSetCount; i++)
{
descriptorSets[firstSet + i] = vk::Cast(pDescriptorSets[i])->data;
}
for(uint32_t i = 0; i < dynamicOffsetCount; i++) for(uint32_t i = 0; i < dynamicOffsetCount; i++)
{ {
this->dynamicOffsets[i] = dynamicOffsets[i]; dynamicOffsets[firstDynamicOffset + i] = pDynamicOffsets[i];
} }
} }
void play(vk::CommandBuffer::ExecutionState &executionState) override void play(vk::CommandBuffer::ExecutionState &executionState) override
{ {
ASSERT_OR_RETURN((pipelineBindPoint < VK_PIPELINE_BIND_POINT_RANGE_SIZE) && (setNumber < vk::MAX_BOUND_DESCRIPTOR_SETS)); ASSERT(pipelineBindPoint < VK_PIPELINE_BIND_POINT_RANGE_SIZE);
ASSERT(firstSet + descriptorSetCount <= vk::MAX_BOUND_DESCRIPTOR_SETS);
ASSERT(firstDynamicOffset + dynamicOffsetCount <= vk::MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC);
auto &pipelineState = executionState.pipelineState[pipelineBindPoint]; auto &pipelineState = executionState.pipelineState[pipelineBindPoint];
pipelineState.descriptorSets[setNumber] = descriptorSet->data;
for(uint32_t i = 0; i < dynamicOffsetCount; i++) for(uint32_t i = firstSet; i < firstSet + descriptorSetCount; i++)
{ {
auto dynamicBindingBaseIndex = pipelineLayout->getDynamicOffsetIndex(setNumber, 0); pipelineState.descriptorSets[i] = descriptorSets[i];
ASSERT_OR_RETURN(dynamicBindingBaseIndex + dynamicOffsetCount <= vk::MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC); }
pipelineState.descriptorDynamicOffsets[dynamicBindingBaseIndex + i] = dynamicOffsets[i];
for(uint32_t i = firstDynamicOffset; i < firstDynamicOffset + dynamicOffsetCount; i++)
{
pipelineState.descriptorDynamicOffsets[i] = dynamicOffsets[i];
} }
} }
std::string description() override { return "vkCmdBindDescriptorSet()"; } std::string description() override { return "vkCmdBindDescriptorSets()"; }
private: private:
const VkPipelineBindPoint pipelineBindPoint; const VkPipelineBindPoint pipelineBindPoint;
const vk::PipelineLayout *const pipelineLayout; const uint32_t firstSet;
const uint32_t setNumber; const uint32_t descriptorSetCount;
vk::DescriptorSet *const descriptorSet; const uint32_t firstDynamicOffset;
const uint32_t dynamicOffsetCount; const uint32_t dynamicOffsetCount;
vk::DescriptorSet::Bindings descriptorSets;
vk::DescriptorSet::DynamicOffsets dynamicOffsets; vk::DescriptorSet::DynamicOffsets dynamicOffsets;
}; };
...@@ -1559,26 +1574,17 @@ void CommandBuffer::setStencilReference(VkStencilFaceFlags faceMask, uint32_t re ...@@ -1559,26 +1574,17 @@ void CommandBuffer::setStencilReference(VkStencilFaceFlags faceMask, uint32_t re
addCommand<::CmdSetStencilReference>(faceMask, reference); addCommand<::CmdSetStencilReference>(faceMask, reference);
} }
void CommandBuffer::bindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, const PipelineLayout *layout, void CommandBuffer::bindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, const PipelineLayout *pipelineLayout,
uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets,
uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets)
{ {
ASSERT(state == RECORDING); ASSERT(state == RECORDING);
for(uint32_t i = 0; i < descriptorSetCount; i++) auto firstDynamicOffset = (dynamicOffsetCount != 0) ? pipelineLayout->getDynamicOffsetIndex(firstSet, 0) : 0;
{
auto descriptorSetIndex = firstSet + i;
uint32_t numDynamicDescriptors = layout->getDynamicDescriptorCount(descriptorSetIndex);
ASSERT(numDynamicDescriptors == 0 || pDynamicOffsets != nullptr);
ASSERT(dynamicOffsetCount >= numDynamicDescriptors);
addCommand<::CmdBindDescriptorSet>( addCommand<::CmdBindDescriptorSets>(
pipelineBindPoint, layout, descriptorSetIndex, vk::Cast(pDescriptorSets[i]), pipelineBindPoint, firstSet, descriptorSetCount, pDescriptorSets,
dynamicOffsetCount, pDynamicOffsets); firstDynamicOffset, dynamicOffsetCount, pDynamicOffsets);
pDynamicOffsets += numDynamicDescriptors;
dynamicOffsetCount -= numDynamicDescriptors;
}
} }
void CommandBuffer::bindIndexBuffer(Buffer *buffer, VkDeviceSize offset, VkIndexType indexType) void CommandBuffer::bindIndexBuffer(Buffer *buffer, VkDeviceSize offset, VkIndexType indexType)
......
...@@ -34,8 +34,6 @@ PipelineLayout::PipelineLayout(const VkPipelineLayoutCreateInfo *pCreateInfo, vo ...@@ -34,8 +34,6 @@ PipelineLayout::PipelineLayout(const VkPipelineLayoutCreateInfo *pCreateInfo, vo
uint32_t bindingsArraySize = setLayout->getBindingsArraySize(); uint32_t bindingsArraySize = setLayout->getBindingsArraySize();
descriptorSets[i].bindings = bindingStorage; descriptorSets[i].bindings = bindingStorage;
bindingStorage += bindingsArraySize; bindingStorage += bindingsArraySize;
descriptorSets[i].dynamicDescriptorCount = setLayout->getDynamicDescriptorCount();
descriptorSets[i].bindingCount = bindingsArraySize; descriptorSets[i].bindingCount = bindingsArraySize;
for(uint32_t j = 0; j < bindingsArraySize; j++) for(uint32_t j = 0; j < bindingsArraySize; j++)
...@@ -78,12 +76,6 @@ size_t PipelineLayout::getDescriptorSetCount() const ...@@ -78,12 +76,6 @@ size_t PipelineLayout::getDescriptorSetCount() const
return descriptorSetCount; return descriptorSetCount;
} }
uint32_t PipelineLayout::getDynamicDescriptorCount(uint32_t setNumber) const
{
ASSERT(setNumber < descriptorSetCount);
return descriptorSets[setNumber].dynamicDescriptorCount;
}
uint32_t PipelineLayout::getDynamicOffsetIndex(uint32_t setNumber, uint32_t bindingNumber) const uint32_t PipelineLayout::getDynamicOffsetIndex(uint32_t setNumber, uint32_t bindingNumber) const
{ {
ASSERT(setNumber < descriptorSetCount && bindingNumber < descriptorSets[setNumber].bindingCount); ASSERT(setNumber < descriptorSetCount && bindingNumber < descriptorSets[setNumber].bindingCount);
......
...@@ -29,7 +29,6 @@ public: ...@@ -29,7 +29,6 @@ public:
static size_t ComputeRequiredAllocationSize(const VkPipelineLayoutCreateInfo *pCreateInfo); static size_t ComputeRequiredAllocationSize(const VkPipelineLayoutCreateInfo *pCreateInfo);
size_t getDescriptorSetCount() const; size_t getDescriptorSetCount() const;
uint32_t getDynamicDescriptorCount(uint32_t setNumber) const;
// Returns the index into the pipeline's dynamic offsets array for // Returns the index into the pipeline's dynamic offsets array for
// the given descriptor set and binding number. // the given descriptor set and binding number.
...@@ -53,7 +52,6 @@ private: ...@@ -53,7 +52,6 @@ private:
struct DescriptorSet struct DescriptorSet
{ {
Binding *bindings; Binding *bindings;
uint32_t dynamicDescriptorCount;
uint32_t bindingCount; uint32_t bindingCount;
}; };
......
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