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