From 78ca4655ab8dddd736a9ce8342946d7f5269a65a Mon Sep 17 00:00:00 2001 From: Michael Barriault Date: Thu, 26 Dec 2019 14:05:08 -0330 Subject: [PATCH] Use MTLBuffer when inline uniform block descriptor is written to instead of copying host-side bytes --- .../MoltenVK/GPUObjects/MVKDescriptorSet.mm | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm index bef94aff..b0ca0dac 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm @@ -90,7 +90,6 @@ void MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding bb; MVKMTLTextureBinding tb; MVKMTLSamplerStateBinding sb; - MVKMTLInlineBinding ib; NSUInteger bufferDynamicOffset = 0; // Establish the resource indices to use, by combining the offsets of the DSL and this DSL binding. @@ -124,15 +123,16 @@ void MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder, } case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT: { - ib.mtlBytes = descBinding._inlineBindings[rezIdx].pData; - ib.size = descBinding._inlineBindings[rezIdx].dataSize; + bb.mtlBuffer = descBinding._mtlBuffers[rezIdx]; + bb.offset = descBinding._mtlBufferOffsets[rezIdx]; + bb.size = descBinding._inlineBindings[rezIdx].dataSize; for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (_applyToStage[i]) { - ib.index = mtlIdxs.stages[i].bufferIndex + rezIdx; + bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx; if (i == kMVKShaderStageCompute) { - if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindInline(ib); } + if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); } } else { - if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindInline(MVKShaderStage(i), ib); } + if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); } } } } @@ -839,17 +839,14 @@ uint32_t MVKDescriptorBinding::writeBindings(uint32_t srcStartIndex, uint32_t dstIdx = dstStartIndex + i; const auto& srcInlineUniformBlock = get(pData, stride, srcStartIndex + i); auto& dstInlineUniformBlock = _inlineBindings[dstIdx]; - if (dstInlineUniformBlock.pData && dstInlineUniformBlock.pData != srcInlineUniformBlock.pData) - delete [] reinterpret_cast(dstInlineUniformBlock.pData); if (srcInlineUniformBlock.dataSize != 0) { - dstInlineUniformBlock.pData = reinterpret_cast(new uint8_t*[srcInlineUniformBlock.dataSize]); - if (srcInlineUniformBlock.pData) { - memcpy(const_cast(dstInlineUniformBlock.pData), srcInlineUniformBlock.pData, srcInlineUniformBlock.dataSize); - } + MTLResourceOptions mtlBuffOpts = MTLResourceStorageModeShared | MTLResourceCPUCacheModeDefaultCache; + _mtlBuffers[dstIdx] = [_pDescSet->getMTLDevice() newBufferWithBytes:srcInlineUniformBlock.pData length:srcInlineUniformBlock.dataSize options:mtlBuffOpts]; } else { - dstInlineUniformBlock.pData = nullptr; + _mtlBuffers[dstIdx] = nil; } dstInlineUniformBlock.dataSize = srcInlineUniformBlock.dataSize; + dstInlineUniformBlock.pData = nullptr; } break; @@ -964,6 +961,8 @@ MVKDescriptorBinding::MVKDescriptorBinding(MVKDescriptorSet* pDescSet, MVKDescri case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT: { static const VkWriteDescriptorSetInlineUniformBlockEXT inlineUniformBlock {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT, nullptr, 0, nullptr}; _inlineBindings.resize(descCnt, inlineUniformBlock); + _mtlBuffers.resize(descCnt, nil); + _mtlBufferOffsets.resize(descCnt, 0); break; }