diff --git a/src/xrt/compositor/shaders/layer.comp b/src/xrt/compositor/shaders/layer.comp index 586e710af..acdb9c8ff 100644 --- a/src/xrt/compositor/shaders/layer.comp +++ b/src/xrt/compositor/shaders/layer.comp @@ -1,4 +1,5 @@ // Copyright 2021-2023, Collabora Ltd. +// Copyright 2025, NVIDIA CORPORATION. // Author: Jakob Bornecrantz // Author: Christoph Haag // SPDX-License-Identifier: BSL-1.0 @@ -7,15 +8,8 @@ #extension GL_GOOGLE_include_directive : require #include "srgb.inc.glsl" +#include "layer_defines.inc.glsl" -//! @todo should this be a spcialization const? -#define XRT_LAYER_PROJECTION 0 -#define XRT_LAYER_PROJECTION_DEPTH 1 -#define XRT_LAYER_QUAD 2 -#define XRT_LAYER_CUBE 3 -#define XRT_LAYER_CYLINDER 4 -#define XRT_LAYER_EQUIRECT1 5 -#define XRT_LAYER_EQUIRECT2 6 const float PI = acos(-1); @@ -460,19 +454,18 @@ vec4 do_layers(vec2 view_uv) vec4 rgba = vec4(0, 0, 0, 0); switch (ubo.layer_type_and_unpremultiplied[layer].x) { - case XRT_LAYER_CYLINDER: + case LAYER_COMP_TYPE_QUAD: + rgba = do_quad(view_uv, layer); + break; + case LAYER_COMP_TYPE_CYLINDER: rgba = do_cylinder(view_uv, layer); break; - case XRT_LAYER_EQUIRECT2: + case LAYER_COMP_TYPE_EQUIRECT2: rgba = do_equirect2(view_uv, layer); break; - case XRT_LAYER_PROJECTION: - case XRT_LAYER_PROJECTION_DEPTH: + case LAYER_COMP_TYPE_PROJECTION: rgba = do_projection(view_uv, layer); break; - case XRT_LAYER_QUAD: - rgba = do_quad(view_uv, layer); - break; default: break; } diff --git a/src/xrt/compositor/shaders/layer_defines.inc.glsl b/src/xrt/compositor/shaders/layer_defines.inc.glsl new file mode 100644 index 000000000..9f601c7e3 --- /dev/null +++ b/src/xrt/compositor/shaders/layer_defines.inc.glsl @@ -0,0 +1,22 @@ +// Copyright 2025, NVIDIA CORPORATION. +// SPDX-License-Identifier: BSL-1.0 + +/* + * This file is included by both C code, like comp_render_cs.c, and GLSL code, + * like layer.comp, so it uses a very limited set of features of both. + */ +#ifndef LAYER_DEFINES_INC_GLSL +#define LAYER_DEFINES_INC_GLSL + +//! To handle invalid/unsupported layer types. +#define LAYER_COMP_TYPE_NOOP 0 +//! Maps to XRT_LAYER_QUAD (not numerically) +#define LAYER_COMP_TYPE_QUAD 1 +//! Maps to XRT_LAYER_CYLINDER (not numerically) +#define LAYER_COMP_TYPE_CYLINDER 2 +//! Maps to XRT_LAYER_EQUIRECT2 (not numerically) +#define LAYER_COMP_TYPE_EQUIRECT2 3 +//! Maps to XRT_LAYER_PROJECTION[_DEPTH] (not numerically) +#define LAYER_COMP_TYPE_PROJECTION 4 + +#endif // LAYER_DEFINES_INC_GLSL diff --git a/src/xrt/compositor/util/comp_render_cs.c b/src/xrt/compositor/util/comp_render_cs.c index f7da44e7f..6b8ed8b30 100644 --- a/src/xrt/compositor/util/comp_render_cs.c +++ b/src/xrt/compositor/util/comp_render_cs.c @@ -26,6 +26,8 @@ #include "render/render_interface.h" +#include "shaders/layer_defines.inc.glsl" + #include "util/comp_render.h" #include "util/comp_render_helpers.h" #include "util/comp_base.h" @@ -33,7 +35,7 @@ /* * - * Compute layer data builders. + * Helpers * */ @@ -54,6 +56,27 @@ get_layer_depth_image(const struct comp_layer *layer, uint32_t swapchain_index, return &sc->images[image_index]; } + +static inline uint32_t +xrt_layer_to_cs_layer_type(const struct xrt_layer_data *data) +{ + switch (data->type) { + case XRT_LAYER_QUAD: return LAYER_COMP_TYPE_QUAD; + case XRT_LAYER_CYLINDER: return LAYER_COMP_TYPE_CYLINDER; + case XRT_LAYER_EQUIRECT2: return LAYER_COMP_TYPE_EQUIRECT2; + case XRT_LAYER_PROJECTION: + case XRT_LAYER_PROJECTION_DEPTH: return LAYER_COMP_TYPE_PROJECTION; + default: U_LOG_E("Invalid layer type! %u", data->type); return LAYER_COMP_TYPE_NOOP; + } +} + + +/* + * + * Compute layer data builders. + * + */ + /// Data setup for a cylinder layer static inline void do_cs_cylinder_layer(const struct comp_layer *layer, @@ -660,7 +683,7 @@ comp_render_cs_layer(struct render_compute *render, continue; } - ubo_data->layer_type[cur_layer].val = data->type; + ubo_data->layer_type[cur_layer].val = xrt_layer_to_cs_layer_type(data); ubo_data->layer_type[cur_layer].unpremultiplied = is_layer_unpremultiplied(data); // Finally okay to increment the current layer. @@ -671,7 +694,7 @@ comp_render_cs_layer(struct render_compute *render, ubo_data->layer_count.value = cur_layer; for (uint32_t i = cur_layer; i < RENDER_MAX_LAYERS; i++) { - ubo_data->layer_type[i].val = UINT32_MAX; + ubo_data->layer_type[i].val = LAYER_COMP_TYPE_NOOP; // Explicit no-op. } //! @todo: If Vulkan 1.2, use VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT and skip this