32 if(!GLAD_GL_KHR_shader_subgroup)
33 printf(
"no shader_subgroups.\n");
35 if(GLAD_GL_KHR_shader_subgroup)
37 printf(
"shader_subgroups:\n");
40 glGetIntegerv(GL_SUBGROUP_SIZE_KHR, &size);
41 printf(
"subgroup size %d\n", size);
44 glGetIntegerv(GL_SUBGROUP_SUPPORTED_STAGES_KHR, &stages);
46 if(stages & GL_COMPUTE_SHADER_BIT)
printf(
" compute\n");
else printf(
" no compute\n");
47 if(stages & GL_VERTEX_SHADER_BIT)
printf(
" vertex\n");
else printf(
" no vertex\n");
48 if(stages & GL_TESS_CONTROL_SHADER_BIT)
printf(
" tesselation control\n");
else printf(
" no tesselation control\n");
49 if(stages & GL_TESS_EVALUATION_SHADER_BIT)
printf(
" tesselation evaluation\n");
else printf(
" no tesselation evaluation\n");
50 if(stages & GL_GEOMETRY_SHADER_BIT)
printf(
" geometry\n");
else printf(
" no geometry\n");
51 if(stages & GL_FRAGMENT_SHADER_BIT)
printf(
" fragment\n");
else printf(
" no fragment\n");
52 if(stages & GL_MESH_SHADER_BIT_EXT)
printf(
" mesh\n");
else printf(
" no mesh\n");
53 if(stages & GL_TASK_SHADER_BIT_EXT)
printf(
" mesh task\n");
else printf(
" no mesh task\n");
56 glGetIntegerv(GL_SUBGROUP_SUPPORTED_FEATURES_KHR, &features);
58 if(features & GL_SUBGROUP_FEATURE_BASIC_BIT_KHR)
printf(
" basic\n");
else printf(
" no basic\n");
59 if(features & GL_SUBGROUP_FEATURE_VOTE_BIT_KHR)
printf(
" vote\n");
else printf(
" no vote\n");
60 if(features & GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR)
printf(
" arithmetic\n");
else printf(
" no arithmetic\n");
61 if(features & GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR)
printf(
" ballot\n");
else printf(
" no ballot\n");
62 if(features & GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR)
printf(
" shuffle\n");
else printf(
" no shuffle\n");
63 if(features & GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR)
printf(
" shuffle relative\n");
else printf(
" no shuffle relative\n");
64 if(features & GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR)
printf(
" clustered\n");
else printf(
" no clustered\n");
65 if(features & GL_SUBGROUP_FEATURE_QUAD_BIT_KHR)
printf(
" quad\n");
else printf(
" no quad\n");
69 m_program=
read_program(
"gkit2_tutos/M2/count_buffer.glsl");
72 std::vector<int> data(1024);
73 for(
unsigned i= 0; i < data.size(); i++)
77 glGenBuffers(1, &m_gpu_buffer1);
78 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_gpu_buffer1);
79 #ifdef USE_BUFFER_STORAGE
80 glBufferStorage(GL_SHADER_STORAGE_BUFFER,
sizeof(
int) * data.size(), data.data(), 0);
82 glBufferData(GL_SHADER_STORAGE_BUFFER,
sizeof(
int) * data.size(), data.data(), GL_STATIC_COPY);
85 glGenBuffers(1, &m_gpu_buffer2);
86 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_gpu_buffer2);
87 #ifdef USE_BUFFER_STORAGE
88 glBufferStorage(GL_SHADER_STORAGE_BUFFER,
sizeof(
int) * data.size(),
nullptr, 0);
90 glBufferData(GL_SHADER_STORAGE_BUFFER,
sizeof(
int) * data.size(),
nullptr, GL_STATIC_COPY);
93 glGenBuffers(1, &m_gpu_count);
94 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_gpu_count);
95 #ifdef USE_BUFFER_STORAGE
96 glBufferStorage(GL_SHADER_STORAGE_BUFFER,
sizeof(
int),
nullptr, 0);
98 glBufferData(GL_SHADER_STORAGE_BUFFER,
sizeof(
int),
nullptr, GL_STATIC_COPY);
101 glGenBuffers(1, &m_read_buffer);
102 glBindBuffer(GL_COPY_READ_BUFFER, m_read_buffer);
103 #ifdef USE_BUFFER_STORAGE
105 glBufferStorage(GL_COPY_READ_BUFFER,
sizeof(
int) * data.size(),
nullptr, GL_CLIENT_STORAGE_BIT | GL_MAP_READ_BIT);
107 glBufferStorage(GL_COPY_READ_BUFFER,
sizeof(
int) * data.size(),
nullptr, GL_CLIENT_STORAGE_BIT);
110 glBufferData(GL_COPY_READ_BUFFER,
sizeof(
int) * data.size(),
nullptr, GL_DYNAMIC_READ);
113 #ifdef USE_BUFFER_STORAGE
114 printf(
"!! use buffer storage\n");
116 printf(
"!! use buffer data\n");
134 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_gpu_buffer1);
135 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_gpu_buffer2);
137 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_gpu_count);
140 glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);
142 glUseProgram(m_program);
143 glDispatchCompute(4, 1, 1);
145 glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
147 glBindBuffer(GL_COPY_READ_BUFFER, m_read_buffer);
148 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_gpu_buffer2);
149 glCopyBufferSubData(GL_SHADER_STORAGE_BUFFER, GL_COPY_READ_BUFFER, 0, 0,
sizeof(
int)*1024);
156 int *tmp= (
int *) glMapBuffer(GL_COPY_READ_BUFFER, GL_READ_ONLY);
158 for(
unsigned i= 0; i < 1024; i++)
162 glUnmapBuffer(GL_COPY_READ_BUFFER);
165 printf(
"!! use get buffer\n");
169 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_gpu_count);
170 glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0,
sizeof(
int), &n);
175 std::vector<int> tmp(n);
176 glGetBufferSubData(GL_COPY_READ_BUFFER, 0,
sizeof(
int) * tmp.size(), tmp.data());
178 for(
unsigned i= 0; i < tmp.size(); i++)