#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 это не значение по умолчанию для начала?