Reduce memory requirements for vkCmdBindDescriptorSets.

Split MVKCmdBindDescriptorSetsStatic into separate subclasses,
depending on use of dynamic offsets, and make them template classes
based on descriptor set count.
This commit is contained in:
Bill Hollings 2020-05-11 18:01:40 -04:00
parent 7e692f76c2
commit 4ba93c16a5
10 changed files with 130 additions and 51 deletions

View File

@ -120,10 +120,49 @@ protected:
#pragma mark - #pragma mark -
#pragma mark MVKCmdBindDescriptorSets #pragma mark MVKCmdBindDescriptorSetsStatic
/** Vulkan command to bind descriptor sets. */ /**
class MVKCmdBindDescriptorSets : public MVKCommand { * Vulkan command to bind descriptor sets without dynamic offsets.
* Template class to balance vector pre-allocations between very common low counts and fewer larger counts.
*/
template <size_t N>
class MVKCmdBindDescriptorSetsStatic : public MVKCommand {
public:
VkResult setContent(MVKCommandBuffer* cmdBuff,
VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout layout,
uint32_t firstSet,
uint32_t setCount,
const VkDescriptorSet* pDescriptorSets);
void encode(MVKCommandEncoder* cmdEncoder) override;
protected:
MVKCommandTypePool<MVKCommand>* getTypePool(MVKCommandPool* cmdPool) override;
MVKVectorInline<MVKDescriptorSet*, N> _descriptorSets;
MVKPipelineLayout* _pipelineLayout;
VkPipelineBindPoint _pipelineBindPoint;
uint32_t _firstSet;
};
// Concrete template class implementations.
typedef MVKCmdBindDescriptorSetsStatic<1> MVKCmdBindDescriptorSetsStatic1;
typedef MVKCmdBindDescriptorSetsStatic<4> MVKCmdBindDescriptorSetsStatic4;
typedef MVKCmdBindDescriptorSetsStatic<8> MVKCmdBindDescriptorSetsStaticMulti;
#pragma mark -
#pragma mark MVKCmdBindDescriptorSetsDynamic
/**
* Vulkan command to bind descriptor sets with dynamic offsets.
* Template class to balance vector pre-allocations between very common low counts and fewer larger counts.
*/
template <size_t N>
class MVKCmdBindDescriptorSetsDynamic : public MVKCmdBindDescriptorSetsStatic<N> {
public: public:
VkResult setContent(MVKCommandBuffer* cmdBuff, VkResult setContent(MVKCommandBuffer* cmdBuff,
@ -140,13 +179,13 @@ public:
protected: protected:
MVKCommandTypePool<MVKCommand>* getTypePool(MVKCommandPool* cmdPool) override; MVKCommandTypePool<MVKCommand>* getTypePool(MVKCommandPool* cmdPool) override;
VkPipelineBindPoint _pipelineBindPoint; MVKVectorInline<uint32_t, N> _dynamicOffsets;
MVKPipelineLayout* _pipelineLayout;
MVKVectorInline<MVKDescriptorSet*, 8> _descriptorSets;
MVKVectorInline<uint32_t, 8> _dynamicOffsets;
uint32_t _firstSet;
}; };
// Concrete template class implementations.
typedef MVKCmdBindDescriptorSetsDynamic<4> MVKCmdBindDescriptorSetsDynamic4;
typedef MVKCmdBindDescriptorSetsDynamic<8> MVKCmdBindDescriptorSetsDynamicMulti;
#pragma mark - #pragma mark -
#pragma mark MVKCmdPushConstants #pragma mark MVKCmdPushConstants

View File

@ -182,16 +182,15 @@ void MVKCmdBindComputePipeline::encode(MVKCommandEncoder* cmdEncoder) {
#pragma mark - #pragma mark -
#pragma mark MVKCmdBindDescriptorSets #pragma mark MVKCmdBindDescriptorSetsStatic
VkResult MVKCmdBindDescriptorSets::setContent(MVKCommandBuffer* cmdBuff, template <size_t N>
VkResult MVKCmdBindDescriptorSetsStatic<N>::setContent(MVKCommandBuffer* cmdBuff,
VkPipelineBindPoint pipelineBindPoint, VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout layout, VkPipelineLayout layout,
uint32_t firstSet, uint32_t firstSet,
uint32_t setCount, uint32_t setCount,
const VkDescriptorSet* pDescriptorSets, const VkDescriptorSet* pDescriptorSets) {
uint32_t dynamicOffsetCount,
const uint32_t* pDynamicOffsets) {
_pipelineBindPoint = pipelineBindPoint; _pipelineBindPoint = pipelineBindPoint;
_pipelineLayout = (MVKPipelineLayout*)layout; _pipelineLayout = (MVKPipelineLayout*)layout;
_firstSet = firstSet; _firstSet = firstSet;
@ -203,6 +202,35 @@ VkResult MVKCmdBindDescriptorSets::setContent(MVKCommandBuffer* cmdBuff,
_descriptorSets.push_back((MVKDescriptorSet*)pDescriptorSets[dsIdx]); _descriptorSets.push_back((MVKDescriptorSet*)pDescriptorSets[dsIdx]);
} }
return VK_SUCCESS;
}
template <size_t N>
void MVKCmdBindDescriptorSetsStatic<N>::encode(MVKCommandEncoder* cmdEncoder) {
_pipelineLayout->bindDescriptorSets(cmdEncoder, _descriptorSets, _firstSet, nullptr);
}
template class MVKCmdBindDescriptorSetsStatic<1>;
template class MVKCmdBindDescriptorSetsStatic<4>;
template class MVKCmdBindDescriptorSetsStatic<8>;
#pragma mark -
#pragma mark MVKCmdBindDescriptorSetsDynamic
template <size_t N>
VkResult MVKCmdBindDescriptorSetsDynamic<N>::setContent(MVKCommandBuffer* cmdBuff,
VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout layout,
uint32_t firstSet,
uint32_t setCount,
const VkDescriptorSet* pDescriptorSets,
uint32_t dynamicOffsetCount,
const uint32_t* pDynamicOffsets) {
MVKCmdBindDescriptorSetsStatic<N>::setContent(cmdBuff, pipelineBindPoint, layout,
firstSet, setCount, pDescriptorSets);
// Add the dynamic offsets // Add the dynamic offsets
_dynamicOffsets.clear(); // Clear for reuse _dynamicOffsets.clear(); // Clear for reuse
_dynamicOffsets.reserve(dynamicOffsetCount); _dynamicOffsets.reserve(dynamicOffsetCount);
@ -213,10 +241,14 @@ VkResult MVKCmdBindDescriptorSets::setContent(MVKCommandBuffer* cmdBuff,
return VK_SUCCESS; return VK_SUCCESS;
} }
void MVKCmdBindDescriptorSets::encode(MVKCommandEncoder* cmdEncoder) { template <size_t N>
_pipelineLayout->bindDescriptorSets(cmdEncoder, _descriptorSets, _firstSet, _dynamicOffsets); void MVKCmdBindDescriptorSetsDynamic<N>::encode(MVKCommandEncoder* cmdEncoder) {
MVKCmdBindDescriptorSetsStatic<N>::_pipelineLayout->bindDescriptorSets(cmdEncoder, MVKCmdBindDescriptorSetsStatic<N>::_descriptorSets, MVKCmdBindDescriptorSetsStatic<N>::_firstSet, &_dynamicOffsets);
} }
template class MVKCmdBindDescriptorSetsDynamic<4>;
template class MVKCmdBindDescriptorSetsDynamic<8>;
#pragma mark - #pragma mark -
#pragma mark MVKCmdPushConstants #pragma mark MVKCmdPushConstants

View File

@ -58,7 +58,8 @@ MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS(BeginRenderPass, 1, 2)
MVK_CMD_TYPE_POOL(NextSubpass) MVK_CMD_TYPE_POOL(NextSubpass)
MVK_CMD_TYPE_POOL(EndRenderPass) MVK_CMD_TYPE_POOL(EndRenderPass)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ExecuteCommands, 1) MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ExecuteCommands, 1)
MVK_CMD_TYPE_POOL(BindDescriptorSets) MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS(BindDescriptorSetsStatic, 1, 4)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(BindDescriptorSetsDynamic, 4)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetViewport, 1) MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetViewport, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetScissor, 1) MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetScissor, 1)
MVK_CMD_TYPE_POOL(SetLineWidth) MVK_CMD_TYPE_POOL(SetLineWidth)

View File

@ -89,7 +89,7 @@ public:
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
uint32_t descStartIndex, uint32_t descStartIndex,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex); uint32_t* pDynamicOffsetIndex);
/** Encodes this binding layout and the specified descriptor on the specified command encoder immediately. */ /** Encodes this binding layout and the specified descriptor on the specified command encoder immediately. */
@ -148,7 +148,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) = 0; uint32_t* pDynamicOffsetIndex) = 0;
/** /**
@ -202,7 +202,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -280,7 +280,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -319,7 +319,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -391,7 +391,7 @@ protected:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex); uint32_t* pDynamicOffsetIndex);
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -433,7 +433,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -473,7 +473,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,
@ -511,7 +511,7 @@ public:
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) override; uint32_t* pDynamicOffsetIndex) override;
void write(MVKDescriptorSet* mvkDescSet, void write(MVKDescriptorSet* mvkDescSet,

View File

@ -83,7 +83,7 @@ uint32_t MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder,
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
uint32_t descStartIndex, uint32_t descStartIndex,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
// Establish the resource indices to use, by combining the offsets of the DSL and this DSL binding. // Establish the resource indices to use, by combining the offsets of the DSL and this DSL binding.
@ -93,7 +93,7 @@ uint32_t MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t descIdx = 0; descIdx < descCnt; descIdx++) { for (uint32_t descIdx = 0; descIdx < descCnt; descIdx++) {
MVKDescriptor* mvkDesc = descSet->getDescriptor(descStartIndex + descIdx); MVKDescriptor* mvkDesc = descSet->getDescriptor(descStartIndex + descIdx);
mvkDesc->bind(cmdEncoder, _info.descriptorType, descIdx, _applyToStage, mvkDesc->bind(cmdEncoder, _info.descriptorType, descIdx, _applyToStage,
mtlIdxs, dynamicOffsets, pDynamicOffsetIndex); mtlIdxs, pDynamicOffsets, pDynamicOffsetIndex);
} }
return descCnt; return descCnt;
} }
@ -476,7 +476,7 @@ void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
MVKMTLBufferBinding bb; MVKMTLBufferBinding bb;
NSUInteger bufferDynamicOffset = 0; NSUInteger bufferDynamicOffset = 0;
@ -485,8 +485,10 @@ void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
// After determining dynamic part of offset (zero otherwise), fall through to non-dynamic handling // After determining dynamic part of offset (zero otherwise), fall through to non-dynamic handling
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
bufferDynamicOffset = dynamicOffsets[*pDynamicOffsetIndex]; if (pDynamicOffsets) {
bufferDynamicOffset = (*pDynamicOffsets)[*pDynamicOffsetIndex];
(*pDynamicOffsetIndex)++; // Move on to next dynamic offset (and feedback to caller) (*pDynamicOffsetIndex)++; // Move on to next dynamic offset (and feedback to caller)
}
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: { case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: {
if (_mvkBuffer) { if (_mvkBuffer) {
@ -581,7 +583,7 @@ void MVKInlineUniformBlockDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
MVKMTLBufferBinding bb; MVKMTLBufferBinding bb;
@ -678,7 +680,7 @@ void MVKImageDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
MVKMTLTextureBinding tb; MVKMTLTextureBinding tb;
MVKMTLBufferBinding bb; MVKMTLBufferBinding bb;
@ -796,7 +798,7 @@ void MVKSamplerDescriptorMixin::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
MVKMTLSamplerStateBinding sb; MVKMTLSamplerStateBinding sb;
switch (descriptorType) { switch (descriptorType) {
@ -914,12 +916,12 @@ void MVKSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
switch (descriptorType) { switch (descriptorType) {
case VK_DESCRIPTOR_TYPE_SAMPLER: { case VK_DESCRIPTOR_TYPE_SAMPLER: {
MVKSamplerDescriptorMixin::bind(cmdEncoder, descriptorType, descriptorIndex, stages, MVKSamplerDescriptorMixin::bind(cmdEncoder, descriptorType, descriptorIndex, stages,
mtlIndexes, dynamicOffsets, pDynamicOffsetIndex); mtlIndexes, pDynamicOffsets, pDynamicOffsetIndex);
break; break;
} }
@ -983,14 +985,14 @@ void MVKCombinedImageSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
switch (descriptorType) { switch (descriptorType) {
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
MVKImageDescriptor::bind(cmdEncoder, descriptorType, descriptorIndex, stages, MVKImageDescriptor::bind(cmdEncoder, descriptorType, descriptorIndex, stages,
mtlIndexes, dynamicOffsets, pDynamicOffsetIndex); mtlIndexes, pDynamicOffsets, pDynamicOffsetIndex);
MVKSamplerDescriptorMixin::bind(cmdEncoder, descriptorType, descriptorIndex, stages, MVKSamplerDescriptorMixin::bind(cmdEncoder, descriptorType, descriptorIndex, stages,
mtlIndexes, dynamicOffsets, pDynamicOffsetIndex); mtlIndexes, pDynamicOffsets, pDynamicOffsetIndex);
break; break;
} }
@ -1057,7 +1059,7 @@ void MVKTexelBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
uint32_t descriptorIndex, uint32_t descriptorIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
MVKMTLTextureBinding tb; MVKMTLTextureBinding tb;
MVKMTLBufferBinding bb; MVKMTLBufferBinding bb;

View File

@ -46,7 +46,7 @@ public:
void bindDescriptorSet(MVKCommandEncoder* cmdEncoder, void bindDescriptorSet(MVKCommandEncoder* cmdEncoder,
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex); uint32_t* pDynamicOffsetIndex);

View File

@ -38,7 +38,7 @@ uint32_t MVKDescriptorSetLayout::getDescriptorIndex(uint32_t binding, uint32_t e
void MVKDescriptorSetLayout::bindDescriptorSet(MVKCommandEncoder* cmdEncoder, void MVKDescriptorSetLayout::bindDescriptorSet(MVKCommandEncoder* cmdEncoder,
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKVector<uint32_t>& dynamicOffsets, MVKVector<uint32_t>* pDynamicOffsets,
uint32_t* pDynamicOffsetIndex) { uint32_t* pDynamicOffsetIndex) {
if (_isPushDescriptorLayout) return; if (_isPushDescriptorLayout) return;
@ -46,7 +46,7 @@ void MVKDescriptorSetLayout::bindDescriptorSet(MVKCommandEncoder* cmdEncoder,
uint32_t bindCnt = (uint32_t)_bindings.size(); uint32_t bindCnt = (uint32_t)_bindings.size();
for (uint32_t descIdx = 0, bindIdx = 0; bindIdx < bindCnt; bindIdx++) { for (uint32_t descIdx = 0, bindIdx = 0; bindIdx < bindCnt; bindIdx++) {
descIdx += _bindings[bindIdx].bind(cmdEncoder, descSet, descIdx, descIdx += _bindings[bindIdx].bind(cmdEncoder, descSet, descIdx,
dslMTLRezIdxOffsets, dynamicOffsets, dslMTLRezIdxOffsets, pDynamicOffsets,
pDynamicOffsetIndex); pDynamicOffsetIndex);
} }
} }

View File

@ -56,7 +56,7 @@ public:
void bindDescriptorSets(MVKCommandEncoder* cmdEncoder, void bindDescriptorSets(MVKCommandEncoder* cmdEncoder,
MVKVector<MVKDescriptorSet*>& descriptorSets, MVKVector<MVKDescriptorSet*>& descriptorSets,
uint32_t firstSet, uint32_t firstSet,
MVKVector<uint32_t>& dynamicOffsets); MVKVector<uint32_t>* pDynamicOffsets);
/** Updates a descriptor set in a command encoder. */ /** Updates a descriptor set in a command encoder. */
void pushDescriptorSet(MVKCommandEncoder* cmdEncoder, void pushDescriptorSet(MVKCommandEncoder* cmdEncoder,

View File

@ -40,7 +40,7 @@ using namespace SPIRV_CROSS_NAMESPACE;
void MVKPipelineLayout::bindDescriptorSets(MVKCommandEncoder* cmdEncoder, void MVKPipelineLayout::bindDescriptorSets(MVKCommandEncoder* cmdEncoder,
MVKVector<MVKDescriptorSet*>& descriptorSets, MVKVector<MVKDescriptorSet*>& descriptorSets,
uint32_t firstSet, uint32_t firstSet,
MVKVector<uint32_t>& dynamicOffsets) { MVKVector<uint32_t>* pDynamicOffsets) {
clearConfigurationResult(); clearConfigurationResult();
uint32_t pDynamicOffsetIndex = 0; uint32_t pDynamicOffsetIndex = 0;
uint32_t dsCnt = (uint32_t)descriptorSets.size(); uint32_t dsCnt = (uint32_t)descriptorSets.size();
@ -50,7 +50,7 @@ void MVKPipelineLayout::bindDescriptorSets(MVKCommandEncoder* cmdEncoder,
MVKDescriptorSetLayout* dsl = _descriptorSetLayouts[dslIdx]; MVKDescriptorSetLayout* dsl = _descriptorSetLayouts[dslIdx];
dsl->bindDescriptorSet(cmdEncoder, descSet, dsl->bindDescriptorSet(cmdEncoder, descSet,
_dslMTLResourceIndexOffsets[dslIdx], _dslMTLResourceIndexOffsets[dslIdx],
dynamicOffsets, &pDynamicOffsetIndex); pDynamicOffsets, &pDynamicOffsetIndex);
setConfigurationResult(dsl->getConfigurationResult()); setConfigurationResult(dsl->getConfigurationResult());
} }
} }

View File

@ -1449,8 +1449,13 @@ MVK_PUBLIC_SYMBOL void vkCmdBindDescriptorSets(
const uint32_t* pDynamicOffsets) { const uint32_t* pDynamicOffsets) {
MVKTraceVulkanCallStart(); MVKTraceVulkanCallStart();
MVKAddCmd(BindDescriptorSets, commandBuffer, pipelineBindPoint, layout, if (dynamicOffsetCount) {
MVKAddCmdFromThreshold(BindDescriptorSetsDynamic, setCount, 4, commandBuffer, pipelineBindPoint, layout,
firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets); firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
} else {
MVKAddCmdFromTwoThresholds(BindDescriptorSetsStatic, setCount, 1, 4, commandBuffer, pipelineBindPoint, layout,
firstSet, setCount, pDescriptorSets);
}
MVKTraceVulkanCallEnd(); MVKTraceVulkanCallEnd();
} }