Skip to content
This repository was archived by the owner on Oct 28, 2024. It is now read-only.

Commit 9a19731

Browse files
committed
Add synchronization2_blit_image sample
1 parent 2513b7b commit 9a19731

File tree

4 files changed

+137
-88
lines changed

4 files changed

+137
-88
lines changed

application_sandbox/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ add_vulkan_subdirectory(swapchain_colorspace)
129129
add_vulkan_subdirectory(subgroup_vote)
130130
add_vulkan_subdirectory(synchronization2_async_compute)
131131
add_vulkan_subdirectory(synchronization2_set_event)
132+
add_vulkan_subdirectory(synchronization2_blit_image)
132133
add_vulkan_subdirectory(texel_buffer_alignment)
133134
add_vulkan_subdirectory(textured_cube)
134135
add_vulkan_subdirectory(timeline_semaphore_simple)

application_sandbox/synchronization2_blit_image/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2017 Google Inc.
1+
# Copyright 2022 Google Inc.
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -12,20 +12,20 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
add_shader_library(blit_image_shaders
15+
add_shader_library(synchronization2_blit_image_shaders
1616
SOURCES
1717
cube.frag
1818
cube.vert
1919
SHADER_DEPS
2020
shader_library
2121
)
2222

23-
add_vulkan_sample_application(blit_image
23+
add_vulkan_sample_application(synchronization2_blit_image
2424
SOURCES main.cpp
2525
LIBS
2626
vulkan_helpers
2727
MODELS
2828
standard_models
2929
SHADERS
30-
blit_image_shaders
30+
synchronization2_blit_image_shaders
3131
)
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# Blit Image
1+
# Blit Image (VK_KHR_synchronization2 version)
22

3-
This sample renders a rotating cube, and then blits it upside down
4-
into the framebuffer.
3+
This is based on the blit_image sample, using the VK_KHR_synchronization2
4+
extension. Specifically, this uses the vkQueueSubmit2KHR and
5+
vkCmdPipelineBarrier2KHR commands.

application_sandbox/synchronization2_blit_image/main.cpp

Lines changed: 128 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2017 Google Inc.
1+
// Copyright 2022 Google Inc.
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -47,14 +47,22 @@ struct CubeFrameData {
4747
containers::unique_ptr<vulkan::VkImageView> blit_src_view_;
4848
};
4949

50+
VkPhysicalDeviceSynchronization2FeaturesKHR kSynchronization2Features = {
51+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, nullptr,
52+
VK_TRUE};
53+
5054
// This creates an application with 16MB of image memory, and defaults
5155
// for host, and device buffer sizes.
5256
class BlitImageSample : public sample_application::Sample<CubeFrameData> {
5357
public:
5458
BlitImageSample(const entry::EntryData* data)
5559
: data_(data),
56-
Sample<CubeFrameData>(data->allocator(), data, 1, 512, 1, 1,
57-
sample_application::SampleOptions()),
60+
Sample<CubeFrameData>(
61+
data->allocator(), data, 1, 512, 1, 1,
62+
sample_application::SampleOptions()
63+
.SetVulkanApiVersion(VK_API_VERSION_1_1)
64+
.AddDeviceExtensionStructure(&kSynchronization2Features),
65+
{}, {}, {VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME}),
5866
cube_(data->allocator(), data->logger(), cube_data) {}
5967
virtual void InitializeApplicationData(
6068
vulkan::VkCommandBuffer* initialization_buffer,
@@ -251,37 +259,59 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
251259
// Image barriers for the blit source image, UNDEFINED ->
252260
// COLOR_ATTACHMENT_OPTIMAL COLOR_ATTACHMENT_OPTIMAL ->
253261
// TRANSFER_SRC_OPTIMAL
254-
VkImageMemoryBarrier undef_to_attach{
255-
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType
256-
nullptr, // pNext
257-
0, // srcAccessMask
258-
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
259-
VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout
260-
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
261-
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
262-
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
263-
*frame_data->blit_src_, // image
264-
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
262+
VkImageMemoryBarrier2KHR undef_to_attach_barrier{
263+
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // sType
264+
nullptr, // pNext
265+
VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR, // srcStageMask
266+
0, // srcAccessMask
267+
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR, // dstStageMask
268+
0, // dstAccessMask
269+
VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout
270+
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
271+
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
272+
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
273+
*frame_data->blit_src_, // image
274+
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1} // subresourceRange
275+
};
276+
VkDependencyInfoKHR undef_to_attach = {
277+
VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // sType
278+
nullptr, // pNext
279+
0, // dependencyFlags
280+
0, // memoryBarrierCount
281+
nullptr, // pMemoryBarriers
282+
0, // bufferMemoryBarrierCount
283+
nullptr, // pBufferMemoryBarriers
284+
1, // imageMemoryBarrierCount
285+
&undef_to_attach_barrier // pImageMemoryBarriers
286+
};
265287

266-
VkImageMemoryBarrier attach_to_src{
267-
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType
268-
nullptr, // pNext
269-
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
270-
VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask
271-
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
272-
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout
273-
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
274-
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
275-
*frame_data->blit_src_, // image
288+
VkImageMemoryBarrier2KHR attach_to_src_barrier{
289+
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // sType
290+
nullptr, // pNext
291+
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR, // srcStageMask
292+
VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR, // srcAccessMask
293+
VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR, // dstStageMask
294+
VK_ACCESS_2_TRANSFER_READ_BIT_KHR, // dstAccessMask
295+
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
296+
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout
297+
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
298+
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
299+
*frame_data->blit_src_, // image
276300
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
301+
VkDependencyInfoKHR attach_to_src = {
302+
VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // sType
303+
nullptr, // pNext
304+
0, // dependencyFlags
305+
0, // memoryBarrierCount
306+
nullptr, // pMemoryBarriers
307+
0, // bufferMemoryBarrierCount
308+
nullptr, // pBufferMemoryBarriers
309+
1, // imageMemoryBarrierCount
310+
&attach_to_src_barrier // pImageMemoryBarriers
311+
};
277312

278313
// Change the layout of blit source image to COLOR_ATTACHMENT_OPTIMAL
279-
cmdBuffer->vkCmdPipelineBarrier(
280-
cmdBuffer,
281-
VK_PIPELINE_STAGE_TRANSFER_BIT, // srcStageMask
282-
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // dstStageMask
283-
0, // dependencyFlags
284-
0, nullptr, 0, nullptr, 1, &undef_to_attach);
314+
cmdBuffer->vkCmdPipelineBarrier2KHR(cmdBuffer, &undef_to_attach);
285315

286316
VkRenderPassBeginInfo pass_begin = {
287317
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // sType
@@ -308,47 +338,63 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
308338
cmdBuffer->vkCmdEndRenderPass(cmdBuffer);
309339

310340
// Change the layout of blit source image to TRANSFER_SRC_OPTIMAL
311-
cmdBuffer->vkCmdPipelineBarrier(
312-
cmdBuffer,
313-
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // srcStageMask
314-
VK_PIPELINE_STAGE_TRANSFER_BIT, // dstStageMask
315-
0, // dependencyFlags
316-
0, nullptr, 0, nullptr, 1, &attach_to_src);
341+
cmdBuffer->vkCmdPipelineBarrier2KHR(cmdBuffer, &attach_to_src);
317342

318343
// Image barriers for swapchain image, COLOR_ATTACHMENT_OPTIMAL ->
319344
// TRANSFER_DST_OPTIMAL and TRANSFER_DST_OPTIMAL ->
320345
// COLOR_ATTACHMENT_OPTIMAL
321-
VkImageMemoryBarrier attach_to_dst{
322-
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType
323-
nullptr, // pNext
324-
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
325-
VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask
326-
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
327-
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout
328-
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
329-
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
330-
swapchain_image(frame_data), // image
346+
VkImageMemoryBarrier2KHR attach_to_dst_barrier{
347+
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // sType
348+
nullptr, // pNext
349+
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR, // srcStageMask
350+
VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR, // srcAccessMask
351+
VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR, // dstStageMask
352+
VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR, // dstAccessMask
353+
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
354+
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout
355+
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
356+
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
357+
swapchain_image(frame_data), // image
331358
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
359+
VkDependencyInfoKHR attach_to_dst = {
360+
VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // sType
361+
nullptr, // pNext
362+
0, // dependencyFlags
363+
0, // memoryBarrierCount
364+
nullptr, // pMemoryBarriers
365+
0, // bufferMemoryBarrierCount
366+
nullptr, // pBufferMemoryBarriers
367+
1, // imageMemoryBarrierCount
368+
&attach_to_dst_barrier // pImageMemoryBarriers
369+
};
332370

333-
VkImageMemoryBarrier dst_to_attach{
334-
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType
335-
nullptr, // pNext
336-
VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask
337-
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
338-
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // oldLayout
339-
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
340-
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
341-
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
342-
swapchain_image(frame_data), // image
371+
VkImageMemoryBarrier2KHR dst_to_attach_barrier{
372+
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // sType
373+
nullptr, // pNext
374+
VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR, // srcStageMask
375+
VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR, // srcAccessMask
376+
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR, // dstStageMask
377+
VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR, // dstAccessMask
378+
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // oldLayout
379+
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
380+
VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
381+
VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
382+
swapchain_image(frame_data), // image
343383
{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
384+
VkDependencyInfoKHR dst_to_attach = {
385+
VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR, // sType
386+
nullptr, // pNext
387+
0, // dependencyFlags
388+
0, // memoryBarrierCount
389+
nullptr, // pMemoryBarriers
390+
0, // bufferMemoryBarrierCount
391+
nullptr, // pBufferMemoryBarriers
392+
1, // imageMemoryBarrierCount
393+
&dst_to_attach_barrier // pImageMemoryBarriers
394+
};
344395

345396
// Change the layout of swapchain image to TRANSFER_DST_OPTIMAL
346-
cmdBuffer->vkCmdPipelineBarrier(
347-
cmdBuffer,
348-
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // srcStageMask
349-
VK_PIPELINE_STAGE_TRANSFER_BIT, // dstStageMask
350-
0, // dependencyFlags
351-
0, nullptr, 0, nullptr, 1, &attach_to_dst);
397+
cmdBuffer->vkCmdPipelineBarrier2KHR(cmdBuffer, &attach_to_dst);
352398

353399
// Blit the blit source image to the swapchain image
354400
VkImageBlit blit_region{
@@ -367,12 +413,7 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
367413
&blit_region, VK_FILTER_NEAREST);
368414

369415
// Change the layout of swapchain image to COLOR_ATTACHMENT_OPTIMAL
370-
cmdBuffer->vkCmdPipelineBarrier(
371-
cmdBuffer,
372-
VK_PIPELINE_STAGE_TRANSFER_BIT, // srcStageMask
373-
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // dstStageMask
374-
0, // dependencyFlags
375-
0, nullptr, 0, nullptr, 1, &dst_to_attach);
416+
cmdBuffer->vkCmdPipelineBarrier2KHR(cmdBuffer, &dst_to_attach);
376417

377418
(*frame_data->command_buffer_)
378419
->vkEndCommandBuffer(*frame_data->command_buffer_);
@@ -391,21 +432,27 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
391432
camera_data->UpdateBuffer(queue, frame_index);
392433
model_data->UpdateBuffer(queue, frame_index);
393434

394-
VkSubmitInfo init_submit_info{
395-
VK_STRUCTURE_TYPE_SUBMIT_INFO, // sType
396-
nullptr, // pNext
397-
0, // waitSemaphoreCount
398-
nullptr, // pWaitSemaphores
399-
nullptr, // pWaitDstStageMask,
400-
1, // commandBufferCount
401-
&(frame_data->command_buffer_->get_command_buffer()),
402-
0, // signalSemaphoreCount
403-
nullptr // pSignalSemaphores
435+
VkCommandBufferSubmitInfoKHR cb_info = {
436+
VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR, // sType
437+
nullptr, // pNext
438+
frame_data->command_buffer_->get_command_buffer(), // commandBuffer
439+
0 // deviceMask
440+
};
441+
VkSubmitInfo2KHR init_submit_info{
442+
VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR, // sType
443+
nullptr, // pNext
444+
0, // flags
445+
0, // waitSemaphoreInfoCount
446+
nullptr, // pWaitSemaphoreInfos
447+
1, // commandBufferInfoCount
448+
&cb_info, // pCommandBufferInfos
449+
0, // signalSemaphoreInfoCount
450+
nullptr // pSignalSemaphoreInfos
404451
};
405452

406-
app()->render_queue()->vkQueueSubmit(app()->render_queue(), 1,
407-
&init_submit_info,
408-
static_cast<VkFence>(VK_NULL_HANDLE));
453+
app()->render_queue()->vkQueueSubmit2KHR(
454+
app()->render_queue(), 1, &init_submit_info,
455+
static_cast<VkFence>(VK_NULL_HANDLE));
409456
}
410457

411458
private:

0 commit comments

Comments
 (0)