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_TextureStage_hpp |
16 | #define sw_TextureStage_hpp |
17 | |
18 | #include "Common/Types.hpp" |
19 | #include "Common/Math.hpp" |
20 | #include "Renderer/Color.hpp" |
21 | |
22 | namespace sw |
23 | { |
24 | class Sampler; |
25 | class PixelRoutine; |
26 | class Context; |
27 | |
28 | class TextureStage |
29 | { |
30 | friend class Context; // FIXME |
31 | |
32 | public: |
33 | enum StageOperation |
34 | { |
35 | STAGE_DISABLE, |
36 | STAGE_SELECTARG1, |
37 | STAGE_SELECTARG2, |
38 | STAGE_SELECTARG3, |
39 | STAGE_MODULATE, |
40 | STAGE_MODULATE2X, |
41 | STAGE_MODULATE4X, |
42 | STAGE_ADD, |
43 | STAGE_ADDSIGNED, |
44 | STAGE_ADDSIGNED2X, |
45 | STAGE_SUBTRACT, |
46 | STAGE_ADDSMOOTH, |
47 | STAGE_MULTIPLYADD, |
48 | STAGE_LERP, |
49 | STAGE_DOT3, |
50 | STAGE_BLENDCURRENTALPHA, |
51 | STAGE_BLENDDIFFUSEALPHA, |
52 | STAGE_BLENDFACTORALPHA, |
53 | STAGE_BLENDTEXTUREALPHA, |
54 | STAGE_BLENDTEXTUREALPHAPM, |
55 | STAGE_PREMODULATE, |
56 | STAGE_MODULATEALPHA_ADDCOLOR, |
57 | STAGE_MODULATECOLOR_ADDALPHA, |
58 | STAGE_MODULATEINVALPHA_ADDCOLOR, |
59 | STAGE_MODULATEINVCOLOR_ADDALPHA, |
60 | STAGE_BUMPENVMAP, |
61 | STAGE_BUMPENVMAPLUMINANCE, |
62 | |
63 | STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE |
64 | }; |
65 | |
66 | enum SourceArgument |
67 | { |
68 | SOURCE_TEXTURE, |
69 | SOURCE_CONSTANT, |
70 | SOURCE_CURRENT, |
71 | SOURCE_DIFFUSE, |
72 | SOURCE_SPECULAR, |
73 | SOURCE_TEMP, |
74 | SOURCE_TFACTOR, |
75 | |
76 | SOURCE_LAST = SOURCE_TFACTOR |
77 | }; |
78 | |
79 | enum DestinationArgument |
80 | { |
81 | DESTINATION_CURRENT, |
82 | DESTINATION_TEMP, |
83 | |
84 | DESTINATION_LAST = DESTINATION_TEMP |
85 | }; |
86 | |
87 | enum ArgumentModifier |
88 | { |
89 | MODIFIER_COLOR, |
90 | MODIFIER_INVCOLOR, |
91 | MODIFIER_ALPHA, |
92 | MODIFIER_INVALPHA, |
93 | |
94 | MODIFIER_LAST = MODIFIER_INVALPHA |
95 | }; |
96 | |
97 | struct State |
98 | { |
99 | State(); |
100 | |
101 | unsigned int stageOperation : BITS(STAGE_LAST); |
102 | unsigned int firstArgument : BITS(SOURCE_LAST); |
103 | unsigned int secondArgument : BITS(SOURCE_LAST); |
104 | unsigned int thirdArgument : BITS(SOURCE_LAST); |
105 | unsigned int stageOperationAlpha : BITS(STAGE_LAST); |
106 | unsigned int firstArgumentAlpha : BITS(SOURCE_LAST); |
107 | unsigned int secondArgumentAlpha : BITS(SOURCE_LAST); |
108 | unsigned int thirdArgumentAlpha : BITS(SOURCE_LAST); |
109 | unsigned int firstModifier : BITS(MODIFIER_LAST); |
110 | unsigned int secondModifier : BITS(MODIFIER_LAST); |
111 | unsigned int thirdModifier : BITS(MODIFIER_LAST); |
112 | unsigned int firstModifierAlpha : BITS(MODIFIER_LAST); |
113 | unsigned int secondModifierAlpha : BITS(MODIFIER_LAST); |
114 | unsigned int thirdModifierAlpha : BITS(MODIFIER_LAST); |
115 | unsigned int destinationArgument : BITS(DESTINATION_LAST); |
116 | unsigned int texCoordIndex : BITS(7); |
117 | |
118 | unsigned int cantUnderflow : 1; |
119 | unsigned int usesTexture : 1; |
120 | }; |
121 | |
122 | struct Uniforms |
123 | { |
124 | word4 constantColor4[4]; |
125 | float4 bumpmapMatrix4F[2][2]; |
126 | word4 bumpmapMatrix4W[2][2]; |
127 | word4 luminanceScale4; |
128 | word4 luminanceOffset4; |
129 | }; |
130 | |
131 | TextureStage(); |
132 | |
133 | ~TextureStage(); |
134 | |
135 | void init(int stage, const Sampler *sampler, const TextureStage *previousStage); |
136 | |
137 | State textureStageState() const; |
138 | |
139 | void setConstantColor(const Color<float> &constantColor); |
140 | void setBumpmapMatrix(int element, float value); |
141 | void setLuminanceScale(float value); |
142 | void setLuminanceOffset(float value); |
143 | |
144 | void setTexCoordIndex(unsigned int texCoordIndex); |
145 | void setStageOperation(StageOperation stageOperation); |
146 | void setFirstArgument(SourceArgument firstArgument); |
147 | void setSecondArgument(SourceArgument secondArgument); |
148 | void setThirdArgument(SourceArgument thirdArgument); |
149 | void setStageOperationAlpha(StageOperation stageOperationAlpha); |
150 | void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha); |
151 | void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha); |
152 | void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha); |
153 | void setFirstModifier(ArgumentModifier firstModifier); |
154 | void setSecondModifier(ArgumentModifier secondModifier); |
155 | void setThirdModifier(ArgumentModifier thirdModifier); |
156 | void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha); |
157 | void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha); |
158 | void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha); |
159 | void setDestinationArgument(DestinationArgument destinationArgument); |
160 | |
161 | Uniforms uniforms; // FIXME: Private |
162 | |
163 | private: |
164 | bool usesColor(SourceArgument source) const; |
165 | bool usesAlpha(SourceArgument source) const; |
166 | bool uses(SourceArgument source) const; |
167 | bool usesCurrent() const; |
168 | bool usesDiffuse() const; |
169 | bool usesSpecular() const; |
170 | bool usesTexture() const; |
171 | bool isStageDisabled() const; |
172 | bool writesCurrent() const; |
173 | |
174 | int stage; |
175 | |
176 | StageOperation stageOperation; |
177 | SourceArgument firstArgument; |
178 | SourceArgument secondArgument; |
179 | SourceArgument thirdArgument; |
180 | StageOperation stageOperationAlpha; |
181 | SourceArgument firstArgumentAlpha; |
182 | SourceArgument secondArgumentAlpha; |
183 | SourceArgument thirdArgumentAlpha; |
184 | ArgumentModifier firstModifier; |
185 | ArgumentModifier secondModifier; |
186 | ArgumentModifier thirdModifier; |
187 | ArgumentModifier firstModifierAlpha; |
188 | ArgumentModifier secondModifierAlpha; |
189 | ArgumentModifier thirdModifierAlpha; |
190 | DestinationArgument destinationArgument; |
191 | |
192 | int texCoordIndex; |
193 | const Sampler *sampler; |
194 | const TextureStage *previousStage; |
195 | }; |
196 | } |
197 | |
198 | #endif // sw_TextureStage_hpp |
199 | |