xref: /aosp_15_r20/external/swiftshader/src/Pipeline/Constants.hpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef sw_Constants_hpp
16*03ce13f7SAndroid Build Coastguard Worker #define sw_Constants_hpp
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "System/Math.hpp"
19*03ce13f7SAndroid Build Coastguard Worker #include "System/Types.hpp"
20*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkConfig.hpp"
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker namespace sw {
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker // VK_SAMPLE_COUNT_4_BIT
25*03ce13f7SAndroid Build Coastguard Worker // https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#primsrast-multisampling
26*03ce13f7SAndroid Build Coastguard Worker static constexpr float VkSampleLocations4[][2] = {
27*03ce13f7SAndroid Build Coastguard Worker 	{ 0.375, 0.125 },
28*03ce13f7SAndroid Build Coastguard Worker 	{ 0.875, 0.375 },
29*03ce13f7SAndroid Build Coastguard Worker 	{ 0.125, 0.625 },
30*03ce13f7SAndroid Build Coastguard Worker 	{ 0.625, 0.875 },
31*03ce13f7SAndroid Build Coastguard Worker };
32*03ce13f7SAndroid Build Coastguard Worker 
33*03ce13f7SAndroid Build Coastguard Worker // Vulkan spec sample positions are relative to 0,0 in top left corner, with Y+ going down.
34*03ce13f7SAndroid Build Coastguard Worker // Convert to our space, with 0,0 in center, and Y+ going up.
35*03ce13f7SAndroid Build Coastguard Worker static constexpr float SampleLocationsX[4] = {
36*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[0][0] - 0.5f,
37*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[1][0] - 0.5f,
38*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[2][0] - 0.5f,
39*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[3][0] - 0.5f,
40*03ce13f7SAndroid Build Coastguard Worker };
41*03ce13f7SAndroid Build Coastguard Worker 
42*03ce13f7SAndroid Build Coastguard Worker static constexpr float SampleLocationsY[4] = {
43*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[0][1] - 0.5f,
44*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[1][1] - 0.5f,
45*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[2][1] - 0.5f,
46*03ce13f7SAndroid Build Coastguard Worker 	VkSampleLocations4[3][1] - 0.5f,
47*03ce13f7SAndroid Build Coastguard Worker };
48*03ce13f7SAndroid Build Coastguard Worker 
49*03ce13f7SAndroid Build Coastguard Worker // Compute the yMin and yMax multisample offsets so that they are just
50*03ce13f7SAndroid Build Coastguard Worker // large enough (+/- max range - epsilon) to include sample points
51*03ce13f7SAndroid Build Coastguard Worker static constexpr int yMinMultiSampleOffset = sw::toFixedPoint(1, vk::SUBPIXEL_PRECISION_BITS) - sw::toFixedPoint(sw::max(SampleLocationsY[0], SampleLocationsY[1], SampleLocationsY[2], SampleLocationsY[3]), vk::SUBPIXEL_PRECISION_BITS) - 1;
52*03ce13f7SAndroid Build Coastguard Worker static constexpr int yMaxMultiSampleOffset = sw::toFixedPoint(1, vk::SUBPIXEL_PRECISION_BITS) + sw::toFixedPoint(sw::max(SampleLocationsY[0], SampleLocationsY[1], SampleLocationsY[2], SampleLocationsY[3]), vk::SUBPIXEL_PRECISION_BITS) - 1;
53*03ce13f7SAndroid Build Coastguard Worker 
54*03ce13f7SAndroid Build Coastguard Worker struct Constants
55*03ce13f7SAndroid Build Coastguard Worker {
56*03ce13f7SAndroid Build Coastguard Worker 	Constants();
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker 	unsigned int transposeBit0[16];
59*03ce13f7SAndroid Build Coastguard Worker 	unsigned int transposeBit1[16];
60*03ce13f7SAndroid Build Coastguard Worker 	unsigned int transposeBit2[16];
61*03ce13f7SAndroid Build Coastguard Worker 
62*03ce13f7SAndroid Build Coastguard Worker 	ushort4 cWeight[17];
63*03ce13f7SAndroid Build Coastguard Worker 	float4 uvWeight[17];
64*03ce13f7SAndroid Build Coastguard Worker 	float4 uvStart[17];
65*03ce13f7SAndroid Build Coastguard Worker 
66*03ce13f7SAndroid Build Coastguard Worker 	unsigned int occlusionCount[16];
67*03ce13f7SAndroid Build Coastguard Worker 
68*03ce13f7SAndroid Build Coastguard Worker 	byte8 maskB4Q[16];
69*03ce13f7SAndroid Build Coastguard Worker 	byte8 invMaskB4Q[16];
70*03ce13f7SAndroid Build Coastguard Worker 	word4 maskW4Q[16];
71*03ce13f7SAndroid Build Coastguard Worker 	word4 invMaskW4Q[16];
72*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskD4X[16];
73*03ce13f7SAndroid Build Coastguard Worker 	dword4 invMaskD4X[16];
74*03ce13f7SAndroid Build Coastguard Worker 	qword maskQ0Q[16];
75*03ce13f7SAndroid Build Coastguard Worker 	qword maskQ1Q[16];
76*03ce13f7SAndroid Build Coastguard Worker 	qword maskQ2Q[16];
77*03ce13f7SAndroid Build Coastguard Worker 	qword maskQ3Q[16];
78*03ce13f7SAndroid Build Coastguard Worker 	qword invMaskQ0Q[16];
79*03ce13f7SAndroid Build Coastguard Worker 	qword invMaskQ1Q[16];
80*03ce13f7SAndroid Build Coastguard Worker 	qword invMaskQ2Q[16];
81*03ce13f7SAndroid Build Coastguard Worker 	qword invMaskQ3Q[16];
82*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskX0X[16];
83*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskX1X[16];
84*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskX2X[16];
85*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskX3X[16];
86*03ce13f7SAndroid Build Coastguard Worker 	dword4 invMaskX0X[16];
87*03ce13f7SAndroid Build Coastguard Worker 	dword4 invMaskX1X[16];
88*03ce13f7SAndroid Build Coastguard Worker 	dword4 invMaskX2X[16];
89*03ce13f7SAndroid Build Coastguard Worker 	dword4 invMaskX3X[16];
90*03ce13f7SAndroid Build Coastguard Worker 	dword2 maskD01Q[16];
91*03ce13f7SAndroid Build Coastguard Worker 	dword2 maskD23Q[16];
92*03ce13f7SAndroid Build Coastguard Worker 	dword2 invMaskD01Q[16];
93*03ce13f7SAndroid Build Coastguard Worker 	dword2 invMaskD23Q[16];
94*03ce13f7SAndroid Build Coastguard Worker 	qword2 maskQ01X[16];
95*03ce13f7SAndroid Build Coastguard Worker 	qword2 maskQ23X[16];
96*03ce13f7SAndroid Build Coastguard Worker 	qword2 invMaskQ01X[16];
97*03ce13f7SAndroid Build Coastguard Worker 	qword2 invMaskQ23X[16];
98*03ce13f7SAndroid Build Coastguard Worker 	word4 maskW01Q[4];
99*03ce13f7SAndroid Build Coastguard Worker 	dword4 maskD01X[4];
100*03ce13f7SAndroid Build Coastguard Worker 	word4 mask565Q[8];
101*03ce13f7SAndroid Build Coastguard Worker 	dword2 mask10Q[16];       // 4 bit writemask -> A2B10G10R10 bit patterns, replicated 2x
102*03ce13f7SAndroid Build Coastguard Worker 	word4 mask5551Q[16];      // 4 bit writemask -> A1R5G5B5 bit patterns, replicated 4x
103*03ce13f7SAndroid Build Coastguard Worker 	word4 maskr5g5b5a1Q[16];  // 4 bit writemask -> R5G5B5A1 bit patterns, replicated 4x
104*03ce13f7SAndroid Build Coastguard Worker 	word4 maskb5g5r5a1Q[16];  // 4 bit writemask -> B5G5R5A1 bit patterns, replicated 4x
105*03ce13f7SAndroid Build Coastguard Worker 	word4 mask4rgbaQ[16];     // 4 bit writemask -> R4G4B4A4 bit patterns, replicated 4x
106*03ce13f7SAndroid Build Coastguard Worker 	word4 mask4argbQ[16];     // 4 bit writemask -> A4R4G4B4 bit patterns, replicated 4x
107*03ce13f7SAndroid Build Coastguard Worker 	dword4 mask11X[8];        // 3 bit writemask -> B10G11R11 bit patterns, replicated 4x
108*03ce13f7SAndroid Build Coastguard Worker 
109*03ce13f7SAndroid Build Coastguard Worker 	unsigned short sRGBtoLinearFF_FF00[256];
110*03ce13f7SAndroid Build Coastguard Worker 
111*03ce13f7SAndroid Build Coastguard Worker 	// Centroid parameters
112*03ce13f7SAndroid Build Coastguard Worker 	float4 sampleX[4][16];
113*03ce13f7SAndroid Build Coastguard Worker 	float4 sampleY[4][16];
114*03ce13f7SAndroid Build Coastguard Worker 	float4 weight[16];
115*03ce13f7SAndroid Build Coastguard Worker 
116*03ce13f7SAndroid Build Coastguard Worker 	// Fragment offsets
117*03ce13f7SAndroid Build Coastguard Worker 	int Xf[4];
118*03ce13f7SAndroid Build Coastguard Worker 	int Yf[4];
119*03ce13f7SAndroid Build Coastguard Worker 
120*03ce13f7SAndroid Build Coastguard Worker 	const float SampleLocationsX[4] = {
121*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsX[0],
122*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsX[1],
123*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsX[2],
124*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsX[3],
125*03ce13f7SAndroid Build Coastguard Worker 	};
126*03ce13f7SAndroid Build Coastguard Worker 
127*03ce13f7SAndroid Build Coastguard Worker 	const float SampleLocationsY[4] = {
128*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsY[0],
129*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsY[1],
130*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsY[2],
131*03ce13f7SAndroid Build Coastguard Worker 		sw::SampleLocationsY[3],
132*03ce13f7SAndroid Build Coastguard Worker 	};
133*03ce13f7SAndroid Build Coastguard Worker 
134*03ce13f7SAndroid Build Coastguard Worker 	float half2float[65536];
135*03ce13f7SAndroid Build Coastguard Worker };
136*03ce13f7SAndroid Build Coastguard Worker 
137*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw
138*03ce13f7SAndroid Build Coastguard Worker 
139*03ce13f7SAndroid Build Coastguard Worker #endif  // sw_Constants_hpp
140