1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
3e5c31af7Sopenharmony_ci * ------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright (c) 2021 The Khronos Group Inc.
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *	  http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Video Encoding and Decoding Capabilities tests
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "vktVideoCapabilitiesTests.hpp"
25e5c31af7Sopenharmony_ci#include "vktVideoTestUtils.hpp"
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ci#include "vkDefs.hpp"
28e5c31af7Sopenharmony_ci#include "vkTypeUtil.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ci#include "vktTestCase.hpp"
32e5c31af7Sopenharmony_ci#include "vktCustomInstancesDevices.hpp"
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cinamespace vkt
36e5c31af7Sopenharmony_ci{
37e5c31af7Sopenharmony_cinamespace video
38e5c31af7Sopenharmony_ci{
39e5c31af7Sopenharmony_cinamespace
40e5c31af7Sopenharmony_ci{
41e5c31af7Sopenharmony_ciusing namespace vk;
42e5c31af7Sopenharmony_ciusing namespace std;
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cienum TestType
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_ci	TEST_TYPE_QUEUE_SUPPORT_QUERY,							// Test case 1
47e5c31af7Sopenharmony_ci	TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 2 iteration 1 ?
48e5c31af7Sopenharmony_ci	TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 2 iteration 2 ?
49e5c31af7Sopenharmony_ci	TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 3 iteration 1
50e5c31af7Sopenharmony_ci	TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 3 iteration 2
51e5c31af7Sopenharmony_ci	TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 4a iteration 1 ?
52e5c31af7Sopenharmony_ci	TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 4a iteration 2 ?
53e5c31af7Sopenharmony_ci	TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 4b iteration 1
54e5c31af7Sopenharmony_ci	TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY,	// Test case 4b iteration 2
55e5c31af7Sopenharmony_ci	TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY,				// Test case 5a
56e5c31af7Sopenharmony_ci	TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY,				// Test case 5b
57e5c31af7Sopenharmony_ci	TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY,				// Test case 5c
58e5c31af7Sopenharmony_ci	TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY,				// Test case 5d
59e5c31af7Sopenharmony_ci	TEST_TYPE_LAST
60e5c31af7Sopenharmony_ci};
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_cistruct CaseDef
63e5c31af7Sopenharmony_ci{
64e5c31af7Sopenharmony_ci	TestType	testType;
65e5c31af7Sopenharmony_ci};
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_ci#define VALIDATE_FIELD_EQUAL(A,B,X) if (deMemCmp(&A.X, &B.X, sizeof(A.X)) != 0) TCU_FAIL("Unequal " #A "." #X)
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ciclass VideoQueueQueryTestInstance : public VideoBaseTestInstance
70e5c31af7Sopenharmony_ci{
71e5c31af7Sopenharmony_cipublic:
72e5c31af7Sopenharmony_ci					VideoQueueQueryTestInstance		(Context& context, const CaseDef& data);
73e5c31af7Sopenharmony_ci					~VideoQueueQueryTestInstance	(void);
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci	tcu::TestStatus	iterate							(void);
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ciprivate:
78e5c31af7Sopenharmony_ci	CaseDef			m_caseDef;
79e5c31af7Sopenharmony_ci};
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_ciVideoQueueQueryTestInstance::VideoQueueQueryTestInstance (Context& context, const CaseDef& data)
82e5c31af7Sopenharmony_ci	: VideoBaseTestInstance	(context)
83e5c31af7Sopenharmony_ci	, m_caseDef				(data)
84e5c31af7Sopenharmony_ci{
85e5c31af7Sopenharmony_ci    DE_UNREF(m_caseDef);
86e5c31af7Sopenharmony_ci}
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ciVideoQueueQueryTestInstance::~VideoQueueQueryTestInstance (void)
89e5c31af7Sopenharmony_ci{
90e5c31af7Sopenharmony_ci}
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_citcu::TestStatus VideoQueueQueryTestInstance::iterate (void)
93e5c31af7Sopenharmony_ci{
94e5c31af7Sopenharmony_ci	const InstanceInterface&					vk								= m_context.getInstanceInterface();
95e5c31af7Sopenharmony_ci	const VkPhysicalDevice						physicalDevice					= m_context.getPhysicalDevice();
96e5c31af7Sopenharmony_ci	deUint32									queueFamilyPropertiesCount		= 0u;
97e5c31af7Sopenharmony_ci	vector<VkQueueFamilyProperties2>			queueFamilyProperties2;
98e5c31af7Sopenharmony_ci	vector<VkQueueFamilyVideoPropertiesKHR>		videoQueueFamilyProperties2;
99e5c31af7Sopenharmony_ci	bool										encodePass = false;
100e5c31af7Sopenharmony_ci	bool										decodePass = false;
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci	vk.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, DE_NULL);
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci	if(queueFamilyPropertiesCount == 0u)
105e5c31af7Sopenharmony_ci		TCU_FAIL("Device reports an empty set of queue family properties");
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci	queueFamilyProperties2.resize(queueFamilyPropertiesCount);
108e5c31af7Sopenharmony_ci	videoQueueFamilyProperties2.resize(queueFamilyPropertiesCount);
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
111e5c31af7Sopenharmony_ci	{
112e5c31af7Sopenharmony_ci		queueFamilyProperties2[ndx].sType							= VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
113e5c31af7Sopenharmony_ci		queueFamilyProperties2[ndx].pNext							= &videoQueueFamilyProperties2[ndx];
114e5c31af7Sopenharmony_ci		videoQueueFamilyProperties2[ndx].sType						= VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
115e5c31af7Sopenharmony_ci		videoQueueFamilyProperties2[ndx].pNext						= DE_NULL;
116e5c31af7Sopenharmony_ci		videoQueueFamilyProperties2[ndx].videoCodecOperations		= 0;
117e5c31af7Sopenharmony_ci	}
118e5c31af7Sopenharmony_ci
119e5c31af7Sopenharmony_ci	vk.getPhysicalDeviceQueueFamilyProperties2(physicalDevice, &queueFamilyPropertiesCount, queueFamilyProperties2.data());
120e5c31af7Sopenharmony_ci
121e5c31af7Sopenharmony_ci	if (queueFamilyPropertiesCount != queueFamilyProperties2.size())
122e5c31af7Sopenharmony_ci		TCU_FAIL("Device returns less queue families than initially reported");
123e5c31af7Sopenharmony_ci
124e5c31af7Sopenharmony_ci	for (uint32_t ndx = 0; ndx < queueFamilyPropertiesCount; ++ndx)
125e5c31af7Sopenharmony_ci	{
126e5c31af7Sopenharmony_ci		const uint32_t						queueCount					= queueFamilyProperties2[ndx].queueFamilyProperties.queueCount;
127e5c31af7Sopenharmony_ci		const VkQueueFlags					queueFlags					= queueFamilyProperties2[ndx].queueFamilyProperties.queueFlags;
128e5c31af7Sopenharmony_ci		const VkVideoCodecOperationFlagsKHR	queueVideoCodecOperations	= videoQueueFamilyProperties2[ndx].videoCodecOperations;
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_ci		if ((queueFlags & VK_QUEUE_VIDEO_ENCODE_BIT_KHR) != 0)
131e5c31af7Sopenharmony_ci		{
132e5c31af7Sopenharmony_ci			if (!VideoDevice::isVideoEncodeOperation(queueVideoCodecOperations))
133e5c31af7Sopenharmony_ci				TCU_FAIL("Invalid codec operations for encode queue");
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci			if (queueCount == 0)
136e5c31af7Sopenharmony_ci				TCU_FAIL("Video encode queue returned queueCount is zero");
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci			encodePass = true;
139e5c31af7Sopenharmony_ci		}
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci		if ((queueFlags & VK_QUEUE_VIDEO_DECODE_BIT_KHR) != 0)
142e5c31af7Sopenharmony_ci		{
143e5c31af7Sopenharmony_ci			if (!VideoDevice::isVideoDecodeOperation(queueVideoCodecOperations))
144e5c31af7Sopenharmony_ci				TCU_FAIL("Invalid codec operations for decode queue");
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_ci			if (queueCount == 0)
147e5c31af7Sopenharmony_ci				TCU_FAIL("Video decode queue returned queueCount is zero");
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ci			decodePass = true;
150e5c31af7Sopenharmony_ci		}
151e5c31af7Sopenharmony_ci	}
152e5c31af7Sopenharmony_ci
153e5c31af7Sopenharmony_ci	if (!m_context.isDeviceFunctionalitySupported("VK_KHR_video_encode_queue"))
154e5c31af7Sopenharmony_ci		encodePass = false;
155e5c31af7Sopenharmony_ci
156e5c31af7Sopenharmony_ci	if (!m_context.isDeviceFunctionalitySupported("VK_KHR_video_decode_queue"))
157e5c31af7Sopenharmony_ci		decodePass = false;
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ci	if (encodePass || decodePass)
160e5c31af7Sopenharmony_ci		return tcu::TestStatus::pass("Pass");
161e5c31af7Sopenharmony_ci	else
162e5c31af7Sopenharmony_ci		return tcu::TestStatus::fail("Neither encode, nor decode is available");
163e5c31af7Sopenharmony_ci}
164e5c31af7Sopenharmony_ci
165e5c31af7Sopenharmony_citemplate<typename ProfileOperation>
166e5c31af7Sopenharmony_ciclass VideoFormatPropertiesQueryTestInstance : public VideoBaseTestInstance
167e5c31af7Sopenharmony_ci{
168e5c31af7Sopenharmony_cipublic:
169e5c31af7Sopenharmony_ci									VideoFormatPropertiesQueryTestInstance	(Context& context, const CaseDef& data);
170e5c31af7Sopenharmony_ci									~VideoFormatPropertiesQueryTestInstance	(void);
171e5c31af7Sopenharmony_ci	tcu::TestStatus					iterate									(void);
172e5c31af7Sopenharmony_ci
173e5c31af7Sopenharmony_ciprivate:
174e5c31af7Sopenharmony_ci	ProfileOperation				getProfileOperation						(void);
175e5c31af7Sopenharmony_ci
176e5c31af7Sopenharmony_ci	CaseDef							m_caseDef;
177e5c31af7Sopenharmony_ci	VkVideoCodecOperationFlagsKHR	m_videoCodecOperation;
178e5c31af7Sopenharmony_ci	VkImageUsageFlags				m_imageUsageFlags;
179e5c31af7Sopenharmony_ci};
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_citemplate<typename ProfileOperation>
182e5c31af7Sopenharmony_ciVideoFormatPropertiesQueryTestInstance<ProfileOperation>::VideoFormatPropertiesQueryTestInstance (Context& context, const CaseDef& data)
183e5c31af7Sopenharmony_ci	: VideoBaseTestInstance	(context)
184e5c31af7Sopenharmony_ci	, m_caseDef				(data)
185e5c31af7Sopenharmony_ci{
186e5c31af7Sopenharmony_ci	switch (m_caseDef.testType)
187e5c31af7Sopenharmony_ci	{
188e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
189e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR; break;
190e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
191e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT; break;
192e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
193e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR; break;
194e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
195e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_videoCodecOperation = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT; break;
196e5c31af7Sopenharmony_ci		default: TCU_THROW(InternalError, "Unknown testType");
197e5c31af7Sopenharmony_ci	}
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ci	switch (m_caseDef.testType)
200e5c31af7Sopenharmony_ci	{
201e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR; break;
202e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR; break;
203e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR; break;
204e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR; break;
205e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR; break;
206e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR; break;
207e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR; break;
208e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	m_imageUsageFlags = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR; break;
209e5c31af7Sopenharmony_ci		default: TCU_THROW(InternalError, "Unknown testType");
210e5c31af7Sopenharmony_ci	}
211e5c31af7Sopenharmony_ci}
212e5c31af7Sopenharmony_ci
213e5c31af7Sopenharmony_citemplate<typename ProfileOperation>
214e5c31af7Sopenharmony_ciVideoFormatPropertiesQueryTestInstance<ProfileOperation>::~VideoFormatPropertiesQueryTestInstance (void)
215e5c31af7Sopenharmony_ci{
216e5c31af7Sopenharmony_ci}
217e5c31af7Sopenharmony_ci
218e5c31af7Sopenharmony_citemplate<>
219e5c31af7Sopenharmony_ciVkVideoDecodeH264ProfileInfoKHR VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH264ProfileInfoKHR>::getProfileOperation (void)
220e5c31af7Sopenharmony_ci{
221e5c31af7Sopenharmony_ci	return getProfileOperationH264Decode();
222e5c31af7Sopenharmony_ci}
223e5c31af7Sopenharmony_ci
224e5c31af7Sopenharmony_citemplate<>
225e5c31af7Sopenharmony_ciVkVideoEncodeH264ProfileInfoEXT VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH264ProfileInfoEXT>::getProfileOperation ()
226e5c31af7Sopenharmony_ci{
227e5c31af7Sopenharmony_ci	return getProfileOperationH264Encode();
228e5c31af7Sopenharmony_ci}
229e5c31af7Sopenharmony_ci
230e5c31af7Sopenharmony_citemplate<>
231e5c31af7Sopenharmony_ciVkVideoDecodeH265ProfileInfoKHR VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH265ProfileInfoKHR>::getProfileOperation ()
232e5c31af7Sopenharmony_ci{
233e5c31af7Sopenharmony_ci	return getProfileOperationH265Decode();
234e5c31af7Sopenharmony_ci}
235e5c31af7Sopenharmony_ci
236e5c31af7Sopenharmony_citemplate<>
237e5c31af7Sopenharmony_ciVkVideoEncodeH265ProfileInfoEXT VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH265ProfileInfoEXT>::getProfileOperation ()
238e5c31af7Sopenharmony_ci{
239e5c31af7Sopenharmony_ci	return getProfileOperationH265Encode();
240e5c31af7Sopenharmony_ci}
241e5c31af7Sopenharmony_ci
242e5c31af7Sopenharmony_citemplate<typename ProfileOperation>
243e5c31af7Sopenharmony_citcu::TestStatus VideoFormatPropertiesQueryTestInstance<ProfileOperation>::iterate (void)
244e5c31af7Sopenharmony_ci{
245e5c31af7Sopenharmony_ci	const InstanceInterface&					vk							= m_context.getInstanceInterface();
246e5c31af7Sopenharmony_ci	const VkPhysicalDevice						physicalDevice				= m_context.getPhysicalDevice();
247e5c31af7Sopenharmony_ci	deUint32									videoFormatPropertiesCount	= 0u;
248e5c31af7Sopenharmony_ci	bool										testResult					= false;
249e5c31af7Sopenharmony_ci
250e5c31af7Sopenharmony_ci	const ProfileOperation						videoProfileOperation		= getProfileOperation();
251e5c31af7Sopenharmony_ci	const VkVideoCodecOperationFlagBitsKHR		videoCodecOperation			= static_cast<VkVideoCodecOperationFlagBitsKHR>(m_videoCodecOperation);
252e5c31af7Sopenharmony_ci	const VkVideoProfileInfoKHR						videoProfile				=
253e5c31af7Sopenharmony_ci	{
254e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,			//  VkStructureType						sType;
255e5c31af7Sopenharmony_ci		(void*)&videoProfileOperation,						//  void*								pNext;
256e5c31af7Sopenharmony_ci		videoCodecOperation,								//  VkVideoCodecOperationFlagBitsKHR	videoCodecOperation;
257e5c31af7Sopenharmony_ci		VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,			//  VkVideoChromaSubsamplingFlagsKHR	chromaSubsampling;
258e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,				//  VkVideoComponentBitDepthFlagsKHR	lumaBitDepth;
259e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,				//  VkVideoComponentBitDepthFlagsKHR	chromaBitDepth;
260e5c31af7Sopenharmony_ci	};
261e5c31af7Sopenharmony_ci	const VkVideoProfileListInfoKHR					videoProfiles				=
262e5c31af7Sopenharmony_ci	{
263e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR,	//  VkStructureType				sType;
264e5c31af7Sopenharmony_ci		DE_NULL,										//  void*						pNext;
265e5c31af7Sopenharmony_ci		1u,												//  deUint32					profilesCount;
266e5c31af7Sopenharmony_ci		&videoProfile,									//  const VkVideoProfileInfoKHR*	pProfiles;
267e5c31af7Sopenharmony_ci	};
268e5c31af7Sopenharmony_ci
269e5c31af7Sopenharmony_ci	const VkPhysicalDeviceVideoFormatInfoKHR	videoFormatInfo				=
270e5c31af7Sopenharmony_ci	{
271e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR,	//  VkStructureType				sType;
272e5c31af7Sopenharmony_ci		const_cast<VkVideoProfileListInfoKHR *>(&videoProfiles),													//  const void*					pNext;
273e5c31af7Sopenharmony_ci		m_imageUsageFlags,											//  VkImageUsageFlags			imageUsage;
274e5c31af7Sopenharmony_ci	};
275e5c31af7Sopenharmony_ci	const VkImageUsageFlags						imageUsageFlagsDPB			= VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR | VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
276e5c31af7Sopenharmony_ci	const bool									imageUsageDPB				= (videoFormatInfo.imageUsage & imageUsageFlagsDPB) != 0;
277e5c31af7Sopenharmony_ci
278e5c31af7Sopenharmony_ci	{
279e5c31af7Sopenharmony_ci		const VkResult result = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, DE_NULL);
280e5c31af7Sopenharmony_ci
281e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
282e5c31af7Sopenharmony_ci		{
283e5c31af7Sopenharmony_ci			ostringstream failMsg;
284e5c31af7Sopenharmony_ci
285e5c31af7Sopenharmony_ci			failMsg << "Failed query call to vkGetPhysicalDeviceVideoFormatPropertiesKHR with " << result;
286e5c31af7Sopenharmony_ci
287e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
288e5c31af7Sopenharmony_ci		}
289e5c31af7Sopenharmony_ci
290e5c31af7Sopenharmony_ci		if (videoFormatPropertiesCount == 0)
291e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail("vkGetPhysicalDeviceVideoFormatPropertiesKHR reports 0 formats");
292e5c31af7Sopenharmony_ci	}
293e5c31af7Sopenharmony_ci
294e5c31af7Sopenharmony_ci	{
295e5c31af7Sopenharmony_ci		const VkVideoFormatPropertiesKHR		videoFormatPropertiesKHR	=
296e5c31af7Sopenharmony_ci		{
297e5c31af7Sopenharmony_ci			VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR,	//  VkStructureType		sType;
298e5c31af7Sopenharmony_ci			DE_NULL,										//  void*				pNext;
299e5c31af7Sopenharmony_ci			VK_FORMAT_MAX_ENUM,								//  VkFormat			format;
300e5c31af7Sopenharmony_ci			vk::makeComponentMappingIdentity(),				//  VkComponentMapping	componentMapping;
301e5c31af7Sopenharmony_ci			(VkImageCreateFlags)0u,							//  VkImageCreateFlags	imageCreateFlags;
302e5c31af7Sopenharmony_ci			VK_IMAGE_TYPE_2D,								//  VkImageType			imageType;
303e5c31af7Sopenharmony_ci			VK_IMAGE_TILING_OPTIMAL,						//  VkImageTiling		imageTiling;
304e5c31af7Sopenharmony_ci			VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR
305e5c31af7Sopenharmony_ci			| VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR,		//  VkImageUsageFlags	imageUsageFlags;
306e5c31af7Sopenharmony_ci		};
307e5c31af7Sopenharmony_ci		std::vector<VkVideoFormatPropertiesKHR>	videoFormatProperties		(videoFormatPropertiesCount, videoFormatPropertiesKHR);
308e5c31af7Sopenharmony_ci
309e5c31af7Sopenharmony_ci		const VkResult result = vk.getPhysicalDeviceVideoFormatPropertiesKHR(physicalDevice, &videoFormatInfo, &videoFormatPropertiesCount, videoFormatProperties.data());
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
312e5c31af7Sopenharmony_ci		{
313e5c31af7Sopenharmony_ci			ostringstream failMsg;
314e5c31af7Sopenharmony_ci
315e5c31af7Sopenharmony_ci			failMsg << "Failed query data call to vkGetPhysicalDeviceVideoFormatPropertiesKHR with " << result;
316e5c31af7Sopenharmony_ci
317e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
318e5c31af7Sopenharmony_ci		}
319e5c31af7Sopenharmony_ci
320e5c31af7Sopenharmony_ci		if (videoFormatPropertiesCount == 0)
321e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail("vkGetPhysicalDeviceVideoFormatPropertiesKHR reports 0 formats supported for chosen encding/decoding");
322e5c31af7Sopenharmony_ci
323e5c31af7Sopenharmony_ci		if (videoFormatPropertiesCount != videoFormatProperties.size())
324e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail("Number of formats returned is less than reported.");
325e5c31af7Sopenharmony_ci
326e5c31af7Sopenharmony_ci		for (const auto& videoFormatProperty: videoFormatProperties)
327e5c31af7Sopenharmony_ci		{
328e5c31af7Sopenharmony_ci			if (videoFormatProperty.format == VK_FORMAT_MAX_ENUM)
329e5c31af7Sopenharmony_ci				return tcu::TestStatus::fail("Format is not written");
330e5c31af7Sopenharmony_ci
331e5c31af7Sopenharmony_ci			if (videoFormatProperty.format == VK_FORMAT_UNDEFINED)
332e5c31af7Sopenharmony_ci			{
333e5c31af7Sopenharmony_ci				if (!imageUsageDPB)
334e5c31af7Sopenharmony_ci					TCU_FAIL("VK_FORMAT_UNDEFINED is allowed only for DPB image usage");
335e5c31af7Sopenharmony_ci
336e5c31af7Sopenharmony_ci				if (videoFormatProperties.size() != 1)
337e5c31af7Sopenharmony_ci					TCU_FAIL("VK_FORMAT_UNDEFINED must be the only format returned for opaque DPB");
338e5c31af7Sopenharmony_ci
339e5c31af7Sopenharmony_ci				testResult = true;
340e5c31af7Sopenharmony_ci
341e5c31af7Sopenharmony_ci				break;
342e5c31af7Sopenharmony_ci			}
343e5c31af7Sopenharmony_ci
344e5c31af7Sopenharmony_ci			if (videoFormatProperty.format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM ||
345e5c31af7Sopenharmony_ci				videoFormatProperty.format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM)
346e5c31af7Sopenharmony_ci			{
347e5c31af7Sopenharmony_ci				testResult = true;
348e5c31af7Sopenharmony_ci
349e5c31af7Sopenharmony_ci				break;
350e5c31af7Sopenharmony_ci			}
351e5c31af7Sopenharmony_ci		}
352e5c31af7Sopenharmony_ci	}
353e5c31af7Sopenharmony_ci
354e5c31af7Sopenharmony_ci	if (testResult)
355e5c31af7Sopenharmony_ci		return tcu::TestStatus::pass("Pass");
356e5c31af7Sopenharmony_ci	else
357e5c31af7Sopenharmony_ci		return tcu::TestStatus::fail("Fail");
358e5c31af7Sopenharmony_ci}
359e5c31af7Sopenharmony_ci
360e5c31af7Sopenharmony_citypedef VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH264ProfileInfoKHR> VideoFormatPropertiesQueryH264DecodeTestInstance;
361e5c31af7Sopenharmony_citypedef VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH264ProfileInfoEXT> VideoFormatPropertiesQueryH264EncodeTestInstance;
362e5c31af7Sopenharmony_citypedef VideoFormatPropertiesQueryTestInstance<VkVideoDecodeH265ProfileInfoKHR> VideoFormatPropertiesQueryH265DecodeTestInstance;
363e5c31af7Sopenharmony_citypedef VideoFormatPropertiesQueryTestInstance<VkVideoEncodeH265ProfileInfoEXT> VideoFormatPropertiesQueryH265EncodeTestInstance;
364e5c31af7Sopenharmony_ci
365e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryTestInstance : public VideoBaseTestInstance
366e5c31af7Sopenharmony_ci{
367e5c31af7Sopenharmony_cipublic:
368e5c31af7Sopenharmony_ci					VideoCapabilitiesQueryTestInstance	(Context& context, const CaseDef& data);
369e5c31af7Sopenharmony_ci					~VideoCapabilitiesQueryTestInstance	(void);
370e5c31af7Sopenharmony_ci
371e5c31af7Sopenharmony_ciprotected:
372e5c31af7Sopenharmony_ci	void			validateVideoCapabilities			(const VkVideoCapabilitiesKHR&			videoCapabilitiesKHR,
373e5c31af7Sopenharmony_ci														 const VkVideoCapabilitiesKHR&			videoCapabilitiesKHRSecond);
374e5c31af7Sopenharmony_ci	void			validateVideoDecodeCapabilities		(const VkVideoDecodeCapabilitiesKHR&	videoDecodeCapabilitiesKHR,
375e5c31af7Sopenharmony_ci														 const VkVideoDecodeCapabilitiesKHR&	videoDecodeCapabilitiesKHRSecond);
376e5c31af7Sopenharmony_ci	void			validateVideoEncodeCapabilities		(const VkVideoEncodeCapabilitiesKHR&	videoEncodeCapabilitiesKHR,
377e5c31af7Sopenharmony_ci														 const VkVideoEncodeCapabilitiesKHR&	videoEncodeCapabilitiesKHRSecond);
378e5c31af7Sopenharmony_ci	void			validateExtensionProperties			(const VkExtensionProperties&			extensionProperties,
379e5c31af7Sopenharmony_ci														 const VkExtensionProperties&			extensionPropertiesSecond);
380e5c31af7Sopenharmony_ci	CaseDef			m_caseDef;
381e5c31af7Sopenharmony_ci};
382e5c31af7Sopenharmony_ci
383e5c31af7Sopenharmony_ciVideoCapabilitiesQueryTestInstance::VideoCapabilitiesQueryTestInstance (Context& context, const CaseDef& data)
384e5c31af7Sopenharmony_ci	: VideoBaseTestInstance	(context)
385e5c31af7Sopenharmony_ci	, m_caseDef				(data)
386e5c31af7Sopenharmony_ci{
387e5c31af7Sopenharmony_ci	DE_UNREF(m_caseDef);
388e5c31af7Sopenharmony_ci}
389e5c31af7Sopenharmony_ci
390e5c31af7Sopenharmony_ciVideoCapabilitiesQueryTestInstance::~VideoCapabilitiesQueryTestInstance (void)
391e5c31af7Sopenharmony_ci{
392e5c31af7Sopenharmony_ci}
393e5c31af7Sopenharmony_ci
394e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryTestInstance::validateVideoCapabilities (const VkVideoCapabilitiesKHR&	videoCapabilitiesKHR,
395e5c31af7Sopenharmony_ci																	const VkVideoCapabilitiesKHR&	videoCapabilitiesKHRSecond)
396e5c31af7Sopenharmony_ci{
397e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
398e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
399e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minBitstreamBufferOffsetAlignment);
400e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minBitstreamBufferSizeAlignment);
401e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, pictureAccessGranularity);
402e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minCodedExtent);
403e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxCodedExtent);
404e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxDpbSlots);
405e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxActiveReferencePictures);
406e5c31af7Sopenharmony_ci	validateExtensionProperties(videoCapabilitiesKHR.stdHeaderVersion, videoCapabilitiesKHRSecond.stdHeaderVersion);
407e5c31af7Sopenharmony_ci
408e5c31af7Sopenharmony_ci	const VkVideoCapabilityFlagsKHR videoCapabilityFlagsKHR	= VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR
409e5c31af7Sopenharmony_ci															| VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR;
410e5c31af7Sopenharmony_ci
411e5c31af7Sopenharmony_ci	if ((videoCapabilitiesKHR.flags & ~videoCapabilityFlagsKHR) != 0)
412e5c31af7Sopenharmony_ci		TCU_FAIL("Undeclared videoCapabilitiesKHR.flags returned");
413e5c31af7Sopenharmony_ci
414e5c31af7Sopenharmony_ci	if (!deIsPowerOfTwo64(videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment))
415e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be Power-Of-Two: videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment");
416e5c31af7Sopenharmony_ci
417e5c31af7Sopenharmony_ci	if (!deIsPowerOfTwo64(videoCapabilitiesKHR.minBitstreamBufferSizeAlignment))
418e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be Power-Of-Two: videoCapabilitiesKHR.minBitstreamBufferSizeAlignment");
419e5c31af7Sopenharmony_ci
420e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment == 0)
421e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be non zero: videoCapabilitiesKHR.minBitstreamBufferOffsetAlignment");
422e5c31af7Sopenharmony_ci
423e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.minBitstreamBufferSizeAlignment == 0)
424e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be non zero: videoCapabilitiesKHR.minBitstreamBufferSizeAlignment");
425e5c31af7Sopenharmony_ci
426e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.pictureAccessGranularity.width == 0)
427e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be non-zero: videoCapabilitiesKHR.pictureAccessGranularity.width");
428e5c31af7Sopenharmony_ci
429e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.pictureAccessGranularity.height == 0)
430e5c31af7Sopenharmony_ci		TCU_FAIL("Expected to be non-zero: videoCapabilitiesKHR.pictureAccessGranularity.height");
431e5c31af7Sopenharmony_ci
432e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.minCodedExtent.width == 0 || videoCapabilitiesKHR.minCodedExtent.height == 0)
433e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.minCodedExtent");
434e5c31af7Sopenharmony_ci
435e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.maxCodedExtent.width < videoCapabilitiesKHR.minCodedExtent.width)
436e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.maxCodedExtent.width");
437e5c31af7Sopenharmony_ci
438e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.maxCodedExtent.height < videoCapabilitiesKHR.minCodedExtent.height)
439e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.maxCodedExtent.height");
440e5c31af7Sopenharmony_ci
441e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.maxDpbSlots == 0)
442e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.maxDpbSlots");
443e5c31af7Sopenharmony_ci
444e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.maxActiveReferencePictures == 0)
445e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.maxActiveReferencePictures");
446e5c31af7Sopenharmony_ci}
447e5c31af7Sopenharmony_ci
448e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryTestInstance::validateVideoDecodeCapabilities (const VkVideoDecodeCapabilitiesKHR&	videoDecodeCapabilitiesKHR,
449e5c31af7Sopenharmony_ci																		  const VkVideoDecodeCapabilitiesKHR&	videoDecodeCapabilitiesKHRSecond)
450e5c31af7Sopenharmony_ci{
451e5c31af7Sopenharmony_ci	const VkVideoDecodeCapabilityFlagsKHR	videoDecodeCapabilitiesFlags	= VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR
452e5c31af7Sopenharmony_ci																			| VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_DISTINCT_BIT_KHR;
453e5c31af7Sopenharmony_ci
454e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoDecodeCapabilitiesKHR, videoDecodeCapabilitiesKHRSecond, sType);
455e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoDecodeCapabilitiesKHR, videoDecodeCapabilitiesKHRSecond, flags);
456e5c31af7Sopenharmony_ci
457e5c31af7Sopenharmony_ci	if ((videoDecodeCapabilitiesKHR.flags & ~videoDecodeCapabilitiesFlags) != 0)
458e5c31af7Sopenharmony_ci		TCU_FAIL("Undefined videoDecodeCapabilitiesKHR.flags");
459e5c31af7Sopenharmony_ci}
460e5c31af7Sopenharmony_ci
461e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryTestInstance::validateVideoEncodeCapabilities (const VkVideoEncodeCapabilitiesKHR&	videoEncodeCapabilitiesKHR,
462e5c31af7Sopenharmony_ci																		  const VkVideoEncodeCapabilitiesKHR&	videoEncodeCapabilitiesKHRSecond)
463e5c31af7Sopenharmony_ci{
464e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, sType);
465e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, flags);
466e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, rateControlModes);
467e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, maxRateControlLayers);
468e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, maxQualityLevels);
469e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, encodeInputPictureGranularity);
470e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoEncodeCapabilitiesKHR, videoEncodeCapabilitiesKHRSecond, supportedEncodeFeedbackFlags);
471e5c31af7Sopenharmony_ci
472e5c31af7Sopenharmony_ci	const VkVideoEncodeCapabilityFlagsKHR		videoEncodeCapabilityFlags		= VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR;
473e5c31af7Sopenharmony_ci
474e5c31af7Sopenharmony_ci	if ((videoEncodeCapabilitiesKHR.flags & ~videoEncodeCapabilityFlags) != 0)
475e5c31af7Sopenharmony_ci		TCU_FAIL("Undeclared VkVideoEncodeCapabilitiesKHR.flags returned");
476e5c31af7Sopenharmony_ci
477e5c31af7Sopenharmony_ci	if (videoEncodeCapabilitiesKHR.maxRateControlLayers == 0)
478e5c31af7Sopenharmony_ci		TCU_FAIL("videoEncodeCapabilitiesKHR.maxRateControlLayers is zero. Implementations must report at least 1.");
479e5c31af7Sopenharmony_ci
480e5c31af7Sopenharmony_ci	if (videoEncodeCapabilitiesKHR.maxQualityLevels == 0)
481e5c31af7Sopenharmony_ci		TCU_FAIL("videoEncodeCapabilitiesKHR.maxQualityLevels is zero. Implementations must report at least 1.");
482e5c31af7Sopenharmony_ci}
483e5c31af7Sopenharmony_ci
484e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryTestInstance::validateExtensionProperties (const VkExtensionProperties&	extensionProperties,
485e5c31af7Sopenharmony_ci																	  const VkExtensionProperties&	extensionPropertiesSecond)
486e5c31af7Sopenharmony_ci{
487e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(extensionProperties, extensionPropertiesSecond, specVersion);
488e5c31af7Sopenharmony_ci
489e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < VK_MAX_EXTENSION_NAME_SIZE; ++ndx)
490e5c31af7Sopenharmony_ci	{
491e5c31af7Sopenharmony_ci		if (extensionProperties.extensionName[ndx] != extensionPropertiesSecond.extensionName[ndx])
492e5c31af7Sopenharmony_ci			TCU_FAIL("Unequal extensionProperties.extensionName");
493e5c31af7Sopenharmony_ci
494e5c31af7Sopenharmony_ci		if (extensionProperties.extensionName[ndx] == 0)
495e5c31af7Sopenharmony_ci			return;
496e5c31af7Sopenharmony_ci	}
497e5c31af7Sopenharmony_ci
498e5c31af7Sopenharmony_ci	TCU_FAIL("Non-zero terminated string extensionProperties.extensionName");
499e5c31af7Sopenharmony_ci}
500e5c31af7Sopenharmony_ci
501e5c31af7Sopenharmony_ci
502e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryH264DecodeTestInstance : public VideoCapabilitiesQueryTestInstance
503e5c31af7Sopenharmony_ci{
504e5c31af7Sopenharmony_cipublic:
505e5c31af7Sopenharmony_ci					VideoCapabilitiesQueryH264DecodeTestInstance	(Context& context, const CaseDef& data);
506e5c31af7Sopenharmony_ci	virtual			~VideoCapabilitiesQueryH264DecodeTestInstance	(void);
507e5c31af7Sopenharmony_ci	tcu::TestStatus	iterate											(void);
508e5c31af7Sopenharmony_ci
509e5c31af7Sopenharmony_ciprotected:
510e5c31af7Sopenharmony_ci	void			validateVideoCapabilitiesExt					(const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHR,
511e5c31af7Sopenharmony_ci																	 const VkVideoDecodeH264CapabilitiesKHR& videoCapabilitiesKHRSecond);
512e5c31af7Sopenharmony_ci};
513e5c31af7Sopenharmony_ci
514e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH264DecodeTestInstance::VideoCapabilitiesQueryH264DecodeTestInstance (Context& context, const CaseDef& data)
515e5c31af7Sopenharmony_ci	: VideoCapabilitiesQueryTestInstance(context, data)
516e5c31af7Sopenharmony_ci{
517e5c31af7Sopenharmony_ci}
518e5c31af7Sopenharmony_ci
519e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH264DecodeTestInstance::~VideoCapabilitiesQueryH264DecodeTestInstance (void)
520e5c31af7Sopenharmony_ci{
521e5c31af7Sopenharmony_ci}
522e5c31af7Sopenharmony_ci
523e5c31af7Sopenharmony_citcu::TestStatus VideoCapabilitiesQueryH264DecodeTestInstance::iterate (void)
524e5c31af7Sopenharmony_ci{
525e5c31af7Sopenharmony_ci	const InstanceInterface&				vk						= m_context.getInstanceInterface();
526e5c31af7Sopenharmony_ci	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
527e5c31af7Sopenharmony_ci	const VkVideoCodecOperationFlagBitsKHR	videoCodecOperation		= VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR;
528e5c31af7Sopenharmony_ci	const VkVideoDecodeH264ProfileInfoKHR		videoProfileOperation	=
529e5c31af7Sopenharmony_ci	{
530e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR,	//  VkStructureType							sType;
531e5c31af7Sopenharmony_ci		DE_NULL,												//  const void*								pNext;
532e5c31af7Sopenharmony_ci		STD_VIDEO_H264_PROFILE_IDC_BASELINE,					//  StdVideoH264ProfileIdc					stdProfileIdc;
533e5c31af7Sopenharmony_ci		VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_KHR,	//  VkVideoDecodeH264PictureLayoutFlagsEXT	pictureLayout;
534e5c31af7Sopenharmony_ci	};
535e5c31af7Sopenharmony_ci	const VkVideoProfileInfoKHR					videoProfile			=
536e5c31af7Sopenharmony_ci	{
537e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,			//  VkStructureType						sType;
538e5c31af7Sopenharmony_ci		(void*)&videoProfileOperation,					//  void*								pNext;
539e5c31af7Sopenharmony_ci		videoCodecOperation,							//  VkVideoCodecOperationFlagBitsKHR	videoCodecOperation;
540e5c31af7Sopenharmony_ci		VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,		//  VkVideoChromaSubsamplingFlagsKHR	chromaSubsampling;
541e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	lumaBitDepth;
542e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	chromaBitDepth;
543e5c31af7Sopenharmony_ci	};
544e5c31af7Sopenharmony_ci
545e5c31af7Sopenharmony_ci	VkVideoDecodeH264CapabilitiesKHR		videoDecodeH264Capabilities[2];
546e5c31af7Sopenharmony_ci	VkVideoDecodeCapabilitiesKHR			videoDecodeCapabilities[2];
547e5c31af7Sopenharmony_ci	VkVideoCapabilitiesKHR					videoCapabilites[2];
548e5c31af7Sopenharmony_ci
549e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
550e5c31af7Sopenharmony_ci	{
551e5c31af7Sopenharmony_ci		const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
552e5c31af7Sopenharmony_ci
553e5c31af7Sopenharmony_ci		deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
554e5c31af7Sopenharmony_ci		deMemset(&videoDecodeCapabilities[ndx], filling, sizeof(videoDecodeCapabilities[ndx]));
555e5c31af7Sopenharmony_ci		deMemset(&videoDecodeH264Capabilities[ndx], filling, sizeof(videoDecodeH264Capabilities[ndx]));
556e5c31af7Sopenharmony_ci
557e5c31af7Sopenharmony_ci		videoCapabilites[ndx].sType				= VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
558e5c31af7Sopenharmony_ci		videoCapabilites[ndx].pNext				= &videoDecodeCapabilities[ndx];
559e5c31af7Sopenharmony_ci		videoDecodeCapabilities[ndx].sType		= VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR;
560e5c31af7Sopenharmony_ci		videoDecodeCapabilities[ndx].pNext		= &videoDecodeH264Capabilities[ndx];
561e5c31af7Sopenharmony_ci		videoDecodeH264Capabilities[ndx].sType	= VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR;
562e5c31af7Sopenharmony_ci		videoDecodeH264Capabilities[ndx].pNext	= DE_NULL;
563e5c31af7Sopenharmony_ci
564e5c31af7Sopenharmony_ci		VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
565e5c31af7Sopenharmony_ci
566e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
567e5c31af7Sopenharmony_ci		{
568e5c31af7Sopenharmony_ci			ostringstream failMsg;
569e5c31af7Sopenharmony_ci
570e5c31af7Sopenharmony_ci			failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
571e5c31af7Sopenharmony_ci
572e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
573e5c31af7Sopenharmony_ci		}
574e5c31af7Sopenharmony_ci	}
575e5c31af7Sopenharmony_ci
576e5c31af7Sopenharmony_ci	validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
577e5c31af7Sopenharmony_ci	validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
578e5c31af7Sopenharmony_ci	validateVideoDecodeCapabilities(videoDecodeCapabilities[0], videoDecodeCapabilities[1]);
579e5c31af7Sopenharmony_ci	validateVideoCapabilitiesExt(videoDecodeH264Capabilities[0], videoDecodeH264Capabilities[1]);
580e5c31af7Sopenharmony_ci
581e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Pass");
582e5c31af7Sopenharmony_ci}
583e5c31af7Sopenharmony_ci
584e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryH264DecodeTestInstance::validateVideoCapabilitiesExt (const VkVideoDecodeH264CapabilitiesKHR&	videoCapabilitiesKHR,
585e5c31af7Sopenharmony_ci																				 const VkVideoDecodeH264CapabilitiesKHR&	videoCapabilitiesKHRSecond)
586e5c31af7Sopenharmony_ci{
587e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
588e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
589e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, fieldOffsetGranularity);
590e5c31af7Sopenharmony_ci}
591e5c31af7Sopenharmony_ci
592e5c31af7Sopenharmony_ci
593e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryH264EncodeTestInstance : public VideoCapabilitiesQueryTestInstance
594e5c31af7Sopenharmony_ci{
595e5c31af7Sopenharmony_cipublic:
596e5c31af7Sopenharmony_ci					VideoCapabilitiesQueryH264EncodeTestInstance	(Context& context, const CaseDef& data);
597e5c31af7Sopenharmony_ci	virtual			~VideoCapabilitiesQueryH264EncodeTestInstance	(void);
598e5c31af7Sopenharmony_ci	tcu::TestStatus	iterate											(void);
599e5c31af7Sopenharmony_ci
600e5c31af7Sopenharmony_ciprivate:
601e5c31af7Sopenharmony_ci	void			validateVideoCapabilitiesExt					(const VkVideoEncodeH264CapabilitiesEXT&	videoCapabilitiesKHR,
602e5c31af7Sopenharmony_ci																	 const VkVideoEncodeH264CapabilitiesEXT&	videoCapabilitiesKHRSecond);
603e5c31af7Sopenharmony_ci};
604e5c31af7Sopenharmony_ci
605e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH264EncodeTestInstance::VideoCapabilitiesQueryH264EncodeTestInstance (Context& context, const CaseDef& data)
606e5c31af7Sopenharmony_ci	: VideoCapabilitiesQueryTestInstance(context, data)
607e5c31af7Sopenharmony_ci{
608e5c31af7Sopenharmony_ci}
609e5c31af7Sopenharmony_ci
610e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH264EncodeTestInstance::~VideoCapabilitiesQueryH264EncodeTestInstance (void)
611e5c31af7Sopenharmony_ci{
612e5c31af7Sopenharmony_ci}
613e5c31af7Sopenharmony_ci
614e5c31af7Sopenharmony_citcu::TestStatus VideoCapabilitiesQueryH264EncodeTestInstance::iterate (void)
615e5c31af7Sopenharmony_ci{
616e5c31af7Sopenharmony_ci	const InstanceInterface&				vk						= m_context.getInstanceInterface();
617e5c31af7Sopenharmony_ci	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
618e5c31af7Sopenharmony_ci	const VkVideoCodecOperationFlagBitsKHR	videoCodecOperation		= VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT;
619e5c31af7Sopenharmony_ci	const VkVideoEncodeH264ProfileInfoEXT		videoProfileOperation	=
620e5c31af7Sopenharmony_ci	{
621e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT,	//  VkStructureType			sType;
622e5c31af7Sopenharmony_ci		DE_NULL,											//  const void*				pNext;
623e5c31af7Sopenharmony_ci		STD_VIDEO_H264_PROFILE_IDC_BASELINE,				//  StdVideoH264ProfileIdc	stdProfileIdc;
624e5c31af7Sopenharmony_ci	};
625e5c31af7Sopenharmony_ci	const VkVideoProfileInfoKHR				videoProfile				=
626e5c31af7Sopenharmony_ci	{
627e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,			//  VkStructureType						sType;
628e5c31af7Sopenharmony_ci		(void*)&videoProfileOperation,					//  void*								pNext;
629e5c31af7Sopenharmony_ci		videoCodecOperation,							//  VkVideoCodecOperationFlagBitsKHR	videoCodecOperation;
630e5c31af7Sopenharmony_ci		VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,		//  VkVideoChromaSubsamplingFlagsKHR	chromaSubsampling;
631e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	lumaBitDepth;
632e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	chromaBitDepth;
633e5c31af7Sopenharmony_ci	};
634e5c31af7Sopenharmony_ci	VkVideoEncodeH264CapabilitiesEXT	videoEncodeH264Capabilities[2];
635e5c31af7Sopenharmony_ci	VkVideoEncodeCapabilitiesKHR		videoEncodeCapabilities[2];
636e5c31af7Sopenharmony_ci	VkVideoCapabilitiesKHR				videoCapabilites[2];
637e5c31af7Sopenharmony_ci
638e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
639e5c31af7Sopenharmony_ci	{
640e5c31af7Sopenharmony_ci		const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
641e5c31af7Sopenharmony_ci
642e5c31af7Sopenharmony_ci		deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
643e5c31af7Sopenharmony_ci		deMemset(&videoEncodeCapabilities[ndx], filling, sizeof(videoEncodeCapabilities[ndx]));
644e5c31af7Sopenharmony_ci		deMemset(&videoEncodeH264Capabilities[ndx], filling, sizeof(videoEncodeH264Capabilities[ndx]));
645e5c31af7Sopenharmony_ci
646e5c31af7Sopenharmony_ci		videoCapabilites[ndx].sType				= VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
647e5c31af7Sopenharmony_ci		videoCapabilites[ndx].pNext				= &videoEncodeCapabilities[ndx];
648e5c31af7Sopenharmony_ci		videoEncodeCapabilities[ndx].sType		= VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR;
649e5c31af7Sopenharmony_ci		videoEncodeCapabilities[ndx].pNext		= &videoEncodeH264Capabilities[ndx];
650e5c31af7Sopenharmony_ci		videoEncodeH264Capabilities[ndx].sType	= VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT;
651e5c31af7Sopenharmony_ci		videoEncodeH264Capabilities[ndx].pNext	= DE_NULL;
652e5c31af7Sopenharmony_ci
653e5c31af7Sopenharmony_ci		VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
654e5c31af7Sopenharmony_ci
655e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
656e5c31af7Sopenharmony_ci		{
657e5c31af7Sopenharmony_ci			ostringstream failMsg;
658e5c31af7Sopenharmony_ci
659e5c31af7Sopenharmony_ci			failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
660e5c31af7Sopenharmony_ci
661e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
662e5c31af7Sopenharmony_ci		}
663e5c31af7Sopenharmony_ci	}
664e5c31af7Sopenharmony_ci
665e5c31af7Sopenharmony_ci	validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
666e5c31af7Sopenharmony_ci	validateVideoEncodeCapabilities(videoEncodeCapabilities[0], videoEncodeCapabilities[1]);
667e5c31af7Sopenharmony_ci	validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
668e5c31af7Sopenharmony_ci	validateVideoCapabilitiesExt(videoEncodeH264Capabilities[0], videoEncodeH264Capabilities[1]);
669e5c31af7Sopenharmony_ci
670e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Pass");
671e5c31af7Sopenharmony_ci}
672e5c31af7Sopenharmony_ci
673e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryH264EncodeTestInstance::validateVideoCapabilitiesExt (const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHR, const VkVideoEncodeH264CapabilitiesEXT& videoCapabilitiesKHRSecond)
674e5c31af7Sopenharmony_ci{
675e5c31af7Sopenharmony_ci	const VkVideoEncodeH264CapabilityFlagsEXT	videoCapabilityFlags			= VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_EXT
676e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_EXT
677e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_ROW_UNALIGNED_SLICE_BIT_EXT
678e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_DIFFERENT_SLICE_TYPE_BIT_EXT
679e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_EXT
680e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_EXT
681e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_EXT
682e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_EXT
683e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_EXT;
684e5c31af7Sopenharmony_ci
685e5c31af7Sopenharmony_ci
686e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
687e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
688e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
689e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxSliceCount);
690e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxPPictureL0ReferenceCount);
691e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBPictureL0ReferenceCount);
692e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxL1ReferenceCount);
693e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxTemporalLayerCount);
694e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, expectDyadicTemporalLayerPattern);
695e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minQp);
696e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxQp);
697e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, prefersGopRemainingFrames);
698e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, requiresGopRemainingFrames);
699e5c31af7Sopenharmony_ci
700e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.flags == 0)
701e5c31af7Sopenharmony_ci		TCU_FAIL("videoCapabilitiesKHR.flags must not be 0");
702e5c31af7Sopenharmony_ci
703e5c31af7Sopenharmony_ci	if ((videoCapabilitiesKHR.flags & ~videoCapabilityFlags) != 0)
704e5c31af7Sopenharmony_ci		TCU_FAIL("Undefined videoCapabilitiesKHR.flags");
705e5c31af7Sopenharmony_ci}
706e5c31af7Sopenharmony_ci
707e5c31af7Sopenharmony_ci
708e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryH265DecodeTestInstance : public VideoCapabilitiesQueryTestInstance
709e5c31af7Sopenharmony_ci{
710e5c31af7Sopenharmony_cipublic:
711e5c31af7Sopenharmony_ci					VideoCapabilitiesQueryH265DecodeTestInstance	(Context& context, const CaseDef& data);
712e5c31af7Sopenharmony_ci	virtual			~VideoCapabilitiesQueryH265DecodeTestInstance	(void);
713e5c31af7Sopenharmony_ci	tcu::TestStatus	iterate											(void);
714e5c31af7Sopenharmony_ci
715e5c31af7Sopenharmony_ciprotected:
716e5c31af7Sopenharmony_ci	void			validateVideoCapabilitiesExt					(const VkVideoDecodeH265CapabilitiesKHR&	videoCapabilitiesKHR,
717e5c31af7Sopenharmony_ci																	 const VkVideoDecodeH265CapabilitiesKHR&	videoCapabilitiesKHRSecond);
718e5c31af7Sopenharmony_ci};
719e5c31af7Sopenharmony_ci
720e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH265DecodeTestInstance::VideoCapabilitiesQueryH265DecodeTestInstance (Context& context, const CaseDef& data)
721e5c31af7Sopenharmony_ci	: VideoCapabilitiesQueryTestInstance(context, data)
722e5c31af7Sopenharmony_ci{
723e5c31af7Sopenharmony_ci}
724e5c31af7Sopenharmony_ci
725e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH265DecodeTestInstance::~VideoCapabilitiesQueryH265DecodeTestInstance (void)
726e5c31af7Sopenharmony_ci{
727e5c31af7Sopenharmony_ci}
728e5c31af7Sopenharmony_ci
729e5c31af7Sopenharmony_citcu::TestStatus VideoCapabilitiesQueryH265DecodeTestInstance::iterate (void)
730e5c31af7Sopenharmony_ci{
731e5c31af7Sopenharmony_ci	const InstanceInterface&				vk						= m_context.getInstanceInterface();
732e5c31af7Sopenharmony_ci	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
733e5c31af7Sopenharmony_ci	const VkVideoCodecOperationFlagBitsKHR	videoCodecOperation		= VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
734e5c31af7Sopenharmony_ci	const VkVideoDecodeH265ProfileInfoKHR		videoProfileOperation	=
735e5c31af7Sopenharmony_ci	{
736e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR,	//  VkStructureType			sType;
737e5c31af7Sopenharmony_ci		DE_NULL,											//  const void*				pNext;
738e5c31af7Sopenharmony_ci		STD_VIDEO_H265_PROFILE_IDC_MAIN,					//  StdVideoH265ProfileIdc	stdProfileIdc;
739e5c31af7Sopenharmony_ci	};
740e5c31af7Sopenharmony_ci	const VkVideoProfileInfoKHR					videoProfile			=
741e5c31af7Sopenharmony_ci	{
742e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,			//  VkStructureType						sType;
743e5c31af7Sopenharmony_ci		(void*)&videoProfileOperation,					//  void*								pNext;
744e5c31af7Sopenharmony_ci		videoCodecOperation,							//  VkVideoCodecOperationFlagBitsKHR	videoCodecOperation;
745e5c31af7Sopenharmony_ci		VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,		//  VkVideoChromaSubsamplingFlagsKHR	chromaSubsampling;
746e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	lumaBitDepth;
747e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	chromaBitDepth;
748e5c31af7Sopenharmony_ci	};
749e5c31af7Sopenharmony_ci	VkVideoDecodeH265CapabilitiesKHR	videoDecodeH265Capabilities[2];
750e5c31af7Sopenharmony_ci	VkVideoDecodeCapabilitiesKHR		videoDecodeCapabilities[2];
751e5c31af7Sopenharmony_ci	VkVideoCapabilitiesKHR				videoCapabilites[2];
752e5c31af7Sopenharmony_ci
753e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
754e5c31af7Sopenharmony_ci	{
755e5c31af7Sopenharmony_ci		const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
756e5c31af7Sopenharmony_ci
757e5c31af7Sopenharmony_ci		deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
758e5c31af7Sopenharmony_ci		deMemset(&videoDecodeCapabilities[ndx], filling, sizeof(videoDecodeCapabilities[ndx]));
759e5c31af7Sopenharmony_ci		deMemset(&videoDecodeH265Capabilities[ndx], filling, sizeof(videoDecodeH265Capabilities[ndx]));
760e5c31af7Sopenharmony_ci
761e5c31af7Sopenharmony_ci		videoCapabilites[ndx].sType				= VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
762e5c31af7Sopenharmony_ci		videoCapabilites[ndx].pNext				= &videoDecodeCapabilities[ndx];
763e5c31af7Sopenharmony_ci		videoDecodeCapabilities[ndx].sType		= VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR;
764e5c31af7Sopenharmony_ci		videoDecodeCapabilities[ndx].pNext		= &videoDecodeH265Capabilities[ndx];
765e5c31af7Sopenharmony_ci		videoDecodeH265Capabilities[ndx].sType	= VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR;
766e5c31af7Sopenharmony_ci		videoDecodeH265Capabilities[ndx].pNext	= DE_NULL;
767e5c31af7Sopenharmony_ci
768e5c31af7Sopenharmony_ci		VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
769e5c31af7Sopenharmony_ci
770e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
771e5c31af7Sopenharmony_ci		{
772e5c31af7Sopenharmony_ci			ostringstream failMsg;
773e5c31af7Sopenharmony_ci
774e5c31af7Sopenharmony_ci			failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
775e5c31af7Sopenharmony_ci
776e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
777e5c31af7Sopenharmony_ci		}
778e5c31af7Sopenharmony_ci	}
779e5c31af7Sopenharmony_ci
780e5c31af7Sopenharmony_ci	validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
781e5c31af7Sopenharmony_ci	validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
782e5c31af7Sopenharmony_ci	validateVideoDecodeCapabilities(videoDecodeCapabilities[0], videoDecodeCapabilities[1]);
783e5c31af7Sopenharmony_ci	validateVideoCapabilitiesExt(videoDecodeH265Capabilities[0], videoDecodeH265Capabilities[1]);
784e5c31af7Sopenharmony_ci
785e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Pass");
786e5c31af7Sopenharmony_ci}
787e5c31af7Sopenharmony_ci
788e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryH265DecodeTestInstance::validateVideoCapabilitiesExt (const VkVideoDecodeH265CapabilitiesKHR&	videoCapabilitiesKHR,
789e5c31af7Sopenharmony_ci																				 const VkVideoDecodeH265CapabilitiesKHR&	videoCapabilitiesKHRSecond)
790e5c31af7Sopenharmony_ci{
791e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
792e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
793e5c31af7Sopenharmony_ci}
794e5c31af7Sopenharmony_ci
795e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryH265EncodeTestInstance : public VideoCapabilitiesQueryTestInstance
796e5c31af7Sopenharmony_ci{
797e5c31af7Sopenharmony_cipublic:
798e5c31af7Sopenharmony_ci					VideoCapabilitiesQueryH265EncodeTestInstance	(Context& context, const CaseDef& data);
799e5c31af7Sopenharmony_ci	virtual			~VideoCapabilitiesQueryH265EncodeTestInstance	(void);
800e5c31af7Sopenharmony_ci	tcu::TestStatus	iterate											(void);
801e5c31af7Sopenharmony_ci
802e5c31af7Sopenharmony_ciprotected:
803e5c31af7Sopenharmony_ci	void			validateVideoCapabilitiesExt					(const VkVideoEncodeH265CapabilitiesEXT&	videoCapabilitiesKHR,
804e5c31af7Sopenharmony_ci																	 const VkVideoEncodeH265CapabilitiesEXT&	videoCapabilitiesKHRSecond);
805e5c31af7Sopenharmony_ci};
806e5c31af7Sopenharmony_ci
807e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH265EncodeTestInstance::VideoCapabilitiesQueryH265EncodeTestInstance (Context& context, const CaseDef& data)
808e5c31af7Sopenharmony_ci	: VideoCapabilitiesQueryTestInstance(context, data)
809e5c31af7Sopenharmony_ci{
810e5c31af7Sopenharmony_ci}
811e5c31af7Sopenharmony_ci
812e5c31af7Sopenharmony_ciVideoCapabilitiesQueryH265EncodeTestInstance::~VideoCapabilitiesQueryH265EncodeTestInstance (void)
813e5c31af7Sopenharmony_ci{
814e5c31af7Sopenharmony_ci}
815e5c31af7Sopenharmony_ci
816e5c31af7Sopenharmony_citcu::TestStatus VideoCapabilitiesQueryH265EncodeTestInstance::iterate (void)
817e5c31af7Sopenharmony_ci{
818e5c31af7Sopenharmony_ci	const InstanceInterface&				vk						= m_context.getInstanceInterface();
819e5c31af7Sopenharmony_ci	const VkPhysicalDevice					physicalDevice			= m_context.getPhysicalDevice();
820e5c31af7Sopenharmony_ci	const VkVideoCodecOperationFlagBitsKHR	videoCodecOperation		= VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT;
821e5c31af7Sopenharmony_ci	const VkVideoEncodeH265ProfileInfoEXT		videoProfileOperation	=
822e5c31af7Sopenharmony_ci	{
823e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT,	//  VkStructureType			sType;
824e5c31af7Sopenharmony_ci		DE_NULL,											//  const void*				pNext;
825e5c31af7Sopenharmony_ci		STD_VIDEO_H265_PROFILE_IDC_MAIN,					//  StdVideoH265ProfileIdc	stdProfileIdc;
826e5c31af7Sopenharmony_ci	};
827e5c31af7Sopenharmony_ci	const VkVideoProfileInfoKHR					videoProfile			=
828e5c31af7Sopenharmony_ci	{
829e5c31af7Sopenharmony_ci		VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR,			//  VkStructureType						sType;
830e5c31af7Sopenharmony_ci		(void*)&videoProfileOperation,					//  void*								pNext;
831e5c31af7Sopenharmony_ci		videoCodecOperation,							//  VkVideoCodecOperationFlagBitsKHR	videoCodecOperation;
832e5c31af7Sopenharmony_ci		VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR,		//  VkVideoChromaSubsamplingFlagsKHR	chromaSubsampling;
833e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	lumaBitDepth;
834e5c31af7Sopenharmony_ci		VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR,			//  VkVideoComponentBitDepthFlagsKHR	chromaBitDepth;
835e5c31af7Sopenharmony_ci	};
836e5c31af7Sopenharmony_ci	VkVideoEncodeH265CapabilitiesEXT	videoEncodeH265Capabilities[2];
837e5c31af7Sopenharmony_ci	VkVideoEncodeCapabilitiesKHR		videoEncodeCapabilities[2];
838e5c31af7Sopenharmony_ci	VkVideoCapabilitiesKHR				videoCapabilites[2];
839e5c31af7Sopenharmony_ci
840e5c31af7Sopenharmony_ci	for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(videoCapabilites); ++ndx)
841e5c31af7Sopenharmony_ci	{
842e5c31af7Sopenharmony_ci		const deUint8 filling = (ndx == 0) ? 0x00 : 0xFF;
843e5c31af7Sopenharmony_ci
844e5c31af7Sopenharmony_ci		deMemset(&videoCapabilites[ndx], filling, sizeof(videoCapabilites[ndx]));
845e5c31af7Sopenharmony_ci		deMemset(&videoEncodeCapabilities[ndx], filling, sizeof(videoEncodeCapabilities[ndx]));
846e5c31af7Sopenharmony_ci		deMemset(&videoEncodeH265Capabilities[ndx], filling, sizeof(videoEncodeH265Capabilities[ndx]));
847e5c31af7Sopenharmony_ci
848e5c31af7Sopenharmony_ci		videoCapabilites[ndx].sType				= VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
849e5c31af7Sopenharmony_ci		videoCapabilites[ndx].pNext				= &videoEncodeCapabilities[ndx];
850e5c31af7Sopenharmony_ci		videoEncodeCapabilities[ndx].sType		= VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR;
851e5c31af7Sopenharmony_ci		videoEncodeCapabilities[ndx].pNext		= &videoEncodeH265Capabilities[ndx];
852e5c31af7Sopenharmony_ci		videoEncodeH265Capabilities[ndx].sType	= VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT;
853e5c31af7Sopenharmony_ci		videoEncodeH265Capabilities[ndx].pNext	= DE_NULL;
854e5c31af7Sopenharmony_ci
855e5c31af7Sopenharmony_ci		VkResult result = vk.getPhysicalDeviceVideoCapabilitiesKHR(physicalDevice, &videoProfile, &videoCapabilites[ndx]);
856e5c31af7Sopenharmony_ci
857e5c31af7Sopenharmony_ci		if (result != VK_SUCCESS)
858e5c31af7Sopenharmony_ci		{
859e5c31af7Sopenharmony_ci			ostringstream failMsg;
860e5c31af7Sopenharmony_ci
861e5c31af7Sopenharmony_ci			failMsg << "Failed query call to vkGetPhysicalDeviceVideoCapabilitiesKHR with " << result << " at iteration " << ndx;
862e5c31af7Sopenharmony_ci
863e5c31af7Sopenharmony_ci			return tcu::TestStatus::fail(failMsg.str());
864e5c31af7Sopenharmony_ci		}
865e5c31af7Sopenharmony_ci	}
866e5c31af7Sopenharmony_ci
867e5c31af7Sopenharmony_ci	validateVideoCapabilities(videoCapabilites[0], videoCapabilites[1]);
868e5c31af7Sopenharmony_ci	validateVideoEncodeCapabilities(videoEncodeCapabilities[0], videoEncodeCapabilities[1]);
869e5c31af7Sopenharmony_ci	validateExtensionProperties(videoCapabilites[0].stdHeaderVersion, *getVideoExtensionProperties(videoCodecOperation));
870e5c31af7Sopenharmony_ci	validateVideoCapabilitiesExt(videoEncodeH265Capabilities[0], videoEncodeH265Capabilities[1]);
871e5c31af7Sopenharmony_ci
872e5c31af7Sopenharmony_ci	return tcu::TestStatus::pass("Pass");
873e5c31af7Sopenharmony_ci}
874e5c31af7Sopenharmony_ci
875e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryH265EncodeTestInstance::validateVideoCapabilitiesExt (const VkVideoEncodeH265CapabilitiesEXT&	videoCapabilitiesKHR,
876e5c31af7Sopenharmony_ci																				 const VkVideoEncodeH265CapabilitiesEXT&	videoCapabilitiesKHRSecond)
877e5c31af7Sopenharmony_ci{
878e5c31af7Sopenharmony_ci	const VkVideoEncodeH265CtbSizeFlagsEXT				ctbSizeFlags			= VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_EXT
879e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_EXT
880e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_EXT;
881e5c31af7Sopenharmony_ci	const VkVideoEncodeH265TransformBlockSizeFlagsEXT	transformBlockSizes		= VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_EXT
882e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_EXT
883e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_EXT
884e5c31af7Sopenharmony_ci																				| VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_EXT;
885e5c31af7Sopenharmony_ci
886e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, sType);
887e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, flags);
888e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxLevelIdc);
889e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxSliceSegmentCount);
890e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxTiles);
891e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxPPictureL0ReferenceCount);
892e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxBPictureL0ReferenceCount);
893e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxL1ReferenceCount);
894e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxSubLayerCount);
895e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, expectDyadicTemporalSubLayerPattern);
896e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, minQp);
897e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, maxQp);
898e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, prefersGopRemainingFrames);
899e5c31af7Sopenharmony_ci	VALIDATE_FIELD_EQUAL(videoCapabilitiesKHR, videoCapabilitiesKHRSecond, requiresGopRemainingFrames);
900e5c31af7Sopenharmony_ci
901e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.flags != 0)
902e5c31af7Sopenharmony_ci		TCU_FAIL("videoCapabilitiesKHR.flags must be 0");
903e5c31af7Sopenharmony_ci
904e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.ctbSizes == 0)
905e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.ctbSizes");
906e5c31af7Sopenharmony_ci
907e5c31af7Sopenharmony_ci	if ((videoCapabilitiesKHR.ctbSizes & ~ctbSizeFlags) != 0)
908e5c31af7Sopenharmony_ci		TCU_FAIL("Undefined videoCapabilitiesKHR.ctbSizeFlags");
909e5c31af7Sopenharmony_ci
910e5c31af7Sopenharmony_ci	if (videoCapabilitiesKHR.transformBlockSizes == 0)
911e5c31af7Sopenharmony_ci		TCU_FAIL("Invalid videoCapabilitiesKHR.transformBlockSizes");
912e5c31af7Sopenharmony_ci
913e5c31af7Sopenharmony_ci	if ((videoCapabilitiesKHR.transformBlockSizes & ~transformBlockSizes) != 0)
914e5c31af7Sopenharmony_ci		TCU_FAIL("Undefined videoCapabilitiesKHR.transformBlockSizes");
915e5c31af7Sopenharmony_ci}
916e5c31af7Sopenharmony_ci
917e5c31af7Sopenharmony_ci
918e5c31af7Sopenharmony_ciclass VideoCapabilitiesQueryTestCase : public TestCase
919e5c31af7Sopenharmony_ci{
920e5c31af7Sopenharmony_ci	public:
921e5c31af7Sopenharmony_ci							VideoCapabilitiesQueryTestCase	(tcu::TestContext& context, const char* name, const CaseDef caseDef);
922e5c31af7Sopenharmony_ci							~VideoCapabilitiesQueryTestCase	(void);
923e5c31af7Sopenharmony_ci
924e5c31af7Sopenharmony_ci	virtual TestInstance*	createInstance					(Context& context) const;
925e5c31af7Sopenharmony_ci	virtual void			checkSupport					(Context& context) const;
926e5c31af7Sopenharmony_ci
927e5c31af7Sopenharmony_ciprivate:
928e5c31af7Sopenharmony_ci	CaseDef					m_caseDef;
929e5c31af7Sopenharmony_ci};
930e5c31af7Sopenharmony_ci
931e5c31af7Sopenharmony_ciVideoCapabilitiesQueryTestCase::VideoCapabilitiesQueryTestCase (tcu::TestContext& context, const char* name, const CaseDef caseDef)
932e5c31af7Sopenharmony_ci	: vkt::TestCase	(context, name)
933e5c31af7Sopenharmony_ci	, m_caseDef		(caseDef)
934e5c31af7Sopenharmony_ci{
935e5c31af7Sopenharmony_ci}
936e5c31af7Sopenharmony_ci
937e5c31af7Sopenharmony_ciVideoCapabilitiesQueryTestCase::~VideoCapabilitiesQueryTestCase	(void)
938e5c31af7Sopenharmony_ci{
939e5c31af7Sopenharmony_ci}
940e5c31af7Sopenharmony_ci
941e5c31af7Sopenharmony_civoid VideoCapabilitiesQueryTestCase::checkSupport (Context& context) const
942e5c31af7Sopenharmony_ci{
943e5c31af7Sopenharmony_ci	context.requireDeviceFunctionality("VK_KHR_video_queue");
944e5c31af7Sopenharmony_ci
945e5c31af7Sopenharmony_ci	switch (m_caseDef.testType)
946e5c31af7Sopenharmony_ci	{
947e5c31af7Sopenharmony_ci		case TEST_TYPE_QUEUE_SUPPORT_QUERY:							break;
948e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
949e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	context.requireDeviceFunctionality("VK_KHR_video_decode_h264"); break;
950e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
951e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	context.requireDeviceFunctionality("VK_EXT_video_encode_h264"); break;
952e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:
953e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	context.requireDeviceFunctionality("VK_KHR_video_decode_h265"); break;
954e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:
955e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	context.requireDeviceFunctionality("VK_EXT_video_encode_h265"); break;
956e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY:				context.requireDeviceFunctionality("VK_KHR_video_decode_h264"); break;
957e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY:				context.requireDeviceFunctionality("VK_EXT_video_encode_h264"); break;
958e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY:				context.requireDeviceFunctionality("VK_KHR_video_decode_h265"); break;
959e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY:				context.requireDeviceFunctionality("VK_EXT_video_encode_h265"); break;
960e5c31af7Sopenharmony_ci		default:													TCU_THROW(NotSupportedError, "Unknown TestType");
961e5c31af7Sopenharmony_ci	}
962e5c31af7Sopenharmony_ci}
963e5c31af7Sopenharmony_ci
964e5c31af7Sopenharmony_ciTestInstance* VideoCapabilitiesQueryTestCase::createInstance (Context& context) const
965e5c31af7Sopenharmony_ci{
966e5c31af7Sopenharmony_ci	switch (m_caseDef.testType)
967e5c31af7Sopenharmony_ci	{
968e5c31af7Sopenharmony_ci		case TEST_TYPE_QUEUE_SUPPORT_QUERY:							return new VideoQueueQueryTestInstance(context, m_caseDef);
969e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH264DecodeTestInstance(context, m_caseDef);
970e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH264DecodeTestInstance(context, m_caseDef);
971e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH264EncodeTestInstance(context, m_caseDef);
972e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH264EncodeTestInstance(context, m_caseDef);
973e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH265DecodeTestInstance(context, m_caseDef);
974e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH265DecodeTestInstance(context, m_caseDef);
975e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH265EncodeTestInstance(context, m_caseDef);
976e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return new VideoFormatPropertiesQueryH265EncodeTestInstance(context, m_caseDef);
977e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY:				return new VideoCapabilitiesQueryH264DecodeTestInstance(context, m_caseDef);
978e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY:				return new VideoCapabilitiesQueryH264EncodeTestInstance(context, m_caseDef);
979e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY:				return new VideoCapabilitiesQueryH265DecodeTestInstance(context, m_caseDef);
980e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY:				return new VideoCapabilitiesQueryH265EncodeTestInstance(context, m_caseDef);
981e5c31af7Sopenharmony_ci		default:													TCU_THROW(NotSupportedError, "Unknown TestType");
982e5c31af7Sopenharmony_ci	}
983e5c31af7Sopenharmony_ci}
984e5c31af7Sopenharmony_ci
985e5c31af7Sopenharmony_ciconst char* getTestName (const TestType testType)
986e5c31af7Sopenharmony_ci{
987e5c31af7Sopenharmony_ci	switch (testType)
988e5c31af7Sopenharmony_ci	{
989e5c31af7Sopenharmony_ci		case TEST_TYPE_QUEUE_SUPPORT_QUERY:							return "queue_support_query";
990e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	return "h264_decode_dst_video_format_support_query";
991e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return "h264_decode_dpb_video_format_support_query";
992e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	return "h264_encode_src_video_format_support_query";
993e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return "h264_encode_dpb_video_format_support_query";
994e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DST_VIDEO_FORMAT_SUPPORT_QUERY:	return "h265_decode_dst_video_format_support_query";
995e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return "h265_decode_spb_video_format_support_query";
996e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_SRC_VIDEO_FORMAT_SUPPORT_QUERY:	return "h265_encode_src_video_format_support_query";
997e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_DPB_VIDEO_FORMAT_SUPPORT_QUERY:	return "h265_encode_dpb_video_format_support_query";
998e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_DECODE_CAPABILITIES_QUERY:				return "h264_decode_capabilities_query";
999e5c31af7Sopenharmony_ci		case TEST_TYPE_H264_ENCODE_CAPABILITIES_QUERY:				return "h264_encode_capabilities_query";
1000e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_DECODE_CAPABILITIES_QUERY:				return "h265_decode_capabilities_query";
1001e5c31af7Sopenharmony_ci		case TEST_TYPE_H265_ENCODE_CAPABILITIES_QUERY:				return "h265_encode_capabilities_query";
1002e5c31af7Sopenharmony_ci		default:													TCU_THROW(NotSupportedError, "Unknown TestType");
1003e5c31af7Sopenharmony_ci	}
1004e5c31af7Sopenharmony_ci}
1005e5c31af7Sopenharmony_ci}	// anonymous
1006e5c31af7Sopenharmony_ci
1007e5c31af7Sopenharmony_citcu::TestCaseGroup*	createVideoCapabilitiesTests (tcu::TestContext& testCtx)
1008e5c31af7Sopenharmony_ci{
1009e5c31af7Sopenharmony_ci	// Video encoding and decoding capability query tests
1010e5c31af7Sopenharmony_ci	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, "capabilities"));
1011e5c31af7Sopenharmony_ci
1012e5c31af7Sopenharmony_ci	for (int testTypeNdx = 0; testTypeNdx < TEST_TYPE_LAST; ++testTypeNdx)
1013e5c31af7Sopenharmony_ci	{
1014e5c31af7Sopenharmony_ci		const TestType	testType	= static_cast<TestType>(testTypeNdx);
1015e5c31af7Sopenharmony_ci		const CaseDef	caseDef		=
1016e5c31af7Sopenharmony_ci		{
1017e5c31af7Sopenharmony_ci			testType,	//  TestType	testType;
1018e5c31af7Sopenharmony_ci		};
1019e5c31af7Sopenharmony_ci
1020e5c31af7Sopenharmony_ci		group->addChild(new VideoCapabilitiesQueryTestCase(testCtx, getTestName(testType), caseDef));
1021e5c31af7Sopenharmony_ci	}
1022e5c31af7Sopenharmony_ci
1023e5c31af7Sopenharmony_ci	return group.release();
1024e5c31af7Sopenharmony_ci}
1025e5c31af7Sopenharmony_ci}	// video
1026e5c31af7Sopenharmony_ci}	// vkt
1027