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:
parent
7e692f76c2
commit
4ba93c16a5
@ -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
|
||||||
|
@ -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>
|
||||||
VkPipelineBindPoint pipelineBindPoint,
|
VkResult MVKCmdBindDescriptorSetsStatic<N>::setContent(MVKCommandBuffer* cmdBuff,
|
||||||
VkPipelineLayout layout,
|
VkPipelineBindPoint pipelineBindPoint,
|
||||||
uint32_t firstSet,
|
VkPipelineLayout layout,
|
||||||
uint32_t setCount,
|
uint32_t firstSet,
|
||||||
const VkDescriptorSet* pDescriptorSets,
|
uint32_t setCount,
|
||||||
uint32_t dynamicOffsetCount,
|
const VkDescriptorSet* pDescriptorSets) {
|
||||||
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
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
(*pDynamicOffsetIndex)++; // Move on to next dynamic offset (and feedback to caller)
|
bufferDynamicOffset = (*pDynamicOffsets)[*pDynamicOffsetIndex];
|
||||||
|
(*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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
|
MVKAddCmdFromThreshold(BindDescriptorSetsDynamic, setCount, 4, commandBuffer, pipelineBindPoint, layout,
|
||||||
|
firstSet, setCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
|
||||||
|
} else {
|
||||||
|
MVKAddCmdFromTwoThresholds(BindDescriptorSetsStatic, setCount, 1, 4, commandBuffer, pipelineBindPoint, layout,
|
||||||
|
firstSet, setCount, pDescriptorSets);
|
||||||
|
}
|
||||||
MVKTraceVulkanCallEnd();
|
MVKTraceVulkanCallEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user