1cb93a386Sopenharmony_ci// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2cb93a386Sopenharmony_ci//
3cb93a386Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4cb93a386Sopenharmony_ci// you may not use this file except in compliance with the License.
5cb93a386Sopenharmony_ci// You may obtain a copy of the License at
6cb93a386Sopenharmony_ci//
7cb93a386Sopenharmony_ci//    http://www.apache.org/licenses/LICENSE-2.0
8cb93a386Sopenharmony_ci//
9cb93a386Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10cb93a386Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11cb93a386Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cb93a386Sopenharmony_ci// See the License for the specific language governing permissions and
13cb93a386Sopenharmony_ci// limitations under the License.
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#ifndef sw_Sampler_hpp
16cb93a386Sopenharmony_ci#define sw_Sampler_hpp
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ci#include "Device/Config.hpp"
19cb93a386Sopenharmony_ci#include "System/Types.hpp"
20cb93a386Sopenharmony_ci#include "Vulkan/VkFormat.hpp"
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cinamespace vk {
23cb93a386Sopenharmony_ciclass Image;
24cb93a386Sopenharmony_ci}
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_cinamespace sw {
27cb93a386Sopenharmony_ci
28cb93a386Sopenharmony_cistruct Mipmap
29cb93a386Sopenharmony_ci{
30cb93a386Sopenharmony_ci	const void *buffer;
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ci	short4 uHalf;
33cb93a386Sopenharmony_ci	short4 vHalf;
34cb93a386Sopenharmony_ci	short4 wHalf;
35cb93a386Sopenharmony_ci	int4 width;
36cb93a386Sopenharmony_ci	int4 height;
37cb93a386Sopenharmony_ci	int4 depth;
38cb93a386Sopenharmony_ci	short4 onePitchP;
39cb93a386Sopenharmony_ci	int4 pitchP;
40cb93a386Sopenharmony_ci	int4 sliceP;
41cb93a386Sopenharmony_ci	int4 samplePitchP;
42cb93a386Sopenharmony_ci	int4 sampleMax;
43cb93a386Sopenharmony_ci};
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_cistruct Texture
46cb93a386Sopenharmony_ci{
47cb93a386Sopenharmony_ci	Mipmap mipmap[MIPMAP_LEVELS];
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci	float4 widthWidthHeightHeight;
50cb93a386Sopenharmony_ci	float4 width;
51cb93a386Sopenharmony_ci	float4 height;
52cb93a386Sopenharmony_ci	float4 depth;
53cb93a386Sopenharmony_ci};
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_cienum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
56cb93a386Sopenharmony_ci{
57cb93a386Sopenharmony_ci	FILTER_POINT,
58cb93a386Sopenharmony_ci	FILTER_GATHER,
59cb93a386Sopenharmony_ci	FILTER_MIN_POINT_MAG_LINEAR,
60cb93a386Sopenharmony_ci	FILTER_MIN_LINEAR_MAG_POINT,
61cb93a386Sopenharmony_ci	FILTER_LINEAR,
62cb93a386Sopenharmony_ci	FILTER_ANISOTROPIC,
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci	FILTER_LAST = FILTER_ANISOTROPIC
65cb93a386Sopenharmony_ci};
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_cienum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
68cb93a386Sopenharmony_ci{
69cb93a386Sopenharmony_ci	MIPMAP_NONE,
70cb93a386Sopenharmony_ci	MIPMAP_POINT,
71cb93a386Sopenharmony_ci	MIPMAP_LINEAR,
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci	MIPMAP_LAST = MIPMAP_LINEAR
74cb93a386Sopenharmony_ci};
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_cienum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
77cb93a386Sopenharmony_ci{
78cb93a386Sopenharmony_ci	ADDRESSING_UNUSED,
79cb93a386Sopenharmony_ci	ADDRESSING_WRAP,
80cb93a386Sopenharmony_ci	ADDRESSING_CLAMP,
81cb93a386Sopenharmony_ci	ADDRESSING_MIRROR,
82cb93a386Sopenharmony_ci	ADDRESSING_MIRRORONCE,
83cb93a386Sopenharmony_ci	ADDRESSING_BORDER,    // Single color
84cb93a386Sopenharmony_ci	ADDRESSING_SEAMLESS,  // Border of pixels
85cb93a386Sopenharmony_ci	ADDRESSING_CUBEFACE,  // Cube face layer
86cb93a386Sopenharmony_ci	ADDRESSING_TEXELFETCH,
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ci	ADDRESSING_LAST = ADDRESSING_TEXELFETCH
89cb93a386Sopenharmony_ci};
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_cistruct Sampler
92cb93a386Sopenharmony_ci{
93cb93a386Sopenharmony_ci	VkImageViewType textureType;
94cb93a386Sopenharmony_ci	vk::Format textureFormat;
95cb93a386Sopenharmony_ci	FilterType textureFilter;
96cb93a386Sopenharmony_ci	AddressingMode addressingModeU;
97cb93a386Sopenharmony_ci	AddressingMode addressingModeV;
98cb93a386Sopenharmony_ci	AddressingMode addressingModeW;
99cb93a386Sopenharmony_ci	MipmapType mipmapFilter;
100cb93a386Sopenharmony_ci	VkComponentMapping swizzle;
101cb93a386Sopenharmony_ci	int gatherComponent;
102cb93a386Sopenharmony_ci	bool highPrecisionFiltering;
103cb93a386Sopenharmony_ci	bool compareEnable;
104cb93a386Sopenharmony_ci	VkCompareOp compareOp;
105cb93a386Sopenharmony_ci	VkBorderColor border;
106cb93a386Sopenharmony_ci	VkClearColorValue customBorder;
107cb93a386Sopenharmony_ci	bool unnormalizedCoordinates;
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci	VkSamplerYcbcrModelConversion ycbcrModel;
110cb93a386Sopenharmony_ci	bool studioSwing;    // Narrow range
111cb93a386Sopenharmony_ci	bool swappedChroma;  // Cb/Cr components in reverse order
112cb93a386Sopenharmony_ci
113cb93a386Sopenharmony_ci	float mipLodBias = 0.0f;
114cb93a386Sopenharmony_ci	float maxAnisotropy = 0.0f;
115cb93a386Sopenharmony_ci	float minLod = -1000.0f;
116cb93a386Sopenharmony_ci	float maxLod = 1000.0f;
117cb93a386Sopenharmony_ci
118cb93a386Sopenharmony_ci	bool is1D() const
119cb93a386Sopenharmony_ci	{
120cb93a386Sopenharmony_ci		switch(textureType)
121cb93a386Sopenharmony_ci		{
122cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
123cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
124cb93a386Sopenharmony_ci			return true;
125cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
126cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
127cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
128cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
129cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
130cb93a386Sopenharmony_ci			return false;
131cb93a386Sopenharmony_ci		default:
132cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
133cb93a386Sopenharmony_ci			return false;
134cb93a386Sopenharmony_ci		}
135cb93a386Sopenharmony_ci	}
136cb93a386Sopenharmony_ci
137cb93a386Sopenharmony_ci	bool is2D() const
138cb93a386Sopenharmony_ci	{
139cb93a386Sopenharmony_ci		switch(textureType)
140cb93a386Sopenharmony_ci		{
141cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
142cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
143cb93a386Sopenharmony_ci			return true;
144cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
145cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
146cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
147cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
148cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
149cb93a386Sopenharmony_ci			return false;
150cb93a386Sopenharmony_ci		default:
151cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
152cb93a386Sopenharmony_ci			return false;
153cb93a386Sopenharmony_ci		}
154cb93a386Sopenharmony_ci	}
155cb93a386Sopenharmony_ci
156cb93a386Sopenharmony_ci	bool is3D() const
157cb93a386Sopenharmony_ci	{
158cb93a386Sopenharmony_ci		switch(textureType)
159cb93a386Sopenharmony_ci		{
160cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
161cb93a386Sopenharmony_ci			return true;
162cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
163cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
164cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
165cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
166cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
167cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
168cb93a386Sopenharmony_ci			return false;
169cb93a386Sopenharmony_ci		default:
170cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
171cb93a386Sopenharmony_ci			return false;
172cb93a386Sopenharmony_ci		}
173cb93a386Sopenharmony_ci	}
174cb93a386Sopenharmony_ci
175cb93a386Sopenharmony_ci	bool isCube() const
176cb93a386Sopenharmony_ci	{
177cb93a386Sopenharmony_ci		switch(textureType)
178cb93a386Sopenharmony_ci		{
179cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
180cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
181cb93a386Sopenharmony_ci			return true;
182cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
183cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
184cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
185cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
186cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
187cb93a386Sopenharmony_ci			return false;
188cb93a386Sopenharmony_ci		default:
189cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
190cb93a386Sopenharmony_ci			return false;
191cb93a386Sopenharmony_ci		}
192cb93a386Sopenharmony_ci	}
193cb93a386Sopenharmony_ci
194cb93a386Sopenharmony_ci	bool isArrayed() const
195cb93a386Sopenharmony_ci	{
196cb93a386Sopenharmony_ci		switch(textureType)
197cb93a386Sopenharmony_ci		{
198cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
199cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
200cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
201cb93a386Sopenharmony_ci			return true;
202cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
203cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
204cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
205cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
206cb93a386Sopenharmony_ci			return false;
207cb93a386Sopenharmony_ci		default:
208cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
209cb93a386Sopenharmony_ci			return false;
210cb93a386Sopenharmony_ci		}
211cb93a386Sopenharmony_ci	}
212cb93a386Sopenharmony_ci
213cb93a386Sopenharmony_ci	// Returns the number of coordinates required to sample the image,
214cb93a386Sopenharmony_ci	// not including any array coordinate, which is indicated by isArrayed().
215cb93a386Sopenharmony_ci	unsigned int dimensionality() const
216cb93a386Sopenharmony_ci	{
217cb93a386Sopenharmony_ci		switch(textureType)
218cb93a386Sopenharmony_ci		{
219cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D:
220cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
221cb93a386Sopenharmony_ci			return 1;
222cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D:
223cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
224cb93a386Sopenharmony_ci			return 2;
225cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_3D:
226cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE:
227cb93a386Sopenharmony_ci		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
228cb93a386Sopenharmony_ci			return 3;
229cb93a386Sopenharmony_ci		default:
230cb93a386Sopenharmony_ci			UNSUPPORTED("VkImageViewType %d", (int)textureType);
231cb93a386Sopenharmony_ci			return 0;
232cb93a386Sopenharmony_ci		}
233cb93a386Sopenharmony_ci	}
234cb93a386Sopenharmony_ci};
235cb93a386Sopenharmony_ci
236cb93a386Sopenharmony_ci}  // namespace sw
237cb93a386Sopenharmony_ci
238cb93a386Sopenharmony_ci#endif  // sw_Sampler_hpp
239