blob: 2c9ecbdea23cba9570f41e20dc61dcee6912588f [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// 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
22namespace 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