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