blob: a9c301c369c747dcc8b0835fff9f1e8db28ecac6 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_VR_OPENXR_OPENXR_LAYERS_H_
#define DEVICE_VR_OPENXR_OPENXR_LAYERS_H_
#include <memory>
#include <vector>
#include "base/memory/raw_ptr_exclusion.h"
#include "third_party/openxr/src/include/openxr/openxr.h"
namespace device {
class OpenXrCompositionLayer;
// A wrapper around all of the layers to be submitted to a certain frame. Each
// frame creates its own OpenXrLayers object and populates it with all the
// layers of active view configurations. This information is passed into
// xrEndFrame to complete the frame.
class OpenXrLayers {
public:
OpenXrLayers();
~OpenXrLayers();
void AddBaseLayer(
XrSpace space,
std::vector<XrCompositionLayerProjectionView> primary_projection_views,
const void* xr_next_struct);
void AddCompositionLayer(
const OpenXrCompositionLayer& layer,
std::vector<XrCompositionLayerProjectionView> projection_views,
const void* xr_next_struct);
void AddSecondaryLayerForType(
XrSpace space,
XrViewConfigurationType type,
XrEnvironmentBlendMode blend_mode,
std::vector<XrCompositionLayerProjectionView> projection_views,
const void* xr_next_struct);
uint32_t PrimaryLayerCount() const {
return primary_composition_layers_.size();
}
const XrCompositionLayerBaseHeader* const* PrimaryLayerData() const {
return primary_composition_layers_.data();
}
uint32_t SecondaryConfigCount() const { return secondary_layer_info_.size(); }
const XrSecondaryViewConfigurationLayerInfoMSFT* SecondaryConfigData() const {
return secondary_layer_info_.data();
}
private:
union XrCompositionLayerUnion {
XrCompositionLayerProjection projection;
XrCompositionLayerQuad quad;
XrCompositionLayerCylinderKHR cylinder;
XrCompositionLayerEquirect2KHR equirect;
};
static XrCompositionLayerBaseHeader* GetLayerHeaderFromUnion(
OpenXrLayers::XrCompositionLayerUnion& layer_union,
const OpenXrCompositionLayer& layer);
void InitializeBaseLayer(
XrSpace space,
XrCompositionLayerProjection& layer,
std::vector<XrCompositionLayerProjectionView>&& projection_views,
const void* xr_next_struct);
// The base layer is used when there is no layers created by client.
XrCompositionLayerProjection base_layer_;
std::vector<std::unique_ptr<XrCompositionLayerUnion>> composition_layers_;
// The layers for secondary view configurations. We currently only support a
// single layer per view configuration, so each element in this vector is the
// layer for a specific view configuration.
std::vector<std::unique_ptr<XrCompositionLayerProjection>>
secondary_projection_layers_;
// Pointers to the corresponding layer in base_layer_ and
// secondary_projection_layers_. quad_layers cylinder_layers_,
// equirect_layers_ and cube_layers. This field is not vector<raw_ptr<...>>
// due to interaction with third_party api.
RAW_PTR_EXCLUSION std::vector<XrCompositionLayerBaseHeader*>
primary_composition_layers_;
// Pointers to the corresponding layer in secondary_projection_layers_.
// This field is not vector<raw_ptr<...>> due to interaction with third_party
// api.
RAW_PTR_EXCLUSION std::vector<XrCompositionLayerBaseHeader*>
secondary_composition_layers_;
// The secondary view configuration layer info containing the data above,
// which is passed to xrEndFrame.
std::vector<XrSecondaryViewConfigurationLayerInfoMSFT> secondary_layer_info_;
// Keep all projection views for projection layers excluding the base layer,
// so that the XrCompositionLayerProjectionView pointer in
// XrCompositionLayerProjection will be valid.
std::vector<std::vector<XrCompositionLayerProjectionView>>
projection_views_pool_;
};
} // namespace device
#endif // DEVICE_VR_OPENXR_OPENXR_LAYERS_H_