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_PixelPipeline_hpp
     16 #define sw_PixelPipeline_hpp
     17 
     18 #include "PixelRoutine.hpp"
     19 
     20 namespace sw
     21 {
     22 	class PixelPipeline : public PixelRoutine
     23 	{
     24 	public:
     25 		PixelPipeline(const PixelProcessor::State &state, const PixelShader *shader) :
     26 			PixelRoutine(state, shader), current(rs[0]), diffuse(vs[0]), specular(vs[1]), perturbate(false), luminance(false), previousScaling(false) {}
     27 		virtual ~PixelPipeline() {}
     28 
     29 	protected:
     30 		virtual void setBuiltins(Int &x, Int &y, Float4(&z)[4], Float4 &w);
     31 		virtual void applyShader(Int cMask[4]);
     32 		virtual Bool alphaTest(Int cMask[4]);
     33 		virtual void rasterOperation(Float4 &fog, Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4]);
     34 
     35 	private:
     36 		Vector4s &current;
     37 		Vector4s &diffuse;
     38 		Vector4s &specular;
     39 
     40 		Vector4s rs[6];
     41 		Vector4s vs[2];
     42 		Vector4s ts[6];
     43 
     44 		// bem(l) offsets and luminance
     45 		Float4 du;
     46 		Float4 dv;
     47 		Short4 L;
     48 
     49 		// texm3x3 temporaries
     50 		Float4 u_; // FIXME
     51 		Float4 v_; // FIXME
     52 		Float4 w_; // FIXME
     53 		Float4 U;  // FIXME
     54 		Float4 V;  // FIXME
     55 		Float4 W;  // FIXME
     56 
     57 		void fixedFunction();
     58 		void blendTexture(Vector4s &temp, Vector4s &texture, int stage);
     59 		void fogBlend(Vector4s &current, Float4 &fog);
     60 		void specularPixel(Vector4s &current, Vector4s &specular);
     61 
     62 		Vector4s sampleTexture(int coordinates, int sampler, bool project = false);
     63 		Vector4s sampleTexture(int sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, bool project = false);
     64 
     65 		Short4 convertFixed12(RValue<Float4> cf);
     66 		void convertFixed12(Vector4s &cs, Vector4f &cf);
     67 		Float4 convertSigned12(Short4 &cs);
     68 		void convertSigned12(Vector4f &cf, Vector4s &cs);
     69 
     70 		void writeDestination(Vector4s &d, const Dst &dst);
     71 		Vector4s fetchRegister(const Src &src);
     72 
     73 		// Instructions
     74 		void MOV(Vector4s &dst, Vector4s &src0);
     75 		void ADD(Vector4s &dst, Vector4s &src0, Vector4s &src1);
     76 		void SUB(Vector4s &dst, Vector4s &src0, Vector4s &src1);
     77 		void MAD(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
     78 		void MUL(Vector4s &dst, Vector4s &src0, Vector4s &src1);
     79 		void DP3(Vector4s &dst, Vector4s &src0, Vector4s &src1);
     80 		void DP4(Vector4s &dst, Vector4s &src0, Vector4s &src1);
     81 		void LRP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
     82 		void TEXCOORD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate);
     83 		void TEXCRD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate, bool project);
     84 		void TEXDP3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src);
     85 		void TEXDP3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0);
     86 		void TEXKILL(Int cMask[4], Float4 &u, Float4 &v, Float4 &s);
     87 		void TEXKILL(Int cMask[4], Vector4s &dst);
     88 		void TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, bool project);
     89 		void TEXLD(Vector4s &dst, Vector4s &src, int stage, bool project);
     90 		void TEXBEM(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage);
     91 		void TEXBEML(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage);
     92 		void TEXREG2AR(Vector4s &dst, Vector4s &src0, int stage);
     93 		void TEXREG2GB(Vector4s &dst, Vector4s &src0, int stage);
     94 		void TEXREG2RGB(Vector4s &dst, Vector4s &src0, int stage);
     95 		void TEXM3X2DEPTH(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src, bool signedScaling);
     96 		void TEXM3X2PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling);
     97 		void TEXM3X2TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool signedScaling);
     98 		void TEXM3X3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, bool signedScaling);
     99 		void TEXM3X3PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling);
    100 		void TEXM3X3SPEC(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, Vector4s &src1);
    101 		void TEXM3X3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool singedScaling);
    102 		void TEXM3X3VSPEC(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0);
    103 		void TEXDEPTH();
    104 		void CND(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
    105 		void CMP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
    106 		void BEM(Vector4s &dst, Vector4s &src0, Vector4s &src1, int stage);
    107 
    108 		bool perturbate;
    109 		bool luminance;
    110 		bool previousScaling;
    111 	};
    112 }
    113 
    114 #endif
    115