OpenGL GLSL атомный счетчик в Вулкане - PullRequest
1 голос
/ 20 июня 2019

Когда я попытался перенести мою реализацию OpenGL на Vulkan, я обнаружил, что «universal atomic_uint» не поддерживается в Vulkan.Мой вариант использования прост: увеличение целого числа на все фрагменты.Я пытался найти решение, но не нашел ни одного последнего решения.

Вот список старых решений:

  1. https://software.intel.com/en-us/articles/opengl-performance-tips-atomic-counter-buffers-versus-shader-storage-buffer-objects. В нем говорится, что атомный счетчик OpenGL подобен атомарной операции SSBO, и он может быть реализован какSSBO атомные операции на некоторых платформах.(Не уверен, верно ли это до сих пор).

  2. https://community.khronos.org/t/vulkan-atomic-counters/7146. Также говорится, что в качестве замены используется загрузка / сохранение изображений или атомарные операции над SSBO.(Но содержанию уже 2 года.)

Поскольку Vulkan все еще растет, кто-нибудь может предложить последний стандартный способ увеличения атома над целым числом с использованием GLSL в Vulkan?

Редактировать:

Я получил свой ответ, но я добавлю больше деталей.В моем коде OpenGL у меня есть проход рендеринга с вершинным шейдером и фрагментным шейдером (задействован No вычислительный шейдер).В фрагментном шейдере у меня есть следующий glsl (упрощенно):

#version 450
layout (binding = 0) uniform atomic_uint fragmentCount;

void main()
{
  atomicCounterIncrement(fragmentCount);
}

Этот шейдер отлично работает в OpenGL, потому что OpenGL имеет enum 'GL_ATOMIC_COUNTER_BUFFER' в glBindBuffer и ключевое слово 'atomic_uint' в glsl.Однако Vulkan не имеет соответствующего встроенного ключевого слова.Поэтому я стараюсь искать замену этому.Я не спрашивал, как запросить количество отображаемых фрагментов, хотя шейдер здесь выглядит так, как будто я делаю это.Мне было интересно, существует ли этот «атомный счетчик» в общих графических шейдерах в Vulkan.Как отметил Никол Болас, в Vulkan такого нет, а с аппаратной точки зрения нет реализации на NVIDIA GPU, поэтому я решил использовать SSBO и AtomicAdd, чтобы сделать то же самое.

Надеюсь, что это делает мою проблемупонятнее.

1 Ответ

2 голосов
/ 20 июня 2019

Атомных счетчиков в Vulkan не существует, поэтому вам придется использовать одно из этих решений.

Кстати, атомные счетчики, как особая аппаратная концепция, - это только то, что существовало на аппаратном обеспечении AMD.,Вот почему Вулкан не поддерживает их;аппаратные средства не AMD в основном эмулируют их как работу SSBO.

...