1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2021 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "Window.hpp"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #if USE_HEADLESS_SURFACE
18*03ce13f7SAndroid Build Coastguard Worker
Window(vk::Instance instance,vk::Extent2D windowSize)19*03ce13f7SAndroid Build Coastguard Worker Window::Window(vk::Instance instance, vk::Extent2D windowSize)
20*03ce13f7SAndroid Build Coastguard Worker : instance(instance)
21*03ce13f7SAndroid Build Coastguard Worker {
22*03ce13f7SAndroid Build Coastguard Worker vk::HeadlessSurfaceCreateInfoEXT surfaceCreateInfo;
23*03ce13f7SAndroid Build Coastguard Worker surface = instance.createHeadlessSurfaceEXT(surfaceCreateInfo);
24*03ce13f7SAndroid Build Coastguard Worker assert(surface);
25*03ce13f7SAndroid Build Coastguard Worker }
26*03ce13f7SAndroid Build Coastguard Worker
~Window()27*03ce13f7SAndroid Build Coastguard Worker Window::~Window()
28*03ce13f7SAndroid Build Coastguard Worker {
29*03ce13f7SAndroid Build Coastguard Worker instance.destroySurfaceKHR(surface, nullptr);
30*03ce13f7SAndroid Build Coastguard Worker }
31*03ce13f7SAndroid Build Coastguard Worker
getSurface()32*03ce13f7SAndroid Build Coastguard Worker vk::SurfaceKHR Window::getSurface()
33*03ce13f7SAndroid Build Coastguard Worker {
34*03ce13f7SAndroid Build Coastguard Worker return surface;
35*03ce13f7SAndroid Build Coastguard Worker }
36*03ce13f7SAndroid Build Coastguard Worker
show()37*03ce13f7SAndroid Build Coastguard Worker void Window::show()
38*03ce13f7SAndroid Build Coastguard Worker {
39*03ce13f7SAndroid Build Coastguard Worker }
40*03ce13f7SAndroid Build Coastguard Worker
41*03ce13f7SAndroid Build Coastguard Worker #elif defined(_WIN32)
42*03ce13f7SAndroid Build Coastguard Worker
Window(vk::Instance instance,vk::Extent2D windowSize)43*03ce13f7SAndroid Build Coastguard Worker Window::Window(vk::Instance instance, vk::Extent2D windowSize)
44*03ce13f7SAndroid Build Coastguard Worker : instance(instance)
45*03ce13f7SAndroid Build Coastguard Worker {
46*03ce13f7SAndroid Build Coastguard Worker windowClass.cbSize = sizeof(WNDCLASSEX);
47*03ce13f7SAndroid Build Coastguard Worker windowClass.style = CS_HREDRAW | CS_VREDRAW;
48*03ce13f7SAndroid Build Coastguard Worker windowClass.lpfnWndProc = DefWindowProc;
49*03ce13f7SAndroid Build Coastguard Worker windowClass.cbClsExtra = 0;
50*03ce13f7SAndroid Build Coastguard Worker windowClass.cbWndExtra = 0;
51*03ce13f7SAndroid Build Coastguard Worker windowClass.hInstance = moduleInstance;
52*03ce13f7SAndroid Build Coastguard Worker windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
53*03ce13f7SAndroid Build Coastguard Worker windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
54*03ce13f7SAndroid Build Coastguard Worker windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
55*03ce13f7SAndroid Build Coastguard Worker windowClass.lpszMenuName = NULL;
56*03ce13f7SAndroid Build Coastguard Worker windowClass.lpszClassName = "Window";
57*03ce13f7SAndroid Build Coastguard Worker windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
58*03ce13f7SAndroid Build Coastguard Worker
59*03ce13f7SAndroid Build Coastguard Worker RegisterClassEx(&windowClass);
60*03ce13f7SAndroid Build Coastguard Worker
61*03ce13f7SAndroid Build Coastguard Worker DWORD style = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
62*03ce13f7SAndroid Build Coastguard Worker DWORD extendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
63*03ce13f7SAndroid Build Coastguard Worker
64*03ce13f7SAndroid Build Coastguard Worker RECT windowRect;
65*03ce13f7SAndroid Build Coastguard Worker windowRect.left = 0L;
66*03ce13f7SAndroid Build Coastguard Worker windowRect.top = 0L;
67*03ce13f7SAndroid Build Coastguard Worker windowRect.right = (long)windowSize.width;
68*03ce13f7SAndroid Build Coastguard Worker windowRect.bottom = (long)windowSize.height;
69*03ce13f7SAndroid Build Coastguard Worker
70*03ce13f7SAndroid Build Coastguard Worker AdjustWindowRectEx(&windowRect, style, FALSE, extendedStyle);
71*03ce13f7SAndroid Build Coastguard Worker uint32_t x = (GetSystemMetrics(SM_CXSCREEN) - windowRect.right) / 2;
72*03ce13f7SAndroid Build Coastguard Worker uint32_t y = (GetSystemMetrics(SM_CYSCREEN) - windowRect.bottom) / 2;
73*03ce13f7SAndroid Build Coastguard Worker
74*03ce13f7SAndroid Build Coastguard Worker window = CreateWindowEx(extendedStyle, "Window", "Hello",
75*03ce13f7SAndroid Build Coastguard Worker style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
76*03ce13f7SAndroid Build Coastguard Worker x, y,
77*03ce13f7SAndroid Build Coastguard Worker windowRect.right - windowRect.left,
78*03ce13f7SAndroid Build Coastguard Worker windowRect.bottom - windowRect.top,
79*03ce13f7SAndroid Build Coastguard Worker NULL, NULL, moduleInstance, NULL);
80*03ce13f7SAndroid Build Coastguard Worker
81*03ce13f7SAndroid Build Coastguard Worker SetForegroundWindow(window);
82*03ce13f7SAndroid Build Coastguard Worker SetFocus(window);
83*03ce13f7SAndroid Build Coastguard Worker
84*03ce13f7SAndroid Build Coastguard Worker // Create the Vulkan surface
85*03ce13f7SAndroid Build Coastguard Worker vk::Win32SurfaceCreateInfoKHR surfaceCreateInfo;
86*03ce13f7SAndroid Build Coastguard Worker surfaceCreateInfo.hinstance = moduleInstance;
87*03ce13f7SAndroid Build Coastguard Worker surfaceCreateInfo.hwnd = window;
88*03ce13f7SAndroid Build Coastguard Worker surface = instance.createWin32SurfaceKHR(surfaceCreateInfo);
89*03ce13f7SAndroid Build Coastguard Worker assert(surface);
90*03ce13f7SAndroid Build Coastguard Worker }
91*03ce13f7SAndroid Build Coastguard Worker
~Window()92*03ce13f7SAndroid Build Coastguard Worker Window::~Window()
93*03ce13f7SAndroid Build Coastguard Worker {
94*03ce13f7SAndroid Build Coastguard Worker instance.destroySurfaceKHR(surface, nullptr);
95*03ce13f7SAndroid Build Coastguard Worker DestroyWindow(window);
96*03ce13f7SAndroid Build Coastguard Worker UnregisterClass("Window", moduleInstance);
97*03ce13f7SAndroid Build Coastguard Worker }
98*03ce13f7SAndroid Build Coastguard Worker
getSurface()99*03ce13f7SAndroid Build Coastguard Worker vk::SurfaceKHR Window::getSurface()
100*03ce13f7SAndroid Build Coastguard Worker {
101*03ce13f7SAndroid Build Coastguard Worker return surface;
102*03ce13f7SAndroid Build Coastguard Worker }
103*03ce13f7SAndroid Build Coastguard Worker
show()104*03ce13f7SAndroid Build Coastguard Worker void Window::show()
105*03ce13f7SAndroid Build Coastguard Worker {
106*03ce13f7SAndroid Build Coastguard Worker ShowWindow(window, SW_SHOW);
107*03ce13f7SAndroid Build Coastguard Worker }
108*03ce13f7SAndroid Build Coastguard Worker
109*03ce13f7SAndroid Build Coastguard Worker #else
110*03ce13f7SAndroid Build Coastguard Worker # error Window class unimplemented for this platform
111*03ce13f7SAndroid Build Coastguard Worker #endif
112