blob: deac83dc35a25f953d7d0379b52fd4c200357bda [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_VertexProcessor_hpp
16#define sw_VertexProcessor_hpp
17
18#include "Matrix.hpp"
19#include "Context.hpp"
20#include "RoutineCache.hpp"
Alexis Hetub7508b82016-09-22 15:36:45 -040021#include "Shader/VertexShader.hpp"
Nicolas Capens0bac2852016-05-07 06:09:58 -040022
23namespace sw
24{
25 struct DrawData;
26
27 struct VertexCache // FIXME: Variable size
28 {
29 void clear();
30
31 Vertex vertex[16][4];
32 unsigned int tag[16];
33
34 int drawCall;
35 };
36
37 struct VertexTask
38 {
Nicolas Capens0bac2852016-05-07 06:09:58 -040039 unsigned int vertexCount;
Alexis Hetua62a0ca2016-04-20 15:29:51 -040040 unsigned int primitiveStart;
Nicolas Capens0bac2852016-05-07 06:09:58 -040041 VertexCache vertexCache;
42 };
43
44 class VertexProcessor
45 {
46 public:
47 struct States
48 {
49 unsigned int computeHash();
50
51 uint64_t shaderID;
52
53 bool fixedFunction : 1;
54 bool textureSampling : 1;
Nicolas Capensec0936c2016-05-18 12:32:02 -040055 unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS);
56 unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS);
Nicolas Capens0bac2852016-05-07 06:09:58 -040057
58 unsigned int vertexBlendMatrixCount : 3;
59 bool indexedVertexBlendEnable : 1;
60 bool vertexNormalActive : 1;
61 bool normalizeNormals : 1;
62 bool vertexLightingActive : 1;
63 bool diffuseActive : 1;
64 bool specularActive : 1;
65 bool vertexSpecularActive : 1;
66 unsigned int vertexLightActive : 8;
67 MaterialSource vertexDiffuseMaterialSourceActive : BITS(MATERIAL_LAST);
68 MaterialSource vertexSpecularMaterialSourceActive : BITS(MATERIAL_LAST);
69 MaterialSource vertexAmbientMaterialSourceActive : BITS(MATERIAL_LAST);
70 MaterialSource vertexEmissiveMaterialSourceActive : BITS(MATERIAL_LAST);
71 bool fogActive : 1;
72 FogMode vertexFogMode : BITS(FOG_LAST);
73 bool rangeFogActive : 1;
74 bool localViewerActive : 1;
75 bool pointSizeActive : 1;
76 bool pointScaleActive : 1;
77 bool transformFeedbackQueryEnabled : 1;
78 uint64_t transformFeedbackEnabled : 64;
Alexis Hetua62a0ca2016-04-20 15:29:51 -040079 unsigned char verticesPerPrimitive : 2; // 1 (points), 2 (lines) or 3 (triangles)
Nicolas Capens0bac2852016-05-07 06:09:58 -040080
81 bool preTransformed : 1;
82 bool superSampling : 1;
83 bool multiSampling : 1;
84
85 struct TextureState
86 {
87 TexGen texGenActive : BITS(TEXGEN_LAST);
88 unsigned char textureTransformCountActive : 3;
89 unsigned char texCoordIndexActive : 3;
90 };
91
92 TextureState textureState[8];
93
Nicolas Capensf878d502017-11-06 15:29:46 -050094 Sampler::State sampler[VERTEX_TEXTURE_IMAGE_UNITS];
Nicolas Capens0bac2852016-05-07 06:09:58 -040095
96 struct Input
97 {
98 operator bool() const // Returns true if stream contains data
99 {
100 return count != 0;
101 }
102
103 StreamType type : BITS(STREAMTYPE_LAST);
104 unsigned int count : 3;
105 bool normalized : 1;
Alexis Hetub7508b82016-09-22 15:36:45 -0400106 unsigned int attribType : BITS(VertexShader::ATTRIBTYPE_LAST);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400107 };
108
109 struct Output
110 {
111 union
112 {
113 unsigned char write : 4;
114
115 struct
116 {
117 unsigned char xWrite : 1;
118 unsigned char yWrite : 1;
119 unsigned char zWrite : 1;
120 unsigned char wWrite : 1;
121 };
122 };
123
124 union
125 {
126 unsigned char clamp : 4;
127
128 struct
129 {
130 unsigned char xClamp : 1;
131 unsigned char yClamp : 1;
132 unsigned char zClamp : 1;
133 unsigned char wClamp : 1;
134 };
135 };
136 };
137
Nicolas Capensf0aef1a2016-05-18 14:44:21 -0400138 Input input[MAX_VERTEX_INPUTS];
Nicolas Capensec0936c2016-05-18 12:32:02 -0400139 Output output[MAX_VERTEX_OUTPUTS];
Nicolas Capens0bac2852016-05-07 06:09:58 -0400140 };
141
142 struct State : States
143 {
144 State();
145
146 bool operator==(const State &state) const;
147
148 unsigned int hash;
149 };
150
151 struct FixedFunction
152 {
153 float4 transformT[12][4];
154 float4 cameraTransformT[12][4];
155 float4 normalTransformT[12][4];
156 float4 textureTransform[8][4];
157
158 float4 lightPosition[8];
159 float4 lightAmbient[8];
160 float4 lightSpecular[8];
161 float4 lightDiffuse[8];
162 float4 attenuationConstant[8];
163 float4 attenuationLinear[8];
164 float4 attenuationQuadratic[8];
165 float lightRange[8];
166 float4 materialDiffuse;
167 float4 materialSpecular;
168 float materialShininess;
169 float4 globalAmbient;
170 float4 materialEmission;
171 float4 materialAmbient;
172 };
173
174 struct PointSprite
175 {
176 float4 pointSize;
177 float pointSizeMin;
178 float pointSizeMax;
179 float pointScaleA;
180 float pointScaleB;
181 float pointScaleC;
182 };
183
184 typedef void (*RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw);
185
186 VertexProcessor(Context *context);
187
188 virtual ~VertexProcessor();
189
Alexis Hetuc634fb62016-06-02 10:53:13 -0400190 void setInputStream(int index, const Stream &stream);
191 void resetInputStreams(bool preTransformed);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400192
Alexis Hetuc634fb62016-06-02 10:53:13 -0400193 void setFloatConstant(unsigned int index, const float value[4]);
194 void setIntegerConstant(unsigned int index, const int integer[4]);
195 void setBooleanConstant(unsigned int index, int boolean);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400196
Alexis Hetuc634fb62016-06-02 10:53:13 -0400197 void setUniformBuffer(int index, sw::Resource* uniformBuffer, int offset);
198 void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400199
Alexis Hetu1d672442016-06-23 11:24:00 -0400200 void setTransformFeedbackBuffer(int index, sw::Resource* transformFeedbackBuffer, int offset, unsigned int reg, unsigned int row, unsigned int col, unsigned int stride);
Alexis Hetuc634fb62016-06-02 10:53:13 -0400201 void lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s, sw::Resource* transformFeedbackBuffers[]);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400202
203 // Transformations
Alexis Hetuc634fb62016-06-02 10:53:13 -0400204 void setModelMatrix(const Matrix &M, int i = 0);
205 void setViewMatrix(const Matrix &V);
206 void setBaseMatrix(const Matrix &B);
207 void setProjectionMatrix(const Matrix &P);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400208
209 // Lighting
Alexis Hetuc634fb62016-06-02 10:53:13 -0400210 void setLightingEnable(bool lightingEnable);
211 void setLightEnable(unsigned int light, bool lightEnable);
212 void setSpecularEnable(bool specularEnable);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400213
Alexis Hetuc634fb62016-06-02 10:53:13 -0400214 void setGlobalAmbient(const Color<float> &globalAmbient);
215 void setLightPosition(unsigned int light, const Point &lightPosition);
216 void setLightViewPosition(unsigned int light, const Point &lightPosition);
217 void setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse);
218 void setLightSpecular(unsigned int light, const Color<float> &lightSpecular);
219 void setLightAmbient(unsigned int light, const Color<float> &lightAmbient);
220 void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic);
221 void setLightRange(unsigned int light, float lightRange);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400222
Alexis Hetuc634fb62016-06-02 10:53:13 -0400223 void setInstanceID(int instanceID);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400224
Alexis Hetuc634fb62016-06-02 10:53:13 -0400225 void setFogEnable(bool fogEnable);
226 void setVertexFogMode(FogMode fogMode);
227 void setRangeFogEnable(bool enable);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400228
Alexis Hetuc634fb62016-06-02 10:53:13 -0400229 void setColorVertexEnable(bool colorVertexEnable);
230 void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
231 void setSpecularMaterialSource(MaterialSource specularMaterialSource);
232 void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
233 void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400234
Alexis Hetuc634fb62016-06-02 10:53:13 -0400235 void setMaterialEmission(const Color<float> &emission);
236 void setMaterialAmbient(const Color<float> &materialAmbient);
237 void setMaterialDiffuse(const Color<float> &diffuseColor);
238 void setMaterialSpecular(const Color<float> &specularColor);
239 void setMaterialShininess(float specularPower);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400240
Alexis Hetuc634fb62016-06-02 10:53:13 -0400241 void setIndexedVertexBlendEnable(bool indexedVertexBlendEnable);
242 void setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400243
Alexis Hetuc634fb62016-06-02 10:53:13 -0400244 void setTextureWrap(unsigned int stage, int mask);
245 void setTexGen(unsigned int stage, TexGen texGen);
246 void setLocalViewer(bool localViewer);
247 void setNormalizeNormals(bool normalizeNormals);
248 void setTextureMatrix(int stage, const Matrix &T);
249 void setTextureTransform(int stage, int count, bool project);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400250
Alexis Hetuc634fb62016-06-02 10:53:13 -0400251 void setTextureFilter(unsigned int sampler, FilterType textureFilter);
252 void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
253 void setGatherEnable(unsigned int sampler, bool enable);
254 void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);
255 void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);
256 void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);
257 void setReadSRGB(unsigned int sampler, bool sRGB);
258 void setMipmapLOD(unsigned int sampler, float bias);
259 void setBorderColor(unsigned int sampler, const Color<float> &borderColor);
260 void setMaxAnisotropy(unsigned int stage, float maxAnisotropy);
Alexis Hetu010a4642017-07-18 14:33:04 -0400261 void setHighPrecisionFiltering(unsigned int sampler, bool highPrecisionFiltering);
Alexis Hetuc634fb62016-06-02 10:53:13 -0400262 void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);
263 void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
264 void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
265 void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
Nicolas Capensf878d502017-11-06 15:29:46 -0500266 void setCompareFunc(unsigned int sampler, CompareFunc compare);
Alexis Hetuc634fb62016-06-02 10:53:13 -0400267 void setBaseLevel(unsigned int sampler, int baseLevel);
268 void setMaxLevel(unsigned int sampler, int maxLevel);
269 void setMinLod(unsigned int sampler, float minLod);
270 void setMaxLod(unsigned int sampler, float maxLod);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400271
Alexis Hetuc634fb62016-06-02 10:53:13 -0400272 void setPointSize(float pointSize);
273 void setPointSizeMin(float pointSizeMin);
274 void setPointSizeMax(float pointSizeMax);
275 void setPointScaleA(float pointScaleA);
276 void setPointScaleB(float pointScaleB);
277 void setPointScaleC(float pointScaleC);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400278
Alexis Hetuc634fb62016-06-02 10:53:13 -0400279 void setTransformFeedbackQueryEnabled(bool enable);
280 void enableTransformFeedback(uint64_t enable);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400281
282 protected:
283 const Matrix &getModelTransform(int i);
284 const Matrix &getViewTransform();
285
Alexis Hetua62a0ca2016-04-20 15:29:51 -0400286 const State update(DrawType drawType);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400287 Routine *routine(const State &state);
288
289 bool isFixedFunction();
290 void setRoutineCacheSize(int cacheSize);
291
292 // Shader constants
293 float4 c[VERTEX_UNIFORM_VECTORS + 1]; // One extra for indices out of range, c[VERTEX_UNIFORM_VECTORS] = {0, 0, 0, 0}
294 int4 i[16];
295 bool b[16];
296
297 PointSprite point;
298 FixedFunction ff;
299
300 private:
301 struct UniformBufferInfo
302 {
303 UniformBufferInfo();
304
305 Resource* buffer;
306 int offset;
307 };
308 UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];
309
310 struct TransformFeedbackInfo
311 {
312 TransformFeedbackInfo();
313
314 Resource* buffer;
Alexis Hetu1d672442016-06-23 11:24:00 -0400315 unsigned int offset;
316 unsigned int reg;
317 unsigned int row;
318 unsigned int col;
319 unsigned int stride;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400320 };
321 TransformFeedbackInfo transformFeedbackInfo[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS];
322
323 void updateTransform();
324 void setTransform(const Matrix &M, int i);
325 void setCameraTransform(const Matrix &M, int i);
326 void setNormalTransform(const Matrix &M, int i);
327
328 Context *const context;
329
330 RoutineCache<State> *routineCache;
331
332 protected:
333 Matrix M[12]; // Model/Geometry/World matrix
334 Matrix V; // View/Camera/Eye matrix
335 Matrix B; // Base matrix
336 Matrix P; // Projection matrix
337 Matrix PB; // P * B
338 Matrix PBV; // P * B * V
339 Matrix PBVM[12]; // P * B * V * M
340
341 // Update hierarchy
342 bool updateMatrix;
343 bool updateModelMatrix[12];
344 bool updateViewMatrix;
345 bool updateBaseMatrix;
346 bool updateProjectionMatrix;
347 bool updateLighting;
348 };
349}
350
351#endif // sw_VertexProcessor_hpp