Monado OpenXR Runtime
Loading...
Searching...
No Matches
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 //! Whether to use VK_KHR_present_id2 over VK_KHR_present_id.
49
50 //! Also works as a frame index.
52
53 struct
54 {
55 /*!
56 * Should we ignore the compositor's preferred extents. Some
57 * targets, like the direct mode ones, requires a particular
58 * set of dimensions.
59 */
61
62 /*!
63 * The extents that a sub-class wants us to use,
64 * see @p ignore_compositor_extent above.
65 */
66 VkExtent2D extent;
67 } override;
68
69 struct
70 {
71 VkSwapchainKHR handle;
72 } swapchain;
73
74 struct
75 {
76 VkSurfaceKHR handle;
77 VkSurfaceFormatKHR format;
78#ifdef VK_EXT_display_surface_counter
79 VkSurfaceCounterFlagsEXT surface_counter_flags;
80#endif
81 } surface;
82
83 struct
84 {
85 VkFormat color_format;
86 VkColorSpaceKHR color_space;
87 } preferred;
88
89 //! Present mode that the system must support.
90 VkPresentModeKHR present_mode;
91
92 //! The current display used for direct mode, VK_NULL_HANDLE else.
93 VkDisplayKHR display;
94
95 struct
96 {
97 //! Must only be accessed from main compositor thread.
99
100 //! Protected by event_thread lock.
102
103 //! Protected by event_thread lock.
105
106 //! Thread waiting on vblank_event_fence (first pixel out).
108
109 //! Skipping the event on the first vblank avoids a spurious VK_ERROR_OUT_OF_HOST_MEMORY error.
111 } vblank;
112
113 /*!
114 * We print swapchain info as INFO the first time we create a
115 * VkSWapchain, this keeps track if we have done it.
116 */
118};
119
120
121/*
122 *
123 * Functions.
124 *
125 */
126
127/*!
128 * @brief Pre Vulkan initialisation, sets function pointers.
129 *
130 * Call from the creation function for your "subclass", after allocating.
131 *
132 * Initializes these function pointers, all other methods of @ref comp_target are the responsibility of the caller (the
133 * "subclass"):
134 *
135 * - comp_target::check_ready
136 * - comp_target::create_images
137 * - comp_target::has_images
138 * - comp_target::acquire
139 * - comp_target::present
140 * - comp_target::calc_frame_pacing
141 * - comp_target::mark_timing_point
142 * - comp_target::update_timings
143 *
144 * Also sets comp_target_swapchain::timing_usage to the provided value.
145 *
146 * @protected @memberof comp_target_swapchain
147 *
148 * @ingroup comp_main
149 */
150void
151comp_target_swapchain_init_and_set_fnptrs(struct comp_target_swapchain *cts,
152 enum comp_target_display_timing_usage timing_usage);
153
154/*!
155 * Set that any size from the compositor should be ignored and that given size
156 * must be used for the @p VkSwapchain the helper code creates.
157 *
158 * @protected @memberof comp_target_swapchain
159 *
160 * @ingroup comp_main
161 */
162void
163comp_target_swapchain_override_extents(struct comp_target_swapchain *cts, VkExtent2D extent);
164
165/*!
166 * Free all managed resources on the given @ref comp_target_swapchain,
167 * does not free the struct itself.
168 *
169 * @protected @memberof comp_target_swapchain
170 *
171 * @ingroup comp_main
172 */
173void
174comp_target_swapchain_cleanup(struct comp_target_swapchain *cts);
175
176
177#ifdef __cplusplus
178}
179#endif
Abstracted compositor rendering target.
comp_target_display_timing_usage
If the target should use the display timing information.
Definition comp_target.h:52
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:90
VkDisplayKHR display
The current display used for direct mode, VK_NULL_HANDLE else.
Definition comp_target_swapchain.h:93
int64_t current_frame_id
Also works as a frame index.
Definition comp_target_swapchain.h:51
uint64_t last_vblank_ns
Protected by event_thread lock.
Definition comp_target_swapchain.h:104
struct os_thread_helper event_thread
Thread waiting on vblank_event_fence (first pixel out).
Definition comp_target_swapchain.h:107
bool present_id2_supported
Whether to use VK_KHR_present_id2 over VK_KHR_present_id.
Definition comp_target_swapchain.h:48
bool should_wait
Protected by event_thread lock.
Definition comp_target_swapchain.h:101
VkExtent2D extent
The extents that a sub-class wants us to use, see ignore_compositor_extent above.
Definition comp_target_swapchain.h:66
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:117
bool thread_running
Must only be accessed from main compositor thread.
Definition comp_target_swapchain.h:98
bool compositor_extent
Should we ignore the compositor's preferred extents.
Definition comp_target_swapchain.h:60
bool event_active
Skipping the event on the first vblank avoids a spurious VK_ERROR_OUT_OF_HOST_MEMORY error.
Definition comp_target_swapchain.h:110
struct u_pacing_compositor * upc
Compositor frame pacing helper.
Definition comp_target_swapchain.h:42
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:133
Definition t_rift_blobwatch.c:106
All in one helper that handles locking, waiting for change and starting a thread.
Definition os_threading.h:499
Compositor pacing helper interface.
Definition u_pacing.h:68
Common Vulkan code header.