Monado OpenXR Runtime
xrt_byte_order.h
Go to the documentation of this file.
1// Copyright 2025, Beyley Cardellio
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Endian-specific byte order defines.
6 * @author Beyley Cardellio <ep1cm1n10n123@gmail.com>
7 * @ingroup aux_os
8 */
9
10#pragma once
11
12#include "xrt_compiler.h"
13#include "xrt_defines.h"
14
15#include <stdint.h>
16
17#ifdef __linux__
18
19// On Linux, all these conversion functions are defined for both endians
20#include <asm/byteorder.h>
21
22#elif defined(XRT_BIG_ENDIAN)
23
24#error "@todo: Add byte order constants and functions for this OS or big endian machines."
25
26#else
27
28#define __be64 uint64_t
29#define __be32 uint32_t
30#define __be16 uint16_t
31
32#define __be16_to_cpu(x) ((((uint16_t)x & (uint16_t)0x00FFU) << 8) | (((uint16_t)x & (uint16_t)0xFF00U) >> 8))
33#define __cpu_to_be16(x) __be16_to_cpu(x)
34
35#define __be32_to_cpu(x) \
36 ((((uint32_t)x & (uint32_t)0x000000FFUL) << 24) | (((uint32_t)x & (uint32_t)0x0000FF00UL) << 8) | \
37 (((uint32_t)x & (uint32_t)0x00FF0000UL) >> 8) | (((uint32_t)x & (uint32_t)0xFF000000UL) >> 24))
38#define __cpu_to_be32(x) __be32_to_cpu(x)
39
40#define __be64_to_cpu(x) \
41 ((((uint64_t)x & (uint64_t)0x00000000000000FFULL) << 56) | \
42 (((uint64_t)x & (uint64_t)0x000000000000FF00ULL) << 40) | \
43 (((uint64_t)x & (uint64_t)0x0000000000FF0000ULL) << 24) | \
44 (((uint64_t)x & (uint64_t)0x00000000FF000000ULL) << 8) | \
45 (((uint64_t)x & (uint64_t)0x000000FF00000000ULL) >> 8) | \
46 (((uint64_t)x & (uint64_t)0x0000FF0000000000ULL) >> 24) | \
47 (((uint64_t)x & (uint64_t)0x00FF000000000000ULL) >> 40) | \
48 (((uint64_t)x & (uint64_t)0xFF00000000000000ULL) >> 56)) |
49#define __cpu_to_be64(x) __be64_to_cpu(x)
50
51#define __le64 uint64_t
52#define __le32 uint32_t
53#define __le16 uint16_t
54#define __u8 uint8_t
55#define __s8 int8_t
56#define __cpu_to_le16
57#define __le16_to_cpu
58#define __cpu_to_le32
59#define __le32_to_cpu
60#define __cpu_to_le64
61#define __le64_to_cpu
62
63#endif
64
65/*!
66 * Little endian 32-bit float wrapper struct.
67 */
68typedef struct
69{
70 __le32 val;
71} __lef32;
72
73/*!
74 * Big endian 32-bit float wrapper struct.
75 */
76typedef struct
77{
78 __be32 val;
79} __bef32;
80
81static inline float
82__lef32_to_cpu(__lef32 f)
83{
84 union {
85 uint32_t raw;
86 float f32;
87 } safe_copy;
88
89 safe_copy.raw = __le32_to_cpu(f.val);
90 return safe_copy.f32;
91}
92
93static inline __lef32
94__cpu_to_lef32(float f)
95{
96 union {
97 uint32_t wire;
98 float f32;
99 } safe_copy;
100
101 safe_copy.f32 = f;
102
103 return XRT_C11_COMPOUND(__lef32){.val = __cpu_to_le32(safe_copy.wire)};
104}
105
106static inline float
107__bef32_to_cpu(__bef32 f)
108{
109 union {
110 uint32_t raw;
111 float f32;
112 } safe_copy;
113
114 safe_copy.raw = __be32_to_cpu(f.val);
115 return safe_copy.f32;
116}
117
118static inline __bef32
119__cpu_to_bef32(float f)
120{
121 union {
122 uint32_t wire;
123 float f32;
124 } safe_copy;
125
126 safe_copy.f32 = f;
127 return XRT_C11_COMPOUND(__bef32){.val = __cpu_to_be32(safe_copy.wire)};
128}
129
130/*
131 *
132 * Vec2
133 *
134 */
135
137{
138 __lef32 x;
139 __lef32 y;
140};
141
142static inline struct xrt_vec2
143__levec2_to_cpu(struct __levec2 v)
144{
145 return XRT_C11_COMPOUND(struct xrt_vec2){
146 .x = __lef32_to_cpu(v.x),
147 .y = __lef32_to_cpu(v.y),
148 };
149}
150
151static inline struct __levec2
152__cpu_to_levec2(struct xrt_vec2 v)
153{
154 return XRT_C11_COMPOUND(struct __levec2){
155 .x = __cpu_to_lef32(v.x),
156 .y = __cpu_to_lef32(v.y),
157 };
158}
159
160/*
161 *
162 * Vec3
163 *
164 */
165
167{
168 __lef32 x;
169 __lef32 y;
170 __lef32 z;
171};
172
173static inline struct xrt_vec3
174__levec3_to_cpu(struct __levec3 v)
175{
176 return XRT_C11_COMPOUND(struct xrt_vec3){
177 .x = __lef32_to_cpu(v.x),
178 .y = __lef32_to_cpu(v.y),
179 .z = __lef32_to_cpu(v.z),
180 };
181}
182
183static inline struct __levec3
184__cpu_to_levec3(struct xrt_vec3 v)
185{
186 return XRT_C11_COMPOUND(struct __levec3){
187 .x = __cpu_to_lef32(v.x),
188 .y = __cpu_to_lef32(v.y),
189 .z = __cpu_to_lef32(v.z),
190 };
191}
Big endian 32-bit float wrapper struct.
Definition: xrt_byte_order.h:77
Little endian 32-bit float wrapper struct.
Definition: xrt_byte_order.h:69
Definition: xrt_byte_order.h:137
Definition: xrt_byte_order.h:167
A 2 element vector with single floats.
Definition: xrt_defines.h:268
A 3 element vector with single floats.
Definition: xrt_defines.h:289
Header holding common defines.
Common defines and enums for XRT.