diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h index c8665f54..6aa2137b 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.h @@ -234,6 +234,7 @@ public: protected: MVKBuffer* _mvkBuffer = nullptr; VkDeviceSize _buffOffset = 0; + VkDeviceSize _buffRange = 0; }; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm index bb946893..48ce5295 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm @@ -161,6 +161,10 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder, MVKBuffer* buffer = (MVKBuffer*)bufferInfo.buffer; bb.mtlBuffer = buffer->getMTLBuffer(); bb.offset = buffer->getMTLBufferOffset() + bufferInfo.offset; + if (bufferInfo.range == VK_WHOLE_SIZE) + bb.size = (uint32_t)(buffer->getByteCount() - bb.offset); + else + bb.size = (uint32_t)bufferInfo.range; for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (_applyToStage[i]) { @@ -207,6 +211,7 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder, if (mtlTex.parentTexture) { mtlTex = mtlTex.parentTexture; } bb.mtlBuffer = mtlTex.buffer; bb.offset = mtlTex.bufferOffset; + bb.size = (uint32_t)(mtlTex.height * mtlTex.bufferBytesPerRow); } for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (_applyToStage[i]) { @@ -239,6 +244,7 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder, id mtlTex = tb.mtlTexture; bb.mtlBuffer = mtlTex.buffer; bb.offset = mtlTex.bufferOffset; + bb.size = (uint32_t)(mtlTex.height * mtlTex.bufferBytesPerRow); } for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (_applyToStage[i]) { @@ -521,6 +527,10 @@ void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder, if (_mvkBuffer) { bb.mtlBuffer = _mvkBuffer->getMTLBuffer(); bb.offset = _mvkBuffer->getMTLBufferOffset() + _buffOffset + bufferDynamicOffset; + if (_buffRange == VK_WHOLE_SIZE) + bb.size = (uint32_t)(_mvkBuffer->getByteCount() - bb.offset); + else + bb.size = (uint32_t)_buffRange; } for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (stages[i]) { @@ -544,6 +554,7 @@ void MVKBufferDescriptor::write(MVKDescriptorSetLayoutBinding* mvkDSLBind, const auto* pBuffInfo = &get(pData, stride, srcIndex); _mvkBuffer = (MVKBuffer*)pBuffInfo->buffer; _buffOffset = pBuffInfo->offset; + _buffRange = pBuffInfo->range; if (_mvkBuffer) { _mvkBuffer->retain(); } if (oldBuff) { oldBuff->release(); } @@ -559,12 +570,14 @@ void MVKBufferDescriptor::read(MVKDescriptorSetLayoutBinding* mvkDSLBind, auto& buffInfo = pBufferInfo[dstIndex]; buffInfo.buffer = (VkBuffer)_mvkBuffer; buffInfo.offset = _buffOffset; + buffInfo.range = _buffRange; } void MVKBufferDescriptor::reset() { if (_mvkBuffer) { _mvkBuffer->release(); } _mvkBuffer = nullptr; _buffOffset = 0; + _buffRange = 0; MVKDescriptor::reset(); } @@ -662,6 +675,7 @@ void MVKImageDescriptor::bind(MVKCommandEncoder* cmdEncoder, if (mtlTex.parentTexture) { mtlTex = mtlTex.parentTexture; } bb.mtlBuffer = mtlTex.buffer; bb.offset = mtlTex.bufferOffset; + bb.size = (uint32_t)(mtlTex.height * mtlTex.bufferBytesPerRow); } for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) { if (stages[i]) { @@ -883,6 +897,7 @@ void MVKTexelBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder, id mtlTex = tb.mtlTexture; bb.mtlBuffer = mtlTex.buffer; bb.offset = mtlTex.bufferOffset; + bb.size = (uint32_t)(mtlTex.height * mtlTex.bufferBytesPerRow); } } for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageMax; i++) {