Home | History | Annotate | Download | only in Renderer
      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 Vertex_hpp
     16 #define Vertex_hpp
     17 
     18 #include "Color.hpp"
     19 #include "Common/Types.hpp"
     20 #include "Main/Config.hpp"
     21 
     22 namespace sw
     23 {
     24 	enum Out
     25 	{
     26 		// Default vertex output semantics
     27 		Pos = 0,
     28 		C0 = 1,   // Diffuse
     29 		C1 = 2,   // Specular
     30 		T0 = 3,
     31 		T1 = 4,
     32 		T2 = 5,
     33 		T3 = 6,
     34 		T4 = 7,
     35 		T5 = 8,
     36 		T6 = 9,
     37 		T7 = 10,
     38 		Fog = 11,    // x component
     39 		Pts = Fog,   // y component
     40 
     41 		// Variable semantics
     42 		V0 = 0,
     43 		Vn_1 = MAX_VERTEX_OUTPUTS - 1,
     44 
     45 		Unused,
     46 		VERTEX_OUTPUT_LAST = Unused,
     47 	};
     48 
     49 	struct UVWQ
     50 	{
     51 		float u;
     52 		float v;
     53 		float w;
     54 		float q;
     55 
     56 		float &operator[](int i)
     57 		{
     58 			return (&u)[i];
     59 		}
     60 	};
     61 
     62 	ALIGN(16, struct Vertex
     63 	{
     64 		union
     65 		{
     66 			struct   // Fixed semantics
     67 			{
     68 				// Position
     69 				float x;
     70 				float y;
     71 				float z;
     72 				float w;
     73 
     74 				float4 C[2];   // Diffuse and specular color
     75 
     76 				UVWQ T[8];           // Texture coordinates
     77 
     78 				float f;             // Fog
     79 				float pSize;         // Point size
     80 			};
     81 
     82 			float4 v[MAX_VERTEX_OUTPUTS];   // Generic components using semantic declaration
     83 		};
     84 
     85 		// Projected coordinates
     86 		int X;
     87 		int Y;
     88 		float Z;
     89 		float W;
     90 
     91 		int clipFlags;
     92 		int padding[3];
     93 	});
     94 
     95 	static_assert((sizeof(Vertex) & 0x0000000F) == 0, "Vertex size not a multiple of 16 bytes (alignment requirement)");
     96 }
     97 
     98 #endif   // Vertex_hpp
     99