1
- // Copyright 2017 Google Inc.
1
+ // Copyright 2022 Google Inc.
2
2
//
3
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
4
// you may not use this file except in compliance with the License.
@@ -47,14 +47,22 @@ struct CubeFrameData {
47
47
containers::unique_ptr<vulkan::VkImageView> blit_src_view_;
48
48
};
49
49
50
+ VkPhysicalDeviceSynchronization2FeaturesKHR kSynchronization2Features = {
51
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR, nullptr ,
52
+ VK_TRUE};
53
+
50
54
// This creates an application with 16MB of image memory, and defaults
51
55
// for host, and device buffer sizes.
52
56
class BlitImageSample : public sample_application ::Sample<CubeFrameData> {
53
57
public:
54
58
BlitImageSample (const entry::EntryData* data)
55
59
: 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}),
58
66
cube_ (data->allocator (), data->logger(), cube_data) {}
59
67
virtual void InitializeApplicationData (
60
68
vulkan::VkCommandBuffer* initialization_buffer,
@@ -251,37 +259,59 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
251
259
// Image barriers for the blit source image, UNDEFINED ->
252
260
// COLOR_ATTACHMENT_OPTIMAL COLOR_ATTACHMENT_OPTIMAL ->
253
261
// 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
+ };
265
287
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
276
300
{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
+ };
277
312
278
313
// 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);
285
315
286
316
VkRenderPassBeginInfo pass_begin = {
287
317
VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // sType
@@ -308,47 +338,63 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
308
338
cmdBuffer->vkCmdEndRenderPass (cmdBuffer);
309
339
310
340
// 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);
317
342
318
343
// Image barriers for swapchain image, COLOR_ATTACHMENT_OPTIMAL ->
319
344
// TRANSFER_DST_OPTIMAL and TRANSFER_DST_OPTIMAL ->
320
345
// 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
331
358
{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
+ };
332
370
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
343
383
{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
+ };
344
395
345
396
// 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);
352
398
353
399
// Blit the blit source image to the swapchain image
354
400
VkImageBlit blit_region{
@@ -367,12 +413,7 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
367
413
&blit_region, VK_FILTER_NEAREST);
368
414
369
415
// 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);
376
417
377
418
(*frame_data->command_buffer_ )
378
419
->vkEndCommandBuffer (*frame_data->command_buffer_ );
@@ -391,21 +432,27 @@ class BlitImageSample : public sample_application::Sample<CubeFrameData> {
391
432
camera_data->UpdateBuffer (queue, frame_index);
392
433
model_data->UpdateBuffer (queue, frame_index);
393
434
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
404
451
};
405
452
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));
409
456
}
410
457
411
458
private:
0 commit comments