1cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos/*------------------------------------------------------------------------- 2cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * Vulkan Conformance Tests 3cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * ------------------------ 4cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * 5cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * Copyright (c) 2016 Google Inc. 6cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * 7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 10cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 12cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 18cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * 19cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *//*! 20cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * \file 21cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos * \brief VkSurface Tests 22cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos *//*--------------------------------------------------------------------*/ 23cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 24cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktWsiSurfaceTests.hpp" 25cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 26cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktTestCaseUtil.hpp" 27cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vktTestGroupUtil.hpp" 28cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 29cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkDefs.hpp" 30cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkPlatform.hpp" 31cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkStrUtil.hpp" 32cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkRef.hpp" 33cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkRefUtil.hpp" 34cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkQueryUtil.hpp" 35cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkMemUtil.hpp" 36cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkDeviceUtil.hpp" 37cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkPrograms.hpp" 38cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkTypeUtil.hpp" 39cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkWsiPlatform.hpp" 40cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "vkWsiUtil.hpp" 41f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos#include "vkAllocationCallbackUtil.hpp" 42cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 43cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuTestLog.hpp" 44cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuFormatUtil.hpp" 45cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuPlatform.hpp" 46cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "tcuResultCollector.hpp" 47cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 48cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "deUniquePtr.hpp" 49cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos#include "deStringUtil.hpp" 50cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosnamespace vk 528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosinline bool operator!= (const VkSurfaceFormatKHR& a, const VkSurfaceFormatKHR& b) 558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return (a.format != b.format) || (a.colorSpace != b.colorSpace); 578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 588f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosinline bool operator== (const VkSurfaceFormatKHR& a, const VkSurfaceFormatKHR& b) 608f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return !(a != b); 628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} // vk 658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 66cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace vkt 67cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 68cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace wsi 69cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 70cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 71cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosnamespace 72cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 73cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 74cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing namespace vk; 75cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing namespace vk::wsi; 76cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 77cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::TestLog; 78cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::Maybe; 79cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing tcu::UVec2; 80cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosusing de::MovePtr; 828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosusing de::UniquePtr; 838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 84cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing std::string; 85cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosusing std::vector; 86cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 87cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosenum 88cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 89cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC = 0xffffffff 90cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos}; 91cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostypedef vector<VkExtensionProperties> Extensions; 93cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid checkAllSupported (const Extensions& supportedExtensions, const vector<string>& requiredExtensions) 958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (vector<string>::const_iterator requiredExtName = requiredExtensions.begin(); 978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos requiredExtName != requiredExtensions.end(); 98cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos ++requiredExtName) 99cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 100cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos if (!isExtensionSupported(supportedExtensions, RequiredExtension(*requiredExtName))) 101cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos TCU_THROW(NotSupportedError, (*requiredExtName + " is not supported").c_str()); 102cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 103cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 104cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 105f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry HaulosMove<VkInstance> createInstanceWithWsi (const PlatformInterface& vkp, 106f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const Extensions& supportedExtensions, 107f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos Type wsiType, 108f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const VkAllocationCallbacks* pAllocator = DE_NULL) 109cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 110cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos vector<string> extensions; 111cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 112cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos extensions.push_back("VK_KHR_surface"); 113cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos extensions.push_back(getExtensionName(wsiType)); 114cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 1158f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos checkAllSupported(supportedExtensions, extensions); 116cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 117f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return createDefaultInstance(vkp, vector<string>(), extensions, pAllocator); 118cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 119cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 1208f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstruct InstanceHelper 121cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 1228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkExtensionProperties> supportedExtensions; 1238f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos Unique<VkInstance> instance; 1248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceDriver vki; 1258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 126f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos InstanceHelper (Context& context, Type wsiType, const VkAllocationCallbacks* pAllocator = DE_NULL) 1278f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos : supportedExtensions (enumerateInstanceExtensionProperties(context.getPlatformInterface(), 1288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos DE_NULL)) 1298f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos , instance (createInstanceWithWsi(context.getPlatformInterface(), 1308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos supportedExtensions, 131f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos wsiType, 132f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos pAllocator)) 1338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos , vki (context.getPlatformInterface(), *instance) 1348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos {} 1358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}; 136cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 1378f00a90c1c60fe87327de7670ca817c5a42957faPyry HaulosMovePtr<Display> createDisplay (const vk::Platform& platform, 1388f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Extensions& supportedExtensions, 1398f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos Type wsiType) 1408f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 141cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos try 142cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 1438f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return MovePtr<Display>(platform.createWsiDisplay(wsiType)); 144cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 1458f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos catch (const tcu::NotSupportedError& e) 146cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 1478f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isExtensionSupported(supportedExtensions, RequiredExtension(getExtensionName(wsiType)))) 1488f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 1498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // If VK_KHR_{platform}_surface was supported, vk::Platform implementation 1508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // must support creating native display & window for that WSI type. 1518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos throw tcu::TestError(e.getMessage()); 1528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 1538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos else 1548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos throw; 1558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 1568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 1578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 1588f00a90c1c60fe87327de7670ca817c5a42957faPyry HaulosMovePtr<Window> createWindow (const Display& display, const Maybe<UVec2>& initialSize) 1598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 1608f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos try 1618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 1628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return MovePtr<Window>(display.createWindow(initialSize)); 1638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 1648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos catch (const tcu::NotSupportedError& e) 1658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 1668f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // See createDisplay - assuming that wsi::Display was supported platform port 1678f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // should also support creating a window. 1688f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos throw tcu::TestError(e.getMessage()); 169cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 1708f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 1718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 1728f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosstruct NativeObjects 1738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 1748f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UniquePtr<Display> display; 1758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UniquePtr<Window> window; 1768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 1778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos NativeObjects (Context& context, 1788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Extensions& supportedExtensions, 1798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos Type wsiType, 1808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Maybe<UVec2>& initialWindowSize = tcu::nothing<UVec2>()) 1818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos : display (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), supportedExtensions, wsiType)) 1828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos , window (createWindow(*display, initialWindowSize)) 1838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos {} 1848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos}; 1858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 1868f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus createSurfaceTest (Context& context, Type wsiType) 1878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 1888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 1898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 1908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window)); 191cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 192cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return tcu::TestStatus::pass("Creating surface succeeded"); 193cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 194cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 195f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulostcu::TestStatus createSurfaceCustomAllocatorTest (Context& context, Type wsiType) 196f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos{ 197f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos AllocationCallbackRecorder allocationRecorder (getSystemAllocator()); 198f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 199f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 200f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos { 201f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const InstanceHelper instHelper (context, wsiType, allocationRecorder.getCallbacks()); 202f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 203f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, 204f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *instHelper.instance, 205f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos wsiType, 206f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *native.display, 207f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *native.window, 208f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos allocationRecorder.getCallbacks())); 209f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 210f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (!validateAndLog(log, 211f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos allocationRecorder, 212f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos (1u<<VK_SYSTEM_ALLOCATION_SCOPE_OBJECT) | 213f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos (1u<<VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE))) 214f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::fail("Detected invalid system allocation callback"); 215f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos } 216f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 217f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (!validateAndLog(log, allocationRecorder, 0u)) 218f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::fail("Detected invalid system allocation callback"); 219f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 220f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (allocationRecorder.getRecordsBegin() == allocationRecorder.getRecordsEnd()) 221f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks were not used"); 222f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos else 223f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::pass("Creating surface succeeded using custom allocator"); 224f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos} 225f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 226f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulostcu::TestStatus createSurfaceSimulateOOMTest (Context& context, Type wsiType) 227f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos{ 228f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 229f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 230f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos for (deUint32 numPassingAllocs = 0; numPassingAllocs <= 1024u; ++numPassingAllocs) 231f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos { 232f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos AllocationCallbackRecorder allocationRecorder (getSystemAllocator()); 233f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos DeterministicFailAllocator failingAllocator (allocationRecorder.getCallbacks(), numPassingAllocs); 234f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos bool gotOOM = false; 235f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 236f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos log << TestLog::Message << "Testing with " << numPassingAllocs << " first allocations succeeding" << TestLog::EndMessage; 237f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 238f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos try 239f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos { 240f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const InstanceHelper instHelper (context, wsiType, failingAllocator.getCallbacks()); 241f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 242f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, 243f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *instHelper.instance, 244f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos wsiType, 245f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *native.display, 246f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos *native.window, 247f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos failingAllocator.getCallbacks())); 248f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 249f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (!validateAndLog(log, 250f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos allocationRecorder, 251f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos (1u<<VK_SYSTEM_ALLOCATION_SCOPE_OBJECT) | 252f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos (1u<<VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE))) 253f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::fail("Detected invalid system allocation callback"); 254f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos } 255f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos catch (const OutOfMemoryError& e) 256f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos { 257f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos log << TestLog::Message << "Got " << e.getError() << TestLog::EndMessage; 258f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos gotOOM = true; 259f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos } 260f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 261f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (!validateAndLog(log, allocationRecorder, 0u)) 262f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::fail("Detected invalid system allocation callback"); 263f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 264f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (!gotOOM) 265f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos { 266f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos log << TestLog::Message << "Creating surface succeeded!" << TestLog::EndMessage; 267f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 268f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos if (numPassingAllocs == 0) 269f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Allocation callbacks were not used"); 270f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos else 271f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus::pass("OOM simulation completed"); 272f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos } 273f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos } 274f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 275f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos return tcu::TestStatus(QP_TEST_RESULT_QUALITY_WARNING, "Creating surface did not succeed, callback limit exceeded"); 276f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos} 277f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos 278cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry HaulosdeUint32 getNumQueueFamilies (const InstanceInterface& vki, VkPhysicalDevice physicalDevice) 279cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 280cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos deUint32 numFamilies = 0; 281cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 282cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos vki.getPhysicalDeviceQueueFamilyProperties(physicalDevice, &numFamilies, DE_NULL); 283cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 284cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return numFamilies; 285cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 286cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 287cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus querySurfaceSupportTest (Context& context, Type wsiType) 288cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 2898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 2908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::ResultCollector results (log); 2918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 2928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 2938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 2948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window)); 2958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 296cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 297cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos // On Android surface must be supported by all devices and queue families 2988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const bool expectSupportedOnAll = wsiType == TYPE_ANDROID; 299cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 3008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 301cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 3028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkPhysicalDevice physicalDevice = physicalDevices[deviceNdx]; 3038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const deUint32 numQueueFamilies = getNumQueueFamilies(instHelper.vki, physicalDevice); 304cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 3058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numQueueFamilies; ++queueFamilyNdx) 306cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 3078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkBool32 isSupported = getPhysicalDeviceSurfaceSupport(instHelper.vki, physicalDevice, queueFamilyNdx, *surface); 308cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 3098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos log << TestLog::Message << "Device " << deviceNdx << ", queue family " << queueFamilyNdx << ": " 3108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos << (isSupported == VK_FALSE ? "NOT " : "") << "supported" 3118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos << TestLog::EndMessage; 312cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 3138f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (expectSupportedOnAll && !isSupported) 3148f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.fail("Surface must be supported by all devices and queue families"); 315cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 316cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 3178f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 3188f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 319cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 320cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 321cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosbool isSupportedByAnyQueue (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface) 322cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 323cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos const deUint32 numQueueFamilies = getNumQueueFamilies(vki, physicalDevice); 324cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 325cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos for (deUint32 queueFamilyNdx = 0; queueFamilyNdx < numQueueFamilies; ++queueFamilyNdx) 326cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 327cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos if (getPhysicalDeviceSurfaceSupport(vki, physicalDevice, queueFamilyNdx, surface) != VK_FALSE) 328cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return true; 329cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 330cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 331cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return false; 332cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 333cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 334cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosvoid validateSurfaceCapabilities (tcu::ResultCollector& results, const VkSurfaceCapabilitiesKHR& capabilities) 335cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 336cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.minImageCount > 0, 337cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "minImageCount must be larger than 0"); 338cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 339cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.minImageExtent.width > 0 && 340cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos capabilities.minImageExtent.height > 0, 341cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "minImageExtent dimensions must be larger than 0"); 342cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 343cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.maxImageExtent.width > 0 && 344cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos capabilities.maxImageExtent.height > 0, 345cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "maxImageExtent dimensions must be larger than 0"); 346cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 347cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.minImageExtent.width <= capabilities.maxImageExtent.width && 348cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos capabilities.minImageExtent.height <= capabilities.maxImageExtent.height, 349cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "maxImageExtent must be larger or equal to minImageExtent"); 350cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 351cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos if (capabilities.currentExtent.width != SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC || 352cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos capabilities.currentExtent.height != SURFACE_EXTENT_DETERMINED_BY_SWAPCHAIN_MAGIC) 353cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 354cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.currentExtent.width > 0 && 355cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos capabilities.currentExtent.height > 0, 356cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "currentExtent dimensions must be larger than 0"); 357cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 358cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(de::inRange(capabilities.currentExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width) && 3593d8e6ee58a6f3a7701a3e6cdc4ba9fb14b162410Pyry Haulos de::inRange(capabilities.currentExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height), 360cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "currentExtent is not in supported extent limits"); 361cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 362cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 363cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.maxImageArrayLayers > 0, 364cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "maxImageArrayLayers must be larger than 0"); 365cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 366cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check((capabilities.supportedUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) != 0, 367cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT must be set in supportedUsageFlags"); 368cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 369cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.supportedTransforms != 0, 370cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "At least one transform must be supported"); 371cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 372cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(dePop32(capabilities.currentTransform) != 0, 373cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "Invalid currentTransform"); 374cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 375cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check((capabilities.supportedTransforms & capabilities.currentTransform) != 0, 376cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "currentTransform is not supported by surface"); 377cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 378cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos results.check(capabilities.supportedCompositeAlpha != 0, 379cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos "At least one alpha mode must be supported"); 380cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 381cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 382cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus querySurfaceCapabilitiesTest (Context& context, Type wsiType) 383cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 3848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 3858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::ResultCollector results (log); 386cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 3878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 3888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 3898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window)); 3908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 3918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 3928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 393cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 3948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface)) 3958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 3968f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkSurfaceCapabilitiesKHR capabilities = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, 3978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos physicalDevices[deviceNdx], 3988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos *surface); 3998f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4008f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos log << TestLog::Message << "Device " << deviceNdx << ": " << capabilities << TestLog::EndMessage; 4018f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4028f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos validateSurfaceCapabilities(results, capabilities); 4038f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 4048f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // else skip query as surface is not supported by the device 4058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 406cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 4078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 4088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 4098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid validateSurfaceFormats (tcu::ResultCollector& results, Type wsiType, const vector<VkSurfaceFormatKHR>& formats) 4118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 4128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkSurfaceFormatKHR* requiredFormats = DE_NULL; 4138f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos size_t numRequiredFormats = 0; 4148f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4158f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (wsiType == TYPE_ANDROID) 4168f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 4178f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos static const VkSurfaceFormatKHR s_androidFormats[] = 418cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 4198f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { VK_FORMAT_R8G8B8A8_UNORM, VK_COLORSPACE_SRGB_NONLINEAR_KHR }, 4208f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { VK_FORMAT_R8G8B8A8_SRGB, VK_COLORSPACE_SRGB_NONLINEAR_KHR }, 4218f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { VK_FORMAT_R5G6B5_UNORM_PACK16, VK_COLORSPACE_SRGB_NONLINEAR_KHR } 4228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos }; 423cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 4248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos requiredFormats = &s_androidFormats[0]; 4258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos numRequiredFormats = DE_LENGTH_OF_ARRAY(s_androidFormats); 4268f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 427cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 4288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t ndx = 0; ndx < numRequiredFormats; ++ndx) 4298f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 4308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkSurfaceFormatKHR& requiredFormat = requiredFormats[ndx]; 431cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 4328f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (!de::contains(formats.begin(), formats.end(), requiredFormat)) 4338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.fail(de::toString(requiredFormat) + " not supported"); 4348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 4358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 4368f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4378f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus querySurfaceFormatsTest (Context& context, Type wsiType) 4388f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 4398f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 4408f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::ResultCollector results (log); 4418f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4428f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 4438f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 4448f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window)); 4458f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 4468f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4478f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 4488f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 4498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface)) 4508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 4518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkSurfaceFormatKHR> formats = getPhysicalDeviceSurfaceFormats(instHelper.vki, 4528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos physicalDevices[deviceNdx], 4538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos *surface); 4548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos log << TestLog::Message << "Device " << deviceNdx << ": " << tcu::formatArray(formats.begin(), formats.end()) << TestLog::EndMessage; 456cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 4578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos validateSurfaceFormats(results, wsiType, formats); 458cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 4598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // else skip query as surface is not supported by the device 460cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 4618f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4628f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 4638f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 4648f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4658f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulosvoid validateSurfacePresentModes (tcu::ResultCollector& results, Type wsiType, const vector<VkPresentModeKHR>& modes) 4668f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 4678f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.check(de::contains(modes.begin(), modes.end(), VK_PRESENT_MODE_FIFO_KHR), 4688f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos "VK_PRESENT_MODE_FIFO_KHR is not supported"); 4698f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4708f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (wsiType == TYPE_ANDROID) 4718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.check(de::contains(modes.begin(), modes.end(), VK_PRESENT_MODE_MAILBOX_KHR), 4728f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos "VK_PRESENT_MODE_MAILBOX_KHR is not supported"); 4738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos} 4748f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulostcu::TestStatus querySurfacePresentModesTest (Context& context, Type wsiType) 4768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos{ 4778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 4788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos tcu::ResultCollector results (log); 4798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 4818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const NativeObjects native (context, instHelper.supportedExtensions, wsiType); 4828f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *native.display, *native.window)); 4838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 4848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 486cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 4878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface)) 4888f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 4898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPresentModeKHR> modes = getPhysicalDeviceSurfacePresentModes(instHelper.vki, physicalDevices[deviceNdx], *surface); 4908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos log << TestLog::Message << "Device " << deviceNdx << ": " << tcu::formatArray(modes.begin(), modes.end()) << TestLog::EndMessage; 4928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4938f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos validateSurfacePresentModes(results, wsiType, modes); 4948f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 4958f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // else skip query as surface is not supported by the device 496cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 4978f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 4988f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 499cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 500cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 501cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus createSurfaceInitialSizeTest (Context& context, Type wsiType) 502cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 503cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 504cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos tcu::ResultCollector results (log); 5058f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5068f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 5078f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5088f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UniquePtr<Display> nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), 5098f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos instHelper.supportedExtensions, 5108f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos wsiType)); 5118f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5128f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 513cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos const UVec2 sizes[] = 514cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 515cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(64, 64), 516cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(124, 119), 517cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(256, 512) 518cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos }; 519cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 520cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos DE_ASSERT(getPlatformProperties(wsiType).features & PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE); 521cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5228f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes); ++sizeNdx) 523cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5248f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UVec2& testSize = sizes[sizeNdx]; 5258f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UniquePtr<Window> nativeWindow (createWindow(*nativeDisplay, tcu::just(testSize))); 5268f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow)); 527cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5288f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 529cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5308f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface)) 531cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5328f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkSurfaceCapabilitiesKHR capabilities = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, physicalDevices[deviceNdx], *surface); 5338f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5348f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // \note Assumes that surface size is NOT set by swapchain if initial window size is honored by platform 5358f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.check(capabilities.currentExtent.width == testSize.x() && 5368f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos capabilities.currentExtent.height == testSize.y(), 5378f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos "currentExtent " + de::toString(capabilities.currentExtent) + " doesn't match requested size " + de::toString(testSize)); 538cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 539cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 540cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 541cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 542cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 543cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 544cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 545cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulostcu::TestStatus resizeSurfaceTest (Context& context, Type wsiType) 546cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 547cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos tcu::TestLog& log = context.getTestContext().getLog(); 548cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos tcu::ResultCollector results (log); 5498f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5508f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const InstanceHelper instHelper (context, wsiType); 5518f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5528f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UniquePtr<Display> nativeDisplay (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), 5538f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos instHelper.supportedExtensions, 5548f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos wsiType)); 5558f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos UniquePtr<Window> nativeWindow (createWindow(*nativeDisplay, tcu::nothing<UVec2>())); 5568f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 5578f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const vector<VkPhysicalDevice> physicalDevices = enumeratePhysicalDevices(instHelper.vki, *instHelper.instance); 5588f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const Unique<VkSurfaceKHR> surface (createSurface(instHelper.vki, *instHelper.instance, wsiType, *nativeDisplay, *nativeWindow)); 5598f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos 560cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos const UVec2 sizes[] = 561cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 562cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(64, 64), 563cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(124, 119), 564cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos UVec2(256, 512) 565cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos }; 566cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 567cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos DE_ASSERT(getPlatformProperties(wsiType).features & PlatformProperties::FEATURE_RESIZE_WINDOW); 568cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5698f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes); ++sizeNdx) 570cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5718f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const UVec2 testSize = sizes[sizeNdx]; 572cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5738f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos try 574cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5758f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos nativeWindow->resize(testSize); 5768f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 5778f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos catch (const tcu::Exception& e) 5788f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 5798f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // Make sure all exception types result in a test failure 5808f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.fail(e.getMessage()); 5818f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos } 582cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5838f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos for (size_t deviceNdx = 0; deviceNdx < physicalDevices.size(); ++deviceNdx) 5848f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos { 5858f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos if (isSupportedByAnyQueue(instHelper.vki, physicalDevices[deviceNdx], *surface)) 586cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos { 5878f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos const VkSurfaceCapabilitiesKHR capabilities = getPhysicalDeviceSurfaceCapabilities(instHelper.vki, physicalDevices[deviceNdx], *surface); 588cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 5898f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos // \note Assumes that surface size is NOT set by swapchain if initial window size is honored by platform 5908f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos results.check(capabilities.currentExtent.width == testSize.x() && 5918f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos capabilities.currentExtent.height == testSize.y(), 5928f00a90c1c60fe87327de7670ca817c5a42957faPyry Haulos "currentExtent " + de::toString(capabilities.currentExtent) + " doesn't match requested size " + de::toString(testSize)); 593cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 594cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 595cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos } 596cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 597cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos return tcu::TestStatus(results.getResult(), results.getMessage()); 598cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 599cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 600cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // anonymous 601cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 602cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulosvoid createSurfaceTests (tcu::TestCaseGroup* testGroup, vk::wsi::Type wsiType) 603cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos{ 604cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos const PlatformProperties& platformProperties = getPlatformProperties(wsiType); 605cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 606f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "create", "Create surface", createSurfaceTest, wsiType); 607f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "create_custom_allocator", "Create surface with custom allocator", createSurfaceCustomAllocatorTest, wsiType); 608f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "create_simulate_oom", "Create surface with simulating OOM", createSurfaceSimulateOOMTest, wsiType); 609f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "query_support", "Query surface support", querySurfaceSupportTest, wsiType); 610f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "query_capabilities", "Query surface capabilities", querySurfaceCapabilitiesTest, wsiType); 611f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "query_formats", "Query surface formats", querySurfaceFormatsTest, wsiType); 612f1d576d0d3f98e27b55038c5b29df26d1d0f0d79Pyry Haulos addFunctionCase(testGroup, "query_present_modes", "Query surface present modes", querySurfacePresentModesTest, wsiType); 613cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 614cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos if ((platformProperties.features & PlatformProperties::FEATURE_INITIAL_WINDOW_SIZE) != 0) 615cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos addFunctionCase(testGroup, "initial_size", "Create surface with initial window size set", createSurfaceInitialSizeTest, wsiType); 616cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 617cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos if ((platformProperties.features & PlatformProperties::FEATURE_RESIZE_WINDOW) != 0) 618cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos addFunctionCase(testGroup, "resize", "Resize window and surface", resizeSurfaceTest, wsiType); 619cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} 620cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos 621cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // wsi 622cb1582aca23ff763d6515ccd15e05aa29229a4a5Pyry Haulos} // vkt 623