From 0e2439c3e8c568f5d7eed8c27688a9970fe68621 Mon Sep 17 00:00:00 2001 From: Bill Hollings Date: Sat, 10 Apr 2021 09:16:29 -0400 Subject: [PATCH] Metal argument buffers handle descriptor bindings with zero descriptor count. If descriptor count is zero, don't add MTLArgumentDescriptor to MTLArgumentEncoder, and don't populate resources into shader converter. Don't update command encoder resource usage if resource is nil. --- .../Commands/MVKCommandEncoderState.mm | 26 +++++-------------- MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h | 2 +- MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm | 12 ++++++--- 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm index 93036367..25a88a96 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCommandEncoderState.mm @@ -903,19 +903,11 @@ void MVKGraphicsResourcesCommandEncoderState::bindMetalArgumentBuffer(MVKShaderS bindBuffer(stage, buffBind); } -//void MVKGraphicsResourcesCommandEncoderState::encodeDynamicBufferOffset(MVKShaderStage stage, -// uint32_t descSetIndex, -// uint32_t descIndex, -// uint32_t dynamicOffsetBufferIndex) { -// uint32_t dynamicOffset = _dynamicOffsets[getDynamicOffsetKey(descSetIndex, descIndex)]; -// updateImplicitBuffer(_shaderStageResourceBindings[stage].dynamicOffsets, dynamicOffsetBufferIndex, dynamicOffset); -//} - void MVKGraphicsResourcesCommandEncoderState::encodeArgumentBufferResourceUsage(id mtlResource, MTLResourceUsage mtlUsage, MTLRenderStages mtlStages) { - auto* mtlRendEnc = _cmdEncoder->_mtlRenderEncoder; - if (mtlRendEnc && mtlStages) { + if (mtlResource && mtlStages) { + auto* mtlRendEnc = _cmdEncoder->_mtlRenderEncoder; if ([mtlRendEnc respondsToSelector: @selector(useResource:usage:stages:)]) { [mtlRendEnc useResource: mtlResource usage: mtlUsage stages: mtlStages]; } else { @@ -1042,19 +1034,13 @@ void MVKComputeResourcesCommandEncoderState::bindMetalArgumentBuffer(MVKShaderSt bindBuffer(buffBind); } -//void MVKComputeResourcesCommandEncoderState::encodeDynamicBufferOffset(MVKShaderStage stage, -// uint32_t descSetIndex, -// uint32_t descIndex, -// uint32_t dynamicOffsetBufferIndex) { -// uint32_t dynamicOffset = _dynamicOffsets[getDynamicOffsetKey(descSetIndex, descIndex)]; -// updateImplicitBuffer(_resourceBindings.dynamicOffsets, dynamicOffsetBufferIndex, dynamicOffset); -//} - void MVKComputeResourcesCommandEncoderState::encodeArgumentBufferResourceUsage(id mtlResource, MTLResourceUsage mtlUsage, MTLRenderStages mtlStages) { - auto* mtlCompEnc = _cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch); - [mtlCompEnc useResource: mtlResource usage: mtlUsage]; + if (mtlResource) { + auto* mtlCompEnc = _cmdEncoder->getMTLComputeEncoder(kMVKCommandUseDispatch); + [mtlCompEnc useResource: mtlResource usage: mtlUsage]; + } } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h index 50ecb875..a9f85840 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h @@ -139,7 +139,7 @@ public: /** * Returns the indexes into the resources, relative to the descriptor set. * When using Metal argument buffers, all stages have the same values, and - * in that case the value can be withheld and a default stage will be used. + * in that case the stage can be withheld and a default stage will be used. */ MVKShaderStageResourceBinding& getMetalResourceIndexOffsets(MVKShaderStage stage = kMVKShaderStageVertex) { return _mtlResourceIndexOffsets.getMetalResourceIndexs(stage); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm index 907356db..84bce69c 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm @@ -500,11 +500,14 @@ void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptor(NSMutableArray 0) { mvkPopulateShaderConverterContext(context, mtlIdxs.stages[stage], MVKShaderStage(stage), dslIndex, _info.binding, - getDescriptorCount(), + descCnt, getDescriptorType(), mvkSamp); }