VulkanSceneGraph icon indicating copy to clipboard operation
VulkanSceneGraph copied to clipboard

Avoid creating staging buffers in TransferTask that exceed the Vulkan physical device property limit

Open rms7326 opened this issue 7 months ago • 10 comments

Pull Request Template

Description

TransferTask::_transferData() can create a single staging buffer who's allocation size exceeds the Vulkan physical device maxMemoryAllocationSize property limit. Windows NVidia drivers tend to be very strict about keeping allocations at or below the stated maximum memory allocation size whereas Linux is more forgiving.

Now, if multiple regions to transfer collectively exceed the maximum memory allocation size, TransferTask::_transferData() creates a new staging buffer for it and any subsequent regions. If a single region exceeds the maximum memory allocation size TransferTask::_transferData() ensures that the region is in its own staging buffer so that it is more likely to succeed on drivers that are less strict about memory requests exceeding the specified physical device limit.

Fixes #

Failure to transfer data to the GPU, particularly on Windows platforms with NVidia cards. Even though all of our buffers that needed copying to the GPU were under the maximum memory allocation limit, collectively they were over the limit so when TransferTask::_transferData called vsg::createBufferAndMemory() to create an enormous staging buffer it failed.

Type of change

Please delete options that are not relevant.

  • [ X ] Bug fix (non-breaking change which fixes an issue)

How Has This Been Tested?

I tested this extensively with small fabricated maximums to verify the edge conditions. All existing tests and example applications work as before.

Checklist:

  • [ X ] My code follows the style guidelines of this project
  • [ X ] I have performed a self-review of my own code
  • [ X ] I have commented my code, particularly in hard-to-understand areas
  • [ X ] My changes generate no new warnings

rms7326 avatar May 21 '25 23:05 rms7326