#ifndef _VKTNATIVEOBJECTSUTIL_HPP
#define _VKTNATIVEOBJECTSUTIL_HPP
/*-------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2019 The Khronos Group Inc.
 * Copyright (c) 2019 Valve Corporation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief WSI Native Objects utility class.
 *//*--------------------------------------------------------------------*/
#include "vktTestCase.hpp"

#include "vkDefs.hpp"
#include "vkWsiPlatform.hpp"

#include "tcuMaybe.hpp"
#include "tcuVectorType.hpp"


namespace vkt
{
namespace wsi
{

class NativeObjects
{
public:
	using Extensions = std::vector<vk::VkExtensionProperties>;

												NativeObjects	(Context&						context,
																 const Extensions&				supportedExtensions,
																 vk::wsi::Type					wsiType,
																 size_t							windowCount = 1u,
																 const tcu::Maybe<tcu::UVec2>&	initialWindowSize = tcu::Nothing);

												NativeObjects	(NativeObjects&& other);

	vk::wsi::Display&							getDisplay		() const;

	vk::wsi::Window&							getWindow		(size_t index = 0u) const;

	static de::MovePtr<vk::wsi::Window>			createWindow	(const vk::wsi::Display& display, const tcu::Maybe<tcu::UVec2>& initialSize);

	static de::MovePtr<vk::wsi::Display>		createDisplay	(const vk::Platform&	platform,
																 const Extensions&		supportedExtensions,
																 vk::wsi::Type			wsiType);
private:
	de::UniquePtr<vk::wsi::Display>				display;
	std::vector<de::MovePtr<vk::wsi::Window>>	windows;

};

} // wsi
} // vkt

#endif // _VKTNATIVEOBJECTSUTIL_HPP