mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-10 17:05:21 +00:00
167 lines
4.7 KiB
C
167 lines
4.7 KiB
C
// Copyright 2019-2020, Collabora, Ltd.
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
/*!
|
|
* @file
|
|
* @brief Space, space, space, SPAAAAAAAAAAAAAAAAAAAAAAAAAACE!
|
|
* @author Jakob Bornecrantz <jakob@collabora.com>
|
|
* @ingroup oxr_api
|
|
*/
|
|
|
|
#include "xrt/xrt_compiler.h"
|
|
|
|
#include "math/m_api.h"
|
|
#include "util/u_debug.h"
|
|
|
|
#include "oxr_objects.h"
|
|
#include "oxr_logger.h"
|
|
#include "oxr_two_call.h"
|
|
|
|
#include "oxr_api_funcs.h"
|
|
#include "oxr_api_verify.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <inttypes.h>
|
|
|
|
|
|
XrResult
|
|
oxr_xrCreateActionSpace(XrSession session,
|
|
const XrActionSpaceCreateInfo *createInfo,
|
|
XrSpace *space)
|
|
{
|
|
struct oxr_session *sess;
|
|
struct oxr_action *act;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess,
|
|
"xrCreateActionSpace");
|
|
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo,
|
|
XR_TYPE_ACTION_SPACE_CREATE_INFO);
|
|
OXR_VERIFY_POSE(&log, createInfo->poseInActionSpace);
|
|
OXR_VERIFY_ACTION_NOT_NULL(&log, createInfo->action, act);
|
|
|
|
struct oxr_space *spc;
|
|
XrResult ret =
|
|
oxr_space_action_create(&log, sess, act->act_key, createInfo, &spc);
|
|
if (ret != XR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
*space = oxr_space_to_openxr(spc);
|
|
|
|
return oxr_session_success_result(sess);
|
|
}
|
|
|
|
static const XrReferenceSpaceType session_spaces[] = {
|
|
XR_REFERENCE_SPACE_TYPE_VIEW,
|
|
XR_REFERENCE_SPACE_TYPE_LOCAL,
|
|
XR_REFERENCE_SPACE_TYPE_STAGE,
|
|
};
|
|
|
|
XrResult
|
|
oxr_xrEnumerateReferenceSpaces(XrSession session,
|
|
uint32_t spaceCapacityInput,
|
|
uint32_t *spaceCountOutput,
|
|
XrReferenceSpaceType *spaces)
|
|
{
|
|
struct oxr_session *sess;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess,
|
|
"xrEnumerateReferenceSpaces");
|
|
|
|
OXR_TWO_CALL_HELPER(&log, spaceCapacityInput, spaceCountOutput, spaces,
|
|
ARRAY_SIZE(session_spaces), session_spaces,
|
|
oxr_session_success_result(sess));
|
|
}
|
|
|
|
XrResult
|
|
oxr_xrGetReferenceSpaceBoundsRect(XrSession session,
|
|
XrReferenceSpaceType referenceSpaceType,
|
|
XrExtent2Df *bounds)
|
|
{
|
|
struct oxr_session *sess;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess,
|
|
"xrGetReferenceSpaceBoundsRect");
|
|
OXR_VERIFY_ARG_NOT_NULL(&log, bounds);
|
|
|
|
|
|
switch (referenceSpaceType) {
|
|
case XR_REFERENCE_SPACE_TYPE_VIEW:
|
|
case XR_REFERENCE_SPACE_TYPE_LOCAL:
|
|
case XR_REFERENCE_SPACE_TYPE_STAGE: break;
|
|
default:
|
|
return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE,
|
|
"(referenceSpaceType == 0x%08x) is not a "
|
|
"valid XrReferenceSpaceType",
|
|
referenceSpaceType);
|
|
}
|
|
|
|
bounds->width = 0.0;
|
|
bounds->height = 0.0;
|
|
|
|
// Silently return that the bounds aren't available.
|
|
return XR_SPACE_BOUNDS_UNAVAILABLE;
|
|
}
|
|
|
|
XrResult
|
|
oxr_xrCreateReferenceSpace(XrSession session,
|
|
const XrReferenceSpaceCreateInfo *createInfo,
|
|
XrSpace *out_space)
|
|
{
|
|
XrResult ret;
|
|
struct oxr_session *sess;
|
|
struct oxr_space *spc = NULL;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess,
|
|
"xrCreateReferenceSpace");
|
|
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, createInfo,
|
|
XR_TYPE_REFERENCE_SPACE_CREATE_INFO);
|
|
OXR_VERIFY_POSE(&log, createInfo->poseInReferenceSpace);
|
|
|
|
ret = oxr_space_reference_create(&log, sess, createInfo, &spc);
|
|
if (ret != XR_SUCCESS) {
|
|
return ret;
|
|
}
|
|
|
|
*out_space = oxr_space_to_openxr(spc);
|
|
|
|
return oxr_session_success_result(sess);
|
|
}
|
|
|
|
XrResult
|
|
oxr_xrLocateSpace(XrSpace space,
|
|
XrSpace baseSpace,
|
|
XrTime time,
|
|
XrSpaceLocation *location)
|
|
{
|
|
struct oxr_space *spc;
|
|
struct oxr_space *baseSpc;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SPACE_AND_INIT_LOG(&log, space, spc, "xrLocateSpace");
|
|
OXR_VERIFY_SPACE_NOT_NULL(&log, baseSpace, baseSpc);
|
|
OXR_VERIFY_ARG_TYPE_AND_NOT_NULL(&log, location,
|
|
XR_TYPE_SPACE_LOCATION);
|
|
|
|
OXR_VERIFY_ARG_TYPE_CAN_BE_NULL(
|
|
&log, ((XrSpaceVelocity *)location->next), XR_TYPE_SPACE_VELOCITY);
|
|
|
|
if (time <= (XrTime)0) {
|
|
return oxr_error(&log, XR_ERROR_TIME_INVALID,
|
|
"(time == %" PRIi64 ") is not a valid time.",
|
|
time);
|
|
}
|
|
|
|
return oxr_space_locate(&log, spc, baseSpc, time, location);
|
|
}
|
|
|
|
XrResult
|
|
oxr_xrDestroySpace(XrSpace space)
|
|
{
|
|
struct oxr_space *spc;
|
|
struct oxr_logger log;
|
|
OXR_VERIFY_SPACE_AND_INIT_LOG(&log, space, spc, "xrDestroySpace");
|
|
|
|
return oxr_handle_destroy(&log, &spc->handle);
|
|
}
|