1e5c31af7Sopenharmony_ci#ifndef _VKTYCBCRUTIL_HPP
2e5c31af7Sopenharmony_ci#define _VKTYCBCRUTIL_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2017 Google Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief YCbCr Test Utilities
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ci#include "vktTestCase.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ci#include "vkImageUtil.hpp"
31e5c31af7Sopenharmony_ci#include "vkMemUtil.hpp"
32e5c31af7Sopenharmony_ci#include "vkRef.hpp"
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_ci#include "deSharedPtr.hpp"
35e5c31af7Sopenharmony_ci#include "deRandom.hpp"
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ci#include "tcuTextureUtil.hpp"
38e5c31af7Sopenharmony_ci#include "tcuFloatFormat.hpp"
39e5c31af7Sopenharmony_ci#include "tcuFloat.hpp"
40e5c31af7Sopenharmony_ci#include "tcuInterval.hpp"
41e5c31af7Sopenharmony_ci#include "tcuFloatFormat.hpp"
42e5c31af7Sopenharmony_ci#include "tcuFloat.hpp"
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_ci#include <vector>
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_cinamespace vkt
47e5c31af7Sopenharmony_ci{
48e5c31af7Sopenharmony_cinamespace ycbcr
49e5c31af7Sopenharmony_ci{
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci#define VK_YCBCR_FORMAT_FIRST	VK_FORMAT_G8B8G8R8_422_UNORM
52e5c31af7Sopenharmony_ci#define VK_YCBCR_FORMAT_LAST	((vk::VkFormat)(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM+1))
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Allocation>				AllocationSp;
55e5c31af7Sopenharmony_citypedef de::SharedPtr<vk::Unique<vk::VkBuffer> >	VkBufferSp;
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ciclass MultiPlaneImageData
58e5c31af7Sopenharmony_ci{
59e5c31af7Sopenharmony_cipublic:
60e5c31af7Sopenharmony_ci										MultiPlaneImageData		(vk::VkFormat format, const tcu::UVec2& size);
61e5c31af7Sopenharmony_ci										MultiPlaneImageData		(const MultiPlaneImageData&);
62e5c31af7Sopenharmony_ci										~MultiPlaneImageData	(void);
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci	vk::VkFormat						getFormat				(void) const				{ return m_format;						}
65e5c31af7Sopenharmony_ci	const vk::PlanarFormatDescription&	getDescription			(void) const				{ return m_description;					}
66e5c31af7Sopenharmony_ci	const tcu::UVec2&					getSize					(void) const				{ return m_size;						}
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci	size_t								getPlaneSize			(deUint32 planeNdx) const	{ return m_planeData[planeNdx].size();	}
69e5c31af7Sopenharmony_ci	void*								getPlanePtr				(deUint32 planeNdx)			{ return &m_planeData[planeNdx][0];		}
70e5c31af7Sopenharmony_ci	const void*							getPlanePtr				(deUint32 planeNdx) const	{ return &m_planeData[planeNdx][0];		}
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci	tcu::PixelBufferAccess				getChannelAccess		(deUint32 channelNdx);
73e5c31af7Sopenharmony_ci	tcu::ConstPixelBufferAccess			getChannelAccess		(deUint32 channelNdx) const;
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ciprivate:
76e5c31af7Sopenharmony_ci	MultiPlaneImageData&				operator=				(const MultiPlaneImageData&);
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ci	const vk::VkFormat					m_format;
79e5c31af7Sopenharmony_ci	const vk::PlanarFormatDescription	m_description;
80e5c31af7Sopenharmony_ci	const tcu::UVec2					m_size;
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci	std::vector<deUint8>				m_planeData[vk::PlanarFormatDescription::MAX_PLANES];
83e5c31af7Sopenharmony_ci};
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_civoid										checkImageSupport			(Context& context, vk::VkFormat format, vk::VkImageCreateFlags createFlags, vk::VkImageTiling tiling = vk::VK_IMAGE_TILING_OPTIMAL);
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_civoid										fillRandomNoNaN				(de::Random* randomGen, deUint8* const data, deUint32 size, const vk::VkFormat format);
88e5c31af7Sopenharmony_civoid										fillRandom					(de::Random* randomGen, MultiPlaneImageData* imageData, const vk::VkFormat format = vk::VK_FORMAT_UNDEFINED, bool noNan = false);
89e5c31af7Sopenharmony_civoid										fillGradient				(MultiPlaneImageData* imageData, const tcu::Vec4& minVal, const tcu::Vec4& maxVal);
90e5c31af7Sopenharmony_civoid										fillZero					(MultiPlaneImageData* imageData);
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_cistd::vector<de::SharedPtr<vk::Allocation> >	allocateAndBindImageMemory	(const vk::DeviceInterface&	vkd,
93e5c31af7Sopenharmony_ci																		 vk::VkDevice				device,
94e5c31af7Sopenharmony_ci																		 vk::Allocator&				allocator,
95e5c31af7Sopenharmony_ci																		 vk::VkImage				image,
96e5c31af7Sopenharmony_ci																		 vk::VkFormat				format,
97e5c31af7Sopenharmony_ci																		 vk::VkImageCreateFlags		createFlags,
98e5c31af7Sopenharmony_ci																		 vk::MemoryRequirement		requirement = vk::MemoryRequirement::Any);
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_civoid										uploadImage					(const vk::DeviceInterface&	vkd,
101e5c31af7Sopenharmony_ci																		 vk::VkDevice				device,
102e5c31af7Sopenharmony_ci																		 deUint32					queueFamilyNdx,
103e5c31af7Sopenharmony_ci																		 vk::Allocator&				allocator,
104e5c31af7Sopenharmony_ci																		 vk::VkImage				image,
105e5c31af7Sopenharmony_ci																		 const MultiPlaneImageData&	imageData,
106e5c31af7Sopenharmony_ci																		 vk::VkAccessFlags			nextAccess,
107e5c31af7Sopenharmony_ci																		 vk::VkImageLayout			finalLayout,
108e5c31af7Sopenharmony_ci																		 deUint32					arrayLayer = 0u);
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_civoid										fillImageMemory				(const vk::DeviceInterface&							vkd,
111e5c31af7Sopenharmony_ci																		 vk::VkDevice										device,
112e5c31af7Sopenharmony_ci																		 deUint32											queueFamilyNdx,
113e5c31af7Sopenharmony_ci																		 vk::VkImage										image,
114e5c31af7Sopenharmony_ci																		 const std::vector<de::SharedPtr<vk::Allocation> >&	memory,
115e5c31af7Sopenharmony_ci																		 const MultiPlaneImageData&							imageData,
116e5c31af7Sopenharmony_ci																		 vk::VkAccessFlags									nextAccess,
117e5c31af7Sopenharmony_ci																		 vk::VkImageLayout									finalLayout,
118e5c31af7Sopenharmony_ci																		 deUint32											arrayLayer = 0u);
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_civoid										downloadImage				(const vk::DeviceInterface&	vkd,
121e5c31af7Sopenharmony_ci																		 vk::VkDevice				device,
122e5c31af7Sopenharmony_ci																		 deUint32					queueFamilyNdx,
123e5c31af7Sopenharmony_ci																		 vk::Allocator&				allocator,
124e5c31af7Sopenharmony_ci																		 vk::VkImage				image,
125e5c31af7Sopenharmony_ci																		 MultiPlaneImageData*		imageData,
126e5c31af7Sopenharmony_ci																		 vk::VkAccessFlags			prevAccess,
127e5c31af7Sopenharmony_ci																		 vk::VkImageLayout			initialLayout,
128e5c31af7Sopenharmony_ci																		 uint32_t				baseArrayLayer = 0);
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_civoid										readImageMemory				(const vk::DeviceInterface&							vkd,
131e5c31af7Sopenharmony_ci																		 vk::VkDevice										device,
132e5c31af7Sopenharmony_ci																		 deUint32											queueFamilyNdx,
133e5c31af7Sopenharmony_ci																		 vk::VkImage										image,
134e5c31af7Sopenharmony_ci																		 const std::vector<de::SharedPtr<vk::Allocation> >&	memory,
135e5c31af7Sopenharmony_ci																		 MultiPlaneImageData*								imageData,
136e5c31af7Sopenharmony_ci																		 vk::VkAccessFlags									prevAccess,
137e5c31af7Sopenharmony_ci																		 vk::VkImageLayout									initialLayout);
138e5c31af7Sopenharmony_ci
139e5c31af7Sopenharmony_ciclass ChannelAccess
140e5c31af7Sopenharmony_ci{
141e5c31af7Sopenharmony_cipublic:
142e5c31af7Sopenharmony_ci						ChannelAccess	(tcu::TextureChannelClass	channelClass,
143e5c31af7Sopenharmony_ci										 deUint8					channelSize,
144e5c31af7Sopenharmony_ci										 const tcu::IVec3&			size,
145e5c31af7Sopenharmony_ci										 const tcu::IVec3&			bitPitch,
146e5c31af7Sopenharmony_ci										 void*						data,
147e5c31af7Sopenharmony_ci										 deUint32					bitOffset);
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ci	const tcu::IVec3&	getSize			(void) const { return m_size; }
150e5c31af7Sopenharmony_ci	const tcu::IVec3&	getBitPitch		(void) const { return m_bitPitch; }
151e5c31af7Sopenharmony_ci	void*				getDataPtr		(void) const { return m_data; }
152e5c31af7Sopenharmony_ci
153e5c31af7Sopenharmony_ci	tcu::Interval		getChannel		(const tcu::FloatFormat&	conversionFormat,
154e5c31af7Sopenharmony_ci										 const tcu::IVec3&			pos) const;
155e5c31af7Sopenharmony_ci	deUint32			getChannelUint	(const tcu::IVec3&			pos) const;
156e5c31af7Sopenharmony_ci	float				getChannel		(const tcu::IVec3&			pos) const;
157e5c31af7Sopenharmony_ci	void				setChannel		(const tcu::IVec3&			pos,
158e5c31af7Sopenharmony_ci										 deUint32					x);
159e5c31af7Sopenharmony_ci	void				setChannel		(const tcu::IVec3&			pos,
160e5c31af7Sopenharmony_ci										 float						x);
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_ciprivate:
163e5c31af7Sopenharmony_ci	const tcu::TextureChannelClass	m_channelClass;
164e5c31af7Sopenharmony_ci	const deUint8					m_channelSize;
165e5c31af7Sopenharmony_ci	const tcu::IVec3				m_size;
166e5c31af7Sopenharmony_ci	const tcu::IVec3				m_bitPitch;
167e5c31af7Sopenharmony_ci	void* const						m_data;
168e5c31af7Sopenharmony_ci	const deInt32					m_bitOffset;
169e5c31af7Sopenharmony_ci};
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_ciChannelAccess					getChannelAccess			(ycbcr::MultiPlaneImageData&			data,
172e5c31af7Sopenharmony_ci															 const vk::PlanarFormatDescription&		formatInfo,
173e5c31af7Sopenharmony_ci															 const tcu::UVec2&						size,
174e5c31af7Sopenharmony_ci															 int									channelNdx);
175e5c31af7Sopenharmony_ci
176e5c31af7Sopenharmony_cibool							isYChromaSubsampled			(vk::VkFormat							format);
177e5c31af7Sopenharmony_ci
178e5c31af7Sopenharmony_cibool							isXChromaSubsampled			(vk::VkFormat							format);
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_cibool							areLsb6BitsDontCare			(vk::VkFormat							srcFormat,
181e5c31af7Sopenharmony_ci															 vk::VkFormat							dstFormat);
182e5c31af7Sopenharmony_ci
183e5c31af7Sopenharmony_cibool							areLsb4BitsDontCare			(vk::VkFormat							srcFormat,
184e5c31af7Sopenharmony_ci															 vk::VkFormat							dstFormat);
185e5c31af7Sopenharmony_ci
186e5c31af7Sopenharmony_citcu::UVec4						getYCbCrBitDepth			(vk::VkFormat							format);
187e5c31af7Sopenharmony_ci
188e5c31af7Sopenharmony_cistd::vector<tcu::FloatFormat>	getPrecision				(vk::VkFormat							format);
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_cideUint32						getYCbCrFormatChannelCount	(vk::VkFormat							format);
191e5c31af7Sopenharmony_ci
192e5c31af7Sopenharmony_ciint								wrap						(vk::VkSamplerAddressMode				addressMode,
193e5c31af7Sopenharmony_ci															 int									coord,
194e5c31af7Sopenharmony_ci															 int									size);
195e5c31af7Sopenharmony_ci
196e5c31af7Sopenharmony_ciint								divFloor					(int									a,
197e5c31af7Sopenharmony_ci															 int									b);
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_civoid							calculateBounds				(const ChannelAccess&					rPlane,
200e5c31af7Sopenharmony_ci															 const ChannelAccess&					gPlane,
201e5c31af7Sopenharmony_ci															 const ChannelAccess&					bPlane,
202e5c31af7Sopenharmony_ci															 const ChannelAccess&					aPlane,
203e5c31af7Sopenharmony_ci															 const tcu::UVec4&						bitDepth,
204e5c31af7Sopenharmony_ci															 const std::vector<tcu::Vec2>&			sts,
205e5c31af7Sopenharmony_ci															 const std::vector<tcu::FloatFormat>&	filteringFormat,
206e5c31af7Sopenharmony_ci															 const std::vector<tcu::FloatFormat>&	conversionFormat,
207e5c31af7Sopenharmony_ci															 const deUint32							subTexelPrecisionBits,
208e5c31af7Sopenharmony_ci															 vk::VkFilter							filter,
209e5c31af7Sopenharmony_ci															 vk::VkSamplerYcbcrModelConversion		colorModel,
210e5c31af7Sopenharmony_ci															 vk::VkSamplerYcbcrRange				range,
211e5c31af7Sopenharmony_ci															 vk::VkFilter							chromaFilter,
212e5c31af7Sopenharmony_ci															 vk::VkChromaLocation					xChromaOffset,
213e5c31af7Sopenharmony_ci															 vk::VkChromaLocation					yChromaOffset,
214e5c31af7Sopenharmony_ci															 const vk::VkComponentMapping&			componentMapping,
215e5c31af7Sopenharmony_ci															 bool									explicitReconstruction,
216e5c31af7Sopenharmony_ci															 vk::VkSamplerAddressMode				addressModeU,
217e5c31af7Sopenharmony_ci															 vk::VkSamplerAddressMode				addressModeV,
218e5c31af7Sopenharmony_ci															 std::vector<tcu::Vec4>&				minBounds,
219e5c31af7Sopenharmony_ci															 std::vector<tcu::Vec4>&				maxBounds,
220e5c31af7Sopenharmony_ci															 std::vector<tcu::Vec4>&				uvBounds,
221e5c31af7Sopenharmony_ci															 std::vector<tcu::IVec4>&				ijBounds);
222e5c31af7Sopenharmony_ci
223e5c31af7Sopenharmony_ci} // ycbcr
224e5c31af7Sopenharmony_ci} // vkt
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ci#endif // _VKTYCBCRUTIL_HPP
227