1/*------------------------------------------------------------------------- 2 * Vulkan Conformance Tests 3 * ------------------------ 4 * 5 * Copyright (c) 2019 The Khronos Group Inc. 6 * Copyright (c) 2019 Valve Corporation. 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 * 20 *//*! 21 * \file 22 * \brief WSI Native Objects utility class. 23 *//*--------------------------------------------------------------------*/ 24#include "vktNativeObjectsUtil.hpp" 25 26#include "vkQueryUtil.hpp" 27#include "vkWsiUtil.hpp" 28 29#include "tcuPlatform.hpp" 30 31#include "deDefs.hpp" 32 33namespace vkt 34{ 35namespace wsi 36{ 37 38de::MovePtr<vk::wsi::Display> NativeObjects::createDisplay (const vk::Platform& platform, 39 const NativeObjects::Extensions& supportedExtensions, 40 vk::wsi::Type wsiType) 41{ 42 try 43 { 44 return de::MovePtr<vk::wsi::Display>(platform.createWsiDisplay(wsiType)); 45 } 46 catch (const tcu::NotSupportedError& e) 47 { 48 if (vk::isExtensionStructSupported(supportedExtensions, vk::RequiredExtension(vk::wsi::getExtensionName(wsiType))) && 49 platform.hasDisplay(wsiType)) 50 { 51 // If VK_KHR_{platform}_surface was supported, vk::Platform implementation 52 // must support creating native display & window for that WSI type. 53 throw tcu::TestError(e.getMessage()); 54 } 55 else 56 throw; 57 } 58} 59 60de::MovePtr<vk::wsi::Window> NativeObjects::createWindow (const vk::wsi::Display& display, const tcu::Maybe<tcu::UVec2>& initialSize) 61{ 62 try 63 { 64 return de::MovePtr<vk::wsi::Window>(display.createWindow(initialSize)); 65 } 66 catch (const tcu::NotSupportedError& e) 67 { 68 // See createDisplay - assuming that wsi::Display was supported platform port 69 // should also support creating a window. 70 throw tcu::TestError(e.getMessage()); 71 } 72} 73 74NativeObjects::NativeObjects (Context& context, 75 const Extensions& supportedExtensions, 76 vk::wsi::Type wsiType, 77 size_t windowCount, 78 const tcu::Maybe<tcu::UVec2>& initialWindowSize) 79 : display (createDisplay(context.getTestContext().getPlatform().getVulkanPlatform(), supportedExtensions, wsiType)) 80{ 81 DE_ASSERT(windowCount > 0u); 82 for (size_t i = 0; i < windowCount; ++i) 83 windows.emplace_back(createWindow(*display, initialWindowSize)); 84} 85 86NativeObjects::NativeObjects (NativeObjects&& other) 87 : display (other.display.move()) 88 , windows () 89{ 90 windows.swap(other.windows); 91} 92 93vk::wsi::Display& NativeObjects::getDisplay () const 94{ 95 return *display; 96} 97 98vk::wsi::Window& NativeObjects::getWindow (size_t index) const 99{ 100 DE_ASSERT(index < windows.size()); 101 return *windows[index]; 102} 103 104} // wsi 105} // vkt 106