我正在Adreno 630 GPU(平台为SDM845)上使用vulkan开发渲染应用程序。
我尝试使用计算着色器预处理某些附件,但是使用barrier()函数同步线程时遇到麻烦。
在任何地方添加“ barrier();”指令,它会使我的应用程序崩溃。
我使用glslangvalidator编译glsl代码以为我的计算着色器生成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
“ barrier();”指令不包含在条件代码中,因此它应该可以工作。
即使我使用“ barrier();”启动主要功能,指令,它会使我的应用程序崩溃:
我尝试过的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 ***
}
但是,如果我用barrier()注释这一行,我的应用程序将不再崩溃。
由于在同一硬件上使用OpenCL时,障碍会起作用,因此我尝试使用clspv解决此问题。
我从此仓库中检出了最新的主代码: https://github.com/google/clspv/blob/master/docs/OpenCLCOnVulkan.md
我已将一些基本的OpenCL C代码成功编译到spir-v中,但是当我在代码中添加障碍(barrier(CLK_LOCAL_MEM_FENCE);)时,我遇到了相同的问题。
关于什么地方可能出问题或有人遇到过相同问题的任何提示?
谢谢
达米恩