Как настроить память устройства SwiftShader?

#vulkan #swiftshader

#vulkan #swiftshader

Вопрос:

Я использую SwiftShader для рендеринга Vulkan для проекта, где я не могу полагаться на наличие функционирующей аппаратной реализации. Сегодня я столкнулся с ОШИБКОЙ_OUT_OF_DEVICE_MEMORY при попытке выделить большой кусок памяти устройства через vkCreateBuffer() . Поскольку SwiftShader — это программная реализация, я предположил, что память устройства настраивается. Так ли это? Если да, то как это настраивается?

Вот мой вызов, который завершается с ошибкой:

 size_t sz=1323371088; // > 1GB
size_t usage_flags = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(usageFlags, size);
bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
int ret = vkCreateBuffer(device, amp;bufferCreateInfo, nullptr, buffer);
  

(В этом примере используются VulkanInitializers.hpp макросы Саши Виллемса.)

Ответ №1:

Максимальный размер выделяемой памяти для части Vulkan SwiftShader определен в VkConfig.hpp и установлен в 1 гигабайт по умолчанию. Если вам нужен больший лимит для отдельных выделений, увеличьте MAX_MEMORY_ALLOCATION_SIZE . Обратите внимание, что она не может быть увеличена более чем на 2 гигабайта (см. Комментарий в этом файле).

Комментарии:

1. Я просто попытался увеличить MAX_MEMORY_ALLOCATION_SIZE до 2 ГБ, но затем компиляция завершилась с ошибкой в SpirvShaderImage.cpp в утверждении static_assert(OOB_OFFSET >= vk::MAX_MEMORY_ALLOCATION_SIZE, "the largest offset must be guaranteed to be out-of-bounds"); . Есть ли решение для этого?

2. Я снова проверил компиляцию и утверждение и обнаружил, что можно скомпилировать SwiftShader, уменьшив объем памяти на 32 байта до: constexpr VkDeviceSize MAX_MEMORY_ALLOCATION_SIZE = 0x80000000ull - 32; . Почему для SwiftShader это не значение по умолчанию для начала?