1/*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
3 * ----------------------------------------
4 *
5 * Copyright (c) 2016 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Wayland Vulkan Platform.
22 *//*--------------------------------------------------------------------*/
23
24#include "tcuWaylandVulkanPlatform.hpp"
25#include "tcuWaylandPlatform.hpp"
26#include "vkWsiPlatform.hpp"
27#include "gluPlatform.hpp"
28#include "tcuWayland.hpp"
29#include "tcuFunctionLibrary.hpp"
30#include "deUniquePtr.hpp"
31#include "deMemory.h"
32
33#include <sys/utsname.h>
34
35using de::MovePtr;
36using de::UniquePtr;
37
38namespace tcu
39{
40namespace wayland
41{
42
43class VulkanWindowWayland : public vk::wsi::WaylandWindowInterface
44{
45public:
46	VulkanWindowWayland (MovePtr<wayland::Window> window)
47		: vk::wsi::WaylandWindowInterface	(vk::pt::WaylandSurfacePtr(window->getSurface()))
48		, m_window							(window)
49	{
50	}
51
52	void resize (const UVec2& newSize)
53	{
54		m_window->setDimensions((int)newSize.x(), (int)newSize.y());
55	}
56
57private:
58	UniquePtr<wayland::Window>	m_window;
59};
60
61class VulkanDisplayWayland : public vk::wsi::WaylandDisplayInterface
62{
63public:
64	VulkanDisplayWayland (MovePtr<wayland::Display> display)
65		: vk::wsi::WaylandDisplayInterface	(vk::pt::WaylandDisplayPtr(display->getDisplay()))
66		, m_display		(display)
67	{
68	}
69
70	vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
71	{
72		const deUint32	height		= !initialSize ? (deUint32)DEFAULT_WINDOW_HEIGHT : initialSize->y();
73		const deUint32	width		= !initialSize ? (deUint32)DEFAULT_WINDOW_WIDTH : initialSize->x();
74		return new VulkanWindowWayland(MovePtr<wayland::Window>(new wayland::Window(*m_display, (int)width, (int)height)));
75	}
76
77private:
78	MovePtr<wayland::Display> m_display;
79};
80
81class VulkanLibrary : public vk::Library
82{
83public:
84	VulkanLibrary (void)
85		: m_library	("libvulkan.so.1")
86		, m_driver	(m_library)
87	{
88	}
89
90	const vk::PlatformInterface& getPlatformInterface (void) const
91	{
92		return m_driver;
93	}
94
95private:
96	const DynamicFunctionLibrary	m_library;
97	const vk::PlatformDriver		m_driver;
98};
99
100WaylandVulkanPlatform::WaylandVulkanPlatform (EventState& eventState)
101	: m_eventState(eventState)
102{
103}
104
105vk::wsi::Display* WaylandVulkanPlatform::createWsiDisplay (vk::wsi::Type wsiType) const
106{
107	switch(wsiType)
108	{
109	case vk::wsi::TYPE_WAYLAND:
110		return new VulkanDisplayWayland(MovePtr<Display>(new Display(m_eventState, DE_NULL)));
111		break;
112	default:
113		TCU_THROW(NotSupportedError, "WSI type not supported");
114
115	};
116}
117
118vk::Library* WaylandVulkanPlatform::createLibrary (void) const
119{
120	return new VulkanLibrary();
121}
122
123void WaylandVulkanPlatform::describePlatform (std::ostream& dst) const
124{
125	utsname		sysInfo;
126	deMemset(&sysInfo, 0, sizeof(sysInfo));
127
128	if (uname(&sysInfo) != 0)
129		throw std::runtime_error("uname() failed");
130
131	dst << "OS: " << sysInfo.sysname << " " << sysInfo.release << " " << sysInfo.version << "\n";
132	dst << "CPU: " << sysInfo.machine << "\n";
133}
134
135void WaylandVulkanPlatform::getMemoryLimits (vk::PlatformMemoryLimits& limits) const
136{
137	limits.totalSystemMemory					= 256*1024*1024;
138	limits.totalDeviceLocalMemory				= 128*1024*1024;
139	limits.deviceMemoryAllocationGranularity	= 64*1024;
140	limits.devicePageSize						= 4096;
141	limits.devicePageTableEntrySize				= 8;
142	limits.devicePageTableHierarchyLevels		= 3;
143}
144
145} // wayland
146} // tcu
147
148