Skip to content

Commit 96f9d89

Browse files
authored
Merge pull request #2273 from billhollings/alloc-var-count-descs-from-pool
Descriptor set only consumes the variable number of descriptors from the pool.
2 parents 8bfa85b + 3262113 commit 96f9d89

File tree

7 files changed

+224
-176
lines changed

7 files changed

+224
-176
lines changed

Diff for: Docs/Whats_New.md

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ Released TBD
2525
- Use Metal argument buffers by default when they are available.
2626
- Revert `MVKConfiguration::useMetalArgumentBuffers` and env var
2727
`MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS` to a boolean value, and enable it by default.
28+
- Support a descriptor pool with less descriptors than the descriptor set layout,
29+
as long as the pool has enough descriptors for the variable descriptor count,
2830
- Update max number of bindless buffers and textures per stage to 1M, per Apple Docs.
2931
- Add option to generate a GPU capture via a temporary named pipe from an external process.
3032
- Fix shader conversion failure when using native texture atomics.

Diff for: MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm

+1-1
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ - (void)setDepthBoundsTestAMD:(BOOL)enable minDepth:(float)minDepth maxDepth:(fl
692692
auto* dslBind = dsLayout->getBindingAt(dslBindIdx);
693693
if (dslBind->getApplyToStage(stage) && shaderBindingUsage.getBit(dslBindIdx)) {
694694
shouldBindArgBuffToStage = true;
695-
uint32_t elemCnt = dslBind->getDescriptorCount(descSet);
695+
uint32_t elemCnt = dslBind->getDescriptorCount(descSet->getVariableDescriptorCount());
696696
for (uint32_t elemIdx = 0; elemIdx < elemCnt; elemIdx++) {
697697
uint32_t descIdx = dslBind->getDescriptorIndex(elemIdx);
698698
if (resourceUsageDirtyDescs.getBit(descIdx, true)) {

Diff for: MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h

+24-9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class MVKCommandEncoder;
2828
class MVKResourcesCommandEncoderState;
2929

3030

31+
/** Magic number to indicate the variable descriptor count is currently unknown. */
32+
static uint32_t kMVKVariableDescriptorCountUnknown = std::numeric_limits<uint32_t>::max();
33+
34+
3135
#pragma mark MVKShaderStageResourceBinding
3236

3337
/** Indicates the Metal resource indexes used by a single shader stage in a descriptor. */
@@ -100,11 +104,10 @@ class MVKDescriptorSetLayoutBinding : public MVKBaseDeviceObject {
100104
* Returns the number of descriptors in this layout.
101105
*
102106
* If this is an inline block data descriptor, always returns 1. If this descriptor
103-
* has a variable descriptor count, and descSet is not null, the variable descriptor
104-
* count provided to that descriptor set is returned. Otherwise returns the value
105-
* defined in VkDescriptorSetLayoutBinding::descriptorCount.
107+
* has a variable descriptor count, and it is provided here, it is returned.
108+
* Otherwise returns the value defined in VkDescriptorSetLayoutBinding::descriptorCount.
106109
*/
107-
uint32_t getDescriptorCount(MVKDescriptorSet* descSet = nullptr) const;
110+
uint32_t getDescriptorCount(uint32_t variableDescriptorCount = kMVKVariableDescriptorCountUnknown) const;
108111

109112
/** Returns the descriptor type of this layout. */
110113
VkDescriptorType getDescriptorType() { return _info.descriptorType; }
@@ -157,7 +160,9 @@ class MVKDescriptorSetLayoutBinding : public MVKBaseDeviceObject {
157160
MVKDescriptorSetLayoutBinding(MVKDevice* device,
158161
MVKDescriptorSetLayout* layout,
159162
const VkDescriptorSetLayoutBinding* pBinding,
160-
VkDescriptorBindingFlagsEXT bindingFlags);
163+
VkDescriptorBindingFlagsEXT bindingFlags,
164+
uint32_t& dslDescCnt,
165+
uint32_t& dslMTLRezCnt);
161166

162167
MVKDescriptorSetLayoutBinding(const MVKDescriptorSetLayoutBinding& binding);
163168

@@ -168,9 +173,13 @@ class MVKDescriptorSetLayoutBinding : public MVKBaseDeviceObject {
168173
friend class MVKDescriptorSet;
169174
friend class MVKInlineUniformBlockDescriptor;
170175

171-
void initMetalResourceIndexOffsets(const VkDescriptorSetLayoutBinding* pBinding, uint32_t stage);
172-
void addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args);
176+
void initMetalResourceIndexOffsets(const VkDescriptorSetLayoutBinding* pBinding,
177+
uint32_t stage,
178+
uint32_t dslMTLRezCnt);
179+
void addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args,
180+
uint32_t variableDescriptorCount);
173181
void addMTLArgumentDescriptor(NSMutableArray<MTLArgumentDescriptor*>* args,
182+
uint32_t variableDescriptorCount,
174183
uint32_t argIndex,
175184
MTLDataType dataType,
176185
MTLArgumentAccess access);
@@ -180,8 +189,7 @@ class MVKDescriptorSetLayoutBinding : public MVKBaseDeviceObject {
180189
bool validate(MVKSampler* mvkSampler);
181190
void encodeImmutableSamplersToMetalArgumentBuffer(MVKDescriptorSet* mvkDescSet);
182191
uint8_t getMaxPlaneCount();
183-
uint32_t getMTLResourceCount();
184-
bool needsBuffSizeAuxBuffer();
192+
uint32_t getMTLResourceCount(uint32_t variableDescriptorCount = kMVKVariableDescriptorCountUnknown);
185193
std::string getLogDescription();
186194

187195
MVKDescriptorSetLayout* _layout;
@@ -674,5 +682,12 @@ class MVKStorageTexelBufferDescriptor : public MVKTexelBufferDescriptor {
674682
#pragma mark -
675683
#pragma mark Support functions
676684

685+
/**
686+
* If the binding defines a buffer type, returns whether there are buffers, and
687+
* therefore an auxilliary buffer is required to hold the lengths of those buffers.
688+
* Returns false if the binding does not define a buffer type.
689+
*/
690+
bool mvkNeedsBuffSizeAuxBuffer(const VkDescriptorSetLayoutBinding* pBinding);
691+
677692
/** Returns the name of the descriptor type. */
678693
const char* mvkVkDescriptorTypeName(VkDescriptorType vkDescType);

Diff for: MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm

+62-58
Original file line numberDiff line numberDiff line change
@@ -190,16 +190,13 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
190190

191191
MVKVulkanAPIObject* MVKDescriptorSetLayoutBinding::getVulkanAPIObject() { return _layout; };
192192

193-
uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount(MVKDescriptorSet* descSet) const {
194-
193+
uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount(uint32_t variableDescriptorCount) const {
195194
if (_info.descriptorType == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
196195
return 1;
197196
}
198-
199-
if (descSet && hasVariableDescriptorCount()) {
200-
return descSet->_variableDescriptorCount;
197+
if (hasVariableDescriptorCount()) {
198+
return std::min(variableDescriptorCount, _info.descriptorCount);
201199
}
202-
203200
return _info.descriptorCount;
204201
}
205202

@@ -215,7 +212,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
215212
MVKShaderResourceBinding mtlIdxs = _mtlResourceIndexOffsets + dslMTLRezIdxOffsets;
216213

217214
VkDescriptorType descType = getDescriptorType();
218-
uint32_t descCnt = getDescriptorCount(descSet);
215+
uint32_t descCnt = getDescriptorCount(descSet->_variableDescriptorCount);
219216
for (uint32_t descIdx = 0; descIdx < descCnt; descIdx++) {
220217
MVKDescriptor* mvkDesc = descSet->getDescriptor(getBinding(), descIdx);
221218
if (mvkDesc->getDescriptorType() == descType) {
@@ -417,53 +414,54 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
417414
}
418415

419416
// 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) {
421419
switch (getDescriptorType()) {
422420

423421
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
424422
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
425423
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
426-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadOnly);
424+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadOnly);
427425
break;
428426

429427
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
430428
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
431-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
429+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
432430
break;
433431

434432
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
435433
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
436-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
434+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
437435
break;
438436

439437
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
440-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
438+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
441439
if (!getMetalFeatures().nativeTextureAtomics) { // Needed for emulated atomic operations
442-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
440+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
443441
}
444442
break;
445443

446444
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
447-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
445+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
448446
break;
449447

450448
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
451-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
449+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
452450
if (!getMetalFeatures().nativeTextureAtomics) { // Needed for emulated atomic operations
453-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
451+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
454452
}
455453
break;
456454

457455
case VK_DESCRIPTOR_TYPE_SAMPLER:
458-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
456+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
459457
break;
460458

461459
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
462460
uint8_t maxPlaneCnt = getMaxPlaneCount();
463461
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);
465463
}
466-
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
464+
addMTLArgumentDescriptor(args, variableDescriptorCount, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
467465
break;
468466
}
469467

@@ -473,10 +471,11 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
473471
}
474472

475473
void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptor(NSMutableArray<MTLArgumentDescriptor*>* args,
474+
uint32_t variableDescriptorCount,
476475
uint32_t argIndex,
477476
MTLDataType dataType,
478477
MTLArgumentAccess access) {
479-
uint32_t descCnt = getDescriptorCount();
478+
uint32_t descCnt = getDescriptorCount(variableDescriptorCount);
480479
if (descCnt == 0) { return; }
481480

482481
auto* argDesc = [MTLArgumentDescriptor argumentDescriptor];
@@ -497,7 +496,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
497496
return maxPlaneCnt;
498497
}
499498

500-
uint32_t MVKDescriptorSetLayoutBinding::getMTLResourceCount() {
499+
uint32_t MVKDescriptorSetLayoutBinding::getMTLResourceCount(uint32_t variableDescriptorCount) {
501500
uint32_t rezCntPerElem = 1;
502501
switch (_info.descriptorType) {
503502
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
@@ -510,7 +509,7 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
510509
default:
511510
break;
512511
}
513-
return rezCntPerElem * getDescriptorCount();
512+
return rezCntPerElem * getDescriptorCount(variableDescriptorCount);
514513
}
515514

516515
// Encodes an immutable sampler to the Metal argument buffer.
@@ -532,13 +531,15 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
532531
void MVKDescriptorSetLayoutBinding::populateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
533532
MVKShaderResourceBinding& dslMTLRezIdxOffsets,
534533
uint32_t dslIndex) {
535-
uint32_t descCnt = getDescriptorCount();
534+
// For argument buffers, set variable length arrays to length 1 in shader.
536535
bool isUsingMtlArgBuff = _layout->isUsingMetalArgumentBuffers();
537-
MVKSampler* mvkSamp = !_immutableSamplers.empty() ? _immutableSamplers.front() : nullptr;
536+
uint32_t descCnt = isUsingMtlArgBuff ? getDescriptorCount(1) : getDescriptorCount();
538537

539538
// Establish the resource indices to use, by combining the offsets of the DSL and this DSL binding.
540539
MVKShaderResourceBinding mtlIdxs = _mtlResourceIndexOffsets + dslMTLRezIdxOffsets;
541540

541+
MVKSampler* mvkSamp = !_immutableSamplers.empty() ? _immutableSamplers.front() : nullptr;
542+
542543
for (uint32_t stage = kMVKShaderStageVertex; stage < kMVKShaderStageCount; stage++) {
543544
if (_applyToStage[stage] || isUsingMtlArgBuff) {
544545
mvkPopulateShaderConversionConfig(shaderConfig,
@@ -600,12 +601,14 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
600601
MVKDescriptorSetLayoutBinding::MVKDescriptorSetLayoutBinding(MVKDevice* device,
601602
MVKDescriptorSetLayout* layout,
602603
const VkDescriptorSetLayoutBinding* pBinding,
603-
VkDescriptorBindingFlagsEXT bindingFlags) :
604+
VkDescriptorBindingFlagsEXT bindingFlags,
605+
uint32_t& dslDescCnt,
606+
uint32_t& dslMTLRezCnt) :
604607
MVKBaseDeviceObject(device),
605608
_layout(layout),
606609
_info(*pBinding),
607610
_flags(bindingFlags),
608-
_descriptorIndex(layout->_descriptorCount) {
611+
_descriptorIndex(dslDescCnt) {
609612

610613
// If immutable samplers are defined, copy them in.
611614
// Do this before anything else, because they are referenced in getMaxPlaneCount().
@@ -624,14 +627,14 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
624627
// Determine if this binding is used by this shader stage, and initialize resource indexes.
625628
for (uint32_t stage = kMVKShaderStageVertex; stage < kMVKShaderStageCount; stage++) {
626629
_applyToStage[stage] = mvkAreAllFlagsEnabled(pBinding->stageFlags, mvkVkShaderStageFlagBitsFromMVKShaderStage(MVKShaderStage(stage)));
627-
initMetalResourceIndexOffsets(pBinding, stage);
630+
initMetalResourceIndexOffsets(pBinding, stage, dslMTLRezCnt);
628631
}
629632

630633
// Update descriptor set layout counts
631634
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)) {
635638
_layout->_maxBufferIndex = std::max(_layout->_maxBufferIndex, int32_t(_mtlResourceIndexOffsets.getMaxBufferIndex() + descCnt) - 1);
636639
}
637640
}
@@ -661,19 +664,20 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
661664

662665
// Sets the appropriate Metal resource indexes within this binding from the
663666
// 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) {
666670
// Sets an index offset and updates both that index and the general resource index.
667671
// Can be used more than once for combined multi-resource descriptor types.
668672
// 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+
} \
677681

678682
bool isUsingMtlArgBuff = _layout->isUsingMetalArgumentBuffers();
679683
auto& mtlFeats = getMetalFeatures();
@@ -744,24 +748,6 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
744748
}
745749
}
746750

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-
765751

766752
#pragma mark -
767753
#pragma mark MVKDescriptor
@@ -1355,6 +1341,24 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s
13551341
#pragma mark -
13561342
#pragma mark Support functions
13571343

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+
13581362
#define CASE_STRINGIFY(V) case V: return #V
13591363

13601364
const char* mvkVkDescriptorTypeName(VkDescriptorType vkDescType) {

0 commit comments

Comments
 (0)