Home | History | Annotate | Download | only in Shader
      1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef sw_ShaderCore_hpp
     16 #define sw_ShaderCore_hpp
     17 
     18 #include "Shader.hpp"
     19 #include "Reactor/Reactor.hpp"
     20 #include "Common/Debug.hpp"
     21 
     22 namespace sw
     23 {
     24 	class Vector4s
     25 	{
     26 	public:
     27 		Vector4s();
     28 		Vector4s(unsigned short x, unsigned short y, unsigned short z, unsigned short w);
     29 		Vector4s(const Vector4s &rhs);
     30 
     31 		Short4 &operator[](int i);
     32 		Vector4s &operator=(const Vector4s &rhs);
     33 
     34 		Short4 x;
     35 		Short4 y;
     36 		Short4 z;
     37 		Short4 w;
     38 	};
     39 
     40 	class Vector4f
     41 	{
     42 	public:
     43 		Vector4f();
     44 		Vector4f(float x, float y, float z, float w);
     45 		Vector4f(const Vector4f &rhs);
     46 
     47 		Float4 &operator[](int i);
     48 		Vector4f &operator=(const Vector4f &rhs);
     49 
     50 		Float4 x;
     51 		Float4 y;
     52 		Float4 z;
     53 		Float4 w;
     54 	};
     55 
     56 	Float4 exponential2(RValue<Float4> x, bool pp = false);
     57 	Float4 logarithm2(RValue<Float4> x, bool abs, bool pp = false);
     58 	Float4 exponential(RValue<Float4> x, bool pp = false);
     59 	Float4 logarithm(RValue<Float4> x, bool abs, bool pp = false);
     60 	Float4 power(RValue<Float4> x, RValue<Float4> y, bool pp = false);
     61 	Float4 reciprocal(RValue<Float4> x, bool pp = false, bool finite = false, bool exactAtPow2 = false);
     62 	Float4 reciprocalSquareRoot(RValue<Float4> x, bool abs, bool pp = false);
     63 	Float4 modulo(RValue<Float4> x, RValue<Float4> y);
     64 	Float4 sine_pi(RValue<Float4> x, bool pp = false);     // limited to [-pi, pi] range
     65 	Float4 cosine_pi(RValue<Float4> x, bool pp = false);   // limited to [-pi, pi] range
     66 	Float4 sine(RValue<Float4> x, bool pp = false);
     67 	Float4 cosine(RValue<Float4> x, bool pp = false);
     68 	Float4 tangent(RValue<Float4> x, bool pp = false);
     69 	Float4 arccos(RValue<Float4> x, bool pp = false);
     70 	Float4 arcsin(RValue<Float4> x, bool pp = false);
     71 	Float4 arctan(RValue<Float4> x, bool pp = false);
     72 	Float4 arctan(RValue<Float4> y, RValue<Float4> x, bool pp = false);
     73 	Float4 sineh(RValue<Float4> x, bool pp = false);
     74 	Float4 cosineh(RValue<Float4> x, bool pp = false);
     75 	Float4 tangenth(RValue<Float4> x, bool pp = false);
     76 	Float4 arccosh(RValue<Float4> x, bool pp = false);  // Limited to x >= 1
     77 	Float4 arcsinh(RValue<Float4> x, bool pp = false);
     78 	Float4 arctanh(RValue<Float4> x, bool pp = false);  // Limited to ]-1, 1[ range
     79 
     80 	Float4 dot2(const Vector4f &v0, const Vector4f &v1);
     81 	Float4 dot3(const Vector4f &v0, const Vector4f &v1);
     82 	Float4 dot4(const Vector4f &v0, const Vector4f &v1);
     83 
     84 	void transpose4x4(Short4 &row0, Short4 &row1, Short4 &row2, Short4 &row3);
     85 	void transpose4x3(Short4 &row0, Short4 &row1, Short4 &row2, Short4 &row3);
     86 	void transpose4x4(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3);
     87 	void transpose4x3(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3);
     88 	void transpose4x2(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3);
     89 	void transpose4x1(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3);
     90 	void transpose2x4(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3);
     91 	void transpose4xN(Float4 &row0, Float4 &row1, Float4 &row2, Float4 &row3, int N);
     92 
     93 	class Register
     94 	{
     95 	public:
     96 		Register(const Reference<Float4> &x, const Reference<Float4> &y, const Reference<Float4> &z, const Reference<Float4> &w) : x(x), y(y), z(z), w(w)
     97 		{
     98 		}
     99 
    100 		Reference<Float4> &operator[](int i)
    101 		{
    102 			switch(i)
    103 			{
    104 			default:
    105 			case 0: return x;
    106 			case 1: return y;
    107 			case 2: return z;
    108 			case 3: return w;
    109 			}
    110 		}
    111 
    112 		Register &operator=(const Register &rhs)
    113 		{
    114 			x = rhs.x;
    115 			y = rhs.y;
    116 			z = rhs.z;
    117 			w = rhs.w;
    118 
    119 			return *this;
    120 		}
    121 
    122 		Register &operator=(const Vector4f &rhs)
    123 		{
    124 			x = rhs.x;
    125 			y = rhs.y;
    126 			z = rhs.z;
    127 			w = rhs.w;
    128 
    129 			return *this;
    130 		}
    131 
    132 		operator Vector4f()
    133 		{
    134 			Vector4f v;
    135 
    136 			v.x = x;
    137 			v.y = y;
    138 			v.z = z;
    139 			v.w = w;
    140 
    141 			return v;
    142 		}
    143 
    144 		Reference<Float4> x;
    145 		Reference<Float4> y;
    146 		Reference<Float4> z;
    147 		Reference<Float4> w;
    148 	};
    149 
    150 	template<int S, bool D = false>
    151 	class RegisterArray
    152 	{
    153 	public:
    154 		RegisterArray(bool dynamic = D) : dynamic(dynamic)
    155 		{
    156 			if(dynamic)
    157 			{
    158 				x = new Array<Float4>(S);
    159 				y = new Array<Float4>(S);
    160 				z = new Array<Float4>(S);
    161 				w = new Array<Float4>(S);
    162 			}
    163 			else
    164 			{
    165 				x = new Array<Float4>[S];
    166 				y = new Array<Float4>[S];
    167 				z = new Array<Float4>[S];
    168 				w = new Array<Float4>[S];
    169 			}
    170 		}
    171 
    172 		~RegisterArray()
    173 		{
    174 			if(dynamic)
    175 			{
    176 				delete x;
    177 				delete y;
    178 				delete z;
    179 				delete w;
    180 			}
    181 			else
    182 			{
    183 				delete[] x;
    184 				delete[] y;
    185 				delete[] z;
    186 				delete[] w;
    187 			}
    188 		}
    189 
    190 		Register operator[](int i)
    191 		{
    192 			if(dynamic)
    193 			{
    194 				return Register(x[0][i], y[0][i], z[0][i], w[0][i]);
    195 			}
    196 			else
    197 			{
    198 				return Register(x[i][0], y[i][0], z[i][0], w[i][0]);
    199 			}
    200 		}
    201 
    202 		Register operator[](RValue<Int> i)
    203 		{
    204 			ASSERT(dynamic);
    205 
    206 			return Register(x[0][i], y[0][i], z[0][i], w[0][i]);
    207 		}
    208 
    209 	private:
    210 		const bool dynamic;
    211 		Array<Float4> *x;
    212 		Array<Float4> *y;
    213 		Array<Float4> *z;
    214 		Array<Float4> *w;
    215 	};
    216 
    217 	class ShaderCore
    218 	{
    219 		typedef Shader::Control Control;
    220 
    221 	public:
    222 		void mov(Vector4f &dst, const Vector4f &src, bool integerDestination = false);
    223 		void neg(Vector4f &dst, const Vector4f &src);
    224 		void ineg(Vector4f &dst, const Vector4f &src);
    225 		void f2b(Vector4f &dst, const Vector4f &src);
    226 		void b2f(Vector4f &dst, const Vector4f &src);
    227 		void f2i(Vector4f &dst, const Vector4f &src);
    228 		void i2f(Vector4f &dst, const Vector4f &src);
    229 		void f2u(Vector4f &dst, const Vector4f &src);
    230 		void u2f(Vector4f &dst, const Vector4f &src);
    231 		void i2b(Vector4f &dst, const Vector4f &src);
    232 		void b2i(Vector4f &dst, const Vector4f &src);
    233 		void add(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    234 		void iadd(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    235 		void sub(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    236 		void isub(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    237 		void mad(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    238 		void imad(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    239 		void mul(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    240 		void imul(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    241 		void rcpx(Vector4f &dst, const Vector4f &src, bool pp = false);
    242 		void div(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    243 		void idiv(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    244 		void udiv(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    245 		void mod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    246 		void imod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    247 		void umod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    248 		void shl(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    249 		void ishr(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    250 		void ushr(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    251 		void rsqx(Vector4f &dst, const Vector4f &src, bool pp = false);
    252 		void sqrt(Vector4f &dst, const Vector4f &src, bool pp = false);
    253 		void rsq(Vector4f &dst, const Vector4f &src, bool pp = false);
    254 		void len2(Float4 &dst, const Vector4f &src, bool pp = false);
    255 		void len3(Float4 &dst, const Vector4f &src, bool pp = false);
    256 		void len4(Float4 &dst, const Vector4f &src, bool pp = false);
    257 		void dist1(Float4 &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    258 		void dist2(Float4 &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    259 		void dist3(Float4 &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    260 		void dist4(Float4 &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    261 		void dp1(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    262 		void dp2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    263 		void dp2add(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    264 		void dp3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    265 		void dp4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    266 		void det2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    267 		void det3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    268 		void det4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2, const Vector4f &src3);
    269 		void min(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    270 		void imin(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    271 		void umin(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    272 		void max(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    273 		void imax(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    274 		void umax(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    275 		void slt(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    276 		void step(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    277 		void exp2x(Vector4f &dst, const Vector4f &src, bool pp = false);
    278 		void exp2(Vector4f &dst, const Vector4f &src, bool pp = false);
    279 		void exp(Vector4f &dst, const Vector4f &src, bool pp = false);
    280 		void log2x(Vector4f &dst, const Vector4f &src, bool pp = false);
    281 		void log2(Vector4f &dst, const Vector4f &src, bool pp = false);
    282 		void log(Vector4f &dst, const Vector4f &src, bool pp = false);
    283 		void lit(Vector4f &dst, const Vector4f &src);
    284 		void att(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    285 		void lrp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    286 		void isinf(Vector4f &dst, const Vector4f &src);
    287 		void isnan(Vector4f &dst, const Vector4f &src);
    288 		void smooth(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    289 		void packHalf2x16(Vector4f &dst, const Vector4f &src);
    290 		void unpackHalf2x16(Vector4f &dst, const Vector4f &src);
    291 		void packSnorm2x16(Vector4f &dst, const Vector4f &src);
    292 		void packUnorm2x16(Vector4f &dst, const Vector4f &src);
    293 		void unpackSnorm2x16(Vector4f &dst, const Vector4f &src);
    294 		void unpackUnorm2x16(Vector4f &dst, const Vector4f &src);
    295 		void frc(Vector4f &dst, const Vector4f &src);
    296 		void trunc(Vector4f &dst, const Vector4f &src);
    297 		void floor(Vector4f &dst, const Vector4f &src);
    298 		void round(Vector4f &dst, const Vector4f &src);
    299 		void roundEven(Vector4f &dst, const Vector4f &src);
    300 		void ceil(Vector4f &dst, const Vector4f &src);
    301 		void powx(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    302 		void pow(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    303 		void crs(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    304 		void forward1(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    305 		void forward2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    306 		void forward3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    307 		void forward4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    308 		void reflect1(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    309 		void reflect2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    310 		void reflect3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    311 		void reflect4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    312 		void refract1(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
    313 		void refract2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
    314 		void refract3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
    315 		void refract4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Float4 &src2);
    316 		void sgn(Vector4f &dst, const Vector4f &src);
    317 		void isgn(Vector4f &dst, const Vector4f &src);
    318 		void abs(Vector4f &dst, const Vector4f &src);
    319 		void iabs(Vector4f &dst, const Vector4f &src);
    320 		void nrm2(Vector4f &dst, const Vector4f &src, bool pp = false);
    321 		void nrm3(Vector4f &dst, const Vector4f &src, bool pp = false);
    322 		void nrm4(Vector4f &dst, const Vector4f &src, bool pp = false);
    323 		void sincos(Vector4f &dst, const Vector4f &src, bool pp = false);
    324 		void cos(Vector4f &dst, const Vector4f &src, bool pp = false);
    325 		void sin(Vector4f &dst, const Vector4f &src, bool pp = false);
    326 		void tan(Vector4f &dst, const Vector4f &src, bool pp = false);
    327 		void acos(Vector4f &dst, const Vector4f &src, bool pp = false);
    328 		void asin(Vector4f &dst, const Vector4f &src, bool pp = false);
    329 		void atan(Vector4f &dst, const Vector4f &src, bool pp = false);
    330 		void atan2(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, bool pp = false);
    331 		void cosh(Vector4f &dst, const Vector4f &src, bool pp = false);
    332 		void sinh(Vector4f &dst, const Vector4f &src, bool pp = false);
    333 		void tanh(Vector4f &dst, const Vector4f &src, bool pp = false);
    334 		void acosh(Vector4f &dst, const Vector4f &src, bool pp = false);
    335 		void asinh(Vector4f &dst, const Vector4f &src, bool pp = false);
    336 		void atanh(Vector4f &dst, const Vector4f &src, bool pp = false);
    337 		void expp(Vector4f &dst, const Vector4f &src, unsigned short shaderModel);
    338 		void logp(Vector4f &dst, const Vector4f &src, unsigned short shaderModel);
    339 		void cmp0(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    340 		void cmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
    341 		void icmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
    342 		void ucmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
    343 		void select(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
    344 		void extract(Float4 &dst, const Vector4f &src0, const Float4 &src1);
    345 		void insert(Vector4f &dst, const Vector4f &src, const Float4 &element, const Float4 &index);
    346 		void all(Float4 &dst, const Vector4f &src);
    347 		void any(Float4 &dst, const Vector4f &src);
    348 		void bitwise_not(Vector4f &dst, const Vector4f &src);
    349 		void bitwise_or(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    350 		void bitwise_xor(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    351 		void bitwise_and(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    352 		void equal(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    353 		void notEqual(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
    354 
    355 	private:
    356 		void sgn(Float4 &dst, const Float4 &src);
    357 		void isgn(Float4 &dst, const Float4 &src);
    358 		void cmp0(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
    359 		void cmp0i(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
    360 		void select(Float4 &dst, RValue<Int4> src0, const Float4 &src1, const Float4 &src2);
    361 		void floatToHalfBits(Float4& dst, const Float4& floatBits, bool storeInUpperBits);
    362 		void halfToFloatBits(Float4& dst, const Float4& halfBits);
    363 	};
    364 }
    365 
    366 #endif   // sw_ShaderCore_hpp
    367