|  | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //    http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef Vertex_hpp | 
|  | #define Vertex_hpp | 
|  |  | 
|  | #include "Color.hpp" | 
|  | #include "Common/Types.hpp" | 
|  | #include "Main/Config.hpp" | 
|  |  | 
|  | namespace sw | 
|  | { | 
|  | enum Out | 
|  | { | 
|  | // Default vertex output semantics | 
|  | Pos = 0, | 
|  | C0 = 1,   // Diffuse | 
|  | C1 = 2,   // Specular | 
|  | T0 = 3, | 
|  | T1 = 4, | 
|  | T2 = 5, | 
|  | T3 = 6, | 
|  | T4 = 7, | 
|  | T5 = 8, | 
|  | T6 = 9, | 
|  | T7 = 10, | 
|  | Fog = 11,    // x component | 
|  | Pts = Fog,   // y component | 
|  |  | 
|  | // Variable semantics | 
|  | V0 = 0, | 
|  | Vn_1 = MAX_VERTEX_OUTPUTS - 1, | 
|  |  | 
|  | Unused, | 
|  | VERTEX_OUTPUT_LAST = Unused, | 
|  | }; | 
|  |  | 
|  | struct UVWQ | 
|  | { | 
|  | float u; | 
|  | float v; | 
|  | float w; | 
|  | float q; | 
|  |  | 
|  | float &operator[](int i) | 
|  | { | 
|  | return (&u)[i]; | 
|  | } | 
|  | }; | 
|  |  | 
|  | ALIGN(16, struct Vertex | 
|  | { | 
|  | union | 
|  | { | 
|  | struct   // Fixed semantics | 
|  | { | 
|  | // Position | 
|  | float x; | 
|  | float y; | 
|  | float z; | 
|  | float w; | 
|  |  | 
|  | float4 C[2];   // Diffuse and specular color | 
|  |  | 
|  | UVWQ T[8];           // Texture coordinates | 
|  |  | 
|  | float f;             // Fog | 
|  | float pSize;         // Point size | 
|  | }; | 
|  |  | 
|  | float4 v[MAX_VERTEX_OUTPUTS];   // Generic components using semantic declaration | 
|  | }; | 
|  |  | 
|  | // Projected coordinates | 
|  | int X; | 
|  | int Y; | 
|  | float Z; | 
|  | float W; | 
|  |  | 
|  | int clipFlags; | 
|  | int padding[3]; | 
|  | }); | 
|  |  | 
|  | static_assert((sizeof(Vertex) & 0x0000000F) == 0, "Vertex size not a multiple of 16 bytes (alignment requirement)"); | 
|  | } | 
|  |  | 
|  | #endif   // Vertex_hpp |