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