1e5c31af7Sopenharmony_ci/*
2e5c31af7Sopenharmony_ci * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
5e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
13e5c31af7Sopenharmony_ci * limitations under the License.
14e5c31af7Sopenharmony_ci */
15e5c31af7Sopenharmony_ci
16e5c31af7Sopenharmony_ci#include "tcuOhosPlatform.hpp"
17e5c31af7Sopenharmony_ci
18e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
19e5c31af7Sopenharmony_ci#include "ohos_context_i.h"
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_ci#include "egluGLContextFactory.hpp"
22e5c31af7Sopenharmony_ci#include "display/tcuOhosEglDisplayFactory.hpp"
23e5c31af7Sopenharmony_ci#include "context/tcuOhosEglContextFactory.hpp"
24e5c31af7Sopenharmony_ci
25e5c31af7Sopenharmony_ciusing de::MovePtr;
26e5c31af7Sopenharmony_ciusing de::UniquePtr;
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_ciusing namespace tcu;
29e5c31af7Sopenharmony_ciusing namespace OHOS_ROSEN;
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ciOhosPlatform::OhosPlatform (void)
32e5c31af7Sopenharmony_ci{
33e5c31af7Sopenharmony_ci    printf("OhosPlatform construct!\n");
34e5c31af7Sopenharmony_ci    m_nativeDisplayFactoryRegistry.registerFactory(new OHOS_ROSEN::egl::OhosDisplayFactory());
35e5c31af7Sopenharmony_ci    m_contextFactoryRegistry.registerFactory(new OHOS_ROSEN::egl::OhosContextFactory());
36e5c31af7Sopenharmony_ci}
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_citcu::Platform* createOhosPlatform (void)
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_ci    return new tcu::OHOS_ROSEN::OhosPlatform();
41e5c31af7Sopenharmony_ci}
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ci#include "tcuFunctionLibrary.hpp"
44e5c31af7Sopenharmony_ciclass VulkanLibrary : public vk::Library
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_cipublic:
47e5c31af7Sopenharmony_ci	VulkanLibrary (void)
48e5c31af7Sopenharmony_ci		: m_library	("libvulkan.so")
49e5c31af7Sopenharmony_ci		, m_driver	(m_library)
50e5c31af7Sopenharmony_ci	{
51e5c31af7Sopenharmony_ci	}
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci	const vk::PlatformInterface& getPlatformInterface		(void) const
54e5c31af7Sopenharmony_ci	{
55e5c31af7Sopenharmony_ci		return m_driver;
56e5c31af7Sopenharmony_ci	}
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci	const tcu::FunctionLibrary&		getFunctionLibrary		(void) const
59e5c31af7Sopenharmony_ci	{
60e5c31af7Sopenharmony_ci		return m_library;
61e5c31af7Sopenharmony_ci	}
62e5c31af7Sopenharmony_ci
63e5c31af7Sopenharmony_ciprivate:
64e5c31af7Sopenharmony_ci	const tcu::DynamicFunctionLibrary	m_library;
65e5c31af7Sopenharmony_ci	const vk::PlatformDriver			m_driver;
66e5c31af7Sopenharmony_ci};
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ciclass VulkanWindowOhos : public vk::wsi::OhosWindowInterface
69e5c31af7Sopenharmony_ci{
70e5c31af7Sopenharmony_cipublic:
71e5c31af7Sopenharmony_ci	VulkanWindowOhos (uint64_t windowId)
72e5c31af7Sopenharmony_ci        : vk::wsi::OhosWindowInterface	(vk::pt::OhosNativeWindowPtr(OHOS::OhosContextI::GetInstance().GetNativeWindow(windowId)))
73e5c31af7Sopenharmony_ci		, windowId_(windowId)
74e5c31af7Sopenharmony_ci	{
75e5c31af7Sopenharmony_ci	}
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ci	void setVisible(bool visible)
78e5c31af7Sopenharmony_ci	{
79e5c31af7Sopenharmony_ci		DE_UNREF(visible);
80e5c31af7Sopenharmony_ci	}
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci	void resize(const UVec2& newSize)
83e5c31af7Sopenharmony_ci	{
84e5c31af7Sopenharmony_ci		DE_UNREF(newSize);
85e5c31af7Sopenharmony_ci	}
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ci	~VulkanWindowOhos (void)
88e5c31af7Sopenharmony_ci	{
89e5c31af7Sopenharmony_ci		OHOS::OhosContextI::GetInstance().DestoryWindow(windowId_);
90e5c31af7Sopenharmony_ci	}
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ciprivate:
93e5c31af7Sopenharmony_ci	uint64_t windowId_;
94e5c31af7Sopenharmony_ci};
95e5c31af7Sopenharmony_ciclass VulkanDisplayOhos : public vk::wsi::Display
96e5c31af7Sopenharmony_ci{
97e5c31af7Sopenharmony_cipublic:
98e5c31af7Sopenharmony_ci	VulkanDisplayOhos ()
99e5c31af7Sopenharmony_ci	{
100e5c31af7Sopenharmony_ci	}
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci	vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
103e5c31af7Sopenharmony_ci	{
104e5c31af7Sopenharmony_ci		const deUint32		height		= !initialSize ? (deUint32)300 : initialSize->y();
105e5c31af7Sopenharmony_ci		const deUint32		width		= !initialSize ? (deUint32)400 : initialSize->x();
106e5c31af7Sopenharmony_ci		printf("%d,%d\n",width,height);
107e5c31af7Sopenharmony_ci		uint64_t i = OHOS::OhosContextI::GetInstance().CreateWindow(0,0,width,height);
108e5c31af7Sopenharmony_ci		return new VulkanWindowOhos(i);//cxunmz
109e5c31af7Sopenharmony_ci	}
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ciprivate:
112e5c31af7Sopenharmony_ci};
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_civk::wsi::Display* OhosPlatform::createWsiDisplay(vk::wsi::Type wsiType) const
115e5c31af7Sopenharmony_ci{
116e5c31af7Sopenharmony_ci    if(wsiType == vk::wsi::TYPE_OHOS){
117e5c31af7Sopenharmony_ci        printf("ok\n");
118e5c31af7Sopenharmony_ci		return new VulkanDisplayOhos();
119e5c31af7Sopenharmony_ci    }
120e5c31af7Sopenharmony_ci    return NULL;
121e5c31af7Sopenharmony_ci}
122e5c31af7Sopenharmony_ci
123e5c31af7Sopenharmony_civk::Library* OhosPlatform::createLibrary(LibraryType libraryType, const char* libraryPath) const
124e5c31af7Sopenharmony_ci{
125e5c31af7Sopenharmony_ci	DE_UNREF(libraryType);
126e5c31af7Sopenharmony_ci	DE_UNREF(libraryPath);
127e5c31af7Sopenharmony_ci    return new VulkanLibrary();
128e5c31af7Sopenharmony_ci}
129e5c31af7Sopenharmony_ci
130e5c31af7Sopenharmony_cibool OhosPlatform::hasDisplay(vk::wsi::Type wsiType) const
131e5c31af7Sopenharmony_ci{
132e5c31af7Sopenharmony_ci    if (wsiType == vk::wsi::TYPE_OHOS)
133e5c31af7Sopenharmony_ci		return true;
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci	return false;
136e5c31af7Sopenharmony_ci}
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci#include <sys/utsname.h>
139e5c31af7Sopenharmony_ci#include "deMemory.h"
140e5c31af7Sopenharmony_civoid OhosPlatform::describePlatform(std::ostream& dst) const
141e5c31af7Sopenharmony_ci{
142e5c31af7Sopenharmony_ci	utsname		sysInfo;
143e5c31af7Sopenharmony_ci	deMemset(&sysInfo, 0, sizeof(sysInfo));
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_ci	if (uname(&sysInfo) != 0)
146e5c31af7Sopenharmony_ci		throw std::runtime_error("uname() failed");
147e5c31af7Sopenharmony_ci
148e5c31af7Sopenharmony_ci	dst << "OS: " << sysInfo.sysname << " " << sysInfo.release << " " << sysInfo.version << "\n";
149e5c31af7Sopenharmony_ci	dst << "CPU: " << sysInfo.machine << "\n";
150e5c31af7Sopenharmony_ci}
151e5c31af7Sopenharmony_ci
152e5c31af7Sopenharmony_civoid OhosPlatform::getMemoryLimits(tcu::PlatformMemoryLimits& limits) const
153e5c31af7Sopenharmony_ci{
154e5c31af7Sopenharmony_ci	limits.totalSystemMemory					= 256*1024*1024;
155e5c31af7Sopenharmony_ci	limits.totalDeviceLocalMemory				= 0;//128*1024*1024;
156e5c31af7Sopenharmony_ci	limits.deviceMemoryAllocationGranularity	= 64*1024;
157e5c31af7Sopenharmony_ci	limits.devicePageSize						= 4096;
158e5c31af7Sopenharmony_ci	limits.devicePageTableEntrySize				= 8;
159e5c31af7Sopenharmony_ci	limits.devicePageTableHierarchyLevels		= 3;
160e5c31af7Sopenharmony_ci}