/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Foundation/SimdMath/Implementation/SSE/SSEVec4b_inl.h
117 строк
3 KB
Jan Krassnigg
Various improvements (#1397)
25 сен 2024, 14:45
25 сен 2024, 14:45
affd254
Код
Авторство
О чём код?
#pragma once EZ_ALWAYS_INLINE ezSimdVec4b::ezSimdVec4b() { EZ_CHECK_SIMD_ALIGNMENT(this); } EZ_ALWAYS_INLINE ezSimdVec4b::ezSimdVec4b(bool b) { EZ_CHECK_SIMD_ALIGNMENT(this); ezUInt32 mask = b ? 0xFFFFFFFF : 0; __m128 tmp = _mm_load_ss((float*)&mask); m_v = _mm_shuffle_ps(tmp, tmp, EZ_TO_SHUFFLE(ezSwizzle::XXXX)); } EZ_ALWAYS_INLINE ezSimdVec4b::ezSimdVec4b(bool x, bool y, bool z, bool w) { EZ_CHECK_SIMD_ALIGNMENT(this); alignas(16) ezUInt32 mask[4] = {x ? 0xFFFFFFFF : 0, y ? 0xFFFFFFFF : 0, z ? 0xFFFFFFFF : 0, w ? 0xFFFFFFFF : 0}; m_v = _mm_load_ps((float*)mask); } EZ_ALWAYS_INLINE ezSimdVec4b::ezSimdVec4b(ezInternal::QuadBool v) { m_v = v; } template <int N> EZ_ALWAYS_INLINE bool ezSimdVec4b::GetComponent() const { return _mm_movemask_ps(_mm_shuffle_ps(m_v, m_v, EZ_SHUFFLE(N, N, N, N))) != 0; } EZ_ALWAYS_INLINE bool ezSimdVec4b::x() const { return GetComponent<0>(); } EZ_ALWAYS_INLINE bool ezSimdVec4b::y() const { return GetComponent<1>(); } EZ_ALWAYS_INLINE bool ezSimdVec4b::z() const { return GetComponent<2>(); } EZ_ALWAYS_INLINE bool ezSimdVec4b::w() const { return GetComponent<3>(); } template <ezSwizzle::Enum s> EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::Get() const { return _mm_shuffle_ps(m_v, m_v, EZ_TO_SHUFFLE(s)); } EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::operator&&(const ezSimdVec4b& rhs) const { return _mm_and_ps(m_v, rhs.m_v); } EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::operator||(const ezSimdVec4b& rhs) const { return _mm_or_ps(m_v, rhs.m_v); } EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::operator!() const { __m128 allTrue = _mm_cmpeq_ps(_mm_setzero_ps(), _mm_setzero_ps()); return _mm_xor_ps(m_v, allTrue); } EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::operator==(const ezSimdVec4b& rhs) const { return !(*this != rhs); } EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::operator!=(const ezSimdVec4b& rhs) const { return _mm_xor_ps(m_v, rhs.m_v); } template <int N> EZ_ALWAYS_INLINE bool ezSimdVec4b::AllSet() const { const int mask = EZ_BIT(N) - 1; return (_mm_movemask_ps(m_v) & mask) == mask; } template <int N> EZ_ALWAYS_INLINE bool ezSimdVec4b::AnySet() const { const int mask = EZ_BIT(N) - 1; return (_mm_movemask_ps(m_v) & mask) != 0; } template <int N> EZ_ALWAYS_INLINE bool ezSimdVec4b::NoneSet() const { const int mask = EZ_BIT(N) - 1; return (_mm_movemask_ps(m_v) & mask) == 0; } // static EZ_ALWAYS_INLINE ezSimdVec4b ezSimdVec4b::Select(const ezSimdVec4b& vCmp, const ezSimdVec4b& vTrue, const ezSimdVec4b& vFalse) { #if EZ_SSE_LEVEL >= EZ_SSE_41 return _mm_blendv_ps(vFalse.m_v, vTrue.m_v, vCmp.m_v); #else return _mm_or_ps(_mm_andnot_ps(vCmp.m_v, vFalse.m_v), _mm_and_ps(vCmp.m_v, vTrue.m_v)); #endif }