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