The open source OpenXR runtime
at main 129 lines 3.6 kB view raw
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}