Skip to content

Commit a9ca1fb

Browse files
Add pipeline barriers, update README file
1 parent d09532f commit a9ca1fb

File tree

4 files changed

+221
-91
lines changed

4 files changed

+221
-91
lines changed

samples/extensions/subgroups_operations/README.adoc

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,25 @@
1-
<!--
2-
- Copyright (c) 2023, Mobica Limited
3-
-
4-
- SPDX-License-Identifier: Apache-2.0
5-
-
6-
- Licensed under the Apache License, Version 2.0 the "License";
7-
- you may not use this file except in compliance with the License.
8-
- You may obtain a copy of the License at
9-
-
10-
- http://www.apache.org/licenses/LICENSE-2.0
11-
-
12-
- Unless required by applicable law or agreed to in writing, software
13-
- distributed under the License is distributed on an "AS IS" BASIS,
14-
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15-
- See the License for the specific language governing permissions and
16-
- limitations under the License.
17-
-
18-
-->
1+
<!-- - Copyright (c) 2023, Mobica Limited - - SPDX-License-Identifier: Apache-2.0 - - Licensed under the Apache License, Version 2.0 the "License"; - you may not use this file except in compliance with the License.
2+
- You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
3+
- - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4+
- See the License for the specific language governing permissions and - limitations under the License.
5+
- -->
196

207
# Subgroups Operations
218

22-
239
## Overview
2410

2511
This sample demonstrates how to use and enable the Subgroups operations feature.
26-
12+
image:image/image.png[]
2713

2814
## GLSL Shaders
15+
2916
In shader enable `GL_KHR_shader_subgroup_basic` extension.
3017
TODO: add more description
3118

32-
3319
## Enabling the Feature
3420

3521
To enable the subgroups feature in the Vulkan API you must create a Vulkan instance with a minimum version of version 1.1. Enable the extension `VK_EXT_subgroup_size_control` and get the subgroup properties of a physical device
22+
3623
```C++
3724
VkPhysicalDeviceSubgroupProperties subgroups_properties;
3825
subgroups_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
@@ -43,6 +30,7 @@ device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVI
4330
device_properties2.pNext = &subgroups_properties;
4431
vkGetPhysicalDeviceProperties2(gpu.get_handle(), &device_properties2);
4532
```
33+
4634
TODO: add more description
4735

4836
## Additional information
1.96 MB
Loading

samples/extensions/subgroups_operations/subgroups_operations.cpp

Lines changed: 135 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,40 @@ void SubgroupsOperations::build_compute_command_buffer()
194194
VkCommandBufferBeginInfo begin_info = vkb::initializers::command_buffer_begin_info();
195195
VK_CHECK(vkBeginCommandBuffer(compute.command_buffer, &begin_info));
196196

197+
if (ocean.graphics_queue_family_index != compute.queue_family_index)
198+
{
199+
VkBufferMemoryBarrier memory_barrier = vkb::initializers::buffer_memory_barrier();
200+
memory_barrier.buffer = bit_reverse_buffer->get_handle();
201+
memory_barrier.offset = 0u;
202+
memory_barrier.size = bit_reverse_buffer->get_size();
203+
memory_barrier.srcAccessMask = 0u;
204+
memory_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
205+
memory_barrier.srcQueueFamilyIndex = ocean.graphics_queue_family_index;
206+
memory_barrier.dstQueueFamilyIndex = compute.queue_family_index;
207+
208+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 1u, &memory_barrier, 0u, nullptr);
209+
}
210+
197211
// butterfly texture
198212
{
199213
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, precompute.pipeline.pipeline);
200214
vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, precompute.pipeline.pipeline_layout, 0u, 1u, &precompute.descriptor_set, 0u, nullptr);
201215

202216
vkCmdDispatch(compute.command_buffer, 1u, grid_size, 1u);
203217
}
204-
218+
{
219+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
220+
img_barrier.image = butterfly_precomp.image;
221+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
222+
img_barrier.subresourceRange.baseMipLevel = 0u;
223+
img_barrier.subresourceRange.levelCount = 1u;
224+
img_barrier.subresourceRange.baseArrayLayer = 0u;
225+
img_barrier.subresourceRange.layerCount = 1u;
226+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
227+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
228+
229+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
230+
}
205231
// initial tildes textures
206232
{
207233
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, initial_tildes.pipeline.pipeline);
@@ -210,6 +236,17 @@ void SubgroupsOperations::build_compute_command_buffer()
210236
vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u);
211237
}
212238

239+
{
240+
VkBufferMemoryBarrier memory_barrier = vkb::initializers::buffer_memory_barrier();
241+
memory_barrier.buffer = fft_buffers.fft_input_random->get_handle();
242+
memory_barrier.offset = 0u;
243+
memory_barrier.size = fft_buffers.fft_input_random->get_size();
244+
memory_barrier.srcAccessMask = 0u;
245+
memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
246+
247+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 1u, &memory_barrier, 0u, nullptr);
248+
}
249+
213250
// tildes textures
214251
{
215252
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, tildes.pipeline.pipeline);
@@ -218,6 +255,20 @@ void SubgroupsOperations::build_compute_command_buffer()
218255
vkCmdDispatch(compute.command_buffer, grid_size / 8u, grid_size, 1u);
219256
}
220257

258+
{
259+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
260+
img_barrier.image = fft_buffers.fft_input_htilde0->image;
261+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
262+
img_barrier.subresourceRange.baseMipLevel = 0u;
263+
img_barrier.subresourceRange.levelCount = 1u;
264+
img_barrier.subresourceRange.baseArrayLayer = 0u;
265+
img_barrier.subresourceRange.layerCount = 1u;
266+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
267+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
268+
269+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
270+
}
271+
221272
// fft horizontal; for Y axis
222273
{
223274
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft.pipelines.horizontal.pipeline);
@@ -290,19 +341,63 @@ void SubgroupsOperations::build_compute_command_buffer()
290341
}
291342
}
292343

344+
{
345+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
346+
img_barrier.image = fft_buffers.fft_tilde_h_kt_dy->image;
347+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
348+
img_barrier.subresourceRange.baseMipLevel = 0u;
349+
img_barrier.subresourceRange.levelCount = 1u;
350+
img_barrier.subresourceRange.baseArrayLayer = 0u;
351+
img_barrier.subresourceRange.layerCount = 1u;
352+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
353+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
354+
355+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
356+
}
357+
293358
// fft inverse
294359
{
295360
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_inversion.pipeline.pipeline);
296361
vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_inversion.pipeline.pipeline_layout, 0u, 1u, &fft_inversion.descriptor_set, 0u, nullptr);
297362
vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u);
298363
}
299-
364+
{
365+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
366+
img_barrier.image = fft_buffers.fft_displacement->image;
367+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
368+
img_barrier.subresourceRange.baseMipLevel = 0u;
369+
img_barrier.subresourceRange.levelCount = 1u;
370+
img_barrier.subresourceRange.baseArrayLayer = 0u;
371+
img_barrier.subresourceRange.layerCount = 1u;
372+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
373+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
374+
375+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
376+
}
300377
// fft normal map
301378
{
302379
vkCmdBindPipeline(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_normal_map.pipeline.pipeline);
303380
vkCmdBindDescriptorSets(compute.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, fft_normal_map.pipeline.pipeline_layout, 0u, 1u, &fft_normal_map.descriptor_set, 0u, nullptr);
304381
vkCmdDispatch(compute.command_buffer, grid_size / 32u, grid_size, 1u);
305382
}
383+
if (ocean.graphics_queue_family_index != compute.queue_family_index)
384+
{
385+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
386+
img_barrier.image = fft_buffers.fft_displacement->image;
387+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
388+
img_barrier.subresourceRange.baseMipLevel = 0u;
389+
img_barrier.subresourceRange.levelCount = 1u;
390+
img_barrier.subresourceRange.baseArrayLayer = 0u;
391+
img_barrier.subresourceRange.layerCount = 1u;
392+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
393+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
394+
img_barrier.srcQueueFamilyIndex = compute.queue_family_index;
395+
img_barrier.dstQueueFamilyIndex = ocean.graphics_queue_family_index;
396+
img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
397+
img_barrier.dstAccessMask = 0u;
398+
399+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
400+
}
306401

307402
VK_CHECK(vkEndCommandBuffer(compute.command_buffer));
308403
}
@@ -880,6 +975,25 @@ void SubgroupsOperations::build_command_buffers()
880975

881976
VK_CHECK(vkBeginCommandBuffer(cmd_buff, &command_buffer_begin_info));
882977

978+
if (ocean.graphics_queue_family_index != compute.queue_family_index)
979+
{
980+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
981+
img_barrier.image = fft_buffers.fft_normal_map->image;
982+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
983+
img_barrier.subresourceRange.baseMipLevel = 0u;
984+
img_barrier.subresourceRange.levelCount = 1u;
985+
img_barrier.subresourceRange.baseArrayLayer = 0u;
986+
img_barrier.subresourceRange.layerCount = 1u;
987+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
988+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
989+
img_barrier.srcQueueFamilyIndex = compute.queue_family_index;
990+
img_barrier.dstQueueFamilyIndex = ocean.graphics_queue_family_index;
991+
img_barrier.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
992+
img_barrier.srcAccessMask = 0u;
993+
994+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
995+
}
996+
883997
vkCmdBeginRenderPass(cmd_buff, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
884998

885999
VkViewport viewport = vkb::initializers::viewport(static_cast<float>(width), static_cast<float>(height), 0.0f, 1.0f);
@@ -911,6 +1025,25 @@ void SubgroupsOperations::build_command_buffers()
9111025

9121026
vkCmdEndRenderPass(cmd_buff);
9131027

1028+
if (ocean.graphics_queue_family_index != compute.queue_family_index)
1029+
{
1030+
VkImageMemoryBarrier img_barrier = vkb::initializers::image_memory_barrier();
1031+
img_barrier.image = fft_buffers.fft_normal_map->image;
1032+
img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1033+
img_barrier.subresourceRange.baseMipLevel = 0u;
1034+
img_barrier.subresourceRange.levelCount = 1u;
1035+
img_barrier.subresourceRange.baseArrayLayer = 0u;
1036+
img_barrier.subresourceRange.layerCount = 1u;
1037+
img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1038+
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
1039+
img_barrier.srcQueueFamilyIndex = ocean.graphics_queue_family_index;
1040+
img_barrier.dstQueueFamilyIndex = compute.queue_family_index;
1041+
img_barrier.dstAccessMask = 0u;
1042+
img_barrier.srcAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
1043+
1044+
vkCmdPipelineBarrier(compute.command_buffer, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u, &img_barrier);
1045+
}
1046+
9141047
VK_CHECK(vkEndCommandBuffer(cmd_buff));
9151048
}
9161049
}

0 commit comments

Comments
 (0)