// // Copyright 2024 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. // // WindowSurfaceWgpuX11.cpp: // Defines the class interface for WindowSurfaceWgpuX11, implementing WindowSurfaceWgpu. // #include "libANGLE/renderer/wgpu/linux/x11/WindowSurfaceWgpuX11.h" #include "libANGLE/Display.h" #include "libANGLE/renderer/wgpu/DisplayWgpu.h" #include "libANGLE/renderer/wgpu/wgpu_utils.h" #include #include #include namespace rx { WindowSurfaceWgpuX11::WindowSurfaceWgpuX11(const egl::SurfaceState &surfaceState, EGLNativeWindowType window) : WindowSurfaceWgpu(surfaceState, window) {} angle::Result WindowSurfaceWgpuX11::createWgpuSurface(const egl::Display *display, wgpu::Surface *outSurface) { DisplayWgpu *displayWgpu = webgpu::GetImpl(display); EGLNativeWindowType window = getNativeWindow(); wgpu::Instance instance = displayWgpu->getInstance(); wgpu::SurfaceDescriptorFromXlibWindow x11Desc; x11Desc.display = reinterpret_cast(display->getNativeDisplayId()); x11Desc.window = window; wgpu::SurfaceDescriptor surfaceDesc; surfaceDesc.nextInChain = &x11Desc; wgpu::Surface surface = instance.CreateSurface(&surfaceDesc); *outSurface = surface; return angle::Result::Continue; } angle::Result WindowSurfaceWgpuX11::getCurrentWindowSize(const egl::Display *display, gl::Extents *outSize) { Window root; int x, y; unsigned int width, height, border, depth; if (XGetGeometry(reinterpret_cast(display->getNativeDisplayId()), getNativeWindow(), &root, &x, &y, &width, &height, &border, &depth) == 0) { ERR() << "Failed to get X11 window geometry."; return angle::Result::Stop; } *outSize = gl::Extents(width, height, 1); return angle::Result::Continue; } WindowSurfaceWgpu *CreateWgpuWindowSurface(const egl::SurfaceState &surfaceState, EGLNativeWindowType window) { return new WindowSurfaceWgpuX11(surfaceState, window); } } // namespace rx