From 6da2fbb3533061da1de3ac867bfb12dc81eb1ce9 Mon Sep 17 00:00:00 2001 From: Marko Pintera Date: Thu, 23 Jul 2020 15:06:49 +0200 Subject: [PATCH] Don't over-allocate memory for higher mip levels of 3D textures --- MoltenVK/MoltenVK/GPUObjects/MVKImage.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm index 9a4bea32..d9c86339 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm @@ -147,12 +147,15 @@ void MVKImagePlane::initSubresources(const VkImageCreateInfo* pCreateInfo) { VkDeviceSize rowPitch = _image->getBytesPerRow(_planeIndex, mipLvl); VkDeviceSize depthPitch = _image->getBytesPerLayer(_planeIndex, mipLvl); + VkExtent3D mipExtent = _image->getExtent3D(_planeIndex, mipLvl); + for (uint32_t layer = 0; layer < _image->_arrayLayers; layer++) { subRez.subresource.arrayLayer = layer; VkSubresourceLayout& layout = subRez.layout; layout.offset = offset; - layout.size = depthPitch * _image->_extent.depth; + layout.size = depthPitch * mipExtent.depth; + layout.rowPitch = rowPitch; layout.depthPitch = depthPitch; @@ -828,7 +831,8 @@ MVKImage::MVKImage(MVKDevice* device, const VkImageCreateInfo* pCreateInfo) : MV _isAliasable = mvkIsAnyFlagEnabled(pCreateInfo->flags, VK_IMAGE_CREATE_ALIAS_BIT); } else { for (uint32_t mipLvl = 0; mipLvl < _mipLevels; mipLvl++) { - memoryBinding->_byteCount += getBytesPerLayer(planeIndex, mipLvl) * _extent.depth * _arrayLayers; + VkExtent3D mipExtent = getExtent3D(planeIndex, mipLvl); + memoryBinding->_byteCount += getBytesPerLayer(planeIndex, mipLvl) * mipExtent.depth * _arrayLayers; } memoryBinding->_byteAlignment = std::max(memoryBinding->_byteAlignment, _rowByteAlignment); }