Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/common/math/vec3ba.h
9912 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include "../sys/alloc.h"
7
#include "emath.h"
8
9
#if defined(EMBREE_SYCL_SUPPORT) && defined(__SYCL_DEVICE_ONLY__)
10
# include "vec3ba_sycl.h"
11
#else
12
13
#include "../simd/sse.h"
14
15
namespace embree
16
{
17
////////////////////////////////////////////////////////////////////////////////
18
/// SSE Vec3ba Type
19
////////////////////////////////////////////////////////////////////////////////
20
21
struct __aligned(16) Vec3ba
22
{
23
ALIGNED_STRUCT_(16);
24
25
union {
26
__m128 m128;
27
struct { int x,y,z; };
28
};
29
30
typedef int Scalar;
31
enum { N = 3 };
32
33
////////////////////////////////////////////////////////////////////////////////
34
/// Constructors, Assignment & Cast Operators
35
////////////////////////////////////////////////////////////////////////////////
36
37
__forceinline Vec3ba( ) {}
38
__forceinline Vec3ba( const __m128 input ) : m128(input) {}
39
__forceinline Vec3ba( const Vec3ba& other ) : m128(other.m128) {}
40
__forceinline Vec3ba& operator =(const Vec3ba& other) { m128 = other.m128; return *this; }
41
42
__forceinline explicit Vec3ba( bool a )
43
: m128(mm_lookupmask_ps[(size_t(a) << 3) | (size_t(a) << 2) | (size_t(a) << 1) | size_t(a)]) {}
44
__forceinline Vec3ba( bool a, bool b, bool c)
45
: m128(mm_lookupmask_ps[(size_t(c) << 2) | (size_t(b) << 1) | size_t(a)]) {}
46
47
__forceinline operator const __m128&() const { return m128; }
48
__forceinline operator __m128&() { return m128; }
49
50
////////////////////////////////////////////////////////////////////////////////
51
/// Constants
52
////////////////////////////////////////////////////////////////////////////////
53
54
__forceinline Vec3ba( FalseTy ) : m128(_mm_setzero_ps()) {}
55
__forceinline Vec3ba( TrueTy ) : m128(_mm_castsi128_ps(_mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()))) {}
56
57
////////////////////////////////////////////////////////////////////////////////
58
/// Array Access
59
////////////////////////////////////////////////////////////////////////////////
60
61
__forceinline const int& operator []( const size_t index ) const { assert(index < 3); return (&x)[index]; }
62
__forceinline int& operator []( const size_t index ) { assert(index < 3); return (&x)[index]; }
63
};
64
65
66
////////////////////////////////////////////////////////////////////////////////
67
/// Unary Operators
68
////////////////////////////////////////////////////////////////////////////////
69
70
__forceinline Vec3ba operator !( const Vec3ba& a ) { return _mm_xor_ps(a.m128, Vec3ba(embree::True)); }
71
72
////////////////////////////////////////////////////////////////////////////////
73
/// Binary Operators
74
////////////////////////////////////////////////////////////////////////////////
75
76
__forceinline Vec3ba operator &( const Vec3ba& a, const Vec3ba& b ) { return _mm_and_ps(a.m128, b.m128); }
77
__forceinline Vec3ba operator |( const Vec3ba& a, const Vec3ba& b ) { return _mm_or_ps (a.m128, b.m128); }
78
__forceinline Vec3ba operator ^( const Vec3ba& a, const Vec3ba& b ) { return _mm_xor_ps(a.m128, b.m128); }
79
80
////////////////////////////////////////////////////////////////////////////////
81
/// Assignment Operators
82
////////////////////////////////////////////////////////////////////////////////
83
84
__forceinline Vec3ba& operator &=( Vec3ba& a, const Vec3ba& b ) { return a = a & b; }
85
__forceinline Vec3ba& operator |=( Vec3ba& a, const Vec3ba& b ) { return a = a | b; }
86
__forceinline Vec3ba& operator ^=( Vec3ba& a, const Vec3ba& b ) { return a = a ^ b; }
87
88
////////////////////////////////////////////////////////////////////////////////
89
/// Comparison Operators + Select
90
////////////////////////////////////////////////////////////////////////////////
91
92
__forceinline bool operator ==( const Vec3ba& a, const Vec3ba& b ) {
93
return (_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(_mm_castps_si128(a.m128), _mm_castps_si128(b.m128)))) & 7) == 7;
94
}
95
__forceinline bool operator !=( const Vec3ba& a, const Vec3ba& b ) {
96
return (_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(_mm_castps_si128(a.m128), _mm_castps_si128(b.m128)))) & 7) != 7;
97
}
98
__forceinline bool operator < ( const Vec3ba& a, const Vec3ba& b ) {
99
if (a.x != b.x) return a.x < b.x;
100
if (a.y != b.y) return a.y < b.y;
101
if (a.z != b.z) return a.z < b.z;
102
return false;
103
}
104
105
////////////////////////////////////////////////////////////////////////////////
106
/// Reduction Operations
107
////////////////////////////////////////////////////////////////////////////////
108
109
__forceinline bool reduce_and( const Vec3ba& a ) { return (_mm_movemask_ps(a) & 0x7) == 0x7; }
110
__forceinline bool reduce_or ( const Vec3ba& a ) { return (_mm_movemask_ps(a) & 0x7) != 0x0; }
111
112
__forceinline bool all ( const Vec3ba& b ) { return (_mm_movemask_ps(b) & 0x7) == 0x7; }
113
__forceinline bool any ( const Vec3ba& b ) { return (_mm_movemask_ps(b) & 0x7) != 0x0; }
114
__forceinline bool none ( const Vec3ba& b ) { return (_mm_movemask_ps(b) & 0x7) == 0x0; }
115
116
__forceinline size_t movemask(const Vec3ba& a) { return _mm_movemask_ps(a) & 0x7; }
117
118
////////////////////////////////////////////////////////////////////////////////
119
/// Output Operators
120
////////////////////////////////////////////////////////////////////////////////
121
122
__forceinline embree_ostream operator<<(embree_ostream cout, const Vec3ba& a) {
123
return cout << "(" << (a.x ? "1" : "0") << ", " << (a.y ? "1" : "0") << ", " << (a.z ? "1" : "0") << ")";
124
}
125
}
126
127
#endif
128
129