@@ -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