@@ -190,16 +190,13 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
190
190
191
191
MVKVulkanAPIObject* MVKDescriptorSetLayoutBinding::getVulkanAPIObject () { return _layout; };
192
192
193
- uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount (MVKDescriptorSet* descSet) const {
194
-
193
+ uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount (uint32_t variableDescriptorCount) const {
195
194
if (_info.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
196
195
return 1 ;
197
196
}
198
-
199
- if (descSet && hasVariableDescriptorCount ()) {
200
- return descSet->_variableDescriptorCount ;
197
+ if (hasVariableDescriptorCount ()) {
198
+ return std::min (variableDescriptorCount, _info.descriptorCount );
201
199
}
202
-
203
200
return _info.descriptorCount ;
204
201
}
205
202
@@ -215,7 +212,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
215
212
MVKShaderResourceBinding mtlIdxs = _mtlResourceIndexOffsets + dslMTLRezIdxOffsets;
216
213
217
214
VkDescriptorType descType = getDescriptorType ();
218
- uint32_t descCnt = getDescriptorCount (descSet);
215
+ uint32_t descCnt = getDescriptorCount (descSet-> _variableDescriptorCount );
219
216
for (uint32_t descIdx = 0 ; descIdx < descCnt; descIdx++) {
220
217
MVKDescriptor* mvkDesc = descSet->getDescriptor (getBinding (), descIdx);
221
218
if (mvkDesc->getDescriptorType () == descType) {
@@ -417,53 +414,54 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
417
414
}
418
415
419
416
// Adds MTLArgumentDescriptors to the array, and updates resource indexes consumed.
420
- void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptors (NSMutableArray <MTLArgumentDescriptor *>* args) {
417
+ void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptors (NSMutableArray <MTLArgumentDescriptor *>* args,
418
+ uint32_t variableDescriptorCount) {
421
419
switch (getDescriptorType ()) {
422
420
423
421
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
424
422
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
425
423
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
426
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadOnly );
424
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadOnly );
427
425
break ;
428
426
429
427
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
430
428
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
431
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
429
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
432
430
break ;
433
431
434
432
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
435
433
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
436
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadOnly );
434
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadOnly );
437
435
break ;
438
436
439
437
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
440
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadWrite );
438
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadWrite );
441
439
if (!getMetalFeatures ().nativeTextureAtomics ) { // Needed for emulated atomic operations
442
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
440
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
443
441
}
444
442
break ;
445
443
446
444
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
447
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadOnly );
445
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadOnly );
448
446
break ;
449
447
450
448
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
451
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadWrite );
449
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().textureIndex , MTLDataTypeTexture , MTLArgumentAccessReadWrite );
452
450
if (!getMetalFeatures ().nativeTextureAtomics ) { // Needed for emulated atomic operations
453
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
451
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().bufferIndex , MTLDataTypePointer , MTLArgumentAccessReadWrite );
454
452
}
455
453
break ;
456
454
457
455
case VK_DESCRIPTOR_TYPE_SAMPLER:
458
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().samplerIndex , MTLDataTypeSampler , MTLArgumentAccessReadOnly );
456
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().samplerIndex , MTLDataTypeSampler , MTLArgumentAccessReadOnly );
459
457
break ;
460
458
461
459
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
462
460
uint8_t maxPlaneCnt = getMaxPlaneCount ();
463
461
for (uint8_t planeIdx = 0 ; planeIdx < maxPlaneCnt; planeIdx++) {
464
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().textureIndex + planeIdx, MTLDataTypeTexture , MTLArgumentAccessReadOnly );
462
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().textureIndex + planeIdx, MTLDataTypeTexture , MTLArgumentAccessReadOnly );
465
463
}
466
- addMTLArgumentDescriptor (args, getMetalResourceIndexOffsets ().samplerIndex , MTLDataTypeSampler , MTLArgumentAccessReadOnly );
464
+ addMTLArgumentDescriptor (args, variableDescriptorCount, getMetalResourceIndexOffsets ().samplerIndex , MTLDataTypeSampler , MTLArgumentAccessReadOnly );
467
465
break ;
468
466
}
469
467
@@ -473,10 +471,11 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
473
471
}
474
472
475
473
void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptor (NSMutableArray <MTLArgumentDescriptor *>* args,
474
+ uint32_t variableDescriptorCount,
476
475
uint32_t argIndex,
477
476
MTLDataType dataType,
478
477
MTLArgumentAccess access) {
479
- uint32_t descCnt = getDescriptorCount ();
478
+ uint32_t descCnt = getDescriptorCount (variableDescriptorCount );
480
479
if (descCnt == 0 ) { return ; }
481
480
482
481
auto * argDesc = [MTLArgumentDescriptor argumentDescriptor ];
@@ -497,7 +496,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
497
496
return maxPlaneCnt;
498
497
}
499
498
500
- uint32_t MVKDescriptorSetLayoutBinding::getMTLResourceCount () {
499
+ uint32_t MVKDescriptorSetLayoutBinding::getMTLResourceCount (uint32_t variableDescriptorCount ) {
501
500
uint32_t rezCntPerElem = 1 ;
502
501
switch (_info.descriptorType ) {
503
502
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
@@ -510,7 +509,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
510
509
default :
511
510
break ;
512
511
}
513
- return rezCntPerElem * getDescriptorCount ();
512
+ return rezCntPerElem * getDescriptorCount (variableDescriptorCount );
514
513
}
515
514
516
515
// Encodes an immutable sampler to the Metal argument buffer.
@@ -532,13 +531,15 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
532
531
void MVKDescriptorSetLayoutBinding::populateShaderConversionConfig (mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
533
532
MVKShaderResourceBinding& dslMTLRezIdxOffsets,
534
533
uint32_t dslIndex) {
535
- uint32_t descCnt = getDescriptorCount ();
534
+ // For argument buffers, set variable length arrays to length 1 in shader.
536
535
bool isUsingMtlArgBuff = _layout->isUsingMetalArgumentBuffers ();
537
- MVKSampler* mvkSamp = !_immutableSamplers. empty () ? _immutableSamplers. front ( ) : nullptr ;
536
+ uint32_t descCnt = isUsingMtlArgBuff ? getDescriptorCount ( 1 ) : getDescriptorCount () ;
538
537
539
538
// Establish the resource indices to use, by combining the offsets of the DSL and this DSL binding.
540
539
MVKShaderResourceBinding mtlIdxs = _mtlResourceIndexOffsets + dslMTLRezIdxOffsets;
541
540
541
+ MVKSampler* mvkSamp = !_immutableSamplers.empty () ? _immutableSamplers.front () : nullptr ;
542
+
542
543
for (uint32_t stage = kMVKShaderStageVertex ; stage < kMVKShaderStageCount ; stage++) {
543
544
if (_applyToStage[stage] || isUsingMtlArgBuff) {
544
545
mvkPopulateShaderConversionConfig (shaderConfig,
@@ -600,12 +601,14 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
600
601
MVKDescriptorSetLayoutBinding::MVKDescriptorSetLayoutBinding (MVKDevice* device,
601
602
MVKDescriptorSetLayout* layout,
602
603
const VkDescriptorSetLayoutBinding* pBinding,
603
- VkDescriptorBindingFlagsEXT bindingFlags) :
604
+ VkDescriptorBindingFlagsEXT bindingFlags,
605
+ uint32_t & dslDescCnt,
606
+ uint32_t & dslMTLRezCnt) :
604
607
MVKBaseDeviceObject(device),
605
608
_layout(layout),
606
609
_info(*pBinding),
607
610
_flags(bindingFlags),
608
- _descriptorIndex(layout->_descriptorCount ) {
611
+ _descriptorIndex(dslDescCnt ) {
609
612
610
613
// If immutable samplers are defined, copy them in.
611
614
// Do this before anything else, because they are referenced in getMaxPlaneCount().
@@ -624,14 +627,14 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
624
627
// Determine if this binding is used by this shader stage, and initialize resource indexes.
625
628
for (uint32_t stage = kMVKShaderStageVertex ; stage < kMVKShaderStageCount ; stage++) {
626
629
_applyToStage[stage] = mvkAreAllFlagsEnabled (pBinding->stageFlags , mvkVkShaderStageFlagBitsFromMVKShaderStage (MVKShaderStage (stage)));
627
- initMetalResourceIndexOffsets (pBinding, stage);
630
+ initMetalResourceIndexOffsets (pBinding, stage, dslMTLRezCnt );
628
631
}
629
632
630
633
// Update descriptor set layout counts
631
634
uint32_t descCnt = getDescriptorCount ();
632
- _layout-> _descriptorCount += descCnt;
633
- _layout-> _mtlResourceTotalCount += getMTLResourceCount ();
634
- if (needsBuffSizeAuxBuffer ( )) {
635
+ dslDescCnt += descCnt;
636
+ dslMTLRezCnt += getMTLResourceCount ();
637
+ if (mvkNeedsBuffSizeAuxBuffer (pBinding )) {
635
638
_layout->_maxBufferIndex = std::max (_layout->_maxBufferIndex , int32_t (_mtlResourceIndexOffsets.getMaxBufferIndex () + descCnt) - 1 );
636
639
}
637
640
}
@@ -661,19 +664,20 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
661
664
662
665
// Sets the appropriate Metal resource indexes within this binding from the
663
666
// specified descriptor set binding counts, and updates those counts accordingly.
664
- void MVKDescriptorSetLayoutBinding::initMetalResourceIndexOffsets (const VkDescriptorSetLayoutBinding* pBinding, uint32_t stage) {
665
-
667
+ void MVKDescriptorSetLayoutBinding::initMetalResourceIndexOffsets (const VkDescriptorSetLayoutBinding* pBinding,
668
+ uint32_t stage,
669
+ uint32_t dslMTLRezCnt) {
666
670
// Sets an index offset and updates both that index and the general resource index.
667
671
// Can be used more than once for combined multi-resource descriptor types.
668
672
// When using Metal argument buffers, we accumulate the resource indexes cummulatively, across all resource types.
669
- #define setResourceIndexOffset (rezIdx, mtlRezCntPerElem ) \
670
- if (isUsingMtlArgBuff) { \
671
- bindIdxs.rezIdx = _layout-> _mtlResourceTotalCount + descIdxOfst; \
672
- descIdxOfst += descCnt * mtlRezCntPerElem; \
673
- } else if (_applyToStage[stage]) { \
674
- bindIdxs.rezIdx = dslCnts.rezIdx ; \
675
- dslCnts.rezIdx += descCnt * mtlRezCntPerElem; \
676
- } \
673
+ #define setResourceIndexOffset (rezIdx, mtlRezCntPerElem ) \
674
+ if (isUsingMtlArgBuff) { \
675
+ bindIdxs.rezIdx = dslMTLRezCnt + descIdxOfst; \
676
+ descIdxOfst += descCnt * mtlRezCntPerElem; \
677
+ } else if (_applyToStage[stage]) { \
678
+ bindIdxs.rezIdx = dslCnts.rezIdx ; \
679
+ dslCnts.rezIdx += descCnt * mtlRezCntPerElem; \
680
+ } \
677
681
678
682
bool isUsingMtlArgBuff = _layout->isUsingMetalArgumentBuffers ();
679
683
auto & mtlFeats = getMetalFeatures ();
@@ -744,24 +748,6 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
744
748
}
745
749
}
746
750
747
- bool MVKDescriptorSetLayoutBinding::needsBuffSizeAuxBuffer () {
748
-
749
- if ( !_layout->isUsingMetalArgumentBuffers () ) { return false ; }
750
- if ( getDescriptorCount () == 0 ) { return false ; }
751
-
752
- switch (getDescriptorType ()) {
753
- case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
754
- case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
755
- case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
756
- case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
757
- case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
758
- return true ;
759
-
760
- default :
761
- return false ;
762
- }
763
- }
764
-
765
751
766
752
#pragma mark -
767
753
#pragma mark MVKDescriptor
@@ -1355,6 +1341,24 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
1355
1341
#pragma mark -
1356
1342
#pragma mark Support functions
1357
1343
1344
+
1345
+ bool mvkNeedsBuffSizeAuxBuffer (const VkDescriptorSetLayoutBinding* pBinding) {
1346
+ switch (pBinding->descriptorType ) {
1347
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
1348
+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
1349
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
1350
+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
1351
+ return pBinding->descriptorCount > 0 ;
1352
+
1353
+ case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
1354
+ return true ;
1355
+
1356
+ default :
1357
+ return false ;
1358
+ }
1359
+ }
1360
+
1361
+
1358
1362
#define CASE_STRINGIFY (V ) case V: return #V
1359
1363
1360
1364
const char * mvkVkDescriptorTypeName (VkDescriptorType vkDescType) {
0 commit comments