// // Copyright 2021-2022 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // WindowSurfaceVkWayland.cpp: // Implements the class methods for WindowSurfaceVkWayland. // #include "libANGLE/renderer/vulkan/linux/wayland/WindowSurfaceVkWayland.h" #include "libANGLE/renderer/vulkan/vk_renderer.h" #include namespace rx { void WindowSurfaceVkWayland::ResizeCallback(wl_egl_window *eglWindow, void *payload) { WindowSurfaceVkWayland *windowSurface = reinterpret_cast(payload); windowSurface->mExtents.width = eglWindow->width; windowSurface->mExtents.height = eglWindow->height; } WindowSurfaceVkWayland::WindowSurfaceVkWayland(const egl::SurfaceState &surfaceState, EGLNativeWindowType window, wl_display *display) : WindowSurfaceVk(surfaceState, window), mWaylandDisplay(display) { wl_egl_window *eglWindow = reinterpret_cast(window); eglWindow->resize_callback = WindowSurfaceVkWayland::ResizeCallback; eglWindow->driver_private = this; mExtents = gl::Extents(eglWindow->width, eglWindow->height, 1); } angle::Result WindowSurfaceVkWayland::createSurfaceVk(vk::ErrorContext *context) { ANGLE_VK_CHECK(context, vkGetPhysicalDeviceWaylandPresentationSupportKHR( context->getRenderer()->getPhysicalDevice(), context->getRenderer()->getQueueFamilyIndex(), mWaylandDisplay), VK_ERROR_INITIALIZATION_FAILED); wl_egl_window *eglWindow = reinterpret_cast(mNativeWindowType); VkWaylandSurfaceCreateInfoKHR createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; createInfo.flags = 0; createInfo.display = mWaylandDisplay; createInfo.surface = eglWindow->surface; ANGLE_VK_TRY(context, vkCreateWaylandSurfaceKHR(context->getRenderer()->getInstance(), &createInfo, nullptr, &mSurface)); return angle::Result::Continue; } angle::Result WindowSurfaceVkWayland::getCurrentWindowSize(vk::ErrorContext *context, gl::Extents *extentsOut) const { *extentsOut = mExtents; return angle::Result::Continue; } } // namespace rx