···11// Copyright 2021-2023, Collabora Ltd.
22+// Copyright 2025, NVIDIA CORPORATION.
23// Author: Jakob Bornecrantz <jakob@collabora.com>
34// Author: Christoph Haag <christoph.haag@collabora.com>
45// SPDX-License-Identifier: BSL-1.0
···78#extension GL_GOOGLE_include_directive : require
89910#include "srgb.inc.glsl"
1111+#include "layer_defines.inc.glsl"
10121111-//! @todo should this be a spcialization const?
1212-#define XRT_LAYER_PROJECTION 0
1313-#define XRT_LAYER_PROJECTION_DEPTH 1
1414-#define XRT_LAYER_QUAD 2
1515-#define XRT_LAYER_CUBE 3
1616-#define XRT_LAYER_CYLINDER 4
1717-#define XRT_LAYER_EQUIRECT1 5
1818-#define XRT_LAYER_EQUIRECT2 6
19132014const float PI = acos(-1);
2115···460454 vec4 rgba = vec4(0, 0, 0, 0);
461455462456 switch (ubo.layer_type_and_unpremultiplied[layer].x) {
463463- case XRT_LAYER_CYLINDER:
457457+ case LAYER_COMP_TYPE_QUAD:
458458+ rgba = do_quad(view_uv, layer);
459459+ break;
460460+ case LAYER_COMP_TYPE_CYLINDER:
464461 rgba = do_cylinder(view_uv, layer);
465462 break;
466466- case XRT_LAYER_EQUIRECT2:
463463+ case LAYER_COMP_TYPE_EQUIRECT2:
467464 rgba = do_equirect2(view_uv, layer);
468465 break;
469469- case XRT_LAYER_PROJECTION:
470470- case XRT_LAYER_PROJECTION_DEPTH:
466466+ case LAYER_COMP_TYPE_PROJECTION:
471467 rgba = do_projection(view_uv, layer);
472472- break;
473473- case XRT_LAYER_QUAD:
474474- rgba = do_quad(view_uv, layer);
475468 break;
476469 default: break;
477470 }
+22
src/xrt/compositor/shaders/layer_defines.inc.glsl
···11+// Copyright 2025, NVIDIA CORPORATION.
22+// SPDX-License-Identifier: BSL-1.0
33+44+/*
55+ * This file is included by both C code, like comp_render_cs.c, and GLSL code,
66+ * like layer.comp, so it uses a very limited set of features of both.
77+ */
88+#ifndef LAYER_DEFINES_INC_GLSL
99+#define LAYER_DEFINES_INC_GLSL
1010+1111+//! To handle invalid/unsupported layer types.
1212+#define LAYER_COMP_TYPE_NOOP 0
1313+//! Maps to XRT_LAYER_QUAD (not numerically)
1414+#define LAYER_COMP_TYPE_QUAD 1
1515+//! Maps to XRT_LAYER_CYLINDER (not numerically)
1616+#define LAYER_COMP_TYPE_CYLINDER 2
1717+//! Maps to XRT_LAYER_EQUIRECT2 (not numerically)
1818+#define LAYER_COMP_TYPE_EQUIRECT2 3
1919+//! Maps to XRT_LAYER_PROJECTION[_DEPTH] (not numerically)
2020+#define LAYER_COMP_TYPE_PROJECTION 4
2121+2222+#endif // LAYER_DEFINES_INC_GLSL
+26-3
src/xrt/compositor/util/comp_render_cs.c
···26262727#include "render/render_interface.h"
28282929+#include "shaders/layer_defines.inc.glsl"
3030+2931#include "util/comp_render.h"
3032#include "util/comp_render_helpers.h"
3133#include "util/comp_base.h"
···33353436/*
3537 *
3636- * Compute layer data builders.
3838+ * Helpers
3739 *
3840 */
3941···5355 (struct comp_swapchain *)(comp_layer_get_depth_swapchain(layer, swapchain_index));
5456 return &sc->images[image_index];
5557}
5858+5959+6060+static inline uint32_t
6161+xrt_layer_to_cs_layer_type(const struct xrt_layer_data *data)
6262+{
6363+ switch (data->type) {
6464+ case XRT_LAYER_QUAD: return LAYER_COMP_TYPE_QUAD;
6565+ case XRT_LAYER_CYLINDER: return LAYER_COMP_TYPE_CYLINDER;
6666+ case XRT_LAYER_EQUIRECT2: return LAYER_COMP_TYPE_EQUIRECT2;
6767+ case XRT_LAYER_PROJECTION:
6868+ case XRT_LAYER_PROJECTION_DEPTH: return LAYER_COMP_TYPE_PROJECTION;
6969+ default: U_LOG_E("Invalid layer type! %u", data->type); return LAYER_COMP_TYPE_NOOP;
7070+ }
7171+}
7272+7373+7474+/*
7575+ *
7676+ * Compute layer data builders.
7777+ *
7878+ */
56795780/// Data setup for a cylinder layer
5881static inline void
···660683 continue;
661684 }
662685663663- ubo_data->layer_type[cur_layer].val = data->type;
686686+ ubo_data->layer_type[cur_layer].val = xrt_layer_to_cs_layer_type(data);
664687 ubo_data->layer_type[cur_layer].unpremultiplied = is_layer_unpremultiplied(data);
665688666689 // Finally okay to increment the current layer.
···671694 ubo_data->layer_count.value = cur_layer;
672695673696 for (uint32_t i = cur_layer; i < RENDER_MAX_LAYERS; i++) {
674674- ubo_data->layer_type[i].val = UINT32_MAX;
697697+ ubo_data->layer_type[i].val = LAYER_COMP_TYPE_NOOP; // Explicit no-op.
675698 }
676699677700 //! @todo: If Vulkan 1.2, use VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT and skip this