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 9541460f757de5135ccd0f7bbdc73d9606e30298e9Colin Cross#define LIMIT(_X_) DE_OFFSET_OF(VkPhysicalDeviceLimits, _X_), (const char*)(#_X_) 9641460f757de5135ccd0f7bbdc73d9606e30298e9Colin Cross#define FEATURE(_X_) DE_OFFSET_OF(VkPhysicalDeviceFeatures, _X_) 97b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 988ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowskiinline bool isExtensionSupported (const vector<string>& extensionStrings, const string& extensionName) 998ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski{ 1008ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski return de::contains(extensionStrings.begin(), extensionStrings.end(), extensionName); 1018ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski} 1028ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski 103b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodmanbool validateFeatureLimits(VkPhysicalDeviceProperties* properties, VkPhysicalDeviceFeatures* features, TestLog& log) 1042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 1055489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos bool limitsOk = true; 1065489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos VkPhysicalDeviceLimits* limits = &properties->limits; 1072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman struct FeatureLimitTable 1082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 1092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint32 offset; 1105489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos const char* name; 1112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint32 uintVal; //!< Format is UNSIGNED_INT 1122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deInt32 intVal; //!< Format is SIGNED_INT 1132cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint64 deviceSizeVal; //!< Format is DEVICE_SIZE 1142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman float floatVal; //!< Format is FLOAT 1152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman LimitFormat format; 1162cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman LimitType type; 117b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deInt32 unsuppTableNdx; 118651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski } featureLimitTable[] = //!< Based on 1.0.28 Vulkan spec 1192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 120444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxImageDimension1D), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 121444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxImageDimension2D), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 122444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxImageDimension3D), 256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 123444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxImageDimensionCube), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 124444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxImageArrayLayers), 256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 125444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTexelBufferElements), 65536, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 126444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxUniformBufferRange), 16384, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 127c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(maxStorageBufferRange), 0, 0, 0, 0, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 128444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPushConstantsSize), 128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 129444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxMemoryAllocationCount), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 130c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(maxSamplerAllocationCount), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE , -1 }, 131651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(bufferImageGranularity), 0, 0, 1, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 132444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(bufferImageGranularity), 0, 0, 131072, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 }, 133444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(sparseAddressSpaceSize), 0, 0, 2UL*1024*1024*1024, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 134444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxBoundDescriptorSets), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 135444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorSamplers), 16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 136444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorUniformBuffers), 12, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 137444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorStorageBuffers), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 138444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorSampledImages), 16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 139444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorStorageImages), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 140444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxPerStageDescriptorInputAttachments), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 141c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(maxPerStageResources), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE , -1 }, 142444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetSamplers), 96, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 143444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetUniformBuffers), 72, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 144444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetUniformBuffersDynamic), 8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 145444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetStorageBuffers), 24, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 146444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetStorageBuffersDynamic), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 147444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetSampledImages), 96, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 148444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDescriptorSetStorageImages), 24, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 149c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(maxDescriptorSetInputAttachments), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE , -1 }, 150444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxVertexInputAttributes), 16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 151444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxVertexInputBindings), 16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 152444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxVertexInputAttributeOffset), 2047, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 153444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxVertexInputBindingStride), 2048, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 154444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxVertexOutputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 155444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationGenerationLevel), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 156444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationPatchSize), 32, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 157444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerVertexInputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 158444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerVertexOutputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 159444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerPatchOutputComponents), 120, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 160444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlTotalOutputComponents), 2048, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 161444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationEvaluationInputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 162444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationEvaluationOutputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 163444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryShaderInvocations), 32, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 164444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryInputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 165444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryOutputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 166444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryOutputVertices), 256, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 167444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryTotalOutputComponents), 1024, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 168444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFragmentInputComponents), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 169444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFragmentOutputAttachments), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 170444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFragmentDualSrcAttachments), 1, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 171444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFragmentCombinedOutputResources), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 172444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeSharedMemorySize), 16384, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 173444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupCount[0]), 65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 174444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupCount[1]), 65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 175444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupCount[2]), 65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 176444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupInvocations), 128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 177444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupSize[0]), 128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 178444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupSize[1]), 128, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 179444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxComputeWorkGroupSize[2]), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 180444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(subPixelPrecisionBits), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 181444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(subTexelPrecisionBits), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 182444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(mipmapPrecisionBits), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 183444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDrawIndexedIndexValue), (deUint32)~0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 184444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDrawIndirectCount), 65535, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 185b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { LIMIT(maxSamplerLodBias), 0, 0, 0, 2.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 186b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { LIMIT(maxSamplerAnisotropy), 0, 0, 0, 16.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 187444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxViewports), 16, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 188444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxViewportDimensions[0]), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 189444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxViewportDimensions[1]), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN , -1 }, 190444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(viewportBoundsRange[0]), 0, 0, 0, -8192.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 191444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(viewportBoundsRange[1]), 0, 0, 0, 8191.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 192444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(viewportSubPixelBits), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 193444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(minMemoryMapAlignment), 64, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 194651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minTexelBufferOffsetAlignment), 0, 0, 1, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 195651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minTexelBufferOffsetAlignment), 0, 0, 256, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 }, 196651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minUniformBufferOffsetAlignment), 0, 0, 1, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 197651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minUniformBufferOffsetAlignment), 0, 0, 256, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 }, 198651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minStorageBufferOffsetAlignment), 0, 0, 1, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 199651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(minStorageBufferOffsetAlignment), 0, 0, 256, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 }, 200444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(minTexelOffset), 0, -8, 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MAX, -1 }, 201444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTexelOffset), 7, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 202444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(minTexelGatherOffset), 0, -8, 0, 0.0f, LIMIT_FORMAT_SIGNED_INT, LIMIT_TYPE_MAX, -1 }, 203444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTexelGatherOffset), 7, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 204b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { LIMIT(minInterpolationOffset), 0, 0, 0, -0.5f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 205444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxInterpolationOffset), 0, 0, 0, 0.5f - (1.0f/deFloatPow(2.0f, (float)limits->subPixelInterpolationOffsetBits)), LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 206444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(subPixelInterpolationOffsetBits), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 207444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFramebufferWidth), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 208444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFramebufferHeight), 4096, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 209c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(maxFramebufferLayers), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 210c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(framebufferColorSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 211c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(framebufferDepthSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 212c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(framebufferStencilSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 213c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(framebufferNoAttachmentsSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 214444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxColorAttachments), 4, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 215c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(sampledImageColorSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 216c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(sampledImageIntegerSampleCounts), VK_SAMPLE_COUNT_1_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 217c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(sampledImageDepthSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 218c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(sampledImageStencilSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 219c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(storageImageSampleCounts), VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT, 0, 0, 0.0f, LIMIT_FORMAT_BITMASK, LIMIT_TYPE_MIN, -1 }, 220444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxSampleMaskWords), 1, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 221c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(timestampComputeAndGraphics), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 222c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(timestampPeriod), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 223444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxClipDistances), 8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 224444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxCullDistances), 8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 225444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxCombinedClipAndCullDistances), 8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_MIN, -1 }, 226c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(discreteQueuePriorities), 8, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 227651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(pointSizeRange[0]), 0, 0, 0, 0.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 228444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(pointSizeRange[0]), 0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 229444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(pointSizeRange[1]), 0, 0, 0, 64.0f - limits->pointSizeGranularity , LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 230651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(lineWidthRange[0]), 0, 0, 0, 0.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 231444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(lineWidthRange[0]), 0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 232444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(lineWidthRange[1]), 0, 0, 0, 8.0f - limits->lineWidthGranularity, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MIN, -1 }, 233444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(pointSizeGranularity), 0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 234444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(lineWidthGranularity), 0, 0, 0, 1.0f, LIMIT_FORMAT_FLOAT, LIMIT_TYPE_MAX, -1 }, 235651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(strictLines), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 236651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(standardSampleLocations), 0, 0, 0, 0.0f, LIMIT_FORMAT_UNSIGNED_INT, LIMIT_TYPE_NONE, -1 }, 237651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(optimalBufferCopyOffsetAlignment), 0, 0, 0, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_NONE, -1 }, 238651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(optimalBufferCopyRowPitchAlignment), 0, 0, 0, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_NONE, -1 }, 239651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(nonCoherentAtomSize), 0, 0, 1, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MIN, -1 }, 240651be53b2a7e987618a98c2a13fcf7350204b244Maciej Jesionowski { LIMIT(nonCoherentAtomSize), 0, 0, 256, 0.0f, LIMIT_FORMAT_DEVICE_SIZE, LIMIT_TYPE_MAX, -1 }, 241b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman }; 242b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 2435489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos const struct UnsupportedFeatureLimitTable 244b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 245b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint32 limitOffset; 2465489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos const char* name; 247b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint32 featureOffset; 248b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint32 uintVal; //!< Format is UNSIGNED_INT 249b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deInt32 intVal; //!< Format is SIGNED_INT 250b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint64 deviceSizeVal; //!< Format is DEVICE_SIZE 251b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman float floatVal; //!< Format is FLOAT 252b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } unsupportedFeatureTable[] = 253b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 254444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(sparseAddressSpaceSize), FEATURE(sparseBinding), 0, 0, 0, 0.0f }, 255444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationGenerationLevel), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 256444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationPatchSize), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 257444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerVertexInputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 258444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerVertexOutputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 259444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlPerPatchOutputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 260444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationControlTotalOutputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 261444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationEvaluationInputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 262444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTessellationEvaluationOutputComponents), FEATURE(tessellationShader), 0, 0, 0, 0.0f }, 263444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryShaderInvocations), FEATURE(geometryShader), 0, 0, 0, 0.0f }, 264444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryInputComponents), FEATURE(geometryShader), 0, 0, 0, 0.0f }, 265444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryOutputComponents), FEATURE(geometryShader), 0, 0, 0, 0.0f }, 266444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryOutputVertices), FEATURE(geometryShader), 0, 0, 0, 0.0f }, 267444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxGeometryTotalOutputComponents), FEATURE(geometryShader), 0, 0, 0, 0.0f }, 268444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxFragmentDualSrcAttachments), FEATURE(dualSrcBlend), 0, 0, 0, 0.0f }, 269444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDrawIndexedIndexValue), FEATURE(fullDrawIndexUint32), (1<<24)-1, 0, 0, 0.0f }, 270444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxDrawIndirectCount), FEATURE(multiDrawIndirect), 1, 0, 0, 0.0f }, 271444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxSamplerAnisotropy), FEATURE(samplerAnisotropy), 1, 0, 0, 0.0f }, 272444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxViewports), FEATURE(multiViewport), 1, 0, 0, 0.0f }, 273444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(minTexelGatherOffset), FEATURE(shaderImageGatherExtended), 0, 0, 0, 0.0f }, 274444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxTexelGatherOffset), FEATURE(shaderImageGatherExtended), 0, 0, 0, 0.0f }, 275444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(minInterpolationOffset), FEATURE(sampleRateShading), 0, 0, 0, 0.0f }, 276444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxInterpolationOffset), FEATURE(sampleRateShading), 0, 0, 0, 0.0f }, 277444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(subPixelInterpolationOffsetBits), FEATURE(sampleRateShading), 0, 0, 0, 0.0f }, 278c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { LIMIT(storageImageSampleCounts), FEATURE(shaderStorageImageMultisample), VK_SAMPLE_COUNT_1_BIT, 0, 0, 0.0f }, 279444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxClipDistances), FEATURE(shaderClipDistance), 0, 0, 0, 0.0f }, 280444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxCullDistances), FEATURE(shaderClipDistance), 0, 0, 0, 0.0f }, 281444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(maxCombinedClipAndCullDistances), FEATURE(shaderClipDistance), 0, 0, 0, 0.0f }, 2822a5e097662a19e991f345cffac9500bfd58386a8David Sodman { LIMIT(pointSizeRange[0]), FEATURE(largePoints), 0, 0, 0, 1.0f }, 283444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(pointSizeRange[1]), FEATURE(largePoints), 0, 0, 0, 1.0f }, 284444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(lineWidthRange[0]), FEATURE(wideLines), 0, 0, 0, 1.0f }, 2852a5e097662a19e991f345cffac9500bfd58386a8David Sodman { LIMIT(lineWidthRange[1]), FEATURE(wideLines), 0, 0, 0, 1.0f }, 286444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(pointSizeGranularity), FEATURE(largePoints), 0, 0, 0, 0.0f }, 287444ad0b682ff5f8a2e243ae2cf5e7e762af99b74David Sodman { LIMIT(lineWidthGranularity), FEATURE(wideLines), 0, 0, 0, 0.0f } 2882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman }; 2892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 2902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << *limits << TestLog::EndMessage; 2912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 292b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman //!< First build a map from limit to unsupported table index 293b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++) 294b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 295b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman for (deUint32 unsuppNdx = 0; unsuppNdx < DE_LENGTH_OF_ARRAY(unsupportedFeatureTable); unsuppNdx++) 296b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 297b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (unsupportedFeatureTable[unsuppNdx].limitOffset == featureLimitTable[ndx].offset) 298b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 299b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman featureLimitTable[ndx].unsuppTableNdx = unsuppNdx; 300b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman break; 301b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 302b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 303b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 304b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 3052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(featureLimitTable); ndx++) 3062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman switch (featureLimitTable[ndx].format) 3082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman case LIMIT_FORMAT_UNSIGNED_INT: 310b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 311b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint32 limitToCheck = featureLimitTable[ndx].uintVal; 312b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (featureLimitTable[ndx].unsuppTableNdx != -1) 313b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 314c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE) 315b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].uintVal; 316b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 317b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 318c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN) 3192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 320b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 321c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck) 3222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit Validation failed " << featureLimitTable[ndx].name 3242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MIN - actual is " 325c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deUint32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 3272cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 329c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX) 3302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 331c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck) 3322cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 3342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MAX - actual is " 335c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deUint32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3362cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 3372cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3382cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3392cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman break; 340b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 3412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 3422cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman case LIMIT_FORMAT_FLOAT: 343b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 344b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman float limitToCheck = featureLimitTable[ndx].floatVal; 345b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (featureLimitTable[ndx].unsuppTableNdx != -1) 346b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 347c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE) 348b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].floatVal; 349b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 350b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 351c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN) 3522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 353c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((float*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck) 3542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 3562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MIN - actual is " 357c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((float*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 3592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 361c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX) 3622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 363c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((float*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck) 3642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 3662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MAX actual is " 367c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((float*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 3692cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3702cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman break; 372b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 3732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 3742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman case LIMIT_FORMAT_SIGNED_INT: 375b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 376b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deInt32 limitToCheck = featureLimitTable[ndx].intVal; 377b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (featureLimitTable[ndx].unsuppTableNdx != -1) 378b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 379c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE) 380b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].intVal; 381b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 3822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN) 3832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 384c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deInt32*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck) 3852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 3872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MIN actual is " 388c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deInt32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 3902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 3912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 392c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX) 3932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 394c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deInt32*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck) 3952cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 3962cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 3972cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MAX actual is " 398c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deInt32*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 3992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 4002cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4012cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4022cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman break; 403b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 4042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 4052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman case LIMIT_FORMAT_DEVICE_SIZE: 406b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 407b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman deUint64 limitToCheck = featureLimitTable[ndx].deviceSizeVal; 408b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (featureLimitTable[ndx].unsuppTableNdx != -1) 409b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman { 410c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE) 411b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].deviceSizeVal; 412b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 413b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman 414c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN) 4152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 416c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deUint64*)((deUint8*)limits+featureLimitTable[ndx].offset)) < limitToCheck) 4172cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 4182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 4192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MIN actual is " 420c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 4212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 4222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 424c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (featureLimitTable[ndx].type == LIMIT_TYPE_MAX) 4252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 426c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((deUint64*)((deUint8*)limits+featureLimitTable[ndx].offset)) > limitToCheck) 4272cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 4282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 4292cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << " not valid-limit type MAX actual is " 430c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 431c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos limitsOk = false; 432c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 433c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 434c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos break; 435c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 436c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 437c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos case LIMIT_FORMAT_BITMASK: 438c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 439c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos deUint32 limitToCheck = featureLimitTable[ndx].uintVal; 440c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureLimitTable[ndx].unsuppTableNdx != -1) 441c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 442c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (*((VkBool32*)((deUint8*)features+unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].featureOffset)) == VK_FALSE) 443c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos limitToCheck = unsupportedFeatureTable[featureLimitTable[ndx].unsuppTableNdx].uintVal; 444c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 445c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 446c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureLimitTable[ndx].type == LIMIT_TYPE_MIN) 447c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 448c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if ((*((deUint32*)((deUint8*)limits+featureLimitTable[ndx].offset)) & limitToCheck) != limitToCheck) 449c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 450c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "limit validation failed, " << featureLimitTable[ndx].name 451c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << " not valid-limit type bitmask actual is " 452c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << *((deUint64*)((deUint8*)limits + featureLimitTable[ndx].offset)) << TestLog::EndMessage; 4532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 4542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman break; 457b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman } 4582cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 4592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman default: 4602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman DE_ASSERT(0); 4612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman limitsOk = false; 4622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4632cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 4642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 465c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(limits->maxViewportDimensions); ndx++) 466c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 467c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (limits->maxImageDimension2D > limits->maxViewportDimensions[ndx]) 468c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 469c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "limit validation failed, maxImageDimension2D of " << limits->maxImageDimension2D 470c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << "is larger than maxViewportDimension[" << ndx << "] of " << limits->maxViewportDimensions[ndx] << TestLog::EndMessage; 471c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos limitsOk = false; 472c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 473c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 474c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 475674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos if (limits->viewportBoundsRange[0] > float(-2 * limits->maxViewportDimensions[0])) 476c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 477c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "limit validation failed, viewPortBoundsRange[0] of " << limits->viewportBoundsRange[0] 478c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << "is larger than -2*maxViewportDimension[0] of " << -2*limits->maxViewportDimensions[0] << TestLog::EndMessage; 479c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos limitsOk = false; 480c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 481c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 482674ddbb09a7bb6b16f839e129d5f0f2ac6dc9e74Pyry Haulos if (limits->viewportBoundsRange[1] < float(2 * limits->maxViewportDimensions[1] - 1)) 483c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 484c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "limit validation failed, viewportBoundsRange[1] of " << limits->viewportBoundsRange[1] 485c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << "is less than 2*maxViewportDimension[1] of " << 2*limits->maxViewportDimensions[1] << TestLog::EndMessage; 486c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos limitsOk = false; 487c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 488c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 4892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return limitsOk; 4902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 4912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 4924d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskitemplate<typename T> 4934d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskiclass CheckIncompleteResult 4944d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 4954d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskipublic: 4964d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski virtual ~CheckIncompleteResult (void) {} 4974d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski virtual void getResult (Context& context, T* data) = 0; 4984d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 4994d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void operator() (Context& context, tcu::ResultCollector& results, const std::size_t expectedCompleteSize) 5004d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5014d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski if (expectedCompleteSize == 0) 5024d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski return; 5034d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5044d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski vector<T> outputData (expectedCompleteSize); 5054d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const deUint32 usedSize = static_cast<deUint32>(expectedCompleteSize / 3); 5064d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5074d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski ValidateQueryBits::fillBits(outputData.begin(), outputData.end()); // unused entries should have this pattern intact 5084d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_count = usedSize; 5094d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = VK_SUCCESS; 5104d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5114d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski getResult(context, &outputData[0]); // update m_count and m_result 5124d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5134d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski if (m_count != usedSize || m_result != VK_INCOMPLETE || !ValidateQueryBits::checkBits(outputData.begin() + m_count, outputData.end())) 5144d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski results.fail("Query didn't return VK_INCOMPLETE"); 5154d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5164d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5174d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskiprotected: 5184d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski deUint32 m_count; 5194d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski VkResult m_result; 5204d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5214d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5224d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskistruct CheckEnumeratePhysicalDevicesIncompleteResult : public CheckIncompleteResult<VkPhysicalDevice> 5234d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 5244d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void getResult (Context& context, VkPhysicalDevice* data) 5254d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5264d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = context.getInstanceInterface().enumeratePhysicalDevices(context.getInstance(), &m_count, data); 5274d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5284d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5294d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5304d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskistruct CheckEnumerateInstanceLayerPropertiesIncompleteResult : public CheckIncompleteResult<VkLayerProperties> 5314d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 5324d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void getResult (Context& context, VkLayerProperties* data) 5334d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5344d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = context.getPlatformInterface().enumerateInstanceLayerProperties(&m_count, data); 5354d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5364d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5374d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5384d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskistruct CheckEnumerateDeviceLayerPropertiesIncompleteResult : public CheckIncompleteResult<VkLayerProperties> 5394d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 5404d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void getResult (Context& context, VkLayerProperties* data) 5414d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5424d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = context.getInstanceInterface().enumerateDeviceLayerProperties(context.getPhysicalDevice(), &m_count, data); 5434d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5444d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5454d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5464d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskistruct CheckEnumerateInstanceExtensionPropertiesIncompleteResult : public CheckIncompleteResult<VkExtensionProperties> 5474d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 5484d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateInstanceExtensionPropertiesIncompleteResult (std::string layerName = std::string()) : m_layerName(layerName) {} 5494d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5504d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void getResult (Context& context, VkExtensionProperties* data) 5514d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5524d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const char* pLayerName = (m_layerName.length() != 0 ? m_layerName.c_str() : DE_NULL); 5534d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = context.getPlatformInterface().enumerateInstanceExtensionProperties(pLayerName, &m_count, data); 5544d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5554d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5564d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskiprivate: 5574d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const std::string m_layerName; 5584d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5594d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5604d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskistruct CheckEnumerateDeviceExtensionPropertiesIncompleteResult : public CheckIncompleteResult<VkExtensionProperties> 5614d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski{ 5624d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateDeviceExtensionPropertiesIncompleteResult (std::string layerName = std::string()) : m_layerName(layerName) {} 5634d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5644d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski void getResult (Context& context, VkExtensionProperties* data) 5654d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski { 5664d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const char* pLayerName = (m_layerName.length() != 0 ? m_layerName.c_str() : DE_NULL); 5674d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski m_result = context.getInstanceInterface().enumerateDeviceExtensionProperties(context.getPhysicalDevice(), pLayerName, &m_count, data); 5684d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski } 5694d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5704d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowskiprivate: 5714d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const std::string m_layerName; 5724d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski}; 5734d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumeratePhysicalDevices (Context& context) 5752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 5762cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 5774d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski tcu::ResultCollector results (log); 5782cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(context.getInstanceInterface(), context.getInstance()); 5792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 5802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Integer("NumDevices", "Number of devices", "", QP_KEY_TAG_NONE, deInt64(devices.size())); 5812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 5822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t ndx = 0; ndx < devices.size(); ndx++) 5832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << ndx << ": " << devices[ndx] << TestLog::EndMessage; 5842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 5854d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumeratePhysicalDevicesIncompleteResult()(context, results, devices.size()); 5864d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 5874d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski return tcu::TestStatus(results.getResult(), results.getMessage()); 5882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 5892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 590abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvitemplate<typename T> 591abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvivoid collectDuplicates (set<T>& duplicates, const vector<T>& values) 592abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{ 593abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi set<T> seen; 594abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 595abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi for (size_t ndx = 0; ndx < values.size(); ndx++) 596abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 597abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi const T& value = values[ndx]; 598abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 599abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi if (!seen.insert(value).second) 600abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi duplicates.insert(value); 601abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 602abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi} 603abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 604e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkDuplicates (tcu::ResultCollector& results, const char* what, const vector<string>& values) 605abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{ 606abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi set<string> duplicates; 607abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 608abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi collectDuplicates(duplicates, values); 609abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 610e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos for (set<string>::const_iterator iter = duplicates.begin(); iter != duplicates.end(); ++iter) 611abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 612e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos std::ostringstream msg; 613e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos msg << "Duplicate " << what << ": " << *iter; 614e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos results.fail(msg.str()); 615abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 616e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos} 617e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 618e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkDuplicateExtensions (tcu::ResultCollector& results, const vector<string>& extensions) 619e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos{ 620e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicates(results, "extension", extensions); 621e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos} 622abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 623e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkDuplicateLayers (tcu::ResultCollector& results, const vector<string>& layers) 624e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos{ 625e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicates(results, "layer", layers); 626e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos} 627e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 628e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkKhrExtensions (tcu::ResultCollector& results, 629e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos const vector<string>& extensions, 630e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos const int numAllowedKhrExtensions, 631e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos const char* const* allowedKhrExtensions) 632e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos{ 633e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos const set<string> allowedExtSet (allowedKhrExtensions, allowedKhrExtensions+numAllowedKhrExtensions); 634e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 635e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos for (vector<string>::const_iterator extIter = extensions.begin(); extIter != extensions.end(); ++extIter) 636e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos { 637e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos // Only Khronos-controlled extensions are checked 6384514355a0fdf809a70393642a377ea0906bc8ae6Pyry Haulos if (de::beginsWith(*extIter, "VK_KHR_") && 639e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos !de::contains(allowedExtSet, *extIter)) 640e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos { 641e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos results.fail("Unknown KHR extension " + *extIter); 642e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos } 643abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 644abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi} 645abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 646e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkInstanceExtensions (tcu::ResultCollector& results, const vector<string>& extensions) 647abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{ 648e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos static const char* s_allowedInstanceKhrExtensions[] = 649e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos { 650e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_surface", 651e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_display", 652e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_android_surface", 653e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_mir_surface", 654e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_wayland_surface", 655e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_win32_surface", 656e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_xcb_surface", 657e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_xlib_surface", 658de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos "VK_KHR_get_physical_device_properties2", 659ab5169cc47d02f73685b6a308bc4e81eba41f57ePyry Haulos "VK_KHR_get_surface_capabilities2", 660e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos }; 661e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 662e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedInstanceKhrExtensions), s_allowedInstanceKhrExtensions); 663e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicateExtensions(results, extensions); 664abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi} 665abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 666e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulosvoid checkDeviceExtensions (tcu::ResultCollector& results, const vector<string>& extensions) 667abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi{ 66855e88b15b0983b2fc5d3fa9d5507a50e864602bcMaciej Jesionowski static const char* s_allowedDeviceKhrExtensions[] = 669e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos { 670e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_swapchain", 671e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos "VK_KHR_display_swapchain", 6728ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski "VK_KHR_sampler_mirror_clamp_to_edge", 6738ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski "VK_KHR_shader_draw_parameters", 67455e88b15b0983b2fc5d3fa9d5507a50e864602bcMaciej Jesionowski "VK_KHR_maintenance1", 6750a80ec2c33f4483764669cc58ea3010f9c1b855fPetros Bantolas "VK_KHR_push_descriptor", 6760a80ec2c33f4483764669cc58ea3010f9c1b855fPetros Bantolas "VK_KHR_descriptor_update_template", 677ff4ad17cd6c9331fbf59ffda838bb18e9b3569aaIago Toral Quiroga "VK_KHR_incremental_present", 678a11c1a38ff00f6274e58d8d2476d0cc0de57cb2dChris Forbes "VK_KHR_shared_presentable_image", 679e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos }; 680e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 68155e88b15b0983b2fc5d3fa9d5507a50e864602bcMaciej Jesionowski checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedDeviceKhrExtensions), s_allowedDeviceKhrExtensions); 682e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicateExtensions(results, extensions); 683abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi} 684abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 6852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateInstanceLayers (Context& context) 6862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 687abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi TestLog& log = context.getTestContext().getLog(); 688e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos tcu::ResultCollector results (log); 689abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi const vector<VkLayerProperties> properties = enumerateInstanceLayerProperties(context.getPlatformInterface()); 690abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> layerNames; 6912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 6922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t ndx = 0; ndx < properties.size(); ndx++) 693abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 6942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage; 6952cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 696abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi layerNames.push_back(properties[ndx].layerName); 697abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 698abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 699e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicateLayers(results, layerNames); 7004d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateInstanceLayerPropertiesIncompleteResult()(context, results, layerNames.size()); 701e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 702e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 7032cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 7042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateInstanceExtensions (Context& context) 7062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 707e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos TestLog& log = context.getTestContext().getLog(); 708e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos tcu::ResultCollector results (log); 7092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 7112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const ScopedLogSection section (log, "Global", "Global Extensions"); 7122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkExtensionProperties> properties = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL); 713abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> extensionNames; 7142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t ndx = 0; ndx < properties.size(); ndx++) 716abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 7172cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage; 718abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 719abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi extensionNames.push_back(properties[ndx].extensionName); 720abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 721abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 722e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkInstanceExtensions(results, extensionNames); 7234d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateInstanceExtensionPropertiesIncompleteResult()(context, results, properties.size()); 7242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 7252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 7272cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkLayerProperties> layers = enumerateInstanceLayerProperties(context.getPlatformInterface()); 7282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7292cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 7302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 731abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi const ScopedLogSection section (log, layer->layerName, string("Layer: ") + layer->layerName); 732abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi const vector<VkExtensionProperties> properties = enumerateInstanceExtensionProperties(context.getPlatformInterface(), layer->layerName); 733abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> extensionNames; 7342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7352cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t extNdx = 0; extNdx < properties.size(); extNdx++) 736abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 7372cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << extNdx << ": " << properties[extNdx] << TestLog::EndMessage; 738abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 739abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi extensionNames.push_back(properties[extNdx].extensionName); 740abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 741abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 742e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkInstanceExtensions(results, extensionNames); 7434d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateInstanceExtensionPropertiesIncompleteResult(layer->layerName)(context, results, properties.size()); 7442cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 7452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 7462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 747e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 7482cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 7492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateDeviceLayers (Context& context) 7512cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 7522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 753e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos tcu::ResultCollector results (log); 7544d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski const vector<VkLayerProperties> properties = enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 755abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> layerNames; 7562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t ndx = 0; ndx < properties.size(); ndx++) 758abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 7592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage; 7602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 761abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi layerNames.push_back(properties[ndx].layerName); 762abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 763abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 764e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDuplicateLayers(results, layerNames); 7654d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateDeviceLayerPropertiesIncompleteResult()(context, results, layerNames.size()); 766e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos 767e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 7682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 7692cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7702cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus enumerateDeviceExtensions (Context& context) 7712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 772e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos TestLog& log = context.getTestContext().getLog(); 773e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos tcu::ResultCollector results (log); 7742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7752cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 7762cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const ScopedLogSection section (log, "Global", "Global Extensions"); 7772cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL); 778abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> extensionNames; 7792cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7802cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t ndx = 0; ndx < properties.size(); ndx++) 781abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 7822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << ndx << ": " << properties[ndx] << TestLog::EndMessage; 783abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 784abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi extensionNames.push_back(properties[ndx].extensionName); 785abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 786abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 787e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDeviceExtensions(results, extensionNames); 7884d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateDeviceExtensionPropertiesIncompleteResult()(context, results, properties.size()); 7892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 7902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 7922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkLayerProperties> layers = enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 7932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 7942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 7952cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 7962cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const ScopedLogSection section (log, layer->layerName, string("Layer: ") + layer->layerName); 7972cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkExtensionProperties> properties = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), layer->layerName); 798abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi vector<string> extensionNames; 7992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 8002cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t extNdx = 0; extNdx < properties.size(); extNdx++) 801abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi { 8022cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << extNdx << ": " << properties[extNdx] << TestLog::EndMessage; 803abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 804abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 805abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi extensionNames.push_back(properties[extNdx].extensionName); 806abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi } 807abf60ccfd29f340901efdfceabc195355fd2eeeeMika Isojärvi 808e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos checkDeviceExtensions(results, extensionNames); 8094d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski CheckEnumerateDeviceExtensionPropertiesIncompleteResult(layer->layerName)(context, results, properties.size()); 8102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 8112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 8122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 813e9e21088823d9174eb0a61de765c42c00389f903Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 8142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 8152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 816c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos#define VK_SIZE_OF(STRUCT, MEMBER) (sizeof(((STRUCT*)0)->MEMBER)) 8175489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos#define OFFSET_TABLE_ENTRY(STRUCT, MEMBER) { (size_t)DE_OFFSET_OF(STRUCT, MEMBER), VK_SIZE_OF(STRUCT, MEMBER) } 818c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 8192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceFeatures (Context& context) 8202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 8214d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski using namespace ValidateQueryBits; 8224d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 8232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 8242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman VkPhysicalDeviceFeatures* features; 8252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint8 buffer[sizeof(VkPhysicalDeviceFeatures) + GUARD_SIZE]; 8262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 827c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const QueryMemberTableEntry featureOffsetTable[] = 828c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 829c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, robustBufferAccess), 830c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fullDrawIndexUint32), 831c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, imageCubeArray), 832c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, independentBlend), 833c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, geometryShader), 834c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, tessellationShader), 835c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sampleRateShading), 836c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, dualSrcBlend), 837c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, logicOp), 838c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, multiDrawIndirect), 839c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, drawIndirectFirstInstance), 840c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthClamp), 841c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthBiasClamp), 842c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fillModeNonSolid), 843c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, depthBounds), 844c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, wideLines), 845c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, largePoints), 846c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, alphaToOne), 847c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, multiViewport), 848c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, samplerAnisotropy), 849c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionETC2), 850c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionASTC_LDR), 851c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, textureCompressionBC), 852c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, occlusionQueryPrecise), 853c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, pipelineStatisticsQuery), 854c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, vertexPipelineStoresAndAtomics), 855c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, fragmentStoresAndAtomics), 856c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderTessellationAndGeometryPointSize), 857c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderImageGatherExtended), 858c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageExtendedFormats), 859c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageMultisample), 860c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageReadWithoutFormat), 861c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageWriteWithoutFormat), 862c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderUniformBufferArrayDynamicIndexing), 863c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderSampledImageArrayDynamicIndexing), 864c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageBufferArrayDynamicIndexing), 865c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderStorageImageArrayDynamicIndexing), 866c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderClipDistance), 867c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderCullDistance), 868c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderFloat64), 869c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderInt64), 870c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderInt16), 871c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderResourceResidency), 872c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, shaderResourceMinLod), 873c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseBinding), 874c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyBuffer), 875c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyImage2D), 876c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyImage3D), 877c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency2Samples), 878c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency4Samples), 879c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency8Samples), 880c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidency16Samples), 881c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, sparseResidencyAliased), 882c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, variableMultisampleRate), 883c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos OFFSET_TABLE_ENTRY(VkPhysicalDeviceFeatures, inheritedQueries), 884c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 0, 0 } 885c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos }; 886c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 8872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deMemset(buffer, GUARD_VALUE, sizeof(buffer)); 8882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman features = reinterpret_cast<VkPhysicalDeviceFeatures*>(buffer); 8892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 8902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), features); 8912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 8922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage 8932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << TestLog::Message << *features << TestLog::EndMessage; 8942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 89503649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski // Requirements and dependencies 89603649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski { 89703649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski if (!features->robustBufferAccess) 89803649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski return tcu::TestStatus::fail("robustBufferAccess is not supported"); 89903649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski 90003649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski // multiViewport requires MultiViewport (SPIR-V capability) support, which depends on Geometry 90103649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski if (features->multiViewport && !features->geometryShader) 90203649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski return tcu::TestStatus::fail("multiViewport is supported but geometryShader is not"); 90303649fbf655ac8a93e1ce94189fa316d874f3c21Maciej Jesionowski } 904c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 9052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (int ndx = 0; ndx < GUARD_SIZE; ndx++) 9062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 9072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman if (buffer[ndx + sizeof(VkPhysicalDeviceFeatures)] != GUARD_VALUE) 9082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 9092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "deviceFeatures - Guard offset " << ndx << " not valid" << TestLog::EndMessage; 9102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::fail("deviceFeatures buffer overflow"); 9112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 9122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 9132cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 914c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (!validateInitComplete(context.getPhysicalDevice(), &InstanceInterface::getPhysicalDeviceFeatures, context.getInstanceInterface(), featureOffsetTable)) 915c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 916c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceFeatures - VkPhysicalDeviceFeatures not completely initialized" << TestLog::EndMessage; 917c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceFeatures incomplete initialization"); 918c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 919c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 9202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::pass("Query succeeded"); 9212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 9222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 923fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quirogastatic const ValidateQueryBits::QueryMemberTableEntry s_physicalDevicePropertiesOffsetTable[] = 924fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga{ 925fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, apiVersion), 926fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, driverVersion), 927fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, vendorID), 928fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, deviceID), 929fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, deviceType), 930fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, pipelineCacheUUID), 931fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension1D), 932fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension2D), 933fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimension3D), 934fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageDimensionCube), 935fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxImageArrayLayers), 936fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelBufferElements), 937fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxUniformBufferRange), 938fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxStorageBufferRange), 939fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPushConstantsSize), 940fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxMemoryAllocationCount), 941fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerAllocationCount), 942fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.bufferImageGranularity), 943fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sparseAddressSpaceSize), 944fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxBoundDescriptorSets), 945fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorSamplers), 946fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorUniformBuffers), 947fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorStorageBuffers), 948fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorSampledImages), 949fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorStorageImages), 950fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageDescriptorInputAttachments), 951fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxPerStageResources), 952fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetSamplers), 953fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetUniformBuffers), 954fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetUniformBuffersDynamic), 955fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageBuffers), 956fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageBuffersDynamic), 957fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetSampledImages), 958fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetStorageImages), 959fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDescriptorSetInputAttachments), 960fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputAttributes), 961fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputBindings), 962fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputAttributeOffset), 963fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexInputBindingStride), 964fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxVertexOutputComponents), 965fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationGenerationLevel), 966fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationPatchSize), 967fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerVertexInputComponents), 968fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerVertexOutputComponents), 969fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlPerPatchOutputComponents), 970fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationControlTotalOutputComponents), 971fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationEvaluationInputComponents), 972fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTessellationEvaluationOutputComponents), 973fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryShaderInvocations), 974fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryInputComponents), 975fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryOutputComponents), 976fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryOutputVertices), 977fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxGeometryTotalOutputComponents), 978fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentInputComponents), 979fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentOutputAttachments), 980fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentDualSrcAttachments), 981fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFragmentCombinedOutputResources), 982fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeSharedMemorySize), 983fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupCount[3]), 984fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupInvocations), 985fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxComputeWorkGroupSize[3]), 986fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subPixelPrecisionBits), 987fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subTexelPrecisionBits), 988fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.mipmapPrecisionBits), 989fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDrawIndexedIndexValue), 990fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxDrawIndirectCount), 991fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerLodBias), 992fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSamplerAnisotropy), 993fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxViewports), 994fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxViewportDimensions[2]), 995fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.viewportBoundsRange[2]), 996fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.viewportSubPixelBits), 997fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minMemoryMapAlignment), 998fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelBufferOffsetAlignment), 999fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minUniformBufferOffsetAlignment), 1000fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minStorageBufferOffsetAlignment), 1001fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelOffset), 1002fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelOffset), 1003fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minTexelGatherOffset), 1004fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxTexelGatherOffset), 1005fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.minInterpolationOffset), 1006fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxInterpolationOffset), 1007fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.subPixelInterpolationOffsetBits), 1008fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferWidth), 1009fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferHeight), 1010fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxFramebufferLayers), 1011fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferColorSampleCounts), 1012fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferDepthSampleCounts), 1013fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferStencilSampleCounts), 1014fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.framebufferNoAttachmentsSampleCounts), 1015fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxColorAttachments), 1016fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageColorSampleCounts), 1017fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageIntegerSampleCounts), 1018fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageDepthSampleCounts), 1019fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.sampledImageStencilSampleCounts), 1020fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.storageImageSampleCounts), 1021fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxSampleMaskWords), 1022fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.timestampComputeAndGraphics), 1023fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.timestampPeriod), 1024fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxClipDistances), 1025fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxCullDistances), 1026fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.maxCombinedClipAndCullDistances), 1027fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.discreteQueuePriorities), 1028fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.pointSizeRange[2]), 1029fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.lineWidthRange[2]), 1030fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.pointSizeGranularity), 1031fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.lineWidthGranularity), 1032fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.strictLines), 1033fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.standardSampleLocations), 1034fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.optimalBufferCopyOffsetAlignment), 1035fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.optimalBufferCopyRowPitchAlignment), 1036fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, limits.nonCoherentAtomSize), 1037fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard2DBlockShape), 1038fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard2DMultisampleBlockShape), 1039fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyStandard3DBlockShape), 1040fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyAlignedMipSize), 1041fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga OFFSET_TABLE_ENTRY(VkPhysicalDeviceProperties, sparseProperties.residencyNonResidentStrict), 1042fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga { 0, 0 } 1043fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga}; 1044fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga 10452cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceProperties (Context& context) 10462cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 10474d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski using namespace ValidateQueryBits; 10484d2a7c4bb5ae834b4eb17bc5e5218ccf0d607736Maciej Jesionowski 10492cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 10502cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman VkPhysicalDeviceProperties* props; 1051b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman VkPhysicalDeviceFeatures features; 10522cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint8 buffer[sizeof(VkPhysicalDeviceProperties) + GUARD_SIZE]; 10532cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 10542cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman props = reinterpret_cast<VkPhysicalDeviceProperties*>(buffer); 10552cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deMemset(props, GUARD_VALUE, sizeof(buffer)); 10562cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 10572cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman context.getInstanceInterface().getPhysicalDeviceProperties(context.getPhysicalDevice(), props); 1058b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman context.getInstanceInterface().getPhysicalDeviceFeatures(context.getPhysicalDevice(), &features); 10592cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 10602cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage 10612cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << TestLog::Message << *props << TestLog::EndMessage; 10622cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1063b9e28f6023dd018369a67d077c32cf1c1f5399eeDavid Sodman if (!validateFeatureLimits(props, &features, log)) 10642cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::fail("deviceProperties - feature limits failed"); 10652cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 10662cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (int ndx = 0; ndx < GUARD_SIZE; ndx++) 10672cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 10682cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman if (buffer[ndx + sizeof(VkPhysicalDeviceProperties)] != GUARD_VALUE) 10692cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 10702cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "deviceProperties - Guard offset " << ndx << " not valid" << TestLog::EndMessage; 10712cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::fail("deviceProperties buffer overflow"); 10722cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 10732cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 10742cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1075fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga if (!validateInitComplete(context.getPhysicalDevice(), &InstanceInterface::getPhysicalDeviceProperties, context.getInstanceInterface(), s_physicalDevicePropertiesOffsetTable)) 1076c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1077c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceProperties - VkPhysicalDeviceProperties not completely initialized" << TestLog::EndMessage; 1078c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceProperties incomplete initialization"); 1079c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1080c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 108133878d45346dddf85669f610783939cad0d32817Maciej Jesionowski // Check if deviceName string is properly terminated. 108233878d45346dddf85669f610783939cad0d32817Maciej Jesionowski if (deStrnlen(props->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE) == VK_MAX_PHYSICAL_DEVICE_NAME_SIZE) 108333878d45346dddf85669f610783939cad0d32817Maciej Jesionowski { 108433878d45346dddf85669f610783939cad0d32817Maciej Jesionowski log << TestLog::Message << "deviceProperties - VkPhysicalDeviceProperties deviceName not properly initialized" << TestLog::EndMessage; 108533878d45346dddf85669f610783939cad0d32817Maciej Jesionowski return tcu::TestStatus::fail("deviceProperties incomplete initialization"); 108633878d45346dddf85669f610783939cad0d32817Maciej Jesionowski } 108733878d45346dddf85669f610783939cad0d32817Maciej Jesionowski 1088c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1089c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const ApiVersion deviceVersion = unpackVersion(props->apiVersion); 1090c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const ApiVersion deqpVersion = unpackVersion(VK_API_VERSION); 1091c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1092c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (deviceVersion.majorNum != deqpVersion.majorNum) 1093c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1094c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceProperties - API Major Version " << deviceVersion.majorNum << " is not valid" << TestLog::EndMessage; 1095c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceProperties apiVersion not valid"); 1096c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1097c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1098c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (deviceVersion.minorNum > deqpVersion.minorNum) 1099c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1100c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceProperties - API Minor Version " << deviceVersion.minorNum << " is not valid for this version of dEQP" << TestLog::EndMessage; 1101c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceProperties apiVersion not valid"); 1102c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1103c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1104c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 11052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::pass("DeviceProperites query succeeded"); 11062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 11072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceQueueFamilyProperties (Context& context) 11092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 11102cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 11112cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman const vector<VkQueueFamilyProperties> queueProperties = getPhysicalDeviceQueueFamilyProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 11122cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11132cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage; 11142cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11152cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (size_t queueNdx = 0; queueNdx < queueProperties.size(); queueNdx++) 11162cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << queueNdx << ": " << queueProperties[queueNdx] << TestLog::EndMessage; 11172cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11182cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::pass("Querying queue properties succeeded"); 11192cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 11202cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11212cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestStatus deviceMemoryProperties (Context& context) 11222cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 11232cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman TestLog& log = context.getTestContext().getLog(); 11242cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman VkPhysicalDeviceMemoryProperties* memProps; 11252cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deUint8 buffer[sizeof(VkPhysicalDeviceMemoryProperties) + GUARD_SIZE]; 11262cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11272cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman memProps = reinterpret_cast<VkPhysicalDeviceMemoryProperties*>(buffer); 11282cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman deMemset(buffer, GUARD_VALUE, sizeof(buffer)); 11292cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11302cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman context.getInstanceInterface().getPhysicalDeviceMemoryProperties(context.getPhysicalDevice(), memProps); 11312cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11322cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "device = " << context.getPhysicalDevice() << TestLog::EndMessage 11332cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman << TestLog::Message << *memProps << TestLog::EndMessage; 11342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 11352cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman for (deInt32 ndx = 0; ndx < GUARD_SIZE; ndx++) 11362cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 11372cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman if (buffer[ndx + sizeof(VkPhysicalDeviceMemoryProperties)] != GUARD_VALUE) 11382cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 11392cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman log << TestLog::Message << "deviceMemoryProperties - Guard offset " << ndx << " not valid" << TestLog::EndMessage; 11402cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::fail("deviceMemoryProperties buffer overflow"); 11412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 11422cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 11432cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 1144c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (memProps->memoryHeapCount >= VK_MAX_MEMORY_HEAPS) 1145c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1146c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - HeapCount larger than " << (deUint32)VK_MAX_MEMORY_HEAPS << TestLog::EndMessage; 1147c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties HeapCount too large"); 1148c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1149c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1150c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (memProps->memoryHeapCount == 1) 1151c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1152c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if ((memProps->memoryHeaps[0].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) == 0) 1153c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1154c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - Single heap is not marked DEVICE_LOCAL" << TestLog::EndMessage; 1155c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties invalid HeapFlags"); 1156c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1157c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1158c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1159c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkMemoryPropertyFlags validPropertyFlags[] = 1160c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1161bdd440efc441070324392728d6fd42304c30a2f2Pyry Haulos 0, 1162c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 1163c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1164c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT, 1165c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry 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, 1166c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1167c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT, 1168c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 1169c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT 1170c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos }; 1171c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1172c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkMemoryPropertyFlags requiredPropertyFlags[] = 1173c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1174c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 1175c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos }; 1176c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1177c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos bool requiredFlagsFound[DE_LENGTH_OF_ARRAY(requiredPropertyFlags)]; 1178c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos std::fill(DE_ARRAY_BEGIN(requiredFlagsFound), DE_ARRAY_END(requiredFlagsFound), false); 1179c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1180c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos for (deUint32 memoryNdx = 0; memoryNdx < memProps->memoryTypeCount; memoryNdx++) 1181c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1182c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos bool validPropTypeFound = false; 1183c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1184c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (memProps->memoryTypes[memoryNdx].heapIndex >= memProps->memoryHeapCount) 1185c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1186c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - heapIndex " << memProps->memoryTypes[memoryNdx].heapIndex << " larger than heapCount" << TestLog::EndMessage; 1187c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties - invalid heapIndex"); 1188c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1189c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1190c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry 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; 1191c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1192c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos for (const VkMemoryPropertyFlags* requiredFlagsIterator = DE_ARRAY_BEGIN(requiredPropertyFlags); requiredFlagsIterator != DE_ARRAY_END(requiredPropertyFlags); requiredFlagsIterator++) 1193c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if ((memProps->memoryTypes[memoryNdx].propertyFlags & *requiredFlagsIterator) == *requiredFlagsIterator) 1194c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos requiredFlagsFound[requiredFlagsIterator - DE_ARRAY_BEGIN(requiredPropertyFlags)] = true; 1195c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1196c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (de::contains(DE_ARRAY_BEGIN(validPropertyFlags), DE_ARRAY_END(validPropertyFlags), memProps->memoryTypes[memoryNdx].propertyFlags & bitsToCheck)) 1197c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos validPropTypeFound = true; 1198c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1199c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (!validPropTypeFound) 1200c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1201c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - propertyFlags " 1202c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << memProps->memoryTypes[memoryNdx].propertyFlags << " not valid" << TestLog::EndMessage; 1203c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties propertyFlags not valid"); 1204c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1205c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1206c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (memProps->memoryTypes[memoryNdx].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) 1207c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1208c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if ((memProps->memoryHeaps[memProps->memoryTypes[memoryNdx].heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) == 0) 1209c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1210c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - DEVICE_LOCAL memory type references heap which is not DEVICE_LOCAL" << TestLog::EndMessage; 1211c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties inconsistent memoryType and HeapFlags"); 1212c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1213c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1214c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 1215c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1216c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (memProps->memoryHeaps[memProps->memoryTypes[memoryNdx].heapIndex].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) 1217c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1218c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - non-DEVICE_LOCAL memory type references heap with is DEVICE_LOCAL" << TestLog::EndMessage; 1219c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties inconsistent memoryType and HeapFlags"); 1220c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1221c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1222c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1223c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1224c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos bool* requiredFlagsFoundIterator = std::find(DE_ARRAY_BEGIN(requiredFlagsFound), DE_ARRAY_END(requiredFlagsFound), false); 1225c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (requiredFlagsFoundIterator != DE_ARRAY_END(requiredFlagsFound)) 1226c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1227c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_ASSERT(requiredFlagsFoundIterator - DE_ARRAY_BEGIN(requiredFlagsFound) <= DE_LENGTH_OF_ARRAY(requiredPropertyFlags)); 1228c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "deviceMemoryProperties - required property flags " 1229c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos << getMemoryPropertyFlagsStr(requiredPropertyFlags[requiredFlagsFoundIterator - DE_ARRAY_BEGIN(requiredFlagsFound)]) << " not found" << TestLog::EndMessage; 1230c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1231c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("deviceMemoryProperties propertyFlags not valid"); 1232c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1233c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 12342cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return tcu::TestStatus::pass("Querying memory properties succeeded"); 12352cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 12362cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 123766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos// \todo [2016-01-22 pyry] Optimize by doing format -> flags mapping instead 123866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 123966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry HaulosVkFormatFeatureFlags getRequiredOptimalTilingFeatures (VkFormat format) 124066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 124166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredSampledImageBlitSrcFormats[] = 124266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 124366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B4G4R4A4_UNORM_PACK16, 124466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 124566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A1R5G5B5_UNORM_PACK16, 124666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UNORM, 124766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SNORM, 124866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UINT, 124966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SINT, 125066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UNORM, 125166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SNORM, 125266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UINT, 125366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SINT, 125466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 125566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 125666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 125766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 125866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SRGB, 125966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 126066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_SRGB, 126166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 126266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SNORM_PACK32, 126366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UINT_PACK32, 126466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SINT_PACK32, 126566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SRGB_PACK32, 126666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 126766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UINT_PACK32, 126866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_UINT, 126966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SINT, 127066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SFLOAT, 127166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_UINT, 127266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SINT, 127366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SFLOAT, 127466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 127566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 127666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 127766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 127866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 127966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 128066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 128166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 128266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 128366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 128466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 128566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT, 128666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B10G11R11_UFLOAT_PACK32, 128766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, 128866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_D16_UNORM, 128966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_D32_SFLOAT 129066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 1291c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos static const VkFormat s_requiredSampledImageFilterLinearFormats[] = 1292c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1293c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_B4G4R4A4_UNORM_PACK16, 1294c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 1295c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_A1R5G5B5_UNORM_PACK16, 1296c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8_UNORM, 1297c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8_SNORM, 1298c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8G8_UNORM, 1299c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8G8_SNORM, 1300c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 1301c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 1302c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R8G8B8A8_SRGB, 1303c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 1304c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_B8G8R8A8_SRGB, 1305c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 1306c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_A8B8G8R8_SNORM_PACK32, 1307c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_A8B8G8R8_SRGB_PACK32, 1308c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 1309c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R16_SFLOAT, 1310c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R16G16_SFLOAT, 1311c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 1312c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_B10G11R11_UFLOAT_PACK32, 1313c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, 1314c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos }; 131566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredStorageImageFormats[] = 131666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 131766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 131866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 131966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 132066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 132166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 132266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 132366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 132466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 132566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 132666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 132766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 132866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 132966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 133066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 133166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 133266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT 133366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 133466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredStorageImageAtomicFormats[] = 133566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 133666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 133766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT 133866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 133966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredColorAttachmentBlitDstFormats[] = 134066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 134166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 134266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A1R5G5B5_UNORM_PACK16, 134366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UNORM, 134466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UINT, 134566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SINT, 134666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UNORM, 134766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UINT, 134866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SINT, 134966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 135066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 135166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 135266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SRGB, 135366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 135466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_SRGB, 135566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 135666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UINT_PACK32, 135766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SINT_PACK32, 135866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SRGB_PACK32, 135966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 136066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UINT_PACK32, 136166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_UINT, 136266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SINT, 136366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SFLOAT, 136466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_UINT, 136566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SINT, 136666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SFLOAT, 136766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 136866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 136966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 137066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 137166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 137266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 137366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 137466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 137566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 137666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 137766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 137866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT 137966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 138066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredColorAttachmentBlendFormats[] = 138166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 138266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 138366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A1R5G5B5_UNORM_PACK16, 138466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UNORM, 138566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UNORM, 138666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 138766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SRGB, 138866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 138966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_SRGB, 139066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 139166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SRGB_PACK32, 139266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 139366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SFLOAT, 139466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SFLOAT, 139566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT 139666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 139766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredDepthStencilAttachmentFormats[] = 139866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 139966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_D16_UNORM 140066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 140166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 140266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VkFormatFeatureFlags flags = (VkFormatFeatureFlags)0; 140366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 140466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageBlitSrcFormats), DE_ARRAY_END(s_requiredSampledImageBlitSrcFormats), format)) 140566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT|VK_FORMAT_FEATURE_BLIT_SRC_BIT; 140666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 1407c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredSampledImageFilterLinearFormats), DE_ARRAY_END(s_requiredSampledImageFilterLinearFormats), format)) 1408c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos flags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT; 1409c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 141066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageFormats), DE_ARRAY_END(s_requiredStorageImageFormats), format)) 141166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; 141266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 141366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageImageAtomicFormats), DE_ARRAY_END(s_requiredStorageImageAtomicFormats), format)) 141466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT; 141566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 141666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlitDstFormats), DE_ARRAY_END(s_requiredColorAttachmentBlitDstFormats), format)) 141766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT|VK_FORMAT_FEATURE_BLIT_DST_BIT; 141866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 141966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredColorAttachmentBlendFormats), DE_ARRAY_END(s_requiredColorAttachmentBlendFormats), format)) 142066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT; 142166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 142266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredDepthStencilAttachmentFormats), DE_ARRAY_END(s_requiredDepthStencilAttachmentFormats), format)) 142366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT; 142466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 142566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return flags; 142666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 142766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 142866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry HaulosVkFormatFeatureFlags getRequiredBufferFeatures (VkFormat format) 142966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 143066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredVertexBufferFormats[] = 143166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 143266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UNORM, 143366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SNORM, 143466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UINT, 143566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SINT, 143666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UNORM, 143766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SNORM, 143866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UINT, 143966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SINT, 144066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 144166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 144266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 144366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 144466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 144566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 144666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SNORM_PACK32, 144766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UINT_PACK32, 144866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SINT_PACK32, 144966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 145066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_UNORM, 145166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SNORM, 145266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_UINT, 145366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SINT, 145466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SFLOAT, 145566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_UNORM, 145666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SNORM, 145766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_UINT, 145866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SINT, 145966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SFLOAT, 146066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UNORM, 146166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SNORM, 146266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 146366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 146466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 146566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 146666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 146766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 146866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 146966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 147066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 147166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32_UINT, 147266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32_SINT, 147366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32_SFLOAT, 147466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 147566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 147666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT 147766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 147866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredUniformTexelBufferFormats[] = 147966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 148066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UNORM, 148166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SNORM, 148266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_UINT, 148366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8_SINT, 148466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UNORM, 148566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SNORM, 148666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_UINT, 148766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8_SINT, 148866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 148966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 149066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 149166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 149266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B8G8R8A8_UNORM, 149366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 149466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SNORM_PACK32, 149566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UINT_PACK32, 149666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SINT_PACK32, 149766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UNORM_PACK32, 149866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A2B10G10R10_UINT_PACK32, 149966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_UINT, 150066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SINT, 150166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16_SFLOAT, 150266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_UINT, 150366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SINT, 150466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16_SFLOAT, 150566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 150666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 150766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 150866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 150966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 151066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 151166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 151266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 151366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 151466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 151566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 151666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT, 151766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_B10G11R11_UFLOAT_PACK32 151866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 151966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredStorageTexelBufferFormats[] = 152066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 152166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UNORM, 152266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SNORM, 152366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_UINT, 152466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R8G8B8A8_SINT, 152566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UNORM_PACK32, 152666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SNORM_PACK32, 152766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_UINT_PACK32, 152866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_A8B8G8R8_SINT_PACK32, 152966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_UINT, 153066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SINT, 153166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R16G16B16A16_SFLOAT, 153266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 153366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT, 153466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SFLOAT, 153566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_UINT, 153666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SINT, 153766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32_SFLOAT, 153866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_UINT, 153966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SINT, 154066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32G32B32A32_SFLOAT 154166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 154266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_requiredStorageTexelBufferAtomicFormats[] = 154366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 154466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_UINT, 154566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_R32_SINT 154666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 154766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 154866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VkFormatFeatureFlags flags = (VkFormatFeatureFlags)0; 154966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 155066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredVertexBufferFormats), DE_ARRAY_END(s_requiredVertexBufferFormats), format)) 155166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT; 155266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 155366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredUniformTexelBufferFormats), DE_ARRAY_END(s_requiredUniformTexelBufferFormats), format)) 155466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT; 155566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 155666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageTexelBufferFormats), DE_ARRAY_END(s_requiredStorageTexelBufferFormats), format)) 155766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT; 155866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 155966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (de::contains(DE_ARRAY_BEGIN(s_requiredStorageTexelBufferAtomicFormats), DE_ARRAY_END(s_requiredStorageTexelBufferAtomicFormats), format)) 156066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos flags |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT; 156166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 156266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return flags; 156366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 156466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 156566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus formatProperties (Context& context, VkFormat format) 156666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 156766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos TestLog& log = context.getTestContext().getLog(); 156866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const VkFormatProperties properties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format); 156966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos bool allOk = true; 157066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 157166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const struct 157266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 157366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VkFormatFeatureFlags VkFormatProperties::* field; 157466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const char* fieldName; 157566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VkFormatFeatureFlags requiredFeatures; 157666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos } fields[] = 157766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 157866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { &VkFormatProperties::linearTilingFeatures, "linearTilingFeatures", (VkFormatFeatureFlags)0 }, 157966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { &VkFormatProperties::optimalTilingFeatures, "optimalTilingFeatures", getRequiredOptimalTilingFeatures(format) }, 158066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { &VkFormatProperties::bufferFeatures, "buffeFeatures", getRequiredBufferFeatures(format) } 158166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 158266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 158366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos log << TestLog::Message << properties << TestLog::EndMessage; 158466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 158566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos for (int fieldNdx = 0; fieldNdx < DE_LENGTH_OF_ARRAY(fields); fieldNdx++) 158666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 158766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const char* const fieldName = fields[fieldNdx].fieldName; 158866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const VkFormatFeatureFlags supported = properties.*fields[fieldNdx].field; 158966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const VkFormatFeatureFlags required = fields[fieldNdx].requiredFeatures; 159066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 159166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if ((supported & required) != required) 159266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 159366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos log << TestLog::Message << "ERROR in " << fieldName << ":\n" 159466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos << " required: " << getFormatFeatureFlagsStr(required) << "\n " 159566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos << " missing: " << getFormatFeatureFlagsStr(~supported & required) 159666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos << TestLog::EndMessage; 159766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos allOk = false; 159866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos } 159966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos } 160066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 160166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (allOk) 160266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return tcu::TestStatus::pass("Query and validation passed"); 160366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos else 160466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return tcu::TestStatus::fail("Required features not supported"); 160566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 160666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 160766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosbool optimalTilingFeaturesSupported (Context& context, VkFormat format, VkFormatFeatureFlags features) 160866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 160966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const VkFormatProperties properties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format); 161066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 161166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return (properties.optimalTilingFeatures & features) == features; 161266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 161366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 161466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosbool optimalTilingFeaturesSupportedForAll (Context& context, const VkFormat* begin, const VkFormat* end, VkFormatFeatureFlags features) 161566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 161666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos for (const VkFormat* cur = begin; cur != end; ++cur) 161766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 161866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (!optimalTilingFeaturesSupported(context, *cur, features)) 161966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return false; 162066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos } 162166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 162266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return true; 162366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 162466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 162566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus testDepthStencilSupported (Context& context) 162666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 162766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (!optimalTilingFeaturesSupported(context, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) && 162866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos !optimalTilingFeaturesSupported(context, VK_FORMAT_D32_SFLOAT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) 162966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return tcu::TestStatus::fail("Doesn't support one of VK_FORMAT_X8_D24_UNORM_PACK32 or VK_FORMAT_D32_SFLOAT"); 163066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 163166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos if (!optimalTilingFeaturesSupported(context, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) && 163266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos !optimalTilingFeaturesSupported(context, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) 163366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return tcu::TestStatus::fail("Doesn't support one of VK_FORMAT_D24_UNORM_S8_UINT or VK_FORMAT_D32_SFLOAT_S8_UINT"); 163466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 163566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos return tcu::TestStatus::pass("Required depth/stencil formats supported"); 163666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 163766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 163866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulostcu::TestStatus testCompressedFormatsSupported (Context& context) 163966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 164066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos static const VkFormat s_allBcFormats[] = 164166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 164266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC1_RGB_UNORM_BLOCK, 164366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC1_RGB_SRGB_BLOCK, 164466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC1_RGBA_UNORM_BLOCK, 164566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC1_RGBA_SRGB_BLOCK, 164666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC2_UNORM_BLOCK, 164766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC2_SRGB_BLOCK, 164866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC3_UNORM_BLOCK, 164966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC3_SRGB_BLOCK, 165066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC4_UNORM_BLOCK, 165166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC4_SNORM_BLOCK, 165266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC5_UNORM_BLOCK, 165366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC5_SNORM_BLOCK, 165466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC6H_UFLOAT_BLOCK, 165566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC6H_SFLOAT_BLOCK, 165666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC7_UNORM_BLOCK, 165766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_BC7_SRGB_BLOCK, 165866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 1659c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos static const VkFormat s_allEtc2Formats[] = 166066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 166166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, 166266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, 166366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, 166466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, 166566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, 166666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, 166766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_EAC_R11_UNORM_BLOCK, 166866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_EAC_R11_SNORM_BLOCK, 166966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_EAC_R11G11_UNORM_BLOCK, 167066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_EAC_R11G11_SNORM_BLOCK, 167166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 1672c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos static const VkFormat s_allAstcLdrFormats[] = 167366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 167466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_4x4_UNORM_BLOCK, 167566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_4x4_SRGB_BLOCK, 167666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_5x4_UNORM_BLOCK, 167766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_5x4_SRGB_BLOCK, 167866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_5x5_UNORM_BLOCK, 167966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_5x5_SRGB_BLOCK, 168066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_6x5_UNORM_BLOCK, 168166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_6x5_SRGB_BLOCK, 168266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_6x6_UNORM_BLOCK, 168366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_6x6_SRGB_BLOCK, 168466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x5_UNORM_BLOCK, 168566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x5_SRGB_BLOCK, 168666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x6_UNORM_BLOCK, 168766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x6_SRGB_BLOCK, 168866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x8_UNORM_BLOCK, 168966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_8x8_SRGB_BLOCK, 169066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x5_UNORM_BLOCK, 169166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x5_SRGB_BLOCK, 169266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x6_UNORM_BLOCK, 169366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x6_SRGB_BLOCK, 169466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x8_UNORM_BLOCK, 169566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x8_SRGB_BLOCK, 169666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x10_UNORM_BLOCK, 169766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_10x10_SRGB_BLOCK, 169866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_12x10_UNORM_BLOCK, 169966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_12x10_SRGB_BLOCK, 170066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_12x12_UNORM_BLOCK, 170166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos VK_FORMAT_ASTC_12x12_SRGB_BLOCK, 170266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos }; 170366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 1704c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos static const struct 1705c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1706c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const char* setName; 1707c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const char* featureName; 1708c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkBool32 VkPhysicalDeviceFeatures::* feature; 1709c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkFormat* formatsBegin; 1710c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkFormat* formatsEnd; 1711c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } s_compressedFormatSets[] = 1712c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1713c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { "BC", "textureCompressionBC", &VkPhysicalDeviceFeatures::textureCompressionBC, DE_ARRAY_BEGIN(s_allBcFormats), DE_ARRAY_END(s_allBcFormats) }, 1714c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { "ETC2", "textureCompressionETC2", &VkPhysicalDeviceFeatures::textureCompressionETC2, DE_ARRAY_BEGIN(s_allEtc2Formats), DE_ARRAY_END(s_allEtc2Formats) }, 1715c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { "ASTC LDR", "textureCompressionASTC_LDR", &VkPhysicalDeviceFeatures::textureCompressionASTC_LDR, DE_ARRAY_BEGIN(s_allAstcLdrFormats), DE_ARRAY_END(s_allAstcLdrFormats) }, 1716c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos }; 1717c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1718c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos TestLog& log = context.getTestContext().getLog(); 1719c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkPhysicalDeviceFeatures& features = context.getDeviceFeatures(); 1720c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos int numSupportedSets = 0; 1721c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos int numErrors = 0; 1722c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos int numWarnings = 0; 1723c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1724c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos for (int setNdx = 0; setNdx < DE_LENGTH_OF_ARRAY(s_compressedFormatSets); ++setNdx) 1725c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1726c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const char* const setName = s_compressedFormatSets[setNdx].setName; 1727c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const char* const featureName = s_compressedFormatSets[setNdx].featureName; 1728c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const bool featureBitSet = features.*s_compressedFormatSets[setNdx].feature == VK_TRUE; 1729c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const bool allSupported = optimalTilingFeaturesSupportedForAll(context, 1730c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos s_compressedFormatSets[setNdx].formatsBegin, 1731c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos s_compressedFormatSets[setNdx].formatsEnd, 1732c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT); 1733c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1734c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureBitSet && !allSupported) 1735c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1736c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "ERROR: " << featureName << " = VK_TRUE but " << setName << " formats not supported" << TestLog::EndMessage; 1737c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos numErrors += 1; 1738c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1739c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (allSupported && !featureBitSet) 1740c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1741c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "WARNING: " << setName << " formats supported but " << featureName << " = VK_FALSE" << TestLog::EndMessage; 1742c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos numWarnings += 1; 1743c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1744c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1745c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (featureBitSet) 1746c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1747c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "All " << setName << " formats are supported" << TestLog::EndMessage; 1748c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos numSupportedSets += 1; 1749c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1750c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 1751c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << setName << " formats are not supported" << TestLog::EndMessage; 1752c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1753c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1754c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (numSupportedSets == 0) 1755c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 1756c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "No compressed format sets supported" << TestLog::EndMessage; 1757c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos numErrors += 1; 1758c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1759c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1760c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (numErrors > 0) 1761c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::fail("Compressed format support not valid"); 1762c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (numWarnings > 0) 1763c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Found inconsistencies in compressed format support"); 176466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos else 1765c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus::pass("Compressed texture format support is valid"); 176666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 176766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 176866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulosvoid createFormatTests (tcu::TestCaseGroup* testGroup) 176966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos{ 177066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos DE_STATIC_ASSERT(VK_FORMAT_UNDEFINED == 0); 177166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 17725e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx) 177366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos { 177466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const VkFormat format = (VkFormat)formatNdx; 177566789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const char* const enumName = getFormatName(format); 177666789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos const string caseName = de::toLower(string(enumName).substr(10)); 177766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 177866789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos addFunctionCase(testGroup, caseName, enumName, formatProperties, format); 177966789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos } 178066789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 178166789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos addFunctionCase(testGroup, "depth_stencil", "", testDepthStencilSupported); 178266789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos addFunctionCase(testGroup, "compressed_formats", "", testCompressedFormatsSupported); 178366789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos} 178466789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 17858ceb3d60e04df988e54a330def06237c2bf7eaecMaciej JesionowskiVkImageUsageFlags getValidImageUsageFlags (const VkFormatFeatureFlags supportedFeatures, const bool useKhrMaintenance1Semantics) 1786eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 1787eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos VkImageUsageFlags flags = (VkImageUsageFlags)0; 1788eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 17898ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski if (useKhrMaintenance1Semantics) 17908ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski { 17918ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski if ((supportedFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR) != 0) 17928ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 17938ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski 17948ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski if ((supportedFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR) != 0) 17958ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski flags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; 17968ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski } 17978ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski else 17988ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski { 17998ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski // If format is supported at all, it must be valid transfer src+dst 18008ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski if (supportedFeatures != 0) 18018ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT; 18028ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski } 1803eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1804eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0) 1805eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_USAGE_SAMPLED_BIT; 1806eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1807eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((supportedFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) != 0) 1808eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT|VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 1809eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1810eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((supportedFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0) 1811eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 1812eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1813eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0) 1814eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_USAGE_STORAGE_BIT; 1815eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1816eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos return flags; 1817eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 1818eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1819eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosbool isValidImageUsageFlagCombination (VkImageUsageFlags usage) 1820eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 1821377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos if ((usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0) 182283f90be9118a121b47f5e16f04029e205c68f994scygan { 1823377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos const VkImageUsageFlags allowedFlags = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 1824377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 1825377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 1826377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 1827377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos 1828377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos // Only *_ATTACHMENT_BIT flags can be combined with TRANSIENT_ATTACHMENT_BIT 1829377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos if ((usage & ~allowedFlags) != 0) 1830377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos return false; 1831377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos 1832377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos // TRANSIENT_ATTACHMENT_BIT is not valid without COLOR_ or DEPTH_STENCIL_ATTACHMENT_BIT 1833377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos if ((usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) == 0) 1834377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos return false; 183583f90be9118a121b47f5e16f04029e205c68f994scygan } 1836377ad0ad5962351d14badb1857b55dc8e8e49218Pyry Haulos 1837eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos return usage != 0; 1838eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 1839eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1840eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry HaulosVkImageCreateFlags getValidImageCreateFlags (const VkPhysicalDeviceFeatures& deviceFeatures, VkFormat, VkFormatFeatureFlags, VkImageType type, VkImageUsageFlags usage) 1841eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 1842eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos VkImageCreateFlags flags = (VkImageCreateFlags)0; 1843eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1844eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((usage & VK_IMAGE_USAGE_SAMPLED_BIT) != 0) 1845eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 1846eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; 1847eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1848eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if (type == VK_IMAGE_TYPE_2D) 1849eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; 1850eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 1851eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1852eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((usage & (VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_STORAGE_BIT)) != 0 && 1853eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos (usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0) 1854eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 1855eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if (deviceFeatures.sparseBinding) 1856eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT|VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT; 1857eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1858eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if (deviceFeatures.sparseResidencyAliased) 1859eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos flags |= VK_IMAGE_CREATE_SPARSE_ALIASED_BIT; 1860eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 1861eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1862eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos return flags; 1863eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 1864eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1865eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosbool isValidImageCreateFlagCombination (VkImageCreateFlags) 1866eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 1867eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos return true; 1868eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 1869eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1870c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulosbool isRequiredImageParameterCombination (const VkPhysicalDeviceFeatures& deviceFeatures, 1871c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkFormat format, 1872c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkFormatProperties& formatProperties, 1873c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkImageType imageType, 1874c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkImageTiling imageTiling, 1875c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkImageUsageFlags usageFlags, 1876c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkImageCreateFlags createFlags) 1877c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos{ 1878c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_UNREF(deviceFeatures); 1879c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_UNREF(formatProperties); 1880c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_UNREF(createFlags); 1881c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1882c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos // Linear images can have arbitrary limitations 1883c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (imageTiling == VK_IMAGE_TILING_LINEAR) 1884c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return false; 1885c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1886c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos // Support for other usages for compressed formats is optional 1887c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (isCompressedFormat(format) && 1888c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos (usageFlags & ~(VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT)) != 0) 1889c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return false; 1890c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1891c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos // Support for 1D, and sliced 3D compressed formats is optional 1892c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (isCompressedFormat(format) && (imageType == VK_IMAGE_TYPE_1D || imageType == VK_IMAGE_TYPE_3D)) 1893c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return false; 1894c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 18955d57f6180572b29bdf17869040851b6875d124c6Marcin Kańtoch // Support for 1D and 3D depth/stencil textures is optional 18965d57f6180572b29bdf17869040851b6875d124c6Marcin Kańtoch if (isDepthStencilFormat(format) && (imageType == VK_IMAGE_TYPE_1D || imageType == VK_IMAGE_TYPE_3D)) 18975d57f6180572b29bdf17869040851b6875d124c6Marcin Kańtoch return false; 18985d57f6180572b29bdf17869040851b6875d124c6Marcin Kańtoch 1899c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_ASSERT(deviceFeatures.sparseBinding || (createFlags & (VK_IMAGE_CREATE_SPARSE_BINDING_BIT|VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)) == 0); 1900c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos DE_ASSERT(deviceFeatures.sparseResidencyAliased || (createFlags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) == 0); 1901c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 19025534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan if (createFlags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) 19035534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan { 19045534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan if (isCompressedFormat(format)) 19055534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return false; 19065534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan 19075534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan if (isDepthStencilFormat(format)) 19085534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return false; 19095534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan 19105534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan if (!deIsPowerOfTwo32(mapVkFormat(format).getPixelSize())) 19115534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return false; 19125534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan 19135534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan switch (imageType) 19145534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan { 19155534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan case VK_IMAGE_TYPE_2D: 19165534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return (deviceFeatures.sparseResidencyImage2D == VK_TRUE); 19175534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan case VK_IMAGE_TYPE_3D: 19185534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return (deviceFeatures.sparseResidencyImage3D == VK_TRUE); 19195534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan default: 19205534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan return false; 19215534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan } 19225534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan } 19235534b44a15b530ece4b310e1dd935fb9b0cefeb6Slawomir Cygan 1924c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return true; 1925c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos} 1926c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1927c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry HaulosVkSampleCountFlags getRequiredOptimalTilingSampleCounts (const VkPhysicalDeviceLimits& deviceLimits, 1928c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkFormat format, 1929c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkImageUsageFlags usageFlags) 1930c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos{ 1931c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (!isCompressedFormat(format)) 1932c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 193302c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos const tcu::TextureFormat tcuFormat = mapVkFormat(format); 193402c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos const bool hasDepthComp = (tcuFormat.order == tcu::TextureFormat::D || tcuFormat.order == tcu::TextureFormat::DS); 193502c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos const bool hasStencilComp = (tcuFormat.order == tcu::TextureFormat::S || tcuFormat.order == tcu::TextureFormat::DS); 193602c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos const bool isColorFormat = !hasDepthComp && !hasStencilComp; 193702c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos VkSampleCountFlags sampleCounts = ~(VkSampleCountFlags)0; 1938c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 193902c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos DE_ASSERT((hasDepthComp || hasStencilComp) != isColorFormat); 194002c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 194102c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if ((usageFlags & VK_IMAGE_USAGE_STORAGE_BIT) != 0) 194202c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.storageImageSampleCounts; 194302c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 194402c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if ((usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) != 0) 1945c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 194602c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (hasDepthComp) 194702c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.sampledImageDepthSampleCounts; 1948c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 194902c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (hasStencilComp) 195002c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.sampledImageStencilSampleCounts; 195102c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 195202c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (isColorFormat) 195302c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos { 195402c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos const tcu::TextureChannelClass chnClass = tcu::getTextureChannelClass(tcuFormat.type); 195502c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 195602c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (chnClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER || 195702c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos chnClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 195802c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.sampledImageIntegerSampleCounts; 195902c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos else 196002c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.sampledImageColorSampleCounts; 196102c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos } 1962c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 196302c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 196402c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if ((usageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0) 196502c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.framebufferColorSampleCounts; 196602c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 196702c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if ((usageFlags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0) 196802c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos { 196902c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (hasDepthComp) 197002c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.framebufferDepthSampleCounts; 197102c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 197202c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (hasStencilComp) 197302c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= deviceLimits.framebufferStencilSampleCounts; 197402c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos } 197502c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 197602c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos // If there is no usage flag set that would have corresponding device limit, 197702c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos // only VK_SAMPLE_COUNT_1_BIT is required. 197802c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos if (sampleCounts == ~(VkSampleCountFlags)0) 197902c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos sampleCounts &= VK_SAMPLE_COUNT_1_BIT; 198002c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos 198102c61e30f50cb04505f421b1ebe07c4a42864acfPyry Haulos return sampleCounts; 1982c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 1983c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 1984c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return VK_SAMPLE_COUNT_1_BIT; 1985c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos} 1986c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 1987eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulosstruct ImageFormatPropertyCase 1988eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 1989de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos typedef tcu::TestStatus (*Function) (Context& context, const VkFormat format, const VkImageType imageType, const VkImageTiling tiling); 1990de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 1991de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos Function testFunction; 1992eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos VkFormat format; 1993eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos VkImageType imageType; 1994eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos VkImageTiling tiling; 1995eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 1996de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos ImageFormatPropertyCase (Function testFunction_, VkFormat format_, VkImageType imageType_, VkImageTiling tiling_) 1997de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos : testFunction (testFunction_) 1998de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , format (format_) 1999de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , imageType (imageType_) 2000de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , tiling (tiling_) 2001eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos {} 2002eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2003eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos ImageFormatPropertyCase (void) 2004de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos : testFunction ((Function)DE_NULL) 2005de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , format (VK_FORMAT_UNDEFINED) 2006de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , imageType (VK_IMAGE_TYPE_LAST) 2007de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos , tiling (VK_IMAGE_TILING_LAST) 2008eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos {} 2009eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos}; 2010eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2011de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus execImageFormatTest (Context& context, ImageFormatPropertyCase testCase) 2012de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2013de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return testCase.testFunction(context, testCase.format, testCase.imageType, testCase.tiling); 2014de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2015de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2016de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulosvoid createImageFormatTypeTilingTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase params) 2017de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2018de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos DE_ASSERT(params.format == VK_FORMAT_UNDEFINED); 2019de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2020de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx) 2021de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2022de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkFormat format = (VkFormat)formatNdx; 2023de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const char* const enumName = getFormatName(format); 2024de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const string caseName = de::toLower(string(enumName).substr(10)); 2025de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2026de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos params.format = format; 2027de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2028de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(testGroup, caseName, enumName, execImageFormatTest, params); 2029de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2030de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2031de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2032de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulosvoid createImageFormatTypeTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase params) 2033de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2034de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos DE_ASSERT(params.tiling == VK_IMAGE_TILING_LAST); 2035de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2036de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos testGroup->addChild(createTestGroup(testGroup->getTestContext(), "optimal", "", createImageFormatTypeTilingTests, ImageFormatPropertyCase(params.testFunction, VK_FORMAT_UNDEFINED, params.imageType, VK_IMAGE_TILING_OPTIMAL))); 2037de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos testGroup->addChild(createTestGroup(testGroup->getTestContext(), "linear", "", createImageFormatTypeTilingTests, ImageFormatPropertyCase(params.testFunction, VK_FORMAT_UNDEFINED, params.imageType, VK_IMAGE_TILING_LINEAR))); 2038de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2039de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2040de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulosvoid createImageFormatTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase::Function testFunction) 2041de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2042de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos testGroup->addChild(createTestGroup(testGroup->getTestContext(), "1d", "", createImageFormatTypeTests, ImageFormatPropertyCase(testFunction, VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_1D, VK_IMAGE_TILING_LAST))); 2043de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos testGroup->addChild(createTestGroup(testGroup->getTestContext(), "2d", "", createImageFormatTypeTests, ImageFormatPropertyCase(testFunction, VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_LAST))); 2044de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos testGroup->addChild(createTestGroup(testGroup->getTestContext(), "3d", "", createImageFormatTypeTests, ImageFormatPropertyCase(testFunction, VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_3D, VK_IMAGE_TILING_LAST))); 2045de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2046de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2047de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus imageFormatProperties (Context& context, const VkFormat format, const VkImageType imageType, const VkImageTiling tiling) 2048eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 2049eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos TestLog& log = context.getTestContext().getLog(); 2050eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos const VkPhysicalDeviceFeatures& deviceFeatures = context.getDeviceFeatures(); 2051c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkPhysicalDeviceLimits& deviceLimits = context.getDeviceProperties().limits; 2052eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), format); 20538ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski const bool hasKhrMaintenance1 = isExtensionSupported(context.getDeviceExtensions(), "VK_KHR_maintenance1"); 2054eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2055eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos const VkFormatFeatureFlags supportedFeatures = tiling == VK_IMAGE_TILING_LINEAR ? formatProperties.linearTilingFeatures : formatProperties.optimalTilingFeatures; 20568ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski const VkImageUsageFlags usageFlagSet = getValidImageUsageFlags(supportedFeatures, hasKhrMaintenance1); 2057eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2058c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos tcu::ResultCollector results (log, "ERROR: "); 2059c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 20608ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski if (hasKhrMaintenance1 && (supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0) 20618ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski { 20628ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski results.check((supportedFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR)) != 0, 20638ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski "A sampled image format must have VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR and VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR format feature flags set"); 20648ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski } 20658ceb3d60e04df988e54a330def06237c2bf7eaecMaciej Jesionowski 2066eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos for (VkImageUsageFlags curUsageFlags = 0; curUsageFlags <= usageFlagSet; curUsageFlags++) 2067eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 2068eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((curUsageFlags & ~usageFlagSet) != 0 || 2069eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos !isValidImageUsageFlagCombination(curUsageFlags)) 2070eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos continue; 2071eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2072eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos const VkImageCreateFlags createFlagSet = getValidImageCreateFlags(deviceFeatures, format, supportedFeatures, imageType, curUsageFlags); 2073eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2074eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos for (VkImageCreateFlags curCreateFlags = 0; curCreateFlags <= createFlagSet; curCreateFlags++) 2075eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 2076eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos if ((curCreateFlags & ~createFlagSet) != 0 || 2077eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos !isValidImageCreateFlagCombination(curCreateFlags)) 2078eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos continue; 2079eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2080c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const bool isRequiredCombination = isRequiredImageParameterCombination(deviceFeatures, 2081c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos format, 2082c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos formatProperties, 2083c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos imageType, 2084c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos tiling, 2085c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos curUsageFlags, 2086c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos curCreateFlags); 2087c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VkImageFormatProperties properties; 2088c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos VkResult queryResult; 2089c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2090eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos log << TestLog::Message << "Testing " << getImageTypeStr(imageType) << ", " 2091eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos << getImageTilingStr(tiling) << ", " 2092eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos << getImageUsageFlagsStr(curUsageFlags) << ", " 2093eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos << getImageCreateFlagsStr(curCreateFlags) 2094eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos << TestLog::EndMessage; 2095eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2096c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos // Set return value to known garbage 2097c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos deMemset(&properties, 0xcd, sizeof(properties)); 2098c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2099c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos queryResult = context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(context.getPhysicalDevice(), 2100c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos format, 2101c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos imageType, 2102c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos tiling, 2103c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos curUsageFlags, 2104c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos curCreateFlags, 2105c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos &properties); 2106c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2107c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (queryResult == VK_SUCCESS) 2108eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 2109c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const deUint32 fullMipPyramidSize = de::max(de::max(deLog2Ceil32(properties.maxExtent.width), 2110c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos deLog2Ceil32(properties.maxExtent.height)), 2111c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos deLog2Ceil32(properties.maxExtent.depth)) + 1; 2112c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2113eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos log << TestLog::Message << properties << "\n" << TestLog::EndMessage; 2114eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2115c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry 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"); 2116c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry 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"); 2117c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry 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"); 2118c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(imageType != VK_IMAGE_TYPE_3D || properties.maxArrayLayers == 1, "Invalid maxArrayLayers for 3D image"); 2119c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2120ffae1f8b291f371156c638b2d2b9423eaae96e6bPyry Haulos if (tiling == VK_IMAGE_TILING_OPTIMAL && imageType == VK_IMAGE_TYPE_2D && !(curCreateFlags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) && 2121dc4227d5ec87080f5dad810b5e33ae3b3fa014a4Nanley Chery ((supportedFeatures & (VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) || 2122dc4227d5ec87080f5dad810b5e33ae3b3fa014a4Nanley Chery ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && deviceFeatures.shaderStorageImageMultisample))) 2123c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 2124c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos const VkSampleCountFlags requiredSampleCounts = getRequiredOptimalTilingSampleCounts(deviceLimits, format, curUsageFlags); 2125c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check((properties.sampleCounts & requiredSampleCounts) == requiredSampleCounts, "Required sample counts not supported"); 2126c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 2127c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 2128c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.sampleCounts == VK_SAMPLE_COUNT_1_BIT, "sampleCounts != VK_SAMPLE_COUNT_1_BIT"); 2129c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2130c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (isRequiredCombination) 2131c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 2132c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(imageType != VK_IMAGE_TYPE_1D || (properties.maxExtent.width >= deviceLimits.maxImageDimension1D), 2133c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos "Reported dimensions smaller than device limits"); 2134c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(imageType != VK_IMAGE_TYPE_2D || (properties.maxExtent.width >= deviceLimits.maxImageDimension2D && 2135c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos properties.maxExtent.height >= deviceLimits.maxImageDimension2D), 2136c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos "Reported dimensions smaller than device limits"); 2137c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(imageType != VK_IMAGE_TYPE_3D || (properties.maxExtent.width >= deviceLimits.maxImageDimension3D && 2138c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos properties.maxExtent.height >= deviceLimits.maxImageDimension3D && 2139c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos properties.maxExtent.depth >= deviceLimits.maxImageDimension3D), 2140c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos "Reported dimensions smaller than device limits"); 2141c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxMipLevels == fullMipPyramidSize, "maxMipLevels is not full mip pyramid size"); 2142c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(imageType == VK_IMAGE_TYPE_3D || properties.maxArrayLayers >= deviceLimits.maxImageArrayLayers, 2143c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos "maxArrayLayers smaller than device limits"); 2144c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 2145c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 2146c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 2147c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxMipLevels == 1 || properties.maxMipLevels == fullMipPyramidSize, "Invalid mip pyramid size"); 2148c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxArrayLayers >= 1, "Invalid maxArrayLayers"); 2149c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 2150c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2151c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxResourceSize >= (VkDeviceSize)MINIMUM_REQUIRED_IMAGE_RESOURCE_SIZE, 2152c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos "maxResourceSize smaller than minimum required size"); 2153eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 2154c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else if (queryResult == VK_ERROR_FORMAT_NOT_SUPPORTED) 2155eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 2156c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos log << TestLog::Message << "Got VK_ERROR_FORMAT_NOT_SUPPORTED" << TestLog::EndMessage; 2157c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2158c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos if (isRequiredCombination) 2159c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.fail("VK_ERROR_FORMAT_NOT_SUPPORTED returned for required image parameter combination"); 2160c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos 2161c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos // Specification requires that all fields are set to 0 2162c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxExtent.width == 0, "maxExtent.width != 0"); 2163c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxExtent.height == 0, "maxExtent.height != 0"); 2164c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxExtent.depth == 0, "maxExtent.depth != 0"); 2165c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxMipLevels == 0, "maxMipLevels != 0"); 2166c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxArrayLayers == 0, "maxArrayLayers != 0"); 2167c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.sampleCounts == 0, "sampleCounts != 0"); 2168c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.check(properties.maxResourceSize == 0, "maxResourceSize != 0"); 2169c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos } 2170c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos else 2171c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos { 2172c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos results.fail("Got unexpected error" + de::toString(queryResult)); 2173eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 2174eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 2175eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 2176eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2177c82c0fa6ca73c40c05f73da4b6f7fe5cd82147b6Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 2178eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 2179eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2180de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos// VK_KHR_get_physical_device_properties2 2181de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2182de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry HaulosMove<VkInstance> createInstanceWithExtension (const PlatformInterface& vkp, const char* extensionName) 2183eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 2184de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkExtensionProperties> instanceExts = enumerateInstanceExtensionProperties(vkp, DE_NULL); 2185de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vector<string> enabledExts; 2186eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2187de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (!isExtensionSupported(instanceExts, RequiredExtension(extensionName))) 2188de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_THROW(NotSupportedError, (string(extensionName) + " is not supported").c_str()); 2189de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2190de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos enabledExts.push_back(extensionName); 2191de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2192de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return createDefaultInstance(vkp, vector<string>() /* layers */, enabledExts); 2193de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2194de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2195de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus deviceFeatures2 (Context& context) 2196de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2197de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2198de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2199de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2200de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2201de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2202de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2203eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos { 2204de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceFeatures coreFeatures; 2205de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceFeatures2KHR extFeatures; 2206eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2207de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreFeatures, 0xcd, sizeof(coreFeatures)); 2208de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extFeatures.features, 0xcd, sizeof(extFeatures.features)); 2209de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2210de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; 2211de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extFeatures.pNext = DE_NULL; 2212de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2213de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceFeatures(devices[deviceNdx], &coreFeatures); 2214de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceFeatures2KHR(devices[deviceNdx], &extFeatures); 2215eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2216de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extFeatures.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR); 2217de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extFeatures.pNext == DE_NULL); 2218de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2219de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (deMemCmp(&coreFeatures, &extFeatures.features, sizeof(VkPhysicalDeviceFeatures)) != 0) 2220de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between features reported by vkGetPhysicalDeviceFeatures and vkGetPhysicalDeviceFeatures2KHR"); 2221eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos } 2222de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2223de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying device features succeeded"); 2224eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 2225eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2226de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus deviceProperties2 (Context& context) 2227eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 2228de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2229de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2230de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2231de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2232de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2233de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2234de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2235de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceProperties coreProperties; 2236de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceProperties2KHR extProperties; 2237de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2238de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; 2239de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.pNext = DE_NULL; 2240de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2241de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceProperties(devices[deviceNdx], &coreProperties); 2242de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceProperties2KHR(devices[deviceNdx], &extProperties); 2243de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2244de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR); 2245de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.pNext == DE_NULL); 2246de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2247fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga // We can't use memcmp() here because the structs may contain padding bytes that drivers may or may not 2248fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga // have written while writing the data and memcmp will compare them anyway, so we iterate through the 2249fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga // valid bytes for each field in the struct and compare only the valid bytes for each one. 2250fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga for (int propNdx = 0; propNdx < DE_LENGTH_OF_ARRAY(s_physicalDevicePropertiesOffsetTable); propNdx++) 2251fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga { 2252fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga const size_t offset = s_physicalDevicePropertiesOffsetTable[propNdx].offset; 2253fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga const size_t size = s_physicalDevicePropertiesOffsetTable[propNdx].size; 2254fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga 2255fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga const deUint8* corePropertyBytes = reinterpret_cast<deUint8*>(&coreProperties) + offset; 2256fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga const deUint8* extPropertyBytes = reinterpret_cast<deUint8*>(&extProperties.properties) + offset; 2257fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga 2258fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga if (deMemCmp(corePropertyBytes, extPropertyBytes, size) != 0) 2259fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga TCU_FAIL("Mismatch between properties reported by vkGetPhysicalDeviceProperties and vkGetPhysicalDeviceProperties2KHR"); 2260fba4b9b57e3b66fed3776b2776f2d615f1f2bb66Iago Toral Quiroga } 2261de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2262de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2263de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying device properties succeeded"); 2264eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 2265eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 2266de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus deviceFormatProperties2 (Context& context) 2267eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos{ 2268de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2269de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2270de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2271de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2272de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2273de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2274de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2275de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDevice physicalDevice = devices[deviceNdx]; 2276de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2277de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx) 2278de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2279de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkFormat format = (VkFormat)formatNdx; 2280de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkFormatProperties coreProperties; 2281de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkFormatProperties2KHR extProperties; 2282de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2283de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreProperties, 0xcd, sizeof(VkFormatProperties)); 2284de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extProperties, 0xcd, sizeof(VkFormatProperties2KHR)); 2285de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2286de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR; 2287de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.pNext = DE_NULL; 2288de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2289de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceFormatProperties(physicalDevice, format, &coreProperties); 2290de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceFormatProperties2KHR(physicalDevice, format, &extProperties); 2291de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2292de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.sType == VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR); 2293de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.pNext == DE_NULL); 2294de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2295de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (deMemCmp(&coreProperties, &extProperties.formatProperties, sizeof(VkFormatProperties)) != 0) 2296de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between format properties reported by vkGetPhysicalDeviceFormatProperties and vkGetPhysicalDeviceFormatProperties2KHR"); 2297de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2298de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2299de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2300de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying device format properties succeeded"); 2301de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2302de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2303de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus deviceQueueFamilyProperties2 (Context& context) 2304de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2305de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2306de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2307de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2308de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2309de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2310de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2311de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2312de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDevice physicalDevice = devices[deviceNdx]; 2313de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deUint32 numCoreQueueFamilies = ~0u; 2314de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deUint32 numExtQueueFamilies = ~0u; 2315de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2316de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numCoreQueueFamilies, DE_NULL); 2317de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, &numExtQueueFamilies, DE_NULL); 2318de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2319de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK_MSG(numCoreQueueFamilies == numExtQueueFamilies, "Different number of queue family properties reported"); 2320de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(numCoreQueueFamilies > 0); 2321de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2322de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2323de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos std::vector<VkQueueFamilyProperties> coreProperties (numCoreQueueFamilies); 2324de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos std::vector<VkQueueFamilyProperties2KHR> extProperties (numExtQueueFamilies); 2325de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2326de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreProperties[0], 0xcd, sizeof(VkQueueFamilyProperties)*numCoreQueueFamilies); 2327de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extProperties[0], 0xcd, sizeof(VkQueueFamilyProperties2KHR)*numExtQueueFamilies); 2328de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2329de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t ndx = 0; ndx < extProperties.size(); ++ndx) 2330de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2331de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties[ndx].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR; 2332de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties[ndx].pNext = DE_NULL; 2333de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2334de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2335de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numCoreQueueFamilies, &coreProperties[0]); 2336de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, &numExtQueueFamilies, &extProperties[0]); 2337de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2338de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK((size_t)numCoreQueueFamilies == coreProperties.size()); 2339de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK((size_t)numExtQueueFamilies == extProperties.size()); 2340de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos DE_ASSERT(numCoreQueueFamilies == numExtQueueFamilies); 2341de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2342de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t ndx = 0; ndx < extProperties.size(); ++ndx) 2343de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2344de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties[ndx].sType == VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR); 2345de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties[ndx].pNext == DE_NULL); 2346de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2347de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (deMemCmp(&coreProperties[ndx], &extProperties[ndx].queueFamilyProperties, sizeof(VkQueueFamilyProperties)) != 0) 2348de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between format properties reported by vkGetPhysicalDeviceQueueFamilyProperties and vkGetPhysicalDeviceQueueFamilyProperties2KHR"); 2349de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2350de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2351de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2352de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2353de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying device queue family properties succeeded"); 2354de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2355de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2356de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus deviceMemoryProperties2 (Context& context) 2357de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2358de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2359de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2360de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2361de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2362de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2363de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2364de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2365de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceMemoryProperties coreProperties; 2366de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkPhysicalDeviceMemoryProperties2KHR extProperties; 2367de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2368de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreProperties, 0xcd, sizeof(VkPhysicalDeviceMemoryProperties)); 2369de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extProperties, 0xcd, sizeof(VkPhysicalDeviceMemoryProperties2KHR)); 2370de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2371de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR; 2372de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.pNext = DE_NULL; 2373de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2374de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceMemoryProperties(devices[deviceNdx], &coreProperties); 2375de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceMemoryProperties2KHR(devices[deviceNdx], &extProperties); 2376de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2377de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR); 2378de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.pNext == DE_NULL); 2379de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2380de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (deMemCmp(&coreProperties, &extProperties.memoryProperties, sizeof(VkPhysicalDeviceMemoryProperties)) != 0) 2381de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between properties reported by vkGetPhysicalDeviceMemoryProperties and vkGetPhysicalDeviceMemoryProperties2KHR"); 2382de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2383de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2384de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying device memory properties succeeded"); 2385de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2386de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2387de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus imageFormatProperties2 (Context& context, const VkFormat format, const VkImageType imageType, const VkImageTiling tiling) 2388de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2389de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TestLog& log = context.getTestContext().getLog(); 2390de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2391de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2392de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2393de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2394de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2395de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2396de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkImageUsageFlags allUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT 2397de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_TRANSFER_DST_BIT 2398de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_SAMPLED_BIT 2399de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_STORAGE_BIT 2400de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 2401de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 2402de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 2403de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 2404de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkImageCreateFlags allCreateFlags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT 2405de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 2406de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT 2407de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 2408de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; 2409de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2410de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2411de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2412de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDevice physicalDevice = devices[deviceNdx]; 2413de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2414b59b96f33dbe0f3cd32e25c918368d3734ba0b06Marcin Kańtoch for (VkImageUsageFlags curUsageFlags = (VkImageUsageFlags)1; curUsageFlags <= allUsageFlags; curUsageFlags++) 2415de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2416de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (VkImageCreateFlags curCreateFlags = 0; curCreateFlags <= allCreateFlags; curCreateFlags++) 2417de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2418de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDeviceImageFormatInfo2KHR imageFormatInfo = 2419de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2420de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR, 2421de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos DE_NULL, 2422de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos format, 2423de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos imageType, 2424de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos tiling, 2425de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos curUsageFlags, 2426de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos curCreateFlags 2427de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos }; 2428de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2429de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkImageFormatProperties coreProperties; 2430de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkImageFormatProperties2KHR extProperties; 2431de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkResult coreResult; 2432de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VkResult extResult; 2433de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2434de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreProperties, 0xcd, sizeof(VkImageFormatProperties)); 2435de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extProperties, 0xcd, sizeof(VkImageFormatProperties2KHR)); 2436de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2437de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR; 2438de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties.pNext = DE_NULL; 2439de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2440de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos coreResult = vki.getPhysicalDeviceImageFormatProperties(physicalDevice, imageFormatInfo.format, imageFormatInfo.type, imageFormatInfo.tiling, imageFormatInfo.usage, imageFormatInfo.flags, &coreProperties); 2441de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extResult = vki.getPhysicalDeviceImageFormatProperties2KHR(physicalDevice, &imageFormatInfo, &extProperties); 2442de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2443de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.sType == VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR); 2444de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties.pNext == DE_NULL); 2445de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2446de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if ((coreResult != extResult) || 2447de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos (deMemCmp(&coreProperties, &extProperties.imageFormatProperties, sizeof(VkImageFormatProperties)) != 0)) 2448de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2449de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos log << TestLog::Message << "ERROR: device " << deviceNdx << ": mismatch with query " << imageFormatInfo << TestLog::EndMessage 2450de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos << TestLog::Message << "vkGetPhysicalDeviceImageFormatProperties() returned " << coreResult << ", " << coreProperties << TestLog::EndMessage 2451de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos << TestLog::Message << "vkGetPhysicalDeviceImageFormatProperties2KHR() returned " << extResult << ", " << extProperties << TestLog::EndMessage; 2452de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between image format properties reported by vkGetPhysicalDeviceImageFormatProperties and vkGetPhysicalDeviceImageFormatProperties2KHR"); 2453de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2454de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2455de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2456de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2457de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2458de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying image format properties succeeded"); 2459de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos} 2460de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2461de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulostcu::TestStatus sparseImageFormatProperties2 (Context& context, const VkFormat format, const VkImageType imageType, const VkImageTiling tiling) 2462de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos{ 2463de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TestLog& log = context.getTestContext().getLog(); 2464de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2465de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const PlatformInterface& vkp = context.getPlatformInterface(); 2466de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const Unique<VkInstance> instance (createInstanceWithExtension(vkp, "VK_KHR_get_physical_device_properties2")); 2467de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const InstanceDriver vki (vkp, *instance); 2468de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const vector<VkPhysicalDevice> devices = enumeratePhysicalDevices(vki, *instance); 2469de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2470de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkImageUsageFlags allUsageFlags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT 2471de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_TRANSFER_DST_BIT 2472de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_SAMPLED_BIT 2473de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_STORAGE_BIT 2474de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 2475de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 2476de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT 2477de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 2478de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2479de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (size_t deviceNdx = 0; deviceNdx < devices.size(); ++deviceNdx) 2480de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2481de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDevice physicalDevice = devices[deviceNdx]; 2482de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2483b59b96f33dbe0f3cd32e25c918368d3734ba0b06Marcin Kańtoch for (deUint32 sampleCountBit = VK_SAMPLE_COUNT_1_BIT; sampleCountBit <= VK_SAMPLE_COUNT_64_BIT; sampleCountBit = (sampleCountBit << 1u)) 2484de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2485b59b96f33dbe0f3cd32e25c918368d3734ba0b06Marcin Kańtoch for (VkImageUsageFlags curUsageFlags = (VkImageUsageFlags)1; curUsageFlags <= allUsageFlags; curUsageFlags++) 2486de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2487de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos const VkPhysicalDeviceSparseImageFormatInfo2KHR imageFormatInfo = 2488de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2489de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR, 2490de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos DE_NULL, 2491de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos format, 2492de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos imageType, 2493b59b96f33dbe0f3cd32e25c918368d3734ba0b06Marcin Kańtoch (VkSampleCountFlagBits)sampleCountBit, 2494de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos curUsageFlags, 2495de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos tiling, 2496de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos }; 2497de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2498de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deUint32 numCoreProperties = ~0u; 2499de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deUint32 numExtProperties = ~0u; 2500de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2501de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos // Query count 2502de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, imageFormatInfo.format, imageFormatInfo.type, imageFormatInfo.samples, imageFormatInfo.usage, imageFormatInfo.tiling, &numCoreProperties, DE_NULL); 2503de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, &imageFormatInfo, &numExtProperties, DE_NULL); 2504de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2505de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (numCoreProperties != numExtProperties) 2506de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2507de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos log << TestLog::Message << "ERROR: device " << deviceNdx << ": different number of properties reported for " << imageFormatInfo << TestLog::EndMessage; 2508de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch in reported property count"); 2509de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2510de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2511de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if (numCoreProperties > 0) 2512de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2513de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos std::vector<VkSparseImageFormatProperties> coreProperties (numCoreProperties); 2514de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos std::vector<VkSparseImageFormatProperties2KHR> extProperties (numExtProperties); 2515de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2516de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&coreProperties[0], 0xcd, sizeof(VkSparseImageFormatProperties)*numCoreProperties); 2517de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos deMemset(&extProperties[0], 0xcd, sizeof(VkSparseImageFormatProperties2KHR)*numExtProperties); 2518de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2519de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (deUint32 ndx = 0; ndx < numExtProperties; ++ndx) 2520de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2521de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties[ndx].sType = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR; 2522de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos extProperties[ndx].pNext = DE_NULL; 2523de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2524de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2525de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceSparseImageFormatProperties(physicalDevice, imageFormatInfo.format, imageFormatInfo.type, imageFormatInfo.samples, imageFormatInfo.usage, imageFormatInfo.tiling, &numCoreProperties, &coreProperties[0]); 2526de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos vki.getPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, &imageFormatInfo, &numExtProperties, &extProperties[0]); 2527de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2528de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK((size_t)numCoreProperties == coreProperties.size()); 2529de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK((size_t)numExtProperties == extProperties.size()); 2530de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2531de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos for (deUint32 ndx = 0; ndx < numCoreProperties; ++ndx) 2532de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2533de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties[ndx].sType == VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR); 2534de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_CHECK(extProperties[ndx].pNext == DE_NULL); 2535de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2536de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos if ((deMemCmp(&coreProperties[ndx], &extProperties[ndx].properties, sizeof(VkSparseImageFormatProperties)) != 0)) 2537de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2538de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos log << TestLog::Message << "ERROR: device " << deviceNdx << ": mismatch with query " << imageFormatInfo << " property " << ndx << TestLog::EndMessage 2539de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos << TestLog::Message << "vkGetPhysicalDeviceSparseImageFormatProperties() returned " << coreProperties[ndx] << TestLog::EndMessage 2540de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos << TestLog::Message << "vkGetPhysicalDeviceSparseImageFormatProperties2KHR() returned " << extProperties[ndx] << TestLog::EndMessage; 2541de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos TCU_FAIL("Mismatch between image format properties reported by vkGetPhysicalDeviceSparseImageFormatProperties and vkGetPhysicalDeviceSparseImageFormatProperties2KHR"); 2542de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2543de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2544de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2545de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2546de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2547de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2548de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2549de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos return tcu::TestStatus::pass("Querying sparse image format properties succeeded"); 2550eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos} 2551eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos 25523b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos// Android CTS -specific tests 25533b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25543b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulosnamespace android 25553b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos{ 25563b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25573b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulosvoid checkExtensions (tcu::ResultCollector& results, const set<string>& allowedExtensions, const vector<VkExtensionProperties>& reportedExtensions) 25583b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos{ 25593b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos for (vector<VkExtensionProperties>::const_iterator extension = reportedExtensions.begin(); extension != reportedExtensions.end(); ++extension) 25603b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 25613b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos const string extensionName (extension->extensionName); 25623b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos const bool mustBeKnown = de::beginsWith(extensionName, "VK_KHX_") || 25633b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos de::beginsWith(extensionName, "VK_GOOGLE_") || 25643b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos de::beginsWith(extensionName, "VK_ANDROID_"); 25653b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25663b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos if (mustBeKnown && !de::contains(allowedExtensions, extensionName)) 25673b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos results.fail("Unknown extension: " + extensionName); 25683b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 25693b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos} 25703b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25713b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulostcu::TestStatus testNoUnknownExtensions (Context& context) 25723b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos{ 25733b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos TestLog& log = context.getTestContext().getLog(); 25743b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos tcu::ResultCollector results (log); 2575b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott set<string> allowedInstanceExtensions; 2576b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott set<string> allowedDeviceExtensions; 25773b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25783b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // All known extensions should be added to allowedExtensions: 25793b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // allowedExtensions.insert("VK_GOOGLE_extension1"); 2580b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott allowedDeviceExtensions.insert("VK_GOOGLE_display_timing"); 25813b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25823b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // Instance extensions 25833b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos checkExtensions(results, 2584b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott allowedInstanceExtensions, 25853b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL)); 25863b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25873b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // Extensions exposed by instance layers 25883b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 25893b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos const vector<VkLayerProperties> layers = enumerateInstanceLayerProperties(context.getPlatformInterface()); 25903b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25913b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 25923b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 25933b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos checkExtensions(results, 2594b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott allowedInstanceExtensions, 25953b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos enumerateInstanceExtensionProperties(context.getPlatformInterface(), layer->layerName)); 25963b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 25973b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 25983b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 25993b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // Device extensions 26003b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos checkExtensions(results, 2601b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott allowedDeviceExtensions, 26023b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL)); 26033b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 26043b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos // Extensions exposed by device layers 26053b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 26063b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos const vector<VkLayerProperties> layers = enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 26073b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 26083b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 26093b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 26103b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos checkExtensions(results, 2611b1b66e2402fabaa59a36e5b350946ef38491e9e5Ian Elliott allowedDeviceExtensions, 26123b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), layer->layerName)); 26133b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 26143b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 26153b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 26163b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 26173b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos} 26183b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 261900e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulostcu::TestStatus testNoLayers (Context& context) 262000e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos{ 262100e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos TestLog& log = context.getTestContext().getLog(); 262200e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos tcu::ResultCollector results (log); 262300e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 262400e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos { 262500e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos const vector<VkLayerProperties> layers = enumerateInstanceLayerProperties(context.getPlatformInterface()); 262600e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 262700e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 262800e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos results.fail(string("Instance layer enumerated: ") + layer->layerName); 262900e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos } 263000e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 263100e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos { 263200e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos const vector<VkLayerProperties> layers = enumerateDeviceLayerProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 263300e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 263400e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos for (vector<VkLayerProperties>::const_iterator layer = layers.begin(); layer != layers.end(); ++layer) 263500e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos results.fail(string("Device layer enumerated: ") + layer->layerName); 263600e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos } 263700e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 263800e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 263900e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos} 264000e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos 264176b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulostcu::TestStatus testMandatoryExtensions (Context& context) 264276b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos{ 264376b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos TestLog& log = context.getTestContext().getLog(); 264476b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos tcu::ResultCollector results (log); 264576b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 264676b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos // Instance extensions 264776b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 264876b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos static const char* mandatoryExtensions[] = 264976b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 265076b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos "VK_KHR_get_physical_device_properties2", 265176b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos }; 265276b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos const vector<VkExtensionProperties> extensions = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL); 265376b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 265476b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(mandatoryExtensions); ++ndx) 265576b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 265676b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos if (!isExtensionSupported(extensions, RequiredExtension(mandatoryExtensions[ndx]))) 265776b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos results.fail(string(mandatoryExtensions[ndx]) + " is not supported"); 265876b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos } 265976b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos } 266076b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 266176b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos // Device extensions 266276b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 266376b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos static const char* mandatoryExtensions[] = 266476b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 266576b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos "VK_KHR_maintenance1", 266676b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos }; 266776b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos const vector<VkExtensionProperties> extensions = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL); 266876b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 266976b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(mandatoryExtensions); ++ndx) 267076b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos { 267176b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos if (!isExtensionSupported(extensions, RequiredExtension(mandatoryExtensions[ndx]))) 267276b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos results.fail(string(mandatoryExtensions[ndx]) + " is not supported"); 267376b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos } 267476b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos } 267576b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 267676b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 267776b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos} 267876b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos 26793b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos} // android 26803b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 26812cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // anonymous 26822cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 26832cee520ae710ca28c500e5c510e114096fc924bdDavid Sodmantcu::TestCaseGroup* createFeatureInfoTests (tcu::TestContext& testCtx) 26842cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman{ 26852cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman de::MovePtr<tcu::TestCaseGroup> infoTests (new tcu::TestCaseGroup(testCtx, "info", "Platform Information Tests")); 26862cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 26872cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 26882cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman de::MovePtr<tcu::TestCaseGroup> instanceInfoTests (new tcu::TestCaseGroup(testCtx, "instance", "Instance Information Tests")); 26892cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 26902cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(instanceInfoTests.get(), "physical_devices", "Physical devices", enumeratePhysicalDevices); 26912cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(instanceInfoTests.get(), "layers", "Layers", enumerateInstanceLayers); 26922cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(instanceInfoTests.get(), "extensions", "Extensions", enumerateInstanceExtensions); 26932cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 26942cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman infoTests->addChild(instanceInfoTests.release()); 26952cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 26962cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 26972cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman { 26982cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman de::MovePtr<tcu::TestCaseGroup> deviceInfoTests (new tcu::TestCaseGroup(testCtx, "device", "Device Information Tests")); 26992cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 27002cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "features", "Device Features", deviceFeatures); 27012cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "properties", "Device Properties", deviceProperties); 27022cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "queue_family_properties", "Queue family properties", deviceQueueFamilyProperties); 27032cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "memory_properties", "Memory properties", deviceMemoryProperties); 27042cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "layers", "Layers", enumerateDeviceLayers); 27052cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman addFunctionCase(deviceInfoTests.get(), "extensions", "Extensions", enumerateDeviceExtensions); 27062cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 27072cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman infoTests->addChild(deviceInfoTests.release()); 27082cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman } 27092cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 2710eefb5f5ee7c812d92780f3d32e25635fcb13b1e2Pyry Haulos infoTests->addChild(createTestGroup(testCtx, "format_properties", "VkGetPhysicalDeviceFormatProperties() Tests", createFormatTests)); 2711de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos infoTests->addChild(createTestGroup(testCtx, "image_format_properties", "VkGetPhysicalDeviceImageFormatProperties() Tests", createImageFormatTests, imageFormatProperties)); 2712de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2713de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos { 2714de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos de::MovePtr<tcu::TestCaseGroup> extendedPropertiesTests (new tcu::TestCaseGroup(testCtx, "get_physical_device_properties2", "VK_KHR_get_physical_device_properties2")); 2715de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2716de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(extendedPropertiesTests.get(), "features", "Extended Device Features", deviceFeatures2); 2717de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(extendedPropertiesTests.get(), "properties", "Extended Device Properties", deviceProperties2); 2718de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(extendedPropertiesTests.get(), "format_properties", "Extended Device Format Properties", deviceFormatProperties2); 2719de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(extendedPropertiesTests.get(), "queue_family_properties", "Extended Device Queue Family Properties", deviceQueueFamilyProperties2); 2720de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos addFunctionCase(extendedPropertiesTests.get(), "memory_properties", "Extended Device Memory Properties", deviceMemoryProperties2); 2721de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2722de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos infoTests->addChild(extendedPropertiesTests.release()); 2723de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos } 2724de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos 2725de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos infoTests->addChild(createTestGroup(testCtx, "image_format_properties2", "VkGetPhysicalDeviceImageFormatProperties2KHR() Tests", createImageFormatTests, imageFormatProperties2)); 2726de34fad51cc07daf1eed73fc35e4cd5bf79b1a5cPyry Haulos infoTests->addChild(createTestGroup(testCtx, "sparse_image_format_properties2", "VkGetPhysicalDeviceSparseImageFormatProperties2KHR() Tests", createImageFormatTests, sparseImageFormatProperties2)); 272766789eb6df30afcd80bc2abe60b6cd49e0adc01dPyry Haulos 27283b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos { 27293b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos de::MovePtr<tcu::TestCaseGroup> androidTests (new tcu::TestCaseGroup(testCtx, "android", "Android CTS Tests")); 27303b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 273176b95d9c3546166139b3df2b4e12df06b49b42bdPyry Haulos addFunctionCase(androidTests.get(), "mandatory_extensions", "Test that all mandatory extensions are supported", android::testMandatoryExtensions); 27323b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos addFunctionCase(androidTests.get(), "no_unknown_extensions", "Test for unknown device or instance extensions", android::testNoUnknownExtensions); 273300e47f2b6cbd0c9715274a703d9cb46361743210Pyry Haulos addFunctionCase(androidTests.get(), "no_layers", "Test that no layers are enumerated", android::testNoLayers); 27343b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 27353b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos infoTests->addChild(androidTests.release()); 27363b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos } 27373b3e3dce3ab2b83969241550046645653b9652b3Pyry Haulos 27382cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman return infoTests.release(); 27392cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} 27402cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman 27412cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // api 27422cee520ae710ca28c500e5c510e114096fc924bdDavid Sodman} // vkt 2743