Ошибка функции барьера () в шейдере управления тесселяцией Vulkan на встроенной видеокарте - PullRequest
0 голосов
/ 15 июня 2019

Я обнаружил, что запущенный шейдер управления тесселяцией, который содержит вызов barrier() на моей интегрированной видеокарте Intel, не дает геометрии (????)

Так, например, следующий простой шейдер хорошо работает на моемвыделенная карта Nvidia, но не работает с Intel:

#version 450 core

layout (vertices = 4) out;

void main() {
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
    gl_TessLevelInner[0] = 1;
    gl_TessLevelInner[1] = 1;
    gl_TessLevelOuter[0] = 1;
    gl_TessLevelOuter[1] = 1;
    gl_TessLevelOuter[2] = 1;
    gl_TessLevelOuter[3] = 1;
    barrier();
}

Однако тот же код без вызова barrier() работает и на карте Intel.

Был бы признателен, если бы кто-то мог догадаться, где искать причину проблемы

ОБНОВЛЕНИЕ

Обнаружил, что когда barrier() вызывается раньше gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; все работает нормально, поэтому мне просто нужночтобы перевести это утверждение в конец:

#version 450 core

layout (vertices = 4) out;

void main() {
    gl_TessLevelInner[0] = 1;
    gl_TessLevelInner[1] = 1;
    gl_TessLevelOuter[0] = 1;
    gl_TessLevelOuter[1] = 1;
    gl_TessLevelOuter[2] = 1;
    gl_TessLevelOuter[3] = 1;
    barrier();
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

Это поведение все еще неясно для меня, поэтому было бы здорово, если бы кто-то мог объяснить мне, почему я не должен писать в gl_out до barrier()

1 Ответ

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

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

...