Я разрабатываю приложение рендеринга с использованием vulkan на графическом процессоре Adreno 630 (платформа SDM845).
Я пытался использовать вычислительный шейдер для предварительной обработки некоторых моих вложений, но у меня возникают проблемы с использованиемФункция барьера () для синхронизации моих потоков.
Куда бы я ни добавил «барьер ();»Инструкция, это приводит к сбою моего приложения.
Я компилирую код glsl, используя glslangvalidator для генерации скомпилированного кода spir-v для моего вычислительного шейдера.
Используемая версия glslangvalidator:
>glslangvalidator -v
Glslang Version: 7.11.3113
ESSL Version: OpenGL ES GLSL 3.20 glslang Khronos. 11.3113
GLSL Version: 4.60 glslang Khronos. 11.3113
SPIR-V Version 0x00010300, Revision 6
GLSL.std.450 Version 100, Revision 1
Khronos Tool ID 8
SPIR-V Generator Version 7
GL_KHR_vulkan_glsl version 100
ARB_GL_gl_spirv version 100
"Барьер ();"инструкция не входит в условный код, поэтому она должна работать.
Даже если я запускаю основную функцию с помощью «барьера ();»инструкция вызывает сбой моего приложения:
Пример кода glsl, который я пробовал:
#version 460
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable
void main()
{
// some variables declarations
barrier();
*** my code ***
}
Но если я прокомментирую строку с барьером (), мое приложение больше не будет падать.
Поскольку барьеры работают, когда я использую OpenCL на том же оборудовании, я попытался обойти проблему, используя clspv.
Я извлек последнюю версию мастер-кода из этого репозитория: https://github.com/google/clspv/blob/master/docs/OpenCLCOnVulkan.md
Я успешно скомпилировал некоторый базовый код OpenCL C в spir-v, но когда я добавляю в код барьеры (барьер (CLK_LOCAL_MEM_FENCE);), я сталкиваюсь с той же проблемой.
Любой намек начто может быть не так или у кого-то возникла такая же проблема?
Спасибо,
Дэмиен