Path: blob/master/thirdparty/embree/kernels/common/default.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../../common/sys/platform.h"6#include "../../common/sys/sysinfo.h"7#include "../../common/sys/thread.h"8#include "../../common/sys/alloc.h"9#include "../../common/sys/ref.h"10#include "../../common/sys/intrinsics.h"11#include "../../common/sys/atomic.h"12#include "../../common/sys/mutex.h"13#include "../../common/sys/vector.h"14#include "../../common/sys/array.h"15#include "../../common/sys/estring.h"16#include "../../common/sys/regression.h"17#include "../../common/sys/vector.h"1819#include "../../common/math/emath.h"20#include "../../common/math/transcendental.h"21#include "../../common/simd/simd.h"22#include "../../common/math/vec2.h"23#include "../../common/math/vec3.h"24#include "../../common/math/vec4.h"25#include "../../common/math/vec2fa.h"26#include "../../common/math/vec3fa.h"27#include "../../common/math/interval.h"28#include "../../common/math/bbox.h"29#include "../../common/math/obbox.h"30#include "../../common/math/lbbox.h"31#include "../../common/math/linearspace2.h"32#include "../../common/math/linearspace3.h"33#include "../../common/math/affinespace.h"34#include "../../common/math/range.h"35#include "../../common/lexers/tokenstream.h"3637#define COMMA ,3839#include "../config.h"40#include "isa.h"41#include "stat.h"42#include "profile.h"43#include "rtcore.h"44#include "vector.h"45#include "state.h"46#include "instance_stack.h"4748#include <vector>49#include <map>50#include <algorithm>51#include <functional>52#include <utility>53#include <sstream>5455namespace embree56{57////////////////////////////////////////////////////////////////////////////////58/// Vec2 shortcuts59////////////////////////////////////////////////////////////////////////////////6061template<int N> using Vec2vf = Vec2<vfloat<N>>;62template<int N> using Vec2vd = Vec2<vdouble<N>>;63template<int N> using Vec2vr = Vec2<vreal<N>>;64template<int N> using Vec2vi = Vec2<vint<N>>;65template<int N> using Vec2vl = Vec2<vllong<N>>;66template<int N> using Vec2vb = Vec2<vbool<N>>;67template<int N> using Vec2vbf = Vec2<vboolf<N>>;68template<int N> using Vec2vbd = Vec2<vboold<N>>;6970typedef Vec2<vfloat4> Vec2vf4;71typedef Vec2<vdouble4> Vec2vd4;72typedef Vec2<vreal4> Vec2vr4;73typedef Vec2<vint4> Vec2vi4;74typedef Vec2<vllong4> Vec2vl4;75typedef Vec2<vbool4> Vec2vb4;76typedef Vec2<vboolf4> Vec2vbf4;77typedef Vec2<vboold4> Vec2vbd4;7879typedef Vec2<vfloat8> Vec2vf8;80typedef Vec2<vdouble8> Vec2vd8;81typedef Vec2<vreal8> Vec2vr8;82typedef Vec2<vint8> Vec2vi8;83typedef Vec2<vllong8> Vec2vl8;84typedef Vec2<vbool8> Vec2vb8;85typedef Vec2<vboolf8> Vec2vbf8;86typedef Vec2<vboold8> Vec2vbd8;8788typedef Vec2<vfloat16> Vec2vf16;89typedef Vec2<vdouble16> Vec2vd16;90typedef Vec2<vreal16> Vec2vr16;91typedef Vec2<vint16> Vec2vi16;92typedef Vec2<vllong16> Vec2vl16;93typedef Vec2<vbool16> Vec2vb16;94typedef Vec2<vboolf16> Vec2vbf16;95typedef Vec2<vboold16> Vec2vbd16;9697typedef Vec2<vfloatx> Vec2vfx;98typedef Vec2<vdoublex> Vec2vdx;99typedef Vec2<vrealx> Vec2vrx;100typedef Vec2<vintx> Vec2vix;101typedef Vec2<vllongx> Vec2vlx;102typedef Vec2<vboolx> Vec2vbx;103typedef Vec2<vboolfx> Vec2vbfx;104typedef Vec2<vbooldx> Vec2vbdx;105106////////////////////////////////////////////////////////////////////////////////107/// Vec3 shortcuts108////////////////////////////////////////////////////////////////////////////////109110template<int N> using Vec3vf = Vec3<vfloat<N>>;111template<int N> using Vec3vd = Vec3<vdouble<N>>;112template<int N> using Vec3vr = Vec3<vreal<N>>;113template<int N> using Vec3vi = Vec3<vint<N>>;114template<int N> using Vec3vl = Vec3<vllong<N>>;115template<int N> using Vec3vb = Vec3<vbool<N>>;116template<int N> using Vec3vbf = Vec3<vboolf<N>>;117template<int N> using Vec3vbd = Vec3<vboold<N>>;118119typedef Vec3<vfloat4> Vec3vf4;120typedef Vec3<vdouble4> Vec3vd4;121typedef Vec3<vreal4> Vec3vr4;122typedef Vec3<vint4> Vec3vi4;123typedef Vec3<vllong4> Vec3vl4;124typedef Vec3<vbool4> Vec3vb4;125typedef Vec3<vboolf4> Vec3vbf4;126typedef Vec3<vboold4> Vec3vbd4;127128typedef Vec3<vfloat8> Vec3vf8;129typedef Vec3<vdouble8> Vec3vd8;130typedef Vec3<vreal8> Vec3vr8;131typedef Vec3<vint8> Vec3vi8;132typedef Vec3<vllong8> Vec3vl8;133typedef Vec3<vbool8> Vec3vb8;134typedef Vec3<vboolf8> Vec3vbf8;135typedef Vec3<vboold8> Vec3vbd8;136137typedef Vec3<vfloat16> Vec3vf16;138typedef Vec3<vdouble16> Vec3vd16;139typedef Vec3<vreal16> Vec3vr16;140typedef Vec3<vint16> Vec3vi16;141typedef Vec3<vllong16> Vec3vl16;142typedef Vec3<vbool16> Vec3vb16;143typedef Vec3<vboolf16> Vec3vbf16;144typedef Vec3<vboold16> Vec3vbd16;145146typedef Vec3<vfloatx> Vec3vfx;147typedef Vec3<vdoublex> Vec3vdx;148typedef Vec3<vrealx> Vec3vrx;149typedef Vec3<vintx> Vec3vix;150typedef Vec3<vllongx> Vec3vlx;151typedef Vec3<vboolx> Vec3vbx;152typedef Vec3<vboolfx> Vec3vbfx;153typedef Vec3<vbooldx> Vec3vbdx;154155////////////////////////////////////////////////////////////////////////////////156/// Vec4 shortcuts157////////////////////////////////////////////////////////////////////////////////158159template<int N> using Vec4vf = Vec4<vfloat<N>>;160template<int N> using Vec4vd = Vec4<vdouble<N>>;161template<int N> using Vec4vr = Vec4<vreal<N>>;162template<int N> using Vec4vi = Vec4<vint<N>>;163template<int N> using Vec4vl = Vec4<vllong<N>>;164template<int N> using Vec4vb = Vec4<vbool<N>>;165template<int N> using Vec4vbf = Vec4<vboolf<N>>;166template<int N> using Vec4vbd = Vec4<vboold<N>>;167168typedef Vec4<vfloat4> Vec4vf4;169typedef Vec4<vdouble4> Vec4vd4;170typedef Vec4<vreal4> Vec4vr4;171typedef Vec4<vint4> Vec4vi4;172typedef Vec4<vllong4> Vec4vl4;173typedef Vec4<vbool4> Vec4vb4;174typedef Vec4<vboolf4> Vec4vbf4;175typedef Vec4<vboold4> Vec4vbd4;176177typedef Vec4<vfloat8> Vec4vf8;178typedef Vec4<vdouble8> Vec4vd8;179typedef Vec4<vreal8> Vec4vr8;180typedef Vec4<vint8> Vec4vi8;181typedef Vec4<vllong8> Vec4vl8;182typedef Vec4<vbool8> Vec4vb8;183typedef Vec4<vboolf8> Vec4vbf8;184typedef Vec4<vboold8> Vec4vbd8;185186typedef Vec4<vfloat16> Vec4vf16;187typedef Vec4<vdouble16> Vec4vd16;188typedef Vec4<vreal16> Vec4vr16;189typedef Vec4<vint16> Vec4vi16;190typedef Vec4<vllong16> Vec4vl16;191typedef Vec4<vbool16> Vec4vb16;192typedef Vec4<vboolf16> Vec4vbf16;193typedef Vec4<vboold16> Vec4vbd16;194195typedef Vec4<vfloatx> Vec4vfx;196typedef Vec4<vdoublex> Vec4vdx;197typedef Vec4<vrealx> Vec4vrx;198typedef Vec4<vintx> Vec4vix;199typedef Vec4<vllongx> Vec4vlx;200typedef Vec4<vboolx> Vec4vbx;201typedef Vec4<vboolfx> Vec4vbfx;202typedef Vec4<vbooldx> Vec4vbdx;203204////////////////////////////////////////////////////////////////////////////////205/// Other shortcuts206////////////////////////////////////////////////////////////////////////////////207208template<int N> using BBox3vf = BBox<Vec3vf<N>>;209typedef BBox<Vec3vf4> BBox3vf4;210typedef BBox<Vec3vf8> BBox3vf8;211typedef BBox<Vec3vf16> BBox3vf16;212213/* calculate time segment itime and fractional time ftime */214__forceinline int getTimeSegment(float time, float numTimeSegments, float& ftime)215{216const float timeScaled = time * numTimeSegments;217const float itimef = clamp(floor(timeScaled), 0.0f, numTimeSegments-1.0f);218ftime = timeScaled - itimef;219return int(itimef);220}221222__forceinline int getTimeSegment(float time, float start_time, float end_time, float numTimeSegments, float& ftime)223{224const float timeScaled = (time-start_time)/(end_time-start_time) * numTimeSegments;225const float itimef = clamp(floor(timeScaled), 0.0f, numTimeSegments-1.0f);226ftime = timeScaled - itimef;227return int(itimef);228}229230template<int N>231__forceinline vint<N> getTimeSegment(const vfloat<N>& time, const vfloat<N>& numTimeSegments, vfloat<N>& ftime)232{233const vfloat<N> timeScaled = time * numTimeSegments;234const vfloat<N> itimef = clamp(floor(timeScaled), vfloat<N>(zero), numTimeSegments-1.0f);235ftime = timeScaled - itimef;236return vint<N>(itimef);237}238239template<int N>240__forceinline vint<N> getTimeSegment(const vfloat<N>& time, const vfloat<N>& start_time, const vfloat<N>& end_time, const vfloat<N>& numTimeSegments, vfloat<N>& ftime)241{242const vfloat<N> timeScaled = (time-start_time)/(end_time-start_time) * numTimeSegments;243const vfloat<N> itimef = clamp(floor(timeScaled), vfloat<N>(zero), numTimeSegments-1.0f);244ftime = timeScaled - itimef;245return vint<N>(itimef);246}247248/* calculate overlapping time segment range */249__forceinline range<int> getTimeSegmentRange(const BBox1f& time_range, float numTimeSegments)250{251const float round_up = 1.0f+2.0f*float(ulp); // corrects inaccuracies to precisely match time step252const float round_down = 1.0f-2.0f*float(ulp);253const int itime_lower = (int)max(floor(round_up *time_range.lower*numTimeSegments), 0.0f);254const int itime_upper = (int)min(ceil (round_down*time_range.upper*numTimeSegments), numTimeSegments);255return make_range(itime_lower, itime_upper);256}257258/* calculate overlapping time segment range */259__forceinline range<int> getTimeSegmentRange(const BBox1f& range, BBox1f time_range, float numTimeSegments)260{261const float lower = (range.lower-time_range.lower)/time_range.size();262const float upper = (range.upper-time_range.lower)/time_range.size();263return getTimeSegmentRange(BBox1f(lower,upper),numTimeSegments);264}265}266267268