The open source OpenXR runtime
1// Copyright 2019-2024, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Re-assemble a collection of composition layers submitted for a frame.
6 *
7 * @author Rylie Pavlik <rylie.pavlik@collabora.com>
8 * @author Jakob Bornecrantz <jakob@collabora.com>
9 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
10 * @ingroup comp_util
11 */
12
13#include "comp_layer_accum.h"
14#include "util/u_misc.h"
15#include "xrt/xrt_compositor.h"
16#include "xrt/xrt_limits.h"
17
18// Shared implementation of accumulating a layer with only a single swapchain image.
19static xrt_result_t
20push_single_swapchain_layer(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
21{
22 uint32_t layer_id = cla->layer_count;
23
24 struct comp_layer *layer = &cla->layers[layer_id];
25 U_ZERO_ARRAY(layer->sc_array);
26 layer->sc_array[0] = xsc;
27 layer->data = *data;
28
29 cla->layer_count++;
30
31 return XRT_SUCCESS;
32}
33
34struct xrt_swapchain *
35comp_layer_get_swapchain(const struct comp_layer *cl, uint32_t swapchain_index)
36{
37
38 return cl->sc_array[swapchain_index];
39}
40
41struct xrt_swapchain *
42comp_layer_get_depth_swapchain(const struct comp_layer *cl, uint32_t swapchain_index)
43{
44
45 assert(cl->data.type == XRT_LAYER_PROJECTION_DEPTH);
46 return cl->sc_array[XRT_MAX_VIEWS + swapchain_index];
47}
48
49xrt_result_t
50comp_layer_accum_begin(struct comp_layer_accum *cla, const struct xrt_layer_frame_data *data)
51{
52 cla->data = *data;
53 cla->layer_count = 0;
54
55 return XRT_SUCCESS;
56}
57
58xrt_result_t
59comp_layer_accum_projection(struct comp_layer_accum *cla,
60 struct xrt_swapchain *xsc[XRT_MAX_VIEWS],
61 const struct xrt_layer_data *data)
62{
63
64 uint32_t layer_id = cla->layer_count;
65
66 struct comp_layer *layer = &cla->layers[layer_id];
67 assert(ARRAY_SIZE(layer->sc_array) >= data->view_count);
68 U_ZERO_ARRAY(layer->sc_array);
69 for (uint32_t i = 0; i < data->view_count; ++i) {
70 layer->sc_array[i] = xsc[i];
71 }
72 layer->data = *data;
73
74 cla->layer_count++;
75
76 return XRT_SUCCESS;
77}
78
79xrt_result_t
80comp_layer_accum_projection_depth(struct comp_layer_accum *cla,
81 struct xrt_swapchain *xsc[XRT_MAX_VIEWS],
82 struct xrt_swapchain *d_xsc[XRT_MAX_VIEWS],
83 const struct xrt_layer_data *data)
84{
85
86 uint32_t layer_id = cla->layer_count;
87
88 struct comp_layer *layer = &cla->layers[layer_id];
89 U_ZERO_ARRAY(layer->sc_array);
90 for (uint32_t i = 0; i < data->view_count; ++i) {
91 layer->sc_array[i] = xsc[i];
92 layer->sc_array[i + data->view_count] = d_xsc[i];
93 }
94 layer->data = *data;
95
96 cla->layer_count++;
97
98 return XRT_SUCCESS;
99}
100
101xrt_result_t
102comp_layer_accum_quad(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
103{
104 return push_single_swapchain_layer(cla, xsc, data);
105}
106
107xrt_result_t
108comp_layer_accum_cube(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
109{
110 return push_single_swapchain_layer(cla, xsc, data);
111}
112
113xrt_result_t
114comp_layer_accum_cylinder(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
115{
116 return push_single_swapchain_layer(cla, xsc, data);
117}
118
119xrt_result_t
120comp_layer_accum_equirect1(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
121{
122 return push_single_swapchain_layer(cla, xsc, data);
123}
124
125xrt_result_t
126comp_layer_accum_equirect2(struct comp_layer_accum *cla, struct xrt_swapchain *xsc, const struct xrt_layer_data *data)
127{
128 return push_single_swapchain_layer(cla, xsc, data);
129}