Monado OpenXR Runtime
comp_target_swapchain.h
Go to the documentation of this file.
1// Copyright 2019-2020, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Target Vulkan swapchain code header.
6 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @ingroup comp_main
9 */
10
11#pragma once
12
13#include "vk/vk_helpers.h"
14
15#include "main/comp_target.h"
16
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22
23/*
24 *
25 * Structs.
26 *
27 */
28
30
31/*!
32 * Wraps and manage VkSwapchainKHR and VkSurfaceKHR, used by @ref comp code.
33 *
34 * @ingroup comp_main
35 */
37{
38 //! Base target.
40
41 //! Compositor frame pacing helper
43
44 //! If we should use display timing.
46
47 //! Also works as a frame index.
49
50 struct
51 {
52 /*!
53 * Should we ignore the compositor's preferred extents. Some
54 * targets, like the direct mode ones, requires a particular
55 * set of dimensions.
56 */
58
59 /*!
60 * The extents that a sub-class wants us to use,
61 * see @p ignore_compositor_extent above.
62 */
63 VkExtent2D extent;
64 } override;
65
66 struct
67 {
68 VkSwapchainKHR handle;
69 } swapchain;
70
71 struct
72 {
73 VkSurfaceKHR handle;
74 VkSurfaceFormatKHR format;
75#ifdef VK_EXT_display_surface_counter
76 VkSurfaceCounterFlagsEXT surface_counter_flags;
77#endif
78 } surface;
79
80 struct
81 {
82 VkFormat color_format;
83 VkColorSpaceKHR color_space;
84 } preferred;
85
86 //! Present mode that the system must support.
87 VkPresentModeKHR present_mode;
88
89 //! The current display used for direct mode, VK_NULL_HANDLE else.
90 VkDisplayKHR display;
91
92 struct
93 {
94 //! Must only be accessed from main compositor thread.
96
97 //! Protected by event_thread lock.
99
100 //! Protected by event_thread lock.
102
103 //! Thread waiting on vblank_event_fence (first pixel out).
105 } vblank;
106
107 /*!
108 * We print swapchain info as INFO the first time we create a
109 * VkSWapchain, this keeps track if we have done it.
110 */
112};
113
114
115/*
116 *
117 * Functions.
118 *
119 */
120
121/*!
122 * @brief Pre Vulkan initialisation, sets function pointers.
123 *
124 * Call from the creation function for your "subclass", after allocating.
125 *
126 * Initializes these function pointers, all other methods of @ref comp_target are the responsibility of the caller (the
127 * "subclass"):
128 *
129 * - comp_target::check_ready
130 * - comp_target::create_images
131 * - comp_target::has_images
132 * - comp_target::acquire
133 * - comp_target::present
134 * - comp_target::calc_frame_pacing
135 * - comp_target::mark_timing_point
136 * - comp_target::update_timings
137 *
138 * Also sets comp_target_swapchain::timing_usage to the provided value.
139 *
140 * @protected @memberof comp_target_swapchain
141 *
142 * @ingroup comp_main
143 */
144void
146 enum comp_target_display_timing_usage timing_usage);
147
148/*!
149 * Set that any size from the compositor should be ignored and that given size
150 * must be used for the @p VkSwapchain the helper code creates.
151 *
152 * @protected @memberof comp_target_swapchain
153 *
154 * @ingroup comp_main
155 */
156void
158
159/*!
160 * Free all managed resources on the given @ref comp_target_swapchain,
161 * does not free the struct itself.
162 *
163 * @protected @memberof comp_target_swapchain
164 *
165 * @ingroup comp_main
166 */
167void
169
170
171#ifdef __cplusplus
172}
173#endif
Abstracted compositor rendering target.
comp_target_display_timing_usage
If the target should use the display timing information.
Definition: comp_target.h:51
void comp_target_swapchain_init_and_set_fnptrs(struct comp_target_swapchain *cts, enum comp_target_display_timing_usage timing_usage)
Pre Vulkan initialisation, sets function pointers.
Definition: comp_target_swapchain.c:1078
void comp_target_swapchain_cleanup(struct comp_target_swapchain *cts)
Free all managed resources on the given comp_target_swapchain, does not free the struct itself.
Definition: comp_target_swapchain.c:1043
void comp_target_swapchain_override_extents(struct comp_target_swapchain *cts, VkExtent2D extent)
Set that any size from the compositor should be ignored and that given size must be used for the VkSw...
Definition: comp_target_swapchain.c:1024
Wraps and manage VkSwapchainKHR and VkSurfaceKHR, used by Compositor code.
Definition: comp_target_swapchain.h:37
VkPresentModeKHR present_mode
Present mode that the system must support.
Definition: comp_target_swapchain.h:87
VkDisplayKHR display
The current display used for direct mode, VK_NULL_HANDLE else.
Definition: comp_target_swapchain.h:90
int64_t current_frame_id
Also works as a frame index.
Definition: comp_target_swapchain.h:48
uint64_t last_vblank_ns
Protected by event_thread lock.
Definition: comp_target_swapchain.h:101
struct os_thread_helper event_thread
Thread waiting on vblank_event_fence (first pixel out).
Definition: comp_target_swapchain.h:104
bool should_wait
Protected by event_thread lock.
Definition: comp_target_swapchain.h:98
VkExtent2D extent
The extents that a sub-class wants us to use, see ignore_compositor_extent above.
Definition: comp_target_swapchain.h:63
struct comp_target base
Base target.
Definition: comp_target_swapchain.h:39
bool has_logged_info
We print swapchain info as INFO the first time we create a VkSWapchain, this keeps track if we have d...
Definition: comp_target_swapchain.h:111
bool compositor_extent
Should we ignore the compositor's preferred extents.
Definition: comp_target_swapchain.h:57
struct u_pacing_compositor * upc
Compositor frame pacing helper.
Definition: comp_target_swapchain.h:42
bool has_started
Must only be accessed from main compositor thread.
Definition: comp_target_swapchain.h:95
enum comp_target_display_timing_usage timing_usage
If we should use display timing.
Definition: comp_target_swapchain.h:45
A compositor target: where the compositor renders to.
Definition: comp_target.h:132
All in one helper that handles locking, waiting for change and starting a thread.
Definition: os_threading.h:453
Compositor pacing helper interface.
Definition: u_pacing.h:68
Common Vulkan code header.