@@ -92,21 +92,17 @@ void RasterizationOrderAttachmentAccess::load_assets()
9292// Creates uniform buffer for scene data and instance buffer with randomized sphere transforms/colors
9393void RasterizationOrderAttachmentAccess::create_buffers ()
9494{
95- scene_uniform_buffer = std::make_unique<vkb::core::BufferC>(
96- get_device (), sizeof (SceneUniforms),
97- VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
95+ scene_uniform_buffer =
96+ std::make_unique<vkb::core::BufferC>(get_device (), sizeof (SceneUniforms), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
9897
99- instance_buffer = std::make_unique<vkb::core::BufferC>(
100- get_device (), sizeof (InstanceData) * kInstanceCount ,
101- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
98+ instance_buffer = std::make_unique<vkb::core::BufferC>(get_device (), sizeof (InstanceData) * kInstanceCount , VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
99+ VMA_MEMORY_USAGE_CPU_TO_GPU);
102100
103101 // Initialize instance data with random colors
104102 instances.resize (kInstanceCount );
105103 srand (42 );
106104
107- const auto random_float = []() {
108- return static_cast <float >(rand ()) / static_cast <float >(RAND_MAX);
109- };
105+ const auto random_float = []() { return static_cast <float >(rand ()) / static_cast <float >(RAND_MAX); };
110106
111107 uint32_t idx = 0 ;
112108 for (uint32_t z = 0 ; z < kInstanceLayerCount ; ++z)
@@ -115,20 +111,12 @@ void RasterizationOrderAttachmentAccess::create_buffers()
115111 {
116112 for (uint32_t x = 0 ; x < kInstanceRowCount ; ++x, ++idx)
117113 {
118- const glm::vec3 pos = {
119- static_cast <float >(x) - (kInstanceRowCount - 1 ) * 0 .5f ,
120- static_cast <float >(y) - (kInstanceColumnCount - 1 ) * 0 .5f ,
121- static_cast <float >(z) - (kInstanceLayerCount - 1 ) * 0 .5f };
122-
123- instances[idx].model = glm::scale (
124- glm::translate (glm::mat4 (1 .0f ), pos),
125- glm::vec3 (0 .03f ));
126-
127- instances[idx].color = glm::vec4 (
128- random_float (),
129- random_float (),
130- random_float (),
131- random_float () * 0 .8f + 0 .2f );
114+ const glm::vec3 pos = {static_cast <float >(x) - (kInstanceRowCount - 1 ) * 0 .5f , static_cast <float >(y) - (kInstanceColumnCount - 1 ) * 0 .5f ,
115+ static_cast <float >(z) - (kInstanceLayerCount - 1 ) * 0 .5f };
116+
117+ instances[idx].model = glm::scale (glm::translate (glm::mat4 (1 .0f ), pos), glm::vec3 (0 .03f ));
118+
119+ instances[idx].color = glm::vec4 (random_float (), random_float (), random_float (), random_float () * 0 .8f + 0 .2f );
132120 }
133121 }
134122 }
@@ -153,7 +141,8 @@ void RasterizationOrderAttachmentAccess::create_descriptors()
153141 vkb::initializers::descriptor_set_layout_binding (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 2 ),
154142 vkb::initializers::descriptor_set_layout_binding (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_SHADER_STAGE_FRAGMENT_BIT, 3 ),
155143 };
156- const VkDescriptorSetLayoutCreateInfo layout_info = vkb::initializers::descriptor_set_layout_create_info (bindings.data (), static_cast <uint32_t >(bindings.size ()));
144+ const VkDescriptorSetLayoutCreateInfo layout_info =
145+ vkb::initializers::descriptor_set_layout_create_info (bindings.data (), static_cast <uint32_t >(bindings.size ()));
157146 VK_CHECK (vkCreateDescriptorSetLayout (device, &layout_info, nullptr , &descriptor_set_layout));
158147 }
159148
@@ -175,7 +164,8 @@ void RasterizationOrderAttachmentAccess::create_descriptors()
175164 vkb::initializers::descriptor_pool_size (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, set_count),
176165 vkb::initializers::descriptor_pool_size (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, set_count),
177166 };
178- VkDescriptorPoolCreateInfo pool_info = vkb::initializers::descriptor_pool_create_info (static_cast <uint32_t >(pool_sizes.size ()), pool_sizes.data (), set_count);
167+ VkDescriptorPoolCreateInfo pool_info =
168+ vkb::initializers::descriptor_pool_create_info (static_cast <uint32_t >(pool_sizes.size ()), pool_sizes.data (), set_count);
179169 VK_CHECK (vkCreateDescriptorPool (device, &pool_info, nullptr , &descriptor_pool));
180170
181171 // Allocate
@@ -222,17 +212,21 @@ void RasterizationOrderAttachmentAccess::create_pipelines()
222212 const VkFormat color_format = get_render_context ().get_swapchain ().get_format ();
223213
224214 // Common pipeline state
225- VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info ();
226- const VkPipelineInputAssemblyStateCreateInfo input_assembly_state = vkb::initializers::pipeline_input_assembly_state_create_info (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0 , VK_FALSE);
227- const VkPipelineRasterizationStateCreateInfo rasterization_state = vkb::initializers::pipeline_rasterization_state_create_info (VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0 );
228- const VkPipelineColorBlendAttachmentState blend_attachment = vkb::initializers::pipeline_color_blend_attachment_state (0xF , VK_FALSE);
229- VkPipelineColorBlendStateCreateInfo color_blend_state = vkb::initializers::pipeline_color_blend_state_create_info (1 , &blend_attachment);
230- const VkPipelineMultisampleStateCreateInfo multisample_state = vkb::initializers::pipeline_multisample_state_create_info (VK_SAMPLE_COUNT_1_BIT, 0 );
231- const VkPipelineViewportStateCreateInfo viewport_state = vkb::initializers::pipeline_viewport_state_create_info (1 , 1 , 0 );
232- const VkPipelineDepthStencilStateCreateInfo depth_stencil_state = vkb::initializers::pipeline_depth_stencil_state_create_info (VK_FALSE, VK_FALSE, VK_COMPARE_OP_GREATER);
215+ VkPipelineVertexInputStateCreateInfo vertex_input_state = vkb::initializers::pipeline_vertex_input_state_create_info ();
216+ const VkPipelineInputAssemblyStateCreateInfo input_assembly_state =
217+ vkb::initializers::pipeline_input_assembly_state_create_info (VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0 , VK_FALSE);
218+ const VkPipelineRasterizationStateCreateInfo rasterization_state =
219+ vkb::initializers::pipeline_rasterization_state_create_info (VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_COUNTER_CLOCKWISE, 0 );
220+ const VkPipelineColorBlendAttachmentState blend_attachment = vkb::initializers::pipeline_color_blend_attachment_state (0xF , VK_FALSE);
221+ VkPipelineColorBlendStateCreateInfo color_blend_state = vkb::initializers::pipeline_color_blend_state_create_info (1 , &blend_attachment);
222+ const VkPipelineMultisampleStateCreateInfo multisample_state = vkb::initializers::pipeline_multisample_state_create_info (VK_SAMPLE_COUNT_1_BIT, 0 );
223+ const VkPipelineViewportStateCreateInfo viewport_state = vkb::initializers::pipeline_viewport_state_create_info (1 , 1 , 0 );
224+ const VkPipelineDepthStencilStateCreateInfo depth_stencil_state =
225+ vkb::initializers::pipeline_depth_stencil_state_create_info (VK_FALSE, VK_FALSE, VK_COMPARE_OP_GREATER);
233226
234227 const std::vector<VkDynamicState> dynamic_states = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
235- const VkPipelineDynamicStateCreateInfo dynamic_state = vkb::initializers::pipeline_dynamic_state_create_info (dynamic_states.data (), static_cast <uint32_t >(dynamic_states.size ()), 0 );
228+ const VkPipelineDynamicStateCreateInfo dynamic_state =
229+ vkb::initializers::pipeline_dynamic_state_create_info (dynamic_states.data (), static_cast <uint32_t >(dynamic_states.size ()), 0 );
236230
237231 std::array<VkPipelineShaderStageCreateInfo, 2 > shader_stages{};
238232
@@ -260,7 +254,7 @@ void RasterizationOrderAttachmentAccess::create_pipelines()
260254 VK_CHECK (vkCreateGraphicsPipelines (device, pipeline_cache, 1 , &pipeline_info, nullptr , &background_pipeline));
261255
262256 // Blend pipelines (sphere geometry with local read)
263- const VkVertexInputBindingDescription vertex_binding = vkb::initializers::vertex_input_binding_description (0 , sizeof (Vertex), VK_VERTEX_INPUT_RATE_VERTEX);
257+ const VkVertexInputBindingDescription vertex_binding = vkb::initializers::vertex_input_binding_description (0 , sizeof (Vertex), VK_VERTEX_INPUT_RATE_VERTEX);
264258 const VkVertexInputAttributeDescription vertex_attribute = vkb::initializers::vertex_input_attribute_description (0 , 0 , VK_FORMAT_R32G32B32_SFLOAT, 0 );
265259
266260 vertex_input_state.vertexBindingDescriptionCount = 1 ;
@@ -400,12 +394,9 @@ void RasterizationOrderAttachmentAccess::build_command_buffers()
400394 }
401395
402396 // Transition: UNDEFINED -> RENDERING_LOCAL_READ_KHR (enables framebuffer fetch)
403- vkb::image_layout_transition (
404- draw_cmd_buffers[i], swapchain_buffers[i].image ,
405- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
406- 0 , VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
407- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR,
408- {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
397+ vkb::image_layout_transition (draw_cmd_buffers[i], swapchain_buffers[i].image , VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
398+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0 , VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
399+ VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
409400
410401 // Set up color attachment for dynamic rendering with local read support
411402 VkRenderingAttachmentInfoKHR color_attachment = {};
@@ -457,9 +448,10 @@ void RasterizationOrderAttachmentAccess::build_command_buffers()
457448
458449 VkDependencyInfoKHR dependency_info = {};
459450 dependency_info.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR;
460- dependency_info.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; // BY_REGION makes the barrier tile-local, which is more efficient on tiled GPUs
461- dependency_info.memoryBarrierCount = 1 ;
462- dependency_info.pMemoryBarriers = &memory_barrier;
451+ dependency_info.dependencyFlags =
452+ VK_DEPENDENCY_BY_REGION_BIT; // BY_REGION makes the barrier tile-local, which is more efficient on tiled GPUs
453+ dependency_info.memoryBarrierCount = 1 ;
454+ dependency_info.pMemoryBarriers = &memory_barrier;
463455 vkCmdPipelineBarrier2KHR (draw_cmd_buffers[i], &dependency_info);
464456
465457 // ROAA ON: Single instanced draw. Extension guarantees fragment ordering.
@@ -497,22 +489,17 @@ void RasterizationOrderAttachmentAccess::build_command_buffers()
497489 }
498490
499491 // Transition: RENDERING_LOCAL_READ_KHR -> COLOR_ATTACHMENT_OPTIMAL (required for UI rendering)
500- vkb::image_layout_transition (
501- draw_cmd_buffers[i], swapchain_buffers[i].image ,
502- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
503- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
504- VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
505- {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
492+ vkb::image_layout_transition (draw_cmd_buffers[i], swapchain_buffers[i].image , VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
493+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
494+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR,
495+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
506496
507497 draw_ui (draw_cmd_buffers[i], i);
508498
509499 // Transition: COLOR_ATTACHMENT_OPTIMAL -> PRESENT_SRC_KHR
510- vkb::image_layout_transition (
511- draw_cmd_buffers[i], swapchain_buffers[i].image ,
512- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
513- VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 0 ,
514- VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
515- {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
500+ vkb::image_layout_transition (draw_cmd_buffers[i], swapchain_buffers[i].image , VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
501+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 0 ,
502+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, {VK_IMAGE_ASPECT_COLOR_BIT, 0 , 1 , 0 , 1 });
516503 }
517504 VK_CHECK (vkEndCommandBuffer (draw_cmd_buffers[i]));
518505 }
@@ -549,14 +536,8 @@ void RasterizationOrderAttachmentAccess::retrieve_timestamp_results()
549536
550537 // WAIT_BIT blocks until results are available. 64_BIT for full precision timestamps
551538 const VkDevice device = get_device ().get_handle ();
552- vkGetQueryPoolResults (
553- device,
554- timestamp_query_pool,
555- 0 , 2 ,
556- timestamp_results.size () * sizeof (uint64_t ),
557- timestamp_results.data (),
558- sizeof (uint64_t ),
559- VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
539+ vkGetQueryPoolResults (device, timestamp_query_pool, 0 , 2 , timestamp_results.size () * sizeof (uint64_t ), timestamp_results.data (), sizeof (uint64_t ),
540+ VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
560541
561542 // timestampPeriod is nanoseconds per tick, convert delta to milliseconds
562543 const VkPhysicalDeviceProperties &properties = get_device ().get_gpu ().get_properties ();
0 commit comments