1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef Vertex_hpp 16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define Vertex_hpp 17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Color.hpp" 19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Common/Types.hpp" 20579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens#include "Main/Config.hpp" 21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace sw 23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 24579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens enum Out 25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 26579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens // Default vertex output semantics 27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Pos = 0, 28bcd9e6a22e2ae3a9b6225d87a5e49e6b594575f3Nicolas Capens C0 = 1, // Diffuse 29bcd9e6a22e2ae3a9b6225d87a5e49e6b594575f3Nicolas Capens C1 = 2, // Specular 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T0 = 3, 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T1 = 4, 32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T2 = 5, 33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T3 = 6, 34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T4 = 7, 35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T5 = 8, 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T6 = 9, 37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens T7 = 10, 38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Fog = 11, // x component 39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens Pts = Fog, // y component 40579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens 41579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens // Variable semantics 42579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens V0 = 0, 43579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens Vn_1 = MAX_VERTEX_OUTPUTS - 1, 44579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens 45579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens Unused, 46579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens VERTEX_OUTPUT_LAST = Unused, 47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }; 48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens struct UVWQ 50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float u; 52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float v; 53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float w; 54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float q; 55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float &operator[](int i) 57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens return (&u)[i]; 59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } 60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }; 61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ALIGN(16, struct Vertex 63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens union 65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens struct // Fixed semantics 67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens { 68ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens // Position 69ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float x; 70ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float y; 71ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float z; 72ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float w; 73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float4 C[2]; // Diffuse and specular color 75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens UVWQ T[8]; // Texture coordinates 77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float f; // Fog 79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens float pSize; // Point size 80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }; 81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 82579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens float4 v[MAX_VERTEX_OUTPUTS]; // Generic components using semantic declaration 83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }; 84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 85ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens // Projected coordinates 86ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens int X; 87ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens int Y; 88ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float Z; 89ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens float W; 90ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens 91ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens int clipFlags; 92ddb481671c2d5211a951a6a92a24270c2f7c919fNicolas Capens int padding[3]; 93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens }); 94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 95cbd6c6ab8ce90039909c42107b722a306ba13177Nicolas Capens static_assert((sizeof(Vertex) & 0x0000000F) == 0, "Vertex size not a multiple of 16 bytes (alignment requirement)"); 96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens} 97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif // Vertex_hpp 99