MCPcopy Create free account
hub / github.com/KhronosGroup/Vulkan-Samples / screenshot

Function screenshot

framework/common/utils.cpp:45–185  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

43}
44
45void screenshot(vkb::rendering::RenderContextC &render_context, const std::string &filename)
46{
47 assert(render_context.get_format() == VK_FORMAT_R8G8B8A8_UNORM ||
48 render_context.get_format() == VK_FORMAT_B8G8R8A8_UNORM ||
49 render_context.get_format() == VK_FORMAT_R8G8B8A8_SRGB ||
50 render_context.get_format() == VK_FORMAT_B8G8R8A8_SRGB);
51
52 // We want the last completed frame since we don't want to be reading from an incomplete framebuffer
53 auto &frame = render_context.get_last_rendered_frame();
54 assert(!frame.get_render_target().get_views().empty());
55 auto &src_image_view = frame.get_render_target().get_views()[0];
56
57 auto width = render_context.get_surface_extent().width;
58 auto height = render_context.get_surface_extent().height;
59 auto dst_size = width * height * 4;
60
61 vkb::core::BufferC dst_buffer{render_context.get_device(),
62 dst_size,
63 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
64 VMA_MEMORY_USAGE_GPU_TO_CPU,
65 VMA_ALLOCATION_CREATE_MAPPED_BIT};
66
67 const auto &queue = render_context.get_device().get_queue_by_flags(VK_QUEUE_GRAPHICS_BIT, 0);
68
69 auto cmd_buf = render_context.get_device().get_command_pool().request_command_buffer();
70
71 cmd_buf->begin(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
72
73 // Enable destination buffer to be written to
74 {
75 BufferMemoryBarrier memory_barrier{};
76 memory_barrier.src_access_mask = 0;
77 memory_barrier.dst_access_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
78 memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;
79 memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;
80
81 cmd_buf->buffer_memory_barrier(dst_buffer, 0, dst_size, memory_barrier);
82 }
83
84 // Enable framebuffer image view to be read from
85 {
86 ImageMemoryBarrier memory_barrier{};
87 memory_barrier.old_layout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
88 memory_barrier.new_layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
89 memory_barrier.src_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;
90 memory_barrier.dst_stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;
91
92 cmd_buf->image_memory_barrier(src_image_view, memory_barrier);
93 }
94
95 // Check if framebuffer images are in a BGR format
96 auto bgr_formats = {VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM};
97 bool swizzle = std::ranges::find(bgr_formats, src_image_view.get_format()) != bgr_formats.end();
98
99 // Copy framebuffer image memory
100 VkBufferImageCopy image_copy_region{};
101 image_copy_region.bufferRowLength = width;
102 image_copy_region.bufferImageHeight = height;

Callers 2

input_eventMethod · 0.50
on_post_drawMethod · 0.50

Calls 15

write_imageFunction · 0.85
emptyMethod · 0.80
buffer_memory_barrierMethod · 0.80
image_memory_barrierMethod · 0.80
endMethod · 0.80
copy_image_to_bufferMethod · 0.80
unmapMethod · 0.80
get_formatMethod · 0.45
get_render_targetMethod · 0.45
beginMethod · 0.45
get_imageMethod · 0.45

Tested by

no test coverage detected