vktApiFeatureInfo.cpp revision dc4227d5ec87080f5dad810b5e33ae3b3fa014a4
12cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman/*-------------------------------------------------------------------------
22cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman * Vulkan Conformance Tests
32cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman * ------------------------
42cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *
52cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman * Copyright (c) 2015 Google Inc.
62cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *
7d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * you may not use this file except in compliance with the License.
9d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * You may obtain a copy of the License at
102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *
11d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *
13d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * See the License for the specific language governing permissions and
17d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * limitations under the License.
182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *
192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *//*!
202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman * \file
212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman * \brief Api Feature Query tests
222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman *//*--------------------------------------------------------------------*/
232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vktApiFeatureInfo.hpp"
252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vktTestCaseUtil.hpp"
2766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos#include "vktTestGroupUtil.hpp"
282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
292cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vkPlatform.hpp"
302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vkStrUtil.hpp"
312cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vkRef.hpp"
322cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vkDeviceUtil.hpp"
332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "vkQueryUtil.hpp"
34c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#include "vkImageUtil.hpp"
35c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#include "vkApiVersion.hpp"
362cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
372cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "tcuTestLog.hpp"
382cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "tcuFormatUtil.hpp"
39c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#include "tcuTextureUtil.hpp"
40c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#include "tcuResultCollector.hpp"
412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
422cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "deUniquePtr.hpp"
4333878d45346dddf85669f610783939cad0d32817Maciej Jesionowski#include "deString.h"
4466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos#include "deStringUtil.hpp"
4566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos#include "deSTLUtil.hpp"
462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman#include "deMemory.h"
47444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman#include "deMath.h"
482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
49abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi#include <vector>
50abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi#include <set>
51abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi#include <string>
52abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmannamespace vkt
542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmannamespace api
562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmannamespace
582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanusing namespace vk;
612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanusing std::vector;
62abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärviusing std::set;
632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanusing std::string;
642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanusing tcu::TestLog;
652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanusing tcu::ScopedLogSection;
662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
672cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanenum
682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
69c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	GUARD_SIZE								= 0x20,			//!< Number of bytes to check
70c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	GUARD_VALUE								= 0xcd,			//!< Data pattern
712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman};
722cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
73c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulosstatic const VkDeviceSize MINIMUM_REQUIRED_IMAGE_RESOURCE_SIZE =	(1LLU<<31);	//!< Minimum value for VkImageFormatProperties::maxResourceSize (2GiB)
74c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanenum LimitFormat
762cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
772cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_FORMAT_SIGNED_INT,
782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_FORMAT_UNSIGNED_INT,
792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_FORMAT_FLOAT,
802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_FORMAT_DEVICE_SIZE,
81c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	LIMIT_FORMAT_BITMASK,
822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_FORMAT_LAST
842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman};
852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmanenum LimitType
872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_TYPE_MIN,
892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_TYPE_MAX,
90c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	LIMIT_TYPE_NONE,
912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	LIMIT_TYPE_LAST
932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman};
942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
955489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos#define LIMIT(_X_)		(deUint32)DE_OFFSET_OF(VkPhysicalDeviceLimits, _X_), (const char*)(#_X_)
965489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos#define FEATURE(_X_)	(deUint32)DE_OFFSET_OF(VkPhysicalDeviceFeatures, _X_)
97b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
98b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodmanbool validateFeatureLimits(VkPhysicalDeviceProperties* properties, VkPhysicalDeviceFeatures* features, TestLog& log)
992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
1005489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos	bool						limitsOk	= true;
1015489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos	VkPhysicalDeviceLimits*		limits		= &properties->limits;
1022cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	struct FeatureLimitTable
1032cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
1042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		deUint32		offset;
1055489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos		const char*		name;
1062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		deUint32		uintVal;			//!< Format is UNSIGNED_INT
1072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		deInt32			intVal;				//!< Format is SIGNED_INT
1082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		deUint64		deviceSizeVal;		//!< Format is DEVICE_SIZE
1092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		float			floatVal;			//!< Format is FLOAT
1102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		LimitFormat		format;
1112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		LimitType		type;
112b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deInt32			unsuppTableNdx;
1137a076bd01cd1de560fc3506a61c4c49d853a179bDavid Sodman	} featureLimitTable[] =   //!< From gitlab.khronos.org/vulkan/vulkan.git:doc/specs/vulkan/chapters/features.txt@63b23f3bb3ecd211cd6e448e2001ce1088dacd35
1142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
115444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxImageDimension1D),								4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
116444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxImageDimension2D),								4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
117444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxImageDimension3D),								256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
118444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxImageDimensionCube),								4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
119444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxImageArrayLayers),								256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN   , -1 },
120444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTexelBufferElements),							65536, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
121444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxUniformBufferRange),								16384, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
122c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(maxStorageBufferRange),								0, 0, 0, 0, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 },
123444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPushConstantsSize),								128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
124444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxMemoryAllocationCount),							4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
125c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(maxSamplerAllocationCount),							0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE , -1 },
126444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(bufferImageGranularity),							0, 0, 131072, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 },
127444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(sparseAddressSpaceSize),							0, 0, 2UL*1024*1024*1024, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 },
128444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxBoundDescriptorSets),							4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
129444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorSamplers),						16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
130444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorUniformBuffers),				12, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
131444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorStorageBuffers),				4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
132444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorSampledImages),				16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
133444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorStorageImages),				4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
134444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxPerStageDescriptorInputAttachments),				4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
135c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(maxPerStageResources),								0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE , -1 },
136444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetSamplers),							96, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
137444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetUniformBuffers),					72, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
138444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetUniformBuffersDynamic),				8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
139444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetStorageBuffers),					24, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
140444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetStorageBuffersDynamic),				4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
141444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetSampledImages),						96, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
142444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDescriptorSetStorageImages),						24, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
143c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(maxDescriptorSetInputAttachments),					0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE  , -1 },
144444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxVertexInputAttributes),							16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
145444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxVertexInputBindings),							16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
146444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxVertexInputAttributeOffset),						2047, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
147444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxVertexInputBindingStride),						2048, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
148444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxVertexOutputComponents),							64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
149444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationGenerationLevel),					64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
150444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationPatchSize),							32, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
151444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerVertexInputComponents),	64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
152444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerVertexOutputComponents),	64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
153444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerPatchOutputComponents),	120, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
154444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlTotalOutputComponents),		2048, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
155444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationEvaluationInputComponents),			64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
156444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationEvaluationOutputComponents),			64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
157444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryShaderInvocations),						32, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
158444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryInputComponents),						64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
159444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryOutputComponents),						64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
160444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryOutputVertices),							256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
161444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryTotalOutputComponents),					1024, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
162444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFragmentInputComponents),						64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
163444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFragmentOutputAttachments),						4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
164444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFragmentDualSrcAttachments),						1, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
165444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFragmentCombinedOutputResources),				4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN  , -1 },
166444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeSharedMemorySize),						16384, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN   , -1 },
167444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupCount[0]),						65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN   , -1 },
168444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupCount[1]),						65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN   , -1 },
169444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupCount[2]),						65535,  0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN   , -1 },
170444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupInvocations),					128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
171444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupSize[0]),						128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
172444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupSize[1]),						128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
173444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxComputeWorkGroupSize[2]),						64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
174444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(subPixelPrecisionBits),								4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
175444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(subTexelPrecisionBits),								4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
176444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(mipmapPrecisionBits),								4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
177444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDrawIndexedIndexValue),							(deUint32)~0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
178444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDrawIndirectCount),								65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN    , -1 },
179b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		{ LIMIT(maxSamplerLodBias),									0, 0, 0, 2.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
180b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		{ LIMIT(maxSamplerAnisotropy),								0, 0, 0, 16.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
181444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxViewports),										16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
182444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxViewportDimensions[0]),							4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
183444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxViewportDimensions[1]),							4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 },
184444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(viewportBoundsRange[0]),							0, 0, 0, -8192.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
185444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(viewportBoundsRange[1]),							0, 0, 0, 8191.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
186444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(viewportSubPixelBits),								0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
187444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minMemoryMapAlignment),								64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
188444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minTexelBufferOffsetAlignment),						256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MAX, -1 },
189444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minUniformBufferOffsetAlignment),					256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MAX, -1 },
190444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minStorageBufferOffsetAlignment),					256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MAX, -1 },
191444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minTexelOffset),									0, -8, 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MAX, -1 },
192444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTexelOffset),									7, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
193444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minTexelGatherOffset),								0, -8, 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MAX, -1 },
194444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTexelGatherOffset),								7, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
195b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		{ LIMIT(minInterpolationOffset),							0, 0, 0, -0.5f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
196444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxInterpolationOffset),							0, 0, 0, 0.5f - (1.0f/deFloatPow(2.0f, (float)limits->subPixelInterpolationOffsetBits)), LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
197444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(subPixelInterpolationOffsetBits),					4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
198444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFramebufferWidth),								4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
199444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFramebufferHeight),								4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
200c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(maxFramebufferLayers),								0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
201c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(framebufferColorSampleCounts),						VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
202c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(framebufferDepthSampleCounts),						VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
203c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(framebufferStencilSampleCounts),					VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
204c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(framebufferNoAttachmentsSampleCounts),				VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
205444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxColorAttachments),								4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
206c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(sampledImageColorSampleCounts),						VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
207c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(sampledImageIntegerSampleCounts),					VK_SAMPLE_COUNT_1_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
208c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(sampledImageDepthSampleCounts),						VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
209c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(sampledImageStencilSampleCounts),					VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
210c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(storageImageSampleCounts),							VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 },
211444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxSampleMaskWords),								1, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
212c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(timestampComputeAndGraphics),						0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 },
213c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(timestampPeriod),									0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 },
214444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxClipDistances),									8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
215444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxCullDistances),									8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
216444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxCombinedClipAndCullDistances),					8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 },
217c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(discreteQueuePriorities),							8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 },
218444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeRange[0]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
219444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeRange[1]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
220444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeRange[0]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
221444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeRange[1]),									0, 0, 0, 64.0f - limits->pointSizeGranularity , LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
222444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthRange[0]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
223444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthRange[1]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
224444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthRange[0]),									0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
225444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthRange[1]),									0, 0, 0, 8.0f - limits->lineWidthGranularity, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 },
226444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeGranularity),								0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
227444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthGranularity),								0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 },
228c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(strictLines),										0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_NONE, -1 },
229c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(standardSampleLocations),							0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_NONE, -1 },
230c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(optimalBufferCopyOffsetAlignment),					0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_NONE, -1 },
231c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(optimalBufferCopyRowPitchAlignment),				0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_NONE, -1 },
232444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(nonCoherentAtomSize),								0, 0, 128, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 },
233b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	};
234b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
2355489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos	const struct UnsupportedFeatureLimitTable
236b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	{
237b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deUint32		limitOffset;
2385489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos		const char*		name;
239b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deUint32		featureOffset;
240b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deUint32		uintVal;			//!< Format is UNSIGNED_INT
241b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deInt32			intVal;				//!< Format is SIGNED_INT
242b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		deUint64		deviceSizeVal;		//!< Format is DEVICE_SIZE
243b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		float			floatVal;			//!< Format is FLOAT
244b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	} unsupportedFeatureTable[] =
245b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	{
246444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(sparseAddressSpaceSize),							FEATURE(sparseBinding),					0, 0, 0, 0.0f },
247444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationGenerationLevel),					FEATURE(tessellationShader),			0, 0, 0, 0.0f },
248444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationPatchSize),							FEATURE(tessellationShader),			0, 0, 0, 0.0f },
249444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerVertexInputComponents),	FEATURE(tessellationShader),			0, 0, 0, 0.0f },
250444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerVertexOutputComponents),	FEATURE(tessellationShader),			0, 0, 0, 0.0f },
251444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlPerPatchOutputComponents),	FEATURE(tessellationShader),			0, 0, 0, 0.0f },
252444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationControlTotalOutputComponents),		FEATURE(tessellationShader),			0, 0, 0, 0.0f },
253444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationEvaluationInputComponents),			FEATURE(tessellationShader),			0, 0, 0, 0.0f },
254444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTessellationEvaluationOutputComponents),			FEATURE(tessellationShader),			0, 0, 0, 0.0f },
255444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryShaderInvocations),						FEATURE(geometryShader),				0, 0, 0, 0.0f },
256444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryInputComponents),						FEATURE(geometryShader),				0, 0, 0, 0.0f },
257444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryOutputComponents),						FEATURE(geometryShader),				0, 0, 0, 0.0f },
258444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryOutputVertices),							FEATURE(geometryShader),				0, 0, 0, 0.0f },
259444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxGeometryTotalOutputComponents),					FEATURE(geometryShader),				0, 0, 0, 0.0f },
260444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxFragmentDualSrcAttachments),						FEATURE(dualSrcBlend),					0, 0, 0, 0.0f },
261444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDrawIndexedIndexValue),							FEATURE(fullDrawIndexUint32),			(1<<24)-1, 0, 0, 0.0f },
262444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxDrawIndirectCount),								FEATURE(multiDrawIndirect),				1, 0, 0, 0.0f },
263444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxSamplerAnisotropy),								FEATURE(samplerAnisotropy),				1, 0, 0, 0.0f },
264444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxViewports),										FEATURE(multiViewport),					1, 0, 0, 0.0f },
265444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minTexelGatherOffset),								FEATURE(shaderImageGatherExtended),		0, 0, 0, 0.0f },
266444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxTexelGatherOffset),								FEATURE(shaderImageGatherExtended),		0, 0, 0, 0.0f },
267444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(minInterpolationOffset),							FEATURE(sampleRateShading),				0, 0, 0, 0.0f },
268444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxInterpolationOffset),							FEATURE(sampleRateShading),				0, 0, 0, 0.0f },
269444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(subPixelInterpolationOffsetBits),					FEATURE(sampleRateShading),				0, 0, 0, 0.0f },
270c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ LIMIT(storageImageSampleCounts),							FEATURE(shaderStorageImageMultisample),	VK_SAMPLE_COUNT_1_BIT, 0, 0, 0.0f },
271444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxClipDistances),									FEATURE(shaderClipDistance),			0, 0, 0, 0.0f },
272444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxCullDistances),									FEATURE(shaderClipDistance),			0, 0, 0, 0.0f },
273444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(maxCombinedClipAndCullDistances),					FEATURE(shaderClipDistance),			0, 0, 0, 0.0f },
2742a5e097662a19e991f345cffac9500bfd58386a8David Sodman		{ LIMIT(pointSizeRange[0]),									FEATURE(largePoints),					0, 0, 0, 1.0f },
275444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeRange[1]),									FEATURE(largePoints),					0, 0, 0, 1.0f },
276444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthRange[0]),									FEATURE(wideLines),						0, 0, 0, 1.0f },
2772a5e097662a19e991f345cffac9500bfd58386a8David Sodman		{ LIMIT(lineWidthRange[1]),									FEATURE(wideLines),						0, 0, 0, 1.0f },
278444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(pointSizeGranularity),								FEATURE(largePoints),					0, 0, 0, 0.0f },
279444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman		{ LIMIT(lineWidthGranularity),								FEATURE(wideLines),						0, 0, 0, 0.0f }
2802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	};
2812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
2822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Message << *limits << TestLog::EndMessage;
2832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
284b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	//!< First build a map from limit to unsupported table index
285b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
286b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	{
287b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		for (deUint32 unsuppNdx = 0; unsuppNdx < DE_LENGTH_OF_ARRAY(unsupportedFeatureTable); unsuppNdx++)
288b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		{
289b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			if (unsupportedFeatureTable[unsuppNdx].limitOffset == featureLimitTable[ndx].offset)
290b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			{
291b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				featureLimitTable[ndx].unsuppTableNdx = unsuppNdx;
292b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				break;
293b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			}
294b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman		}
295b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	}
296b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
2972cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++)
2982cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
2992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		switch (featureLimitTable[ndx].format)
3002cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
3012cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			case LIMIT_FORMAT_UNSIGNED_INT:
302b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			{
303b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				deUint32 limitToCheck = featureLimitTable[ndx].uintVal;
304b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				if (featureLimitTable[ndx].unsuppTableNdx != -1)
305b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				{
306c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE)
307b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman						limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].uintVal;
308b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				}
309b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
310c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN)
3112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
312b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
313c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck)
3142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit Validation failed " << featureLimitTable[ndx].name
3162cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MIN - actual is "
317c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deUint32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
321c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX)
3222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
323c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck)
3242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed,  " << featureLimitTable[ndx].name
3262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MAX - actual is "
327c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deUint32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3292cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
3312cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				break;
332b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			}
3332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
3342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			case LIMIT_FORMAT_FLOAT:
335b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			{
336b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				float limitToCheck = featureLimitTable[ndx].floatVal;
337b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				if (featureLimitTable[ndx].unsuppTableNdx != -1)
338b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				{
339c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE)
340b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman						limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].floatVal;
341b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				}
342b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
343c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN)
3442cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
345c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((float*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck)
3462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3472cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
3482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MIN - actual is "
349c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((float*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
353c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX)
3542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
355c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((float*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck)
3562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
3582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MAX actual is "
359c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((float*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
3632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				break;
364b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			}
3652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
3662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			case LIMIT_FORMAT_SIGNED_INT:
367b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			{
368b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				deInt32 limitToCheck = featureLimitTable[ndx].intVal;
369b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				if (featureLimitTable[ndx].unsuppTableNdx != -1)
370b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				{
371c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE)
372b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman						limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].intVal;
373b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				}
3742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN)
3752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
376c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deInt32*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck)
3772cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message <<  "limit validation failed, " << featureLimitTable[ndx].name
3792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MIN actual is "
380c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deInt32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
384c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX)
3852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
386c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deInt32*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck)
3872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
3882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
3892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MAX actual is "
390c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deInt32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
3912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
3922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
3932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
3942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				break;
395b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			}
3962cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
3972cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			case LIMIT_FORMAT_DEVICE_SIZE:
398b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			{
399b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				deUint64 limitToCheck = featureLimitTable[ndx].deviceSizeVal;
400b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				if (featureLimitTable[ndx].unsuppTableNdx != -1)
401b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				{
402c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE)
403b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman						limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].deviceSizeVal;
404b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman				}
405b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman
406c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN)
4072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
408c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deUint64*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck)
4092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
4102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
4112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MIN actual is "
412c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
4132cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
4142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
4152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
416c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX)
4172cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				{
418c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((deUint64*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck)
4192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					{
4202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
4212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman							<< " not valid-limit type MAX actual is "
422c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
423c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos						limitsOk = false;
424c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					}
425c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				}
426c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				break;
427c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			}
428c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
429c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			case LIMIT_FORMAT_BITMASK:
430c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			{
431c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				deUint32 limitToCheck = featureLimitTable[ndx].uintVal;
432c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (featureLimitTable[ndx].unsuppTableNdx != -1)
433c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				{
434c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE)
435c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos						limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].uintVal;
436c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				}
437c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
438c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN)
439c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				{
440c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					if ((*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) & limitToCheck) != limitToCheck)
441c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					{
442c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos						log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name
443c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< " not valid-limit type bitmask actual is "
444c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							<< *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage;
4452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman						limitsOk = false;
4462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman					}
4472cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				}
4482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				break;
449b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman			}
4502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
4512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			default:
4522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				DE_ASSERT(0);
4532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				limitsOk = false;
4542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
4552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
4562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
457c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(limits->maxViewportDimensions); ndx++)
458c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
459c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (limits->maxImageDimension2D > limits->maxViewportDimensions[ndx])
460c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
461c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "limit validation failed, maxImageDimension2D of " << limits->maxImageDimension2D
462c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				<< "is larger than maxViewportDimension[" << ndx << "] of " << limits->maxViewportDimensions[ndx] << TestLog::EndMessage;
463c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			limitsOk = false;
464c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
465c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
466c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
467c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (limits->viewportBoundsRange[0] > -2 * limits->maxViewportDimensions[0])
468c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
469c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "limit validation failed, viewPortBoundsRange[0] of " << limits->viewportBoundsRange[0]
470c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			<< "is larger than -2*maxViewportDimension[0] of " << -2*limits->maxViewportDimensions[0] << TestLog::EndMessage;
471c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		limitsOk = false;
472c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
473c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
474c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (limits->viewportBoundsRange[1] < 2 * limits->maxViewportDimensions[1] - 1)
475c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
476c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "limit validation failed, viewportBoundsRange[1] of " << limits->viewportBoundsRange[1]
477c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			<< "is less than 2*maxViewportDimension[1] of " << 2*limits->maxViewportDimensions[1] << TestLog::EndMessage;
478c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		limitsOk = false;
479c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
480c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
4812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return limitsOk;
4822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
4832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
4842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumeratePhysicalDevices (Context& context)
4852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
4862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&						log		= context.getTestContext().getLog();
4872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	const vector<VkPhysicalDevice>	devices	= enumeratePhysicalDevices(context.getInstanceInterface(), context.getInstance());
4882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
4892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Integer("NumDevices", "Number of devices", "", QP_KEY_TAG_NONE, deInt64(devices.size()));
4902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
4912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (size_t ndx = 0; ndx < devices.size(); ndx++)
4922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		log << TestLog::Message << ndx << ": " << devices[ndx] << TestLog::EndMessage;
4932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
4942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return tcu::TestStatus::pass("Enumerating devices succeeded");
4952cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
4962cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
497abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvitemplate<typename T>
498abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvivoid collectDuplicates (set<T>& duplicates, const vector<T>& values)
499abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{
500abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	set<T> seen;
501abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
502abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	for (size_t ndx = 0; ndx < values.size(); ndx++)
503abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	{
504abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		const T& value = values[ndx];
505abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
506abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		if (!seen.insert(value).second)
507abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			duplicates.insert(value);
508abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	}
509abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi}
510abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
511abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvibool checkDuplicates (TestLog& log, const char* what, const vector<string>& values)
512abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{
513abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	set<string> duplicates;
514abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
515abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	collectDuplicates(duplicates, values);
516abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
517abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	if (duplicates.empty())
518abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	{
519abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return true;
520abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	}
521abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	else
522abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	{
523abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		for (set<string>::const_iterator iter = duplicates.begin(); iter != duplicates.end(); ++iter)
524abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			log << TestLog::Message << "Duplicate " << what << ": " << *iter << TestLog::EndMessage;
525abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
526abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return false;
527abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	}
528abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi}
529abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
530abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvibool checkDuplicateExtensions (TestLog& log, const vector<string>& extensions)
531abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{
532abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	return checkDuplicates(log, "extension", extensions);
533abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi}
534abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
535abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvibool checkDuplicateLayers (TestLog& log, const vector<string>& layers)
536abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{
537abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	return checkDuplicates(log, "layer", layers);
538abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi}
539abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
5402cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateInstanceLayers (Context& context)
5412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
542abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	TestLog&						log					= context.getTestContext().getLog();
543abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	const vector<VkLayerProperties>	properties			= enumerateInstanceLayerProperties(context.getPlatformInterface());
544abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	vector<string>					layerNames;
5452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (size_t ndx = 0; ndx < properties.size(); ndx++)
547abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	{
5482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage;
5492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
550abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		layerNames.push_back(properties[ndx].layerName);
551abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	}
552abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
553abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	if (checkDuplicateLayers(log, layerNames))
554abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::pass("Enumerating layers succeeded");
555abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	else
556abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::fail("Duplicate layers");
5572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
5582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateInstanceExtensions (Context& context)
5602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
561abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	TestLog&	log						= context.getTestContext().getLog();
562abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	bool		hasDuplicateExtensions	= false;
5632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
5652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const ScopedLogSection				section		(log, "Global", "Global Extensions");
5662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const vector<VkExtensionProperties>	properties	= enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL);
567abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		vector<string>						extensionNames;
5682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5692cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		for (size_t ndx = 0; ndx < properties.size(); ndx++)
570abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		{
5712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage;
572abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
573abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			extensionNames.push_back(properties[ndx].extensionName);
574abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		}
575abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
576abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		if (!checkDuplicateExtensions(log, extensionNames))
577abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			hasDuplicateExtensions = true;
5782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
5792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
5812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const vector<VkLayerProperties>	layers	= enumerateInstanceLayerProperties(context.getPlatformInterface());
5822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer)
5842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
585abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			const ScopedLogSection				section				(log, layer->layerName, string("Layer: ") + layer->layerName);
586abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			const vector<VkExtensionProperties>	properties			= enumerateInstanceExtensionProperties(context.getPlatformInterface(), layer->layerName);
587abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			vector<string>						extensionNames;
5882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
5892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			for (size_t extNdx = 0; extNdx < properties.size(); extNdx++)
590abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			{
5912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				log << TestLog::Message << extNdx << ": " << properties[extNdx] << TestLog::EndMessage;
592abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
593abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi				extensionNames.push_back(properties[extNdx].extensionName);
594abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			}
595abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
596abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			if (!checkDuplicateExtensions(log, extensionNames))
597abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi				hasDuplicateExtensions = true;
5982cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
5992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
6002cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
601abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	if (hasDuplicateExtensions)
602abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::fail("Duplicate extensions");
603abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	else
604abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::pass("Enumerating extensions succeeded");
6052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
6062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateDeviceLayers (Context& context)
6082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
6092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&						log			= context.getTestContext().getLog();
6102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	const vector<VkLayerProperties>	properties	= vk::enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice());
611abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	vector<string>					layerNames;
6122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6132cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (size_t ndx = 0; ndx < properties.size(); ndx++)
614abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	{
6152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage;
6162cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
617abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		layerNames.push_back(properties[ndx].layerName);
618abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	}
619abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
620abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	if (checkDuplicateLayers(log, layerNames))
621abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::pass("Enumerating layers succeeded");
622abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	else
623abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::fail("Duplicate layers");
6242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
6252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateDeviceExtensions (Context& context)
6272cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
628abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	TestLog&	log						= context.getTestContext().getLog();
629abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	bool		hasDuplicateExtensions	= false;
6302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6312cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
6322cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const ScopedLogSection				section		(log, "Global", "Global Extensions");
6332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const vector<VkExtensionProperties>	properties	= enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
634abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		vector<string>						extensionNames;
6352cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6362cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		for (size_t ndx = 0; ndx < properties.size(); ndx++)
637abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		{
6382cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage;
639abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
640abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			extensionNames.push_back(properties[ndx].extensionName);
641abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		}
642abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
643abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		if (!checkDuplicateExtensions(log, extensionNames))
644abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			hasDuplicateExtensions = true;
6452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
6462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6472cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
6482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		const vector<VkLayerProperties>	layers	= enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice());
6492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer)
6512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
6522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			const ScopedLogSection				section		(log, layer->layerName, string("Layer: ") + layer->layerName);
6532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			const vector<VkExtensionProperties>	properties	= enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), layer->layerName);
654abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			vector<string>						extensionNames;
6552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
6562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			for (size_t extNdx = 0; extNdx < properties.size(); extNdx++)
657abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			{
6582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman				log << TestLog::Message << extNdx << ": " << properties[extNdx] << TestLog::EndMessage;
659abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
660abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
661abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi				extensionNames.push_back(properties[extNdx].extensionName);
662abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			}
663abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi
664abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi			if (!checkDuplicateExtensions(log, extensionNames))
665abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi				hasDuplicateExtensions = true;
6662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
6672cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
6682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
669abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	if (hasDuplicateExtensions)
670abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::fail("Duplicate extensions");
671abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi	else
672abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi		return tcu::TestStatus::pass("Enumerating extensions succeeded");
6732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
6742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
675c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#define VK_SIZE_OF(STRUCT, MEMBER)					(sizeof(((STRUCT*)0)->MEMBER))
6765489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos#define OFFSET_TABLE_ENTRY(STRUCT, MEMBER)			{ (size_t)DE_OFFSET_OF(STRUCT, MEMBER), VK_SIZE_OF(STRUCT, MEMBER) }
677c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
6782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceFeatures (Context& context)
6792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
6802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&						log			= context.getTestContext().getLog();
6812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	VkPhysicalDeviceFeatures*		features;
6822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deUint8							buffer[sizeof(VkPhysicalDeviceFeatures) + GUARD_SIZE];
6832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
684c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	const QueryMemberTableEntry featureOffsetTable[] =
685c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
686c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, robustBufferAccess),
687c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fullDrawIndexUint32),
688c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, imageCubeArray),
689c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, independentBlend),
690c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, geometryShader),
691c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, tessellationShader),
692c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sampleRateShading),
693c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, dualSrcBlend),
694c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, logicOp),
695c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, multiDrawIndirect),
696c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, drawIndirectFirstInstance),
697c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthClamp),
698c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthBiasClamp),
699c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fillModeNonSolid),
700c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthBounds),
701c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, wideLines),
702c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, largePoints),
703c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, alphaToOne),
704c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, multiViewport),
705c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, samplerAnisotropy),
706c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionETC2),
707c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionASTC_LDR),
708c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionBC),
709c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, occlusionQueryPrecise),
710c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, pipelineStatisticsQuery),
711c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, vertexPipelineStoresAndAtomics),
712c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fragmentStoresAndAtomics),
713c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderTessellationAndGeometryPointSize),
714c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderImageGatherExtended),
715c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageExtendedFormats),
716c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageMultisample),
717c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageReadWithoutFormat),
718c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageWriteWithoutFormat),
719c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderUniformBufferArrayDynamicIndexing),
720c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderSampledImageArrayDynamicIndexing),
721c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageBufferArrayDynamicIndexing),
722c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageArrayDynamicIndexing),
723c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderClipDistance),
724c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderCullDistance),
725c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderFloat64),
726c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderInt64),
727c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderInt16),
728c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderResourceResidency),
729c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderResourceMinLod),
730c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseBinding),
731c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyBuffer),
732c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyImage2D),
733c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyImage3D),
734c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency2Samples),
735c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency4Samples),
736c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency8Samples),
737c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency16Samples),
738c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyAliased),
739c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, variableMultisampleRate),
740c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, inheritedQueries),
741c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ 0, 0 }
742c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
743c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
744c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
7452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deMemset(buffer, GUARD_VALUE, sizeof(buffer));
7462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	features = reinterpret_cast<VkPhysicalDeviceFeatures*>(buffer);
7472cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
7482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), features);
7492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
7502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage
7512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		<< TestLog::Message << *features << TestLog::EndMessage;
7522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
753c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (!features->robustBufferAccess)
754c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("robustBufferAccess is not supported");
755c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
7562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (int ndx = 0; ndx < GUARD_SIZE; ndx++)
7572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
7582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		if (buffer[ndx + sizeof(VkPhysicalDeviceFeatures)] != GUARD_VALUE)
7592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
7602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			log << TestLog::Message << "deviceFeatures - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
7612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			return tcu::TestStatus::fail("deviceFeatures buffer overflow");
7622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
7632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
7642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
765c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (!validateInitComplete(context.getPhysicalDevice(), &InstanceInterface::getPhysicalDeviceFeatures, context.getInstanceInterface(), featureOffsetTable))
766c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
767c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "deviceFeatures - VkPhysicalDeviceFeatures not completely initialized" << TestLog::EndMessage;
768c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("deviceFeatures incomplete initialization");
769c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
770c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
771c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
7722cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return tcu::TestStatus::pass("Query succeeded");
7732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
7742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
7752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceProperties (Context& context)
7762cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
7772cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&						log			= context.getTestContext().getLog();
7782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	VkPhysicalDeviceProperties*		props;
779b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	VkPhysicalDeviceFeatures		features;
7802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deUint8							buffer[sizeof(VkPhysicalDeviceProperties) + GUARD_SIZE];
7812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
7829312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos	const QueryMemberTableEntry physicalDevicePropertiesOffsetTable[] =
783c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
7849312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, apiVersion),
7859312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, driverVersion),
7869312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, vendorID),
7879312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, deviceID),
7889312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, deviceType),
7899312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, pipelineCacheUUID),
7909312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension1D),
7919312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension2D),
7929312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension3D),
7939312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimensionCube),
7949312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageArrayLayers),
7959312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelBufferElements),
7969312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxUniformBufferRange),
7979312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxStorageBufferRange),
7989312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPushConstantsSize),
7999312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxMemoryAllocationCount),
8009312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerAllocationCount),
8019312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.bufferImageGranularity),
8029312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sparseAddressSpaceSize),
8039312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxBoundDescriptorSets),
8049312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorSamplers),
8059312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorUniformBuffers),
8069312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorStorageBuffers),
8079312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorSampledImages),
8089312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorStorageImages),
8099312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorInputAttachments),
8109312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageResources),
8119312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetSamplers),
8129312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetUniformBuffers),
8139312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetUniformBuffersDynamic),
8149312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageBuffers),
8159312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageBuffersDynamic),
8169312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetSampledImages),
8179312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageImages),
8189312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetInputAttachments),
8199312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputAttributes),
8209312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputBindings),
8219312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputAttributeOffset),
8229312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputBindingStride),
8239312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexOutputComponents),
8249312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationGenerationLevel),
8259312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationPatchSize),
8269312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerVertexInputComponents),
8279312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerVertexOutputComponents),
8289312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerPatchOutputComponents),
8299312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlTotalOutputComponents),
8309312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationEvaluationInputComponents),
8319312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationEvaluationOutputComponents),
8329312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryShaderInvocations),
8339312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryInputComponents),
8349312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryOutputComponents),
8359312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryOutputVertices),
8369312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryTotalOutputComponents),
8379312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentInputComponents),
8389312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentOutputAttachments),
8399312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentDualSrcAttachments),
8409312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentCombinedOutputResources),
8419312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeSharedMemorySize),
8429312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupCount[3]),
8439312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupInvocations),
8449312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupSize[3]),
8459312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subPixelPrecisionBits),
8469312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subTexelPrecisionBits),
8479312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.mipmapPrecisionBits),
8489312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDrawIndexedIndexValue),
8499312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDrawIndirectCount),
8509312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerLodBias),
8519312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerAnisotropy),
8529312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxViewports),
8539312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxViewportDimensions[2]),
8549312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.viewportBoundsRange[2]),
8559312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.viewportSubPixelBits),
8569312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minMemoryMapAlignment),
8579312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelBufferOffsetAlignment),
8589312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minUniformBufferOffsetAlignment),
8599312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minStorageBufferOffsetAlignment),
8609312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelOffset),
8619312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelOffset),
8629312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelGatherOffset),
8639312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelGatherOffset),
8649312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minInterpolationOffset),
8659312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxInterpolationOffset),
8669312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subPixelInterpolationOffsetBits),
8679312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferWidth),
8689312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferHeight),
8699312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferLayers),
8709312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferColorSampleCounts),
8719312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferDepthSampleCounts),
8729312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferStencilSampleCounts),
8739312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferNoAttachmentsSampleCounts),
8749312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxColorAttachments),
8759312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageColorSampleCounts),
8769312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageIntegerSampleCounts),
8779312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageDepthSampleCounts),
8789312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageStencilSampleCounts),
8799312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.storageImageSampleCounts),
8809312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSampleMaskWords),
8819312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.timestampComputeAndGraphics),
8829312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.timestampPeriod),
8839312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxClipDistances),
8849312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxCullDistances),
8859312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxCombinedClipAndCullDistances),
8869312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.discreteQueuePriorities),
8879312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.pointSizeRange[2]),
8889312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.lineWidthRange[2]),
8899312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.pointSizeGranularity),
8909312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.lineWidthGranularity),
8919312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.strictLines),
8929312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.standardSampleLocations),
8939312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.optimalBufferCopyOffsetAlignment),
8949312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.optimalBufferCopyRowPitchAlignment),
8959312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.nonCoherentAtomSize),
8969312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard2DBlockShape),
8979312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard2DMultisampleBlockShape),
8989312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard3DBlockShape),
8999312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyAlignedMipSize),
9009312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos		OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyNonResidentStrict),
901c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ 0, 0 }
902c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
903c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
9042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	props = reinterpret_cast<VkPhysicalDeviceProperties*>(buffer);
9052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deMemset(props, GUARD_VALUE, sizeof(buffer));
9062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	context.getInstanceInterface().getPhysicalDeviceProperties(context.getPhysicalDevice(), props);
908b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), &features);
9092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage
9112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		<< TestLog::Message << *props << TestLog::EndMessage;
9122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
913b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman	if (!validateFeatureLimits(props, &features, log))
9142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		return tcu::TestStatus::fail("deviceProperties - feature limits failed");
9152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9162cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (int ndx = 0; ndx < GUARD_SIZE; ndx++)
9172cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
9182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		if (buffer[ndx + sizeof(VkPhysicalDeviceProperties)] != GUARD_VALUE)
9192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
9202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			log << TestLog::Message << "deviceProperties - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
9212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			return tcu::TestStatus::fail("deviceProperties buffer overflow");
9222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
9232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
9242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9259312e3158fb32444d7d29bf592a33308c7e17a0fPyry Haulos	if (!validateInitComplete(context.getPhysicalDevice(), &InstanceInterface::getPhysicalDeviceProperties, context.getInstanceInterface(), physicalDevicePropertiesOffsetTable))
926c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
927c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "deviceProperties - VkPhysicalDeviceProperties not completely initialized" << TestLog::EndMessage;
928c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("deviceProperties incomplete initialization");
929c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
930c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
93133878d45346dddf85669f610783939cad0d32817Maciej Jesionowski	// Check if deviceName string is properly terminated.
93233878d45346dddf85669f610783939cad0d32817Maciej Jesionowski	if (deStrnlen(props->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE) == VK_MAX_PHYSICAL_DEVICE_NAME_SIZE)
93333878d45346dddf85669f610783939cad0d32817Maciej Jesionowski	{
93433878d45346dddf85669f610783939cad0d32817Maciej Jesionowski		log << TestLog::Message << "deviceProperties - VkPhysicalDeviceProperties deviceName not properly initialized" << TestLog::EndMessage;
93533878d45346dddf85669f610783939cad0d32817Maciej Jesionowski		return tcu::TestStatus::fail("deviceProperties incomplete initialization");
93633878d45346dddf85669f610783939cad0d32817Maciej Jesionowski	}
93733878d45346dddf85669f610783939cad0d32817Maciej Jesionowski
938c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
939c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const ApiVersion deviceVersion = unpackVersion(props->apiVersion);
940c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const ApiVersion deqpVersion = unpackVersion(VK_API_VERSION);
941c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
942c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (deviceVersion.majorNum != deqpVersion.majorNum)
943c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
944c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "deviceProperties - API Major Version " << deviceVersion.majorNum << " is not valid" << TestLog::EndMessage;
945c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return tcu::TestStatus::fail("deviceProperties apiVersion not valid");
946c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
947c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
948c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (deviceVersion.minorNum > deqpVersion.minorNum)
949c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
950c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "deviceProperties - API Minor Version " << deviceVersion.minorNum << " is not valid for this version of dEQP" << TestLog::EndMessage;
951c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return tcu::TestStatus::fail("deviceProperties apiVersion not valid");
952c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
953c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
954c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
9552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return tcu::TestStatus::pass("DeviceProperites query succeeded");
9562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
9572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceQueueFamilyProperties (Context& context)
9592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
9602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&								log					= context.getTestContext().getLog();
9612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	const vector<VkQueueFamilyProperties>	queueProperties		= getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice());
9622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage;
9642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (size_t queueNdx = 0; queueNdx < queueProperties.size(); queueNdx++)
9662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		log << TestLog::Message << queueNdx << ": " << queueProperties[queueNdx] << TestLog::EndMessage;
9672cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return tcu::TestStatus::pass("Querying queue properties succeeded");
9692cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
9702cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceMemoryProperties (Context& context)
9722cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
9732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	TestLog&							log			= context.getTestContext().getLog();
9742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	VkPhysicalDeviceMemoryProperties*	memProps;
9752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deUint8								buffer[sizeof(VkPhysicalDeviceMemoryProperties) + GUARD_SIZE];
9762cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9772cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	memProps = reinterpret_cast<VkPhysicalDeviceMemoryProperties*>(buffer);
9782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	deMemset(buffer, GUARD_VALUE, sizeof(buffer));
9792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	context.getInstanceInterface().getPhysicalDeviceMemoryProperties(context.getPhysicalDevice(), memProps);
9812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage
9832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		<< TestLog::Message << *memProps << TestLog::EndMessage;
9842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
9852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++)
9862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
9872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		if (buffer[ndx + sizeof(VkPhysicalDeviceMemoryProperties)] != GUARD_VALUE)
9882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		{
9892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			log << TestLog::Message << "deviceMemoryProperties - Guard offset " << ndx << " not valid" << TestLog::EndMessage;
9902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman			return tcu::TestStatus::fail("deviceMemoryProperties buffer overflow");
9912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		}
9922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
9932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
994c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (memProps->memoryHeapCount >= VK_MAX_MEMORY_HEAPS)
995c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
996c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "deviceMemoryProperties - HeapCount larger than " << (deUint32)VK_MAX_MEMORY_HEAPS << TestLog::EndMessage;
997c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("deviceMemoryProperties HeapCount too large");
998c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
999c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1000c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (memProps->memoryHeapCount == 1)
1001c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1002c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if ((memProps->memoryHeaps[0].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) == 0)
1003c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1004c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "deviceMemoryProperties - Single heap is not marked DEVICE_LOCAL" << TestLog::EndMessage;
1005c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return tcu::TestStatus::fail("deviceMemoryProperties invalid HeapFlags");
1006c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1007c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1008c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1009c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	const VkMemoryPropertyFlags validPropertyFlags[] =
1010c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1011bdd440efc441070324392728d6fd42304c30a2f2Pyry Haulos		0,
1012c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
1013c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
1014c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
1015c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
1016c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
1017c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
1018c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
1019c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
1020c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
1021c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1022c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	const VkMemoryPropertyFlags requiredPropertyFlags[] =
1023c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1024c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
1025c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
1026c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1027c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	bool requiredFlagsFound[DE_LENGTH_OF_ARRAY(requiredPropertyFlags)];
1028c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	std::fill(DE_ARRAY_BEGIN(requiredFlagsFound), DE_ARRAY_END(requiredFlagsFound), false);
1029c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1030c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	for (deUint32 memoryNdx = 0; memoryNdx < memProps->memoryTypeCount; memoryNdx++)
1031c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1032c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		bool validPropTypeFound = false;
1033c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1034c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (memProps->memoryTypes[memoryNdx].heapIndex >= memProps->memoryHeapCount)
1035c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1036c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "deviceMemoryProperties - heapIndex " << memProps->memoryTypes[memoryNdx].heapIndex << " larger than heapCount" << TestLog::EndMessage;
1037c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return tcu::TestStatus::fail("deviceMemoryProperties - invalid heapIndex");
1038c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1039c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1040c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const VkMemoryPropertyFlags bitsToCheck = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT|VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
1041c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1042c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		for (const VkMemoryPropertyFlags* requiredFlagsIterator = DE_ARRAY_BEGIN(requiredPropertyFlags); requiredFlagsIterator != DE_ARRAY_END(requiredPropertyFlags); requiredFlagsIterator++)
1043c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			if ((memProps->memoryTypes[memoryNdx].propertyFlags & *requiredFlagsIterator) == *requiredFlagsIterator)
1044c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				requiredFlagsFound[requiredFlagsIterator - DE_ARRAY_BEGIN(requiredPropertyFlags)] = true;
1045c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1046c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (de::contains(DE_ARRAY_BEGIN(validPropertyFlags), DE_ARRAY_END(validPropertyFlags), memProps->memoryTypes[memoryNdx].propertyFlags & bitsToCheck))
1047c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			validPropTypeFound = true;
1048c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1049c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (!validPropTypeFound)
1050c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1051c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "deviceMemoryProperties - propertyFlags "
1052c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				<< memProps->memoryTypes[memoryNdx].propertyFlags << " not valid" << TestLog::EndMessage;
1053c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return tcu::TestStatus::fail("deviceMemoryProperties propertyFlags not valid");
1054c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1055c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1056c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (memProps->memoryTypes[memoryNdx].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
1057c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1058c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			if ((memProps->memoryHeaps[memProps->memoryTypes[memoryNdx].heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) == 0)
1059c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			{
1060c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				log << TestLog::Message << "deviceMemoryProperties - DEVICE_LOCAL memory type references heap which is not DEVICE_LOCAL" << TestLog::EndMessage;
1061c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				return tcu::TestStatus::fail("deviceMemoryProperties inconsistent memoryType and HeapFlags");
1062c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			}
1063c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1064c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else
1065c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1066c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			if (memProps->memoryHeaps[memProps->memoryTypes[memoryNdx].heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
1067c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			{
1068c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				log << TestLog::Message << "deviceMemoryProperties - non-DEVICE_LOCAL memory type references heap with is DEVICE_LOCAL" << TestLog::EndMessage;
1069c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				return tcu::TestStatus::fail("deviceMemoryProperties inconsistent memoryType and HeapFlags");
1070c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			}
1071c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1072c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1073c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1074c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	bool* requiredFlagsFoundIterator = std::find(DE_ARRAY_BEGIN(requiredFlagsFound), DE_ARRAY_END(requiredFlagsFound), false);
1075c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (requiredFlagsFoundIterator != DE_ARRAY_END(requiredFlagsFound))
1076c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1077c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		DE_ASSERT(requiredFlagsFoundIterator - DE_ARRAY_BEGIN(requiredFlagsFound) <= DE_LENGTH_OF_ARRAY(requiredPropertyFlags));
1078c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "deviceMemoryProperties - required property flags "
1079c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			<< getMemoryPropertyFlagsStr(requiredPropertyFlags[requiredFlagsFoundIterator - DE_ARRAY_BEGIN(requiredFlagsFound)]) << " not found" << TestLog::EndMessage;
1080c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1081c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("deviceMemoryProperties propertyFlags not valid");
1082c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1083c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
10842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return tcu::TestStatus::pass("Querying memory properties succeeded");
10852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
10862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
108766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos// \todo [2016-01-22 pyry] Optimize by doing format -> flags mapping instead
108866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
108966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry HaulosVkFormatFeatureFlags getRequiredOptimalTilingFeatures (VkFormat format)
109066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
109166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredSampledImageBlitSrcFormats[] =
109266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
109366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B4G4R4A4_UNORM_PACK16,
109466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R5G6B5_UNORM_PACK16,
109566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A1R5G5B5_UNORM_PACK16,
109666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UNORM,
109766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SNORM,
109866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UINT,
109966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SINT,
110066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UNORM,
110166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SNORM,
110266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UINT,
110366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SINT,
110466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
110566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
110666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
110766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
110866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SRGB,
110966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
111066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_SRGB,
111166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
111266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SNORM_PACK32,
111366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UINT_PACK32,
111466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SINT_PACK32,
111566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SRGB_PACK32,
111666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
111766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UINT_PACK32,
111866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_UINT,
111966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SINT,
112066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SFLOAT,
112166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_UINT,
112266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SINT,
112366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SFLOAT,
112466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
112566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
112666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
112766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
112866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
112966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
113066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
113166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
113266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
113366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
113466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
113566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT,
113666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B10G11R11_UFLOAT_PACK32,
113766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
113866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_D16_UNORM,
113966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_D32_SFLOAT
114066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
1141c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	static const VkFormat s_requiredSampledImageFilterLinearFormats[] =
1142c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1143c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_B4G4R4A4_UNORM_PACK16,
1144c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R5G6B5_UNORM_PACK16,
1145c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_A1R5G5B5_UNORM_PACK16,
1146c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8_UNORM,
1147c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8_SNORM,
1148c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8G8_UNORM,
1149c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8G8_SNORM,
1150c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
1151c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
1152c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R8G8B8A8_SRGB,
1153c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
1154c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_B8G8R8A8_SRGB,
1155c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
1156c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_A8B8G8R8_SNORM_PACK32,
1157c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_A8B8G8R8_SRGB_PACK32,
1158c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
1159c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R16_SFLOAT,
1160c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R16G16_SFLOAT,
1161c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
1162c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_B10G11R11_UFLOAT_PACK32,
1163c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
1164c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
116566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredStorageImageFormats[] =
116666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
116766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
116866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
116966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
117066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
117166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
117266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
117366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
117466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
117566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
117666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
117766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
117866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
117966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
118066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
118166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
118266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT
118366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
118466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredStorageImageAtomicFormats[] =
118566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
118666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
118766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT
118866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
118966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredColorAttachmentBlitDstFormats[] =
119066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
119166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R5G6B5_UNORM_PACK16,
119266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A1R5G5B5_UNORM_PACK16,
119366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UNORM,
119466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UINT,
119566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SINT,
119666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UNORM,
119766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UINT,
119866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SINT,
119966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
120066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
120166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
120266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SRGB,
120366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
120466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_SRGB,
120566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
120666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UINT_PACK32,
120766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SINT_PACK32,
120866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SRGB_PACK32,
120966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
121066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UINT_PACK32,
121166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_UINT,
121266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SINT,
121366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SFLOAT,
121466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_UINT,
121566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SINT,
121666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SFLOAT,
121766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
121866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
121966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
122066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
122166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
122266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
122366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
122466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
122566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
122666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
122766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
122866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT
122966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
123066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredColorAttachmentBlendFormats[] =
123166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
123266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R5G6B5_UNORM_PACK16,
123366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A1R5G5B5_UNORM_PACK16,
123466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UNORM,
123566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UNORM,
123666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
123766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SRGB,
123866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
123966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_SRGB,
124066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
124166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SRGB_PACK32,
124266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
124366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SFLOAT,
124466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SFLOAT,
124566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT
124666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
124766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredDepthStencilAttachmentFormats[] =
124866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
124966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_D16_UNORM
125066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
125166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
125266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	VkFormatFeatureFlags	flags	= (VkFormatFeatureFlags)0;
125366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
125466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageBlitSrcFormats), DE_ARRAY_END(s_requiredSampledImageBlitSrcFormats), format))
125566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_BLIT_SRC_BIT;
125666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
1257c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageFilterLinearFormats), DE_ARRAY_END(s_requiredSampledImageFilterLinearFormats), format))
1258c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
1259c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
126066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageFormats), DE_ARRAY_END(s_requiredStorageImageFormats), format))
126166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
126266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
126366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageAtomicFormats), DE_ARRAY_END(s_requiredStorageImageAtomicFormats), format))
126466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
126566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
126666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlitDstFormats), DE_ARRAY_END(s_requiredColorAttachmentBlitDstFormats), format))
126766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_BLIT_DST_BIT;
126866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
126966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlendFormats), DE_ARRAY_END(s_requiredColorAttachmentBlendFormats), format))
127066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
127166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
127266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredDepthStencilAttachmentFormats), DE_ARRAY_END(s_requiredDepthStencilAttachmentFormats), format))
127366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
127466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
127566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	return flags;
127666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
127766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
127866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry HaulosVkFormatFeatureFlags getRequiredBufferFeatures (VkFormat format)
127966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
128066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredVertexBufferFormats[] =
128166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
128266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UNORM,
128366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SNORM,
128466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UINT,
128566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SINT,
128666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UNORM,
128766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SNORM,
128866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UINT,
128966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SINT,
129066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
129166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
129266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
129366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
129466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
129566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
129666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SNORM_PACK32,
129766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UINT_PACK32,
129866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SINT_PACK32,
129966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
130066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_UNORM,
130166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SNORM,
130266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_UINT,
130366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SINT,
130466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SFLOAT,
130566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_UNORM,
130666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SNORM,
130766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_UINT,
130866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SINT,
130966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SFLOAT,
131066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UNORM,
131166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SNORM,
131266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
131366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
131466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
131566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
131666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
131766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
131866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
131966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
132066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
132166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32_UINT,
132266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32_SINT,
132366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32_SFLOAT,
132466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
132566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
132666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT
132766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
132866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredUniformTexelBufferFormats[] =
132966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
133066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UNORM,
133166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SNORM,
133266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_UINT,
133366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8_SINT,
133466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UNORM,
133566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SNORM,
133666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_UINT,
133766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8_SINT,
133866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
133966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
134066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
134166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
134266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B8G8R8A8_UNORM,
134366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
134466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SNORM_PACK32,
134566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UINT_PACK32,
134666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SINT_PACK32,
134766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
134866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A2B10G10R10_UINT_PACK32,
134966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_UINT,
135066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SINT,
135166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16_SFLOAT,
135266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_UINT,
135366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SINT,
135466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16_SFLOAT,
135566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
135666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
135766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
135866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
135966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
136066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
136166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
136266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
136366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
136466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
136566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
136666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT,
136766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_B10G11R11_UFLOAT_PACK32
136866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
136966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredStorageTexelBufferFormats[] =
137066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
137166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UNORM,
137266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SNORM,
137366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_UINT,
137466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R8G8B8A8_SINT,
137566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UNORM_PACK32,
137666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SNORM_PACK32,
137766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_UINT_PACK32,
137866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_A8B8G8R8_SINT_PACK32,
137966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_UINT,
138066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SINT,
138166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R16G16B16A16_SFLOAT,
138266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
138366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT,
138466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SFLOAT,
138566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_UINT,
138666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SINT,
138766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32_SFLOAT,
138866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_UINT,
138966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SINT,
139066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32G32B32A32_SFLOAT
139166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
139266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_requiredStorageTexelBufferAtomicFormats[] =
139366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
139466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_UINT,
139566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_R32_SINT
139666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
139766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
139866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	VkFormatFeatureFlags	flags	= (VkFormatFeatureFlags)0;
139966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
140066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredVertexBufferFormats), DE_ARRAY_END(s_requiredVertexBufferFormats), format))
140166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
140266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
140366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredUniformTexelBufferFormats), DE_ARRAY_END(s_requiredUniformTexelBufferFormats), format))
140466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
140566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
140666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageTexelBufferFormats), DE_ARRAY_END(s_requiredStorageTexelBufferFormats), format))
140766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
140866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
140966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageTexelBufferAtomicFormats), DE_ARRAY_END(s_requiredStorageTexelBufferAtomicFormats), format))
141066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
141166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
141266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	return flags;
141366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
141466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
141566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus formatProperties (Context& context, VkFormat format)
141666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
141766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	TestLog&					log				= context.getTestContext().getLog();
141866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	const VkFormatProperties	properties		= getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format);
141966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	bool						allOk			= true;
142066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
142166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	const struct
142266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
142366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VkFormatFeatureFlags VkFormatProperties::*	field;
142466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const char*									fieldName;
142566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VkFormatFeatureFlags						requiredFeatures;
142666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	} fields[] =
142766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
142866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		{ &VkFormatProperties::linearTilingFeatures,	"linearTilingFeatures",		(VkFormatFeatureFlags)0						},
142966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		{ &VkFormatProperties::optimalTilingFeatures,	"optimalTilingFeatures",	getRequiredOptimalTilingFeatures(format)	},
143066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		{ &VkFormatProperties::bufferFeatures,			"buffeFeatures",			getRequiredBufferFeatures(format)			}
143166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
143266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
143366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	log << TestLog::Message << properties << TestLog::EndMessage;
143466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
143566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	for (int fieldNdx = 0; fieldNdx < DE_LENGTH_OF_ARRAY(fields); fieldNdx++)
143666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
143766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const char* const				fieldName	= fields[fieldNdx].fieldName;
143866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const VkFormatFeatureFlags		supported	= properties.*fields[fieldNdx].field;
143966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const VkFormatFeatureFlags		required	= fields[fieldNdx].requiredFeatures;
144066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
144166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		if ((supported & required) != required)
144266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		{
144366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos			log << TestLog::Message << "ERROR in " << fieldName << ":\n"
144466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos								    << "  required: " << getFormatFeatureFlagsStr(required) << "\n  "
144566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos									<< "  missing: " << getFormatFeatureFlagsStr(~supported & required)
144666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos				<< TestLog::EndMessage;
144766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos			allOk = false;
144866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		}
144966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	}
145066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
145166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (allOk)
145266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		return tcu::TestStatus::pass("Query and validation passed");
145366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	else
145466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		return tcu::TestStatus::fail("Required features not supported");
145566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
145666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
145766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosbool optimalTilingFeaturesSupported (Context& context, VkFormat format, VkFormatFeatureFlags features)
145866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
145966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	const VkFormatProperties	properties	= getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format);
146066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
146166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	return (properties.optimalTilingFeatures & features) == features;
146266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
146366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
146466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosbool optimalTilingFeaturesSupportedForAll (Context& context, const VkFormat* begin, const VkFormat* end, VkFormatFeatureFlags features)
146566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
146666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	for (const VkFormat* cur = begin; cur != end; ++cur)
146766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
146866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		if (!optimalTilingFeaturesSupported(context, *cur, features))
146966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos			return false;
147066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	}
147166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
147266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	return true;
147366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
147466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
147566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus testDepthStencilSupported (Context& context)
147666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
147766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (!optimalTilingFeaturesSupported(context, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
147866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		!optimalTilingFeaturesSupported(context, VK_FORMAT_D32_SFLOAT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
147966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		return tcu::TestStatus::fail("Doesn't support one of VK_FORMAT_X8_D24_UNORM_PACK32 or VK_FORMAT_D32_SFLOAT");
148066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
148166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	if (!optimalTilingFeaturesSupported(context, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
148266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		!optimalTilingFeaturesSupported(context, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))
148366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		return tcu::TestStatus::fail("Doesn't support one of VK_FORMAT_D24_UNORM_S8_UINT or VK_FORMAT_D32_SFLOAT_S8_UINT");
148466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
148566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	return tcu::TestStatus::pass("Required depth/stencil formats supported");
148666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
148766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
148866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus testCompressedFormatsSupported (Context& context)
148966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
149066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	static const VkFormat s_allBcFormats[] =
149166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
149266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC1_RGB_UNORM_BLOCK,
149366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC1_RGB_SRGB_BLOCK,
149466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
149566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
149666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC2_UNORM_BLOCK,
149766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC2_SRGB_BLOCK,
149866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC3_UNORM_BLOCK,
149966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC3_SRGB_BLOCK,
150066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC4_UNORM_BLOCK,
150166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC4_SNORM_BLOCK,
150266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC5_UNORM_BLOCK,
150366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC5_SNORM_BLOCK,
150466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC6H_UFLOAT_BLOCK,
150566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC6H_SFLOAT_BLOCK,
150666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC7_UNORM_BLOCK,
150766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_BC7_SRGB_BLOCK,
150866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
1509c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	static const VkFormat s_allEtc2Formats[] =
151066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
151166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
151266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
151366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
151466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
151566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
151666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
151766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_EAC_R11_UNORM_BLOCK,
151866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_EAC_R11_SNORM_BLOCK,
151966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
152066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
152166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
1522c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	static const VkFormat s_allAstcLdrFormats[] =
152366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
152466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
152566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
152666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
152766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
152866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
152966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
153066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
153166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
153266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
153366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
153466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
153566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
153666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
153766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
153866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
153966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
154066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
154166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
154266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
154366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
154466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
154566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
154666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
154766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
154866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
154966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
155066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
155166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
155266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	};
155366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
1554c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	static const struct
1555c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1556c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const char*									setName;
1557c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const char*									featureName;
1558c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const VkBool32 VkPhysicalDeviceFeatures::*	feature;
1559c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const VkFormat*								formatsBegin;
1560c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const VkFormat*								formatsEnd;
1561c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	} s_compressedFormatSets[] =
1562c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1563c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ "BC",			"textureCompressionBC",			&VkPhysicalDeviceFeatures::textureCompressionBC,		DE_ARRAY_BEGIN(s_allBcFormats),			DE_ARRAY_END(s_allBcFormats)		},
1564c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ "ETC2",		"textureCompressionETC2",		&VkPhysicalDeviceFeatures::textureCompressionETC2,		DE_ARRAY_BEGIN(s_allEtc2Formats),		DE_ARRAY_END(s_allEtc2Formats)		},
1565c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{ "ASTC LDR",	"textureCompressionASTC_LDR",	&VkPhysicalDeviceFeatures::textureCompressionASTC_LDR,	DE_ARRAY_BEGIN(s_allAstcLdrFormats),	DE_ARRAY_END(s_allAstcLdrFormats)	},
1566c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	};
1567c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1568c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	TestLog&						log					= context.getTestContext().getLog();
1569c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	const VkPhysicalDeviceFeatures&	features			= context.getDeviceFeatures();
1570c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	int								numSupportedSets	= 0;
1571c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	int								numErrors			= 0;
1572c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	int								numWarnings			= 0;
1573c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1574c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	for (int setNdx = 0; setNdx < DE_LENGTH_OF_ARRAY(s_compressedFormatSets); ++setNdx)
1575c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1576c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const char* const	setName			= s_compressedFormatSets[setNdx].setName;
1577c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const char* const	featureName		= s_compressedFormatSets[setNdx].featureName;
1578c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const bool			featureBitSet	= features.*s_compressedFormatSets[setNdx].feature == VK_TRUE;
1579c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const bool			allSupported	= optimalTilingFeaturesSupportedForAll(context,
1580c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																				   s_compressedFormatSets[setNdx].formatsBegin,
1581c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																				   s_compressedFormatSets[setNdx].formatsEnd,
1582c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																				   VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
1583c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1584c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (featureBitSet && !allSupported)
1585c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1586c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "ERROR: " << featureName << " = VK_TRUE but " << setName << " formats not supported" << TestLog::EndMessage;
1587c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			numErrors += 1;
1588c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1589c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else if (allSupported && !featureBitSet)
1590c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1591c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "WARNING: " << setName << " formats supported but " << featureName << " = VK_FALSE" << TestLog::EndMessage;
1592c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			numWarnings += 1;
1593c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1594c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1595c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (featureBitSet)
1596c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1597c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << "All " << setName << " formats are supported" << TestLog::EndMessage;
1598c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			numSupportedSets += 1;
1599c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1600c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else
1601c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			log << TestLog::Message << setName << " formats are not supported" << TestLog::EndMessage;
1602c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1603c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1604c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (numSupportedSets == 0)
1605c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1606c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		log << TestLog::Message << "No compressed format sets supported" << TestLog::EndMessage;
1607c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		numErrors += 1;
1608c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1609c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1610c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (numErrors > 0)
1611c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::fail("Compressed format support not valid");
1612c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	else if (numWarnings > 0)
1613c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Found inconsistencies in compressed format support");
161466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	else
1615c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return tcu::TestStatus::pass("Compressed texture format support is valid");
161666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
161766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
161866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosvoid createFormatTests (tcu::TestCaseGroup* testGroup)
161966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{
162066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	DE_STATIC_ASSERT(VK_FORMAT_UNDEFINED == 0);
162166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
162266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_FORMAT_LAST; ++formatNdx)
162366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	{
162466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const VkFormat		format			= (VkFormat)formatNdx;
162566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const char* const	enumName		= getFormatName(format);
162666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		const string		caseName		= de::toLower(string(enumName).substr(10));
162766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
162866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos		addFunctionCase(testGroup, caseName, enumName, formatProperties, format);
162966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	}
163066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
163166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	addFunctionCase(testGroup, "depth_stencil",			"",	testDepthStencilSupported);
163266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos	addFunctionCase(testGroup, "compressed_formats",	"",	testCompressedFormatsSupported);
163366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos}
163466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
1635eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry HaulosVkImageUsageFlags getValidImageUsageFlags (VkFormat, VkFormatFeatureFlags supportedFeatures)
1636eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1637eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	VkImageUsageFlags	flags	= (VkImageUsageFlags)0;
1638eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1639eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	// If format is supported at all, it must be valid transfer src+dst
1640eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if (supportedFeatures != 0)
1641eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1642eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1643eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0)
1644eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_USAGE_SAMPLED_BIT;
1645eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1646eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((supportedFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) != 0)
1647eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT|VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
1648eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1649eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((supportedFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0)
1650eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1651eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1652eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0)
1653eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_USAGE_STORAGE_BIT;
1654eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1655eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	return flags;
1656eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1657eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1658eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosbool isValidImageUsageFlagCombination (VkImageUsageFlags usage)
1659eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
166083f90be9118a121b47f5e16f04029e205c68f994scygan	if (usage & vk::VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT)
166183f90be9118a121b47f5e16f04029e205c68f994scygan	{
166283f90be9118a121b47f5e16f04029e205c68f994scygan		const VkImageUsageFlags		allowedFlags	= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
166383f90be9118a121b47f5e16f04029e205c68f994scygan		return (usage & ~allowedFlags) == 0;
166483f90be9118a121b47f5e16f04029e205c68f994scygan	}
1665eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	return usage != 0;
1666eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1667eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1668eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry HaulosVkImageCreateFlags getValidImageCreateFlags (const VkPhysicalDeviceFeatures& deviceFeatures, VkFormat, VkFormatFeatureFlags, VkImageType type, VkImageUsageFlags usage)
1669eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1670eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	VkImageCreateFlags	flags	= (VkImageCreateFlags)0;
1671eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1672eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((usage & VK_IMAGE_USAGE_SAMPLED_BIT) != 0)
1673eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{
1674eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
1675eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1676eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		if (type == VK_IMAGE_TYPE_2D)
1677eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
1678eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	}
1679eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1680eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	if ((usage & (VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_STORAGE_BIT)) != 0 &&
1681eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		(usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0)
1682eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{
1683eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		if (deviceFeatures.sparseBinding)
1684eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT|VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT;
1685eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1686eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		if (deviceFeatures.sparseResidencyAliased)
1687eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			flags |= VK_IMAGE_CREATE_SPARSE_ALIASED_BIT;
1688eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	}
1689eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1690eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	return flags;
1691eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1692eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1693eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosbool isValidImageCreateFlagCombination (VkImageCreateFlags)
1694eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1695eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	return true;
1696eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1697eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1698c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulosbool isRequiredImageParameterCombination (const VkPhysicalDeviceFeatures&	deviceFeatures,
1699c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkFormat					format,
1700c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkFormatProperties&			formatProperties,
1701c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkImageType					imageType,
1702c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkImageTiling				imageTiling,
1703c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkImageUsageFlags			usageFlags,
1704c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos										  const VkImageCreateFlags			createFlags)
1705c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos{
1706c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	DE_UNREF(deviceFeatures);
1707c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	DE_UNREF(formatProperties);
1708c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	DE_UNREF(createFlags);
1709c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1710c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	// Linear images can have arbitrary limitations
1711c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (imageTiling == VK_IMAGE_TILING_LINEAR)
1712c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return false;
1713c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1714c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	// Support for other usages for compressed formats is optional
1715c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (isCompressedFormat(format) &&
1716c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		(usageFlags & ~(VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT)) != 0)
1717c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return false;
1718c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1719c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	// Support for 1D, and sliced 3D compressed formats is optional
1720c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (isCompressedFormat(format) && (imageType == VK_IMAGE_TYPE_1D || imageType == VK_IMAGE_TYPE_3D))
1721c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return false;
1722c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1723c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	DE_ASSERT(deviceFeatures.sparseBinding || (createFlags & (VK_IMAGE_CREATE_SPARSE_BINDING_BIT|VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)) == 0);
1724c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	DE_ASSERT(deviceFeatures.sparseResidencyAliased || (createFlags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) == 0);
1725c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1726c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	return true;
1727c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos}
1728c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1729c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry HaulosVkSampleCountFlags getRequiredOptimalTilingSampleCounts (const VkPhysicalDeviceLimits&	deviceLimits,
1730c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos														 const VkFormat					format,
1731c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos														 const VkImageUsageFlags		usageFlags)
1732c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos{
1733c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	if (!isCompressedFormat(format))
1734c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	{
1735c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		const tcu::TextureFormat		tcuFormat	= mapVkFormat(format);
1736c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1737c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		if (usageFlags & VK_IMAGE_USAGE_STORAGE_BIT)
1738c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return deviceLimits.storageImageSampleCounts;
1739c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else if (tcuFormat.order == tcu::TextureFormat::D)
1740c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return deviceLimits.sampledImageDepthSampleCounts;
1741c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else if (tcuFormat.order == tcu::TextureFormat::S)
1742c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return deviceLimits.sampledImageStencilSampleCounts;
1743c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else if (tcuFormat.order == tcu::TextureFormat::DS)
1744c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			return deviceLimits.sampledImageDepthSampleCounts & deviceLimits.sampledImageStencilSampleCounts;
1745c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		else
1746c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		{
1747c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			const tcu::TextureChannelClass	chnClass	= tcu::getTextureChannelClass(tcuFormat.type);
1748c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1749c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ||
1750c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
1751c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				return deviceLimits.sampledImageIntegerSampleCounts;
1752c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			else
1753c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				return deviceLimits.sampledImageColorSampleCounts;
1754c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		}
1755c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	}
1756c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	else
1757c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos		return VK_SAMPLE_COUNT_1_BIT;
1758c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos}
1759c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1760eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosstruct ImageFormatPropertyCase
1761eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1762eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	VkFormat		format;
1763eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	VkImageType		imageType;
1764eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	VkImageTiling	tiling;
1765eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1766eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	ImageFormatPropertyCase (VkFormat format_, VkImageType imageType_, VkImageTiling tiling_)
1767eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		: format	(format_)
1768eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		, imageType	(imageType_)
1769eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		, tiling	(tiling_)
1770eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{}
1771eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1772eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	ImageFormatPropertyCase (void)
1773eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		: format	(VK_FORMAT_LAST)
1774eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		, imageType	(VK_IMAGE_TYPE_LAST)
1775eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		, tiling	(VK_IMAGE_TILING_LAST)
1776eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{}
1777eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos};
1778eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1779eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulostcu::TestStatus imageFormatProperties (Context& context, ImageFormatPropertyCase params)
1780eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1781eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	TestLog&						log					= context.getTestContext().getLog();
1782eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkFormat					format				= params.format;
1783eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkImageType				imageType			= params.imageType;
1784eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkImageTiling				tiling				= params.tiling;
1785eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkPhysicalDeviceFeatures&	deviceFeatures		= context.getDeviceFeatures();
1786c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	const VkPhysicalDeviceLimits&	deviceLimits		= context.getDeviceProperties().limits;
1787eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkFormatProperties		formatProperties	= getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format);
1788eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1789eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkFormatFeatureFlags		supportedFeatures	= tiling == VK_IMAGE_TILING_LINEAR ? formatProperties.linearTilingFeatures : formatProperties.optimalTilingFeatures;
1790eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	const VkImageUsageFlags			usageFlagSet		= getValidImageUsageFlags(format, supportedFeatures);
1791eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1792c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	tcu::ResultCollector			results				(log, "ERROR: ");
1793c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1794eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	for (VkImageUsageFlags curUsageFlags = 0; curUsageFlags <= usageFlagSet; curUsageFlags++)
1795eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{
1796eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		if ((curUsageFlags & ~usageFlagSet) != 0 ||
1797eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			!isValidImageUsageFlagCombination(curUsageFlags))
1798eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			continue;
1799eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1800eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		const VkImageCreateFlags	createFlagSet		= getValidImageCreateFlags(deviceFeatures, format, supportedFeatures, imageType, curUsageFlags);
1801eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1802eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		for (VkImageCreateFlags curCreateFlags = 0; curCreateFlags <= createFlagSet; curCreateFlags++)
1803eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		{
1804eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			if ((curCreateFlags & ~createFlagSet) != 0 ||
1805eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos				!isValidImageCreateFlagCombination(curCreateFlags))
1806eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos				continue;
1807eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1808c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			const bool				isRequiredCombination	= isRequiredImageParameterCombination(deviceFeatures,
1809c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  format,
1810c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  formatProperties,
1811c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  imageType,
1812c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  tiling,
1813c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  curUsageFlags,
1814c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								  curCreateFlags);
1815c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			VkImageFormatProperties	properties;
1816c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			VkResult				queryResult;
1817c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1818eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			log << TestLog::Message << "Testing " << getImageTypeStr(imageType) << ", "
1819eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos									<< getImageTilingStr(tiling) << ", "
1820eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos									<< getImageUsageFlagsStr(curUsageFlags) << ", "
1821eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos									<< getImageCreateFlagsStr(curCreateFlags)
1822eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos				<< TestLog::EndMessage;
1823eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1824c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			// Set return value to known garbage
1825c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			deMemset(&properties, 0xcd, sizeof(properties));
1826c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1827c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			queryResult = context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(context.getPhysicalDevice(),
1828c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								format,
1829c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								imageType,
1830c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								tiling,
1831c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								curUsageFlags,
1832c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								curCreateFlags,
1833c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																								&properties);
1834c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1835c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			if (queryResult == VK_SUCCESS)
1836eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			{
1837c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				const deUint32	fullMipPyramidSize	= de::max(de::max(deLog2Ceil32(properties.maxExtent.width),
1838c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																	  deLog2Ceil32(properties.maxExtent.height)),
1839c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos															  deLog2Ceil32(properties.maxExtent.depth)) + 1;
1840c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1841eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos				log << TestLog::Message << properties << "\n" << TestLog::EndMessage;
1842eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1843c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(imageType != VK_IMAGE_TYPE_1D || (properties.maxExtent.width >= 1 && properties.maxExtent.height == 1 && properties.maxExtent.depth == 1), "Invalid dimensions for 1D image");
1844c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(imageType != VK_IMAGE_TYPE_2D || (properties.maxExtent.width >= 1 && properties.maxExtent.height >= 1 && properties.maxExtent.depth == 1), "Invalid dimensions for 2D image");
1845c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(imageType != VK_IMAGE_TYPE_3D || (properties.maxExtent.width >= 1 && properties.maxExtent.height >= 1 && properties.maxExtent.depth >= 1), "Invalid dimensions for 3D image");
1846c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(imageType != VK_IMAGE_TYPE_3D || properties.maxArrayLayers == 1, "Invalid maxArrayLayers for 3D image");
1847c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1848dc4227d5ec87080f5dad810b5e33ae3b3fa014a4Nanley Chery				if (tiling == VK_IMAGE_TILING_OPTIMAL && imageType == VK_IMAGE_TYPE_2D && !(curCreateFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
1849dc4227d5ec87080f5dad810b5e33ae3b3fa014a4Nanley Chery					 ((supportedFeatures & (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) ||
1850dc4227d5ec87080f5dad810b5e33ae3b3fa014a4Nanley Chery					 ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && deviceFeatures.shaderStorageImageMultisample)))
1851c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				{
1852c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					const VkSampleCountFlags	requiredSampleCounts	= getRequiredOptimalTilingSampleCounts(deviceLimits, format, curUsageFlags);
1853c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check((properties.sampleCounts & requiredSampleCounts) == requiredSampleCounts, "Required sample counts not supported");
1854c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				}
1855c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else
1856c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(properties.sampleCounts == VK_SAMPLE_COUNT_1_BIT, "sampleCounts != VK_SAMPLE_COUNT_1_BIT");
1857c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1858c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (isRequiredCombination)
1859c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				{
1860c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(imageType != VK_IMAGE_TYPE_1D || (properties.maxExtent.width	>= deviceLimits.maxImageDimension1D),
1861c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos								  "Reported dimensions smaller than device limits");
1862c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(imageType != VK_IMAGE_TYPE_2D || (properties.maxExtent.width	>= deviceLimits.maxImageDimension2D &&
1863c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																	properties.maxExtent.height	>= deviceLimits.maxImageDimension2D),
1864c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos								  "Reported dimensions smaller than device limits");
1865c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(imageType != VK_IMAGE_TYPE_3D || (properties.maxExtent.width	>= deviceLimits.maxImageDimension3D &&
1866c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																	properties.maxExtent.height	>= deviceLimits.maxImageDimension3D &&
1867c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos																	properties.maxExtent.depth	>= deviceLimits.maxImageDimension3D),
1868c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos								  "Reported dimensions smaller than device limits");
1869c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(properties.maxMipLevels == fullMipPyramidSize, "maxMipLevels is not full mip pyramid size");
1870c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(imageType == VK_IMAGE_TYPE_3D || properties.maxArrayLayers >= deviceLimits.maxImageArrayLayers,
1871c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos								  "maxArrayLayers smaller than device limits");
1872c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				}
1873c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				else
1874c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				{
1875c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(properties.maxMipLevels == 1 || properties.maxMipLevels == fullMipPyramidSize, "Invalid mip pyramid size");
1876c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.check(properties.maxArrayLayers >= 1, "Invalid maxArrayLayers");
1877c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				}
1878c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1879c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxResourceSize >= (VkDeviceSize)MINIMUM_REQUIRED_IMAGE_RESOURCE_SIZE,
1880c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos							  "maxResourceSize smaller than minimum required size");
1881eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			}
1882c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			else if (queryResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
1883eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			{
1884c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				log << TestLog::Message << "Got VK_ERROR_FORMAT_NOT_SUPPORTED" << TestLog::EndMessage;
1885c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1886c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				if (isRequiredCombination)
1887c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos					results.fail("VK_ERROR_FORMAT_NOT_SUPPORTED returned for required image parameter combination");
1888c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos
1889c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				// Specification requires that all fields are set to 0
1890c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxExtent.width	== 0, "maxExtent.width != 0");
1891c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxExtent.height	== 0, "maxExtent.height != 0");
1892c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxExtent.depth	== 0, "maxExtent.depth != 0");
1893c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxMipLevels		== 0, "maxMipLevels != 0");
1894c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxArrayLayers		== 0, "maxArrayLayers != 0");
1895c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.sampleCounts		== 0, "sampleCounts != 0");
1896c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.check(properties.maxResourceSize	== 0, "maxResourceSize != 0");
1897c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			}
1898c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			else
1899c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos			{
1900c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos				results.fail("Got unexpected error" + de::toString(queryResult));
1901eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos			}
1902eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		}
1903eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	}
1904eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1905c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos	return tcu::TestStatus(results.getResult(), results.getMessage());
1906eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1907eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1908eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosvoid createImageFormatTypeTilingTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase params)
1909eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1910eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	DE_ASSERT(params.format == VK_FORMAT_LAST);
1911eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1912eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_FORMAT_LAST; ++formatNdx)
1913eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	{
1914eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		const VkFormat		format			= (VkFormat)formatNdx;
1915eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		const char* const	enumName		= getFormatName(format);
1916eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		const string		caseName		= de::toLower(string(enumName).substr(10));
1917eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1918eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		params.format = format;
1919eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1920eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos		addFunctionCase(testGroup, caseName, enumName, imageFormatProperties, params);
1921eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	}
1922eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1923eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1924eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosvoid createImageFormatTypeTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase params)
1925eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1926eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	DE_ASSERT(params.tiling == VK_IMAGE_TILING_LAST);
1927eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1928eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	testGroup->addChild(createTestGroup(testGroup->getTestContext(), "optimal",	"",	createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_LAST, params.imageType, VK_IMAGE_TILING_OPTIMAL)));
1929eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	testGroup->addChild(createTestGroup(testGroup->getTestContext(), "linear",	"",	createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_LAST, params.imageType, VK_IMAGE_TILING_LINEAR)));
1930eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1931eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
1932eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosvoid createImageFormatTests (tcu::TestCaseGroup* testGroup)
1933eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{
1934eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	testGroup->addChild(createTestGroup(testGroup->getTestContext(), "1d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_1D, VK_IMAGE_TILING_LAST)));
1935eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	testGroup->addChild(createTestGroup(testGroup->getTestContext(), "2d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_LAST)));
1936eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	testGroup->addChild(createTestGroup(testGroup->getTestContext(), "3d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_3D, VK_IMAGE_TILING_LAST)));
1937eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}
1938eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos
19392cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // anonymous
19402cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx)
19422cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{
19432cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	de::MovePtr<tcu::TestCaseGroup>	infoTests	(new tcu::TestCaseGroup(testCtx, "info", "Platform Information Tests"));
19442cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
19462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		de::MovePtr<tcu::TestCaseGroup> instanceInfoTests	(new tcu::TestCaseGroup(testCtx, "instance", "Instance Information Tests"));
19472cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(instanceInfoTests.get(), "physical_devices",		"Physical devices",			enumeratePhysicalDevices);
19492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(instanceInfoTests.get(), "layers",					"Layers",					enumerateInstanceLayers);
19502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(instanceInfoTests.get(), "extensions",				"Extensions",				enumerateInstanceExtensions);
19512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		infoTests->addChild(instanceInfoTests.release());
19532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
19542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	{
19562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		de::MovePtr<tcu::TestCaseGroup> deviceInfoTests	(new tcu::TestCaseGroup(testCtx, "device", "Device Information Tests"));
19572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "features",					"Device Features",			deviceFeatures);
19592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "properties",				"Device Properties",		deviceProperties);
19602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "queue_family_properties",	"Queue family properties",	deviceQueueFamilyProperties);
19612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "memory_properties",			"Memory properties",		deviceMemoryProperties);
19622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "layers",					"Layers",					enumerateDeviceLayers);
19632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		addFunctionCase(deviceInfoTests.get(), "extensions",				"Extensions",				enumerateDeviceExtensions);
19642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman		infoTests->addChild(deviceInfoTests.release());
19662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	}
19672cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
1968eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	infoTests->addChild(createTestGroup(testCtx, "format_properties",		"VkGetPhysicalDeviceFormatProperties() Tests",		createFormatTests));
1969eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos	infoTests->addChild(createTestGroup(testCtx, "image_format_properties",	"VkGetPhysicalDeviceImageFormatProperties() Tests",	createImageFormatTests));
197066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos
19712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman	return infoTests.release();
19722cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman}
19732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman
19742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // api
19752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // vkt
1976