Есть ли способ использовать обратные вызовы внутреннего распределения Vulkan без перезаписи реальных распределений? - PullRequest
4 голосов
/ 17 июня 2019

При указании структуры VkAllocationCallbacks для функций vkCreate * я хотел бы использовать только уведомление vulkan без перезаписи реальных распределителей, но я не могу найти, как.

От https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAllocationCallbacks.html

  • pfnAllocation должен быть действительным указателем на действительную пользовательскую PFN_vkAllocationFunction

  • pfnReallocation должен быть действительным указателем на действительную пользовательскую PFN_vkReallocationFunction

  • pfnFree должен быть действительным указателем на действительную пользовательскую PFN_vkFreeFunction

  • , если любой из pfnInternalAllocation или pfnInternalFree не равен NULL, оба должны быть действительными обратными вызовами

Мне кажется странным, что я не могу просто передать nullptr для использования выделений по умолчанию, есть ли для этого какие-то рациональные причины?

Может быть, можно запроситьраспределители по умолчанию во время выполнения, но я не нашел никакого способа сделать это, я был бы рад узнать, возможно ли это переносимым способом.

Ответы [ 2 ]

4 голосов
/ 17 июня 2019

Возможно, вы не до конца понимаете разницу между этими наборами функций.

Первый набор функций, функции выделения, используются Vulkan для выделения памяти ЦП ... большую часть времени.Две другие функции, внутренние функции уведомления, предназначены для других случаев.

Смотрите, бывают случаи, когда реализация Vulkan должна выполнять системные системные вызовы для выделения памяти.Спецификация Vulkan распознает такой случай: выделить «исполняемую память»: память, содержащую коды операций для набора команд ЦП.По соображениям безопасности ОС не позволяют просто выполнять произвольные адреса памяти;современные ОС требуют, чтобы большинство приложений выделяло память особым образом, чтобы она была исполняемой.Следовательно:

Приложение не должно обрабатывать выделение памяти, предназначенной для выполнения хостом, из-за сложности реализации различных защит на разных платформах.Реализация будет выделять такую ​​память внутренне и вызывать информационный обратный вызов приложения, когда эти внутренние выделения выделены и освобождены.

Обычные функции выделения памяти, такие как ::operator new или malloc, не могут этого сделать.И спецификация Vulkan не предполагает, что клиентский код сможет выполнять эти системные вызовы.

Однако клиентскому коду, возможно, потребуется иметь возможность отслеживать такие выделения, чтобы он могможет знать, сколько памяти хранит реализация Vulkan.Поэтому, когда «внутренние выделения» сделаны / освобождены, вызываются внутренние функции уведомления.

Это только время , такие функции вызываются.

Так что если вашцель состоит в том, чтобы просто отслеживать, когда распределения реализации выполняются / освобождаются, только внутренние функции уведомления не будут выполнять работу.Вы должны переопределить их все, что означает, что вам действительно нужно выполнить распределение / перераспределение / освобождение.

0 голосов
/ 18 июня 2019

Поскольку кажется, что это невозможно, я бы просто использовал рукописный распределитель, выполняющий требуемое выравнивание (с оператором for instancele ::, новым в C ++ 17).Скорее всего, этот распределитель будет менее производительным, чем распределитель по умолчанию Vulkan, но если он нужен только для целей отладки, он должен добиться цели.

...