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
19 extern "C" {
20 #endif
21 
22 
23 /*
24  *
25  * Structs.
26  *
27  */
28 
29 struct u_pacing_compositor;
30 
31 /*!
32  * Wraps and manage VkSwapchainKHR and VkSurfaceKHR, used by @ref comp code.
33  *
34  * @ingroup comp_main
35  */
37 {
38  //! Base target.
39  struct comp_target base;
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.
101  uint64_t last_vblank_ns;
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  */
144 void
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  */
156 void
157 comp_target_swapchain_override_extents(struct comp_target_swapchain *cts, VkExtent2D extent);
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  */
167 void
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:1065
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:1030
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:1011
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.