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