rhi: vulkan: be nicer when binding empty buffers

vkUpdateDescriptorSets(): pDescriptorWrites[1].pBufferInfo[0].range is
not VK_WHOLE_SIZE and is zero.
The Vulkan spec states: If range is not equal to VK_WHOLE_SIZE, range
must be greater than 0 (https://docs.vulkan.org/spec/latest/chapters/
descriptorsets.html#VUID-VkDescriptorBufferInfo-range-00341)

As a drive-by, fix the wrong union member access.

Change-Id: I511cddd25f91a117ff181fd64b77079e6946c94c
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
Aurélien Brooke 2025-04-09 13:43:04 +02:00
parent a95c568908
commit a8ae971a95

View File

@ -3626,7 +3626,7 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb)
VkDescriptorBufferInfo bufInfo;
bufInfo.buffer = bufD->m_type == QRhiBuffer::Dynamic ? bufD->buffers[currentFrameSlot] : bufD->buffers[0];
bufInfo.offset = b->u.ubuf.offset;
bufInfo.range = b->u.ubuf.maybeSize ? b->u.ubuf.maybeSize : bufD->m_size;
bufInfo.range = b->u.ubuf.maybeSize ? b->u.ubuf.maybeSize : VK_WHOLE_SIZE;
// be nice and assert when we know the vulkan device would die a horrible death due to non-aligned reads
Q_ASSERT(aligned(bufInfo.offset, ubufAlign) == bufInfo.offset);
bufferInfoIndex = bufferInfos.size();
@ -3721,8 +3721,8 @@ void QRhiVulkan::updateShaderResourceBindings(QRhiShaderResourceBindings *srb)
bd.sbuf.generation = bufD->generation;
VkDescriptorBufferInfo bufInfo;
bufInfo.buffer = bufD->m_type == QRhiBuffer::Dynamic ? bufD->buffers[currentFrameSlot] : bufD->buffers[0];
bufInfo.offset = b->u.ubuf.offset;
bufInfo.range = b->u.ubuf.maybeSize ? b->u.ubuf.maybeSize : bufD->m_size;
bufInfo.offset = b->u.sbuf.offset;
bufInfo.range = b->u.sbuf.maybeSize ? b->u.sbuf.maybeSize : VK_WHOLE_SIZE;
bufferInfoIndex = bufferInfos.size();
bufferInfos.append(bufInfo);
}