xref: /aosp_15_r20/external/swiftshader/src/Device/Sampler.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_Sampler_hpp
16*03ce13f7SAndroid Build Coastguard Worker #define sw_Sampler_hpp
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "Device/Config.hpp"
19*03ce13f7SAndroid Build Coastguard Worker #include "System/Types.hpp"
20*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkFormat.hpp"
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker namespace sw {
23*03ce13f7SAndroid Build Coastguard Worker 
24*03ce13f7SAndroid Build Coastguard Worker struct Mipmap
25*03ce13f7SAndroid Build Coastguard Worker {
26*03ce13f7SAndroid Build Coastguard Worker 	const void *buffer;
27*03ce13f7SAndroid Build Coastguard Worker 
28*03ce13f7SAndroid Build Coastguard Worker 	ushort4 uHalf;
29*03ce13f7SAndroid Build Coastguard Worker 	ushort4 vHalf;
30*03ce13f7SAndroid Build Coastguard Worker 	ushort4 wHalf;
31*03ce13f7SAndroid Build Coastguard Worker 	uint4 width;
32*03ce13f7SAndroid Build Coastguard Worker 	uint4 height;
33*03ce13f7SAndroid Build Coastguard Worker 	uint4 depth;
34*03ce13f7SAndroid Build Coastguard Worker 	short4 onePitchP;
35*03ce13f7SAndroid Build Coastguard Worker 	uint4 pitchP;
36*03ce13f7SAndroid Build Coastguard Worker 	uint4 sliceP;
37*03ce13f7SAndroid Build Coastguard Worker 	uint4 samplePitchP;
38*03ce13f7SAndroid Build Coastguard Worker 	uint4 sampleMax;
39*03ce13f7SAndroid Build Coastguard Worker };
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker struct Texture
42*03ce13f7SAndroid Build Coastguard Worker {
43*03ce13f7SAndroid Build Coastguard Worker 	Mipmap mipmap[MIPMAP_LEVELS];
44*03ce13f7SAndroid Build Coastguard Worker 
45*03ce13f7SAndroid Build Coastguard Worker 	float4 widthWidthHeightHeight;
46*03ce13f7SAndroid Build Coastguard Worker 	float4 width;
47*03ce13f7SAndroid Build Coastguard Worker 	float4 height;
48*03ce13f7SAndroid Build Coastguard Worker 	float4 depth;
49*03ce13f7SAndroid Build Coastguard Worker };
50*03ce13f7SAndroid Build Coastguard Worker 
51*03ce13f7SAndroid Build Coastguard Worker enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
52*03ce13f7SAndroid Build Coastguard Worker {
53*03ce13f7SAndroid Build Coastguard Worker 	FILTER_POINT,
54*03ce13f7SAndroid Build Coastguard Worker 	FILTER_GATHER,
55*03ce13f7SAndroid Build Coastguard Worker 	FILTER_MIN_POINT_MAG_LINEAR,
56*03ce13f7SAndroid Build Coastguard Worker 	FILTER_MIN_LINEAR_MAG_POINT,
57*03ce13f7SAndroid Build Coastguard Worker 	FILTER_LINEAR,
58*03ce13f7SAndroid Build Coastguard Worker 	FILTER_ANISOTROPIC,
59*03ce13f7SAndroid Build Coastguard Worker 
60*03ce13f7SAndroid Build Coastguard Worker 	FILTER_LAST = FILTER_ANISOTROPIC
61*03ce13f7SAndroid Build Coastguard Worker };
62*03ce13f7SAndroid Build Coastguard Worker 
63*03ce13f7SAndroid Build Coastguard Worker enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
64*03ce13f7SAndroid Build Coastguard Worker {
65*03ce13f7SAndroid Build Coastguard Worker 	MIPMAP_NONE,
66*03ce13f7SAndroid Build Coastguard Worker 	MIPMAP_POINT,
67*03ce13f7SAndroid Build Coastguard Worker 	MIPMAP_LINEAR,
68*03ce13f7SAndroid Build Coastguard Worker 
69*03ce13f7SAndroid Build Coastguard Worker 	MIPMAP_LAST = MIPMAP_LINEAR
70*03ce13f7SAndroid Build Coastguard Worker };
71*03ce13f7SAndroid Build Coastguard Worker 
72*03ce13f7SAndroid Build Coastguard Worker enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
73*03ce13f7SAndroid Build Coastguard Worker {
74*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_UNUSED,
75*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_WRAP,
76*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_CLAMP,
77*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_MIRROR,
78*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_MIRRORONCE,
79*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_BORDER,    // Single color
80*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_SEAMLESS,  // Border of pixels
81*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_CUBEFACE,  // Cube face layer
82*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_TEXELFETCH,
83*03ce13f7SAndroid Build Coastguard Worker 
84*03ce13f7SAndroid Build Coastguard Worker 	ADDRESSING_LAST = ADDRESSING_TEXELFETCH
85*03ce13f7SAndroid Build Coastguard Worker };
86*03ce13f7SAndroid Build Coastguard Worker 
87*03ce13f7SAndroid Build Coastguard Worker struct Sampler
88*03ce13f7SAndroid Build Coastguard Worker {
89*03ce13f7SAndroid Build Coastguard Worker 	VkImageViewType textureType;
90*03ce13f7SAndroid Build Coastguard Worker 	vk::Format textureFormat;
91*03ce13f7SAndroid Build Coastguard Worker 	FilterType textureFilter;
92*03ce13f7SAndroid Build Coastguard Worker 	AddressingMode addressingModeU;
93*03ce13f7SAndroid Build Coastguard Worker 	AddressingMode addressingModeV;
94*03ce13f7SAndroid Build Coastguard Worker 	AddressingMode addressingModeW;
95*03ce13f7SAndroid Build Coastguard Worker 	MipmapType mipmapFilter;
96*03ce13f7SAndroid Build Coastguard Worker 	VkComponentMapping swizzle;
97*03ce13f7SAndroid Build Coastguard Worker 	int gatherComponent;
98*03ce13f7SAndroid Build Coastguard Worker 	bool highPrecisionFiltering;
99*03ce13f7SAndroid Build Coastguard Worker 	bool compareEnable;
100*03ce13f7SAndroid Build Coastguard Worker 	VkCompareOp compareOp;
101*03ce13f7SAndroid Build Coastguard Worker 	VkBorderColor border;
102*03ce13f7SAndroid Build Coastguard Worker 	VkClearColorValue customBorder;
103*03ce13f7SAndroid Build Coastguard Worker 	bool unnormalizedCoordinates;
104*03ce13f7SAndroid Build Coastguard Worker 
105*03ce13f7SAndroid Build Coastguard Worker 	VkSamplerYcbcrModelConversion ycbcrModel;
106*03ce13f7SAndroid Build Coastguard Worker 	bool studioSwing;    // Narrow range
107*03ce13f7SAndroid Build Coastguard Worker 	bool swappedChroma;  // Cb/Cr components in reverse order
108*03ce13f7SAndroid Build Coastguard Worker 	FilterType chromaFilter;
109*03ce13f7SAndroid Build Coastguard Worker 	VkChromaLocation chromaXOffset;
110*03ce13f7SAndroid Build Coastguard Worker 	VkChromaLocation chromaYOffset;
111*03ce13f7SAndroid Build Coastguard Worker 
112*03ce13f7SAndroid Build Coastguard Worker 	float mipLodBias = 0.0f;
113*03ce13f7SAndroid Build Coastguard Worker 	float maxAnisotropy = 0.0f;
114*03ce13f7SAndroid Build Coastguard Worker 	float minLod = -1000.0f;
115*03ce13f7SAndroid Build Coastguard Worker 	float maxLod = 1000.0f;
116*03ce13f7SAndroid Build Coastguard Worker 
is1Dsw::Sampler117*03ce13f7SAndroid Build Coastguard Worker 	bool is1D() const
118*03ce13f7SAndroid Build Coastguard Worker 	{
119*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
120*03ce13f7SAndroid Build Coastguard Worker 		{
121*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
122*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
123*03ce13f7SAndroid Build Coastguard Worker 			return true;
124*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
125*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
126*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
127*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
128*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
129*03ce13f7SAndroid Build Coastguard Worker 			return false;
130*03ce13f7SAndroid Build Coastguard Worker 		default:
131*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
132*03ce13f7SAndroid Build Coastguard Worker 			return false;
133*03ce13f7SAndroid Build Coastguard Worker 		}
134*03ce13f7SAndroid Build Coastguard Worker 	}
135*03ce13f7SAndroid Build Coastguard Worker 
is2Dsw::Sampler136*03ce13f7SAndroid Build Coastguard Worker 	bool is2D() const
137*03ce13f7SAndroid Build Coastguard Worker 	{
138*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
139*03ce13f7SAndroid Build Coastguard Worker 		{
140*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
141*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
142*03ce13f7SAndroid Build Coastguard Worker 			return true;
143*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
144*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
145*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
146*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
147*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
148*03ce13f7SAndroid Build Coastguard Worker 			return false;
149*03ce13f7SAndroid Build Coastguard Worker 		default:
150*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
151*03ce13f7SAndroid Build Coastguard Worker 			return false;
152*03ce13f7SAndroid Build Coastguard Worker 		}
153*03ce13f7SAndroid Build Coastguard Worker 	}
154*03ce13f7SAndroid Build Coastguard Worker 
is3Dsw::Sampler155*03ce13f7SAndroid Build Coastguard Worker 	bool is3D() const
156*03ce13f7SAndroid Build Coastguard Worker 	{
157*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
158*03ce13f7SAndroid Build Coastguard Worker 		{
159*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
160*03ce13f7SAndroid Build Coastguard Worker 			return true;
161*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
162*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
163*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
164*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
165*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
166*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
167*03ce13f7SAndroid Build Coastguard Worker 			return false;
168*03ce13f7SAndroid Build Coastguard Worker 		default:
169*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
170*03ce13f7SAndroid Build Coastguard Worker 			return false;
171*03ce13f7SAndroid Build Coastguard Worker 		}
172*03ce13f7SAndroid Build Coastguard Worker 	}
173*03ce13f7SAndroid Build Coastguard Worker 
isCubesw::Sampler174*03ce13f7SAndroid Build Coastguard Worker 	bool isCube() const
175*03ce13f7SAndroid Build Coastguard Worker 	{
176*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
177*03ce13f7SAndroid Build Coastguard Worker 		{
178*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
179*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
180*03ce13f7SAndroid Build Coastguard Worker 			return true;
181*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
182*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
183*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
184*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
185*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
186*03ce13f7SAndroid Build Coastguard Worker 			return false;
187*03ce13f7SAndroid Build Coastguard Worker 		default:
188*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
189*03ce13f7SAndroid Build Coastguard Worker 			return false;
190*03ce13f7SAndroid Build Coastguard Worker 		}
191*03ce13f7SAndroid Build Coastguard Worker 	}
192*03ce13f7SAndroid Build Coastguard Worker 
isArrayedsw::Sampler193*03ce13f7SAndroid Build Coastguard Worker 	bool isArrayed() const
194*03ce13f7SAndroid Build Coastguard Worker 	{
195*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
196*03ce13f7SAndroid Build Coastguard Worker 		{
197*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
198*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
199*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
200*03ce13f7SAndroid Build Coastguard Worker 			return true;
201*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
202*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
203*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
204*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
205*03ce13f7SAndroid Build Coastguard Worker 			return false;
206*03ce13f7SAndroid Build Coastguard Worker 		default:
207*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
208*03ce13f7SAndroid Build Coastguard Worker 			return false;
209*03ce13f7SAndroid Build Coastguard Worker 		}
210*03ce13f7SAndroid Build Coastguard Worker 	}
211*03ce13f7SAndroid Build Coastguard Worker 
212*03ce13f7SAndroid Build Coastguard Worker 	// Returns the number of coordinates required to sample the image,
213*03ce13f7SAndroid Build Coastguard Worker 	// not including any array coordinate, which is indicated by isArrayed().
dimensionalitysw::Sampler214*03ce13f7SAndroid Build Coastguard Worker 	unsigned int dimensionality() const
215*03ce13f7SAndroid Build Coastguard Worker 	{
216*03ce13f7SAndroid Build Coastguard Worker 		switch(textureType)
217*03ce13f7SAndroid Build Coastguard Worker 		{
218*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D:
219*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
220*03ce13f7SAndroid Build Coastguard Worker 			return 1;
221*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D:
222*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
223*03ce13f7SAndroid Build Coastguard Worker 			return 2;
224*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_3D:
225*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE:
226*03ce13f7SAndroid Build Coastguard Worker 		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
227*03ce13f7SAndroid Build Coastguard Worker 			return 3;
228*03ce13f7SAndroid Build Coastguard Worker 		default:
229*03ce13f7SAndroid Build Coastguard Worker 			UNSUPPORTED("VkImageViewType %d", (int)textureType);
230*03ce13f7SAndroid Build Coastguard Worker 			return 0;
231*03ce13f7SAndroid Build Coastguard Worker 		}
232*03ce13f7SAndroid Build Coastguard Worker 	}
233*03ce13f7SAndroid Build Coastguard Worker };
234*03ce13f7SAndroid Build Coastguard Worker 
235*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw
236*03ce13f7SAndroid Build Coastguard Worker 
237*03ce13f7SAndroid Build Coastguard Worker #endif  // sw_Sampler_hpp
238