1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 #ifndef sw_VertexProcessor_hpp
16 #define sw_VertexProcessor_hpp
19 #include "Context.hpp"
20 #include "RoutineCache.hpp"
26 struct VertexCache // FIXME: Variable size
38 unsigned int vertexStart;
39 unsigned int vertexCount;
40 unsigned int verticesPerPrimitive;
41 VertexCache vertexCache;
49 unsigned int computeHash();
53 bool fixedFunction : 1;
54 bool textureSampling : 1;
55 unsigned int positionRegister : BITS(MAX_VERTEX_OUTPUTS);
56 unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS);
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);
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;
80 bool preTransformed : 1;
81 bool superSampling : 1;
82 bool multiSampling : 1;
86 TexGen texGenActive : BITS(TEXGEN_LAST);
87 unsigned char textureTransformCountActive : 3;
88 unsigned char texCoordIndexActive : 3;
91 TextureState textureState[8];
93 Sampler::State samplerState[VERTEX_TEXTURE_IMAGE_UNITS];
97 operator bool() const // Returns true if stream contains data
102 StreamType type : BITS(STREAMTYPE_LAST);
103 unsigned int count : 3;
111 unsigned char write : 4;
115 unsigned char xWrite : 1;
116 unsigned char yWrite : 1;
117 unsigned char zWrite : 1;
118 unsigned char wWrite : 1;
124 unsigned char clamp : 4;
128 unsigned char xClamp : 1;
129 unsigned char yClamp : 1;
130 unsigned char zClamp : 1;
131 unsigned char wClamp : 1;
136 Input input[VERTEX_ATTRIBUTES];
137 Output output[MAX_VERTEX_OUTPUTS];
140 struct State : States
144 bool operator==(const State &state) const;
151 float4 transformT[12][4];
152 float4 cameraTransformT[12][4];
153 float4 normalTransformT[12][4];
154 float4 textureTransform[8][4];
156 float4 lightPosition[8];
157 float4 lightAmbient[8];
158 float4 lightSpecular[8];
159 float4 lightDiffuse[8];
160 float4 attenuationConstant[8];
161 float4 attenuationLinear[8];
162 float4 attenuationQuadratic[8];
164 float4 materialDiffuse;
165 float4 materialSpecular;
166 float materialShininess;
167 float4 globalAmbient;
168 float4 materialEmission;
169 float4 materialAmbient;
182 typedef void (*RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw);
184 VertexProcessor(Context *context);
186 virtual ~VertexProcessor();
188 virtual void setInputStream(int index, const Stream &stream);
189 virtual void resetInputStreams(bool preTransformed);
191 virtual void setFloatConstant(unsigned int index, const float value[4]);
192 virtual void setIntegerConstant(unsigned int index, const int integer[4]);
193 virtual void setBooleanConstant(unsigned int index, int boolean);
195 virtual void setUniformBuffer(int index, sw::Resource* uniformBuffer, int offset);
196 virtual void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
198 virtual void setTransformFeedbackBuffer(int index, sw::Resource* transformFeedbackBuffer, int offset, unsigned int reg, unsigned int row, unsigned int col, size_t stride);
199 virtual void lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s, sw::Resource* transformFeedbackBuffers[]);
202 virtual void setModelMatrix(const Matrix &M, int i = 0);
203 virtual void setViewMatrix(const Matrix &V);
204 virtual void setBaseMatrix(const Matrix &B);
205 virtual void setProjectionMatrix(const Matrix &P);
208 virtual void setLightingEnable(bool lightingEnable);
209 virtual void setLightEnable(unsigned int light, bool lightEnable);
210 virtual void setSpecularEnable(bool specularEnable);
212 virtual void setGlobalAmbient(const Color<float> &globalAmbient);
213 virtual void setLightPosition(unsigned int light, const Point &lightPosition);
214 virtual void setLightViewPosition(unsigned int light, const Point &lightPosition);
215 virtual void setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse);
216 virtual void setLightSpecular(unsigned int light, const Color<float> &lightSpecular);
217 virtual void setLightAmbient(unsigned int light, const Color<float> &lightAmbient);
218 virtual void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic);
219 virtual void setLightRange(unsigned int light, float lightRange);
221 virtual void setInstanceID(int instanceID);
223 virtual void setFogEnable(bool fogEnable);
224 virtual void setVertexFogMode(FogMode fogMode);
225 virtual void setRangeFogEnable(bool enable);
227 virtual void setColorVertexEnable(bool colorVertexEnable);
228 virtual void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
229 virtual void setSpecularMaterialSource(MaterialSource specularMaterialSource);
230 virtual void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
231 virtual void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
233 virtual void setMaterialEmission(const Color<float> &emission);
234 virtual void setMaterialAmbient(const Color<float> &materialAmbient);
235 virtual void setMaterialDiffuse(const Color<float> &diffuseColor);
236 virtual void setMaterialSpecular(const Color<float> &specularColor);
237 virtual void setMaterialShininess(float specularPower);
239 virtual void setIndexedVertexBlendEnable(bool indexedVertexBlendEnable);
240 virtual void setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount);
242 virtual void setTextureWrap(unsigned int stage, int mask);
243 virtual void setTexGen(unsigned int stage, TexGen texGen);
244 virtual void setLocalViewer(bool localViewer);
245 virtual void setNormalizeNormals(bool normalizeNormals);
246 virtual void setTextureMatrix(int stage, const Matrix &T);
247 virtual void setTextureTransform(int stage, int count, bool project);
249 virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter);
250 virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
251 virtual void setGatherEnable(unsigned int sampler, bool enable);
252 virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);
253 virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);
254 virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);
255 virtual void setReadSRGB(unsigned int sampler, bool sRGB);
256 virtual void setMipmapLOD(unsigned int sampler, float bias);
257 virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor);
258 virtual void setMaxAnisotropy(unsigned int stage, float maxAnisotropy);
259 virtual void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);
260 virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
261 virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
262 virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
264 virtual void setPointSize(float pointSize);
265 virtual void setPointSizeMin(float pointSizeMin);
266 virtual void setPointSizeMax(float pointSizeMax);
267 virtual void setPointScaleA(float pointScaleA);
268 virtual void setPointScaleB(float pointScaleB);
269 virtual void setPointScaleC(float pointScaleC);
271 virtual void setTransformFeedbackQueryEnabled(bool enable);
272 virtual void enableTransformFeedback(uint64_t enable);
275 const Matrix &getModelTransform(int i);
276 const Matrix &getViewTransform();
278 const State update();
279 Routine *routine(const State &state);
281 bool isFixedFunction();
282 void setRoutineCacheSize(int cacheSize);
285 float4 c[VERTEX_UNIFORM_VECTORS + 1]; // One extra for indices out of range, c[VERTEX_UNIFORM_VECTORS] = {0, 0, 0, 0}
293 struct UniformBufferInfo
300 UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];
302 struct TransformFeedbackInfo
304 TransformFeedbackInfo();
313 TransformFeedbackInfo transformFeedbackInfo[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS];
315 void updateTransform();
316 void setTransform(const Matrix &M, int i);
317 void setCameraTransform(const Matrix &M, int i);
318 void setNormalTransform(const Matrix &M, int i);
320 Context *const context;
322 RoutineCache<State> *routineCache;
325 Matrix M[12]; // Model/Geometry/World matrix
326 Matrix V; // View/Camera/Eye matrix
327 Matrix B; // Base matrix
328 Matrix P; // Projection matrix
330 Matrix PBV; // P * B * V
331 Matrix PBVM[12]; // P * B * V * M
335 bool updateModelMatrix[12];
336 bool updateViewMatrix;
337 bool updateBaseMatrix;
338 bool updateProjectionMatrix;
343 #endif // sw_VertexProcessor_hpp