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
20namespace 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