Add support for SurfaceDescriptorFromWaylandSurface
Bug: dawn:1246 Change-Id: I0af28e1820ad8da2121a00bdef7202695d23bbf7 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/75422 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
691c5fc4e6
commit
2e22d9285c
|
@ -82,6 +82,7 @@ set(ENABLE_METAL OFF)
|
||||||
set(ENABLE_OPENGLES OFF)
|
set(ENABLE_OPENGLES OFF)
|
||||||
set(ENABLE_DESKTOP_GL OFF)
|
set(ENABLE_DESKTOP_GL OFF)
|
||||||
set(ENABLE_VULKAN OFF)
|
set(ENABLE_VULKAN OFF)
|
||||||
|
set(USE_WAYLAND OFF)
|
||||||
set(USE_X11 OFF)
|
set(USE_X11 OFF)
|
||||||
set(BUILD_SAMPLES OFF)
|
set(BUILD_SAMPLES OFF)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
|
@ -124,6 +125,7 @@ option_if_not_defined(DAWN_ENABLE_DESKTOP_GL "Enable compilation of the OpenGL b
|
||||||
option_if_not_defined(DAWN_ENABLE_OPENGLES "Enable compilation of the OpenGL ES backend" ${ENABLE_OPENGLES})
|
option_if_not_defined(DAWN_ENABLE_OPENGLES "Enable compilation of the OpenGL ES backend" ${ENABLE_OPENGLES})
|
||||||
option_if_not_defined(DAWN_ENABLE_VULKAN "Enable compilation of the Vulkan backend" ${ENABLE_VULKAN})
|
option_if_not_defined(DAWN_ENABLE_VULKAN "Enable compilation of the Vulkan backend" ${ENABLE_VULKAN})
|
||||||
option_if_not_defined(DAWN_ALWAYS_ASSERT "Enable assertions on all build types" OFF)
|
option_if_not_defined(DAWN_ALWAYS_ASSERT "Enable assertions on all build types" OFF)
|
||||||
|
option_if_not_defined(DAWN_USE_WAYLAND "Enable support for Wayland surface" ${USE_WAYLAND})
|
||||||
option_if_not_defined(DAWN_USE_X11 "Enable support for X11 surface" ${USE_X11})
|
option_if_not_defined(DAWN_USE_X11 "Enable support for X11 surface" ${USE_X11})
|
||||||
|
|
||||||
option_if_not_defined(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" ${BUILD_SAMPLES})
|
option_if_not_defined(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" ${BUILD_SAMPLES})
|
||||||
|
@ -232,6 +234,9 @@ endif()
|
||||||
if (DAWN_ENABLE_VULKAN)
|
if (DAWN_ENABLE_VULKAN)
|
||||||
target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_VULKAN")
|
target_compile_definitions(dawn_internal_config INTERFACE "DAWN_ENABLE_BACKEND_VULKAN")
|
||||||
endif()
|
endif()
|
||||||
|
if (DAWN_USE_WAYLAND)
|
||||||
|
target_compile_definitions(dawn_internal_config INTERFACE "DAWN_USE_WAYLAND")
|
||||||
|
endif()
|
||||||
if (DAWN_USE_X11)
|
if (DAWN_USE_X11)
|
||||||
target_compile_definitions(dawn_internal_config INTERFACE "DAWN_USE_X11")
|
target_compile_definitions(dawn_internal_config INTERFACE "DAWN_USE_X11")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -19,10 +19,12 @@ if (build_with_chromium) {
|
||||||
import("//build/config/sanitizers/sanitizers.gni")
|
import("//build/config/sanitizers/sanitizers.gni")
|
||||||
|
|
||||||
dawn_use_x11 = ozone_platform_x11
|
dawn_use_x11 = ozone_platform_x11
|
||||||
|
dawn_use_wayland = false
|
||||||
} else {
|
} else {
|
||||||
declare_args() {
|
declare_args() {
|
||||||
# Whether Dawn should enable X11 support.
|
# Whether Dawn should enable X11 support.
|
||||||
dawn_use_x11 = is_linux && !is_chromeos
|
dawn_use_x11 = is_linux && !is_chromeos
|
||||||
|
dawn_use_wayland = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,9 @@ config("internal_config") {
|
||||||
defines += [ "DAWN_ENABLE_BACKEND_VULKAN" ]
|
defines += [ "DAWN_ENABLE_BACKEND_VULKAN" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dawn_use_wayland) {
|
||||||
|
defines += [ "DAWN_USE_WAYLAND" ]
|
||||||
|
}
|
||||||
if (dawn_use_x11) {
|
if (dawn_use_x11) {
|
||||||
defines += [ "DAWN_USE_X11" ]
|
defines += [ "DAWN_USE_X11" ]
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,6 +153,12 @@ HandleType* AsVkArray(detail::VkHandle<Tag, HandleType>* handle) {
|
||||||
#include "dawn/common/xlib_with_undefs.h"
|
#include "dawn/common/xlib_with_undefs.h"
|
||||||
#endif // defined(DAWN_USE_X11)
|
#endif // defined(DAWN_USE_X11)
|
||||||
|
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
#ifndef VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
|
#define VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
|
#endif
|
||||||
|
#endif // defined(DAWN_USE_WAYLAND)
|
||||||
|
|
||||||
#if defined(DAWN_ENABLE_BACKEND_METAL)
|
#if defined(DAWN_ENABLE_BACKEND_METAL)
|
||||||
#ifndef VK_USE_PLATFORM_METAL_EXT
|
#ifndef VK_USE_PLATFORM_METAL_EXT
|
||||||
#define VK_USE_PLATFORM_METAL_EXT
|
#define VK_USE_PLATFORM_METAL_EXT
|
||||||
|
|
|
@ -41,6 +41,9 @@ absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConv
|
||||||
case Surface::Type::MetalLayer:
|
case Surface::Type::MetalLayer:
|
||||||
s->Append("MetalLayer");
|
s->Append("MetalLayer");
|
||||||
break;
|
break;
|
||||||
|
case Surface::Type::WaylandSurface:
|
||||||
|
s->Append("WaylandSurface");
|
||||||
|
break;
|
||||||
case Surface::Type::WindowsHWND:
|
case Surface::Type::WindowsHWND:
|
||||||
s->Append("WindowsHWND");
|
s->Append("WindowsHWND");
|
||||||
break;
|
break;
|
||||||
|
@ -128,6 +131,18 @@ MaybeError ValidateSurfaceDescriptor(const InstanceBase* instance,
|
||||||
}
|
}
|
||||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||||
|
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
const SurfaceDescriptorFromWaylandSurface* waylandDesc = nullptr;
|
||||||
|
FindInChain(descriptor->nextInChain, &waylandDesc);
|
||||||
|
if (waylandDesc) {
|
||||||
|
// Unfortunately we can't check the validity of wayland objects. Only that they
|
||||||
|
// aren't nullptr.
|
||||||
|
DAWN_INVALID_IF(waylandDesc->display == nullptr, "Wayland display is nullptr.");
|
||||||
|
DAWN_INVALID_IF(waylandDesc->surface == nullptr, "Wayland surface is nullptr.");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
#endif // defined(DAWN_USE_X11)
|
||||||
|
|
||||||
#if defined(DAWN_USE_X11)
|
#if defined(DAWN_USE_X11)
|
||||||
const SurfaceDescriptorFromXlibWindow* xDesc = nullptr;
|
const SurfaceDescriptorFromXlibWindow* xDesc = nullptr;
|
||||||
FindInChain(descriptor->nextInChain, &xDesc);
|
FindInChain(descriptor->nextInChain, &xDesc);
|
||||||
|
@ -165,6 +180,7 @@ Surface::Surface(InstanceBase* instance, const SurfaceDescriptor* descriptor)
|
||||||
const SurfaceDescriptorFromWindowsHWND* hwndDesc = nullptr;
|
const SurfaceDescriptorFromWindowsHWND* hwndDesc = nullptr;
|
||||||
const SurfaceDescriptorFromWindowsCoreWindow* coreWindowDesc = nullptr;
|
const SurfaceDescriptorFromWindowsCoreWindow* coreWindowDesc = nullptr;
|
||||||
const SurfaceDescriptorFromWindowsSwapChainPanel* swapChainPanelDesc = nullptr;
|
const SurfaceDescriptorFromWindowsSwapChainPanel* swapChainPanelDesc = nullptr;
|
||||||
|
const SurfaceDescriptorFromWaylandSurface* waylandDesc = nullptr;
|
||||||
const SurfaceDescriptorFromXlibWindow* xDesc = nullptr;
|
const SurfaceDescriptorFromXlibWindow* xDesc = nullptr;
|
||||||
FindInChain(descriptor->nextInChain, &androidDesc);
|
FindInChain(descriptor->nextInChain, &androidDesc);
|
||||||
FindInChain(descriptor->nextInChain, &metalDesc);
|
FindInChain(descriptor->nextInChain, &metalDesc);
|
||||||
|
@ -178,6 +194,10 @@ Surface::Surface(InstanceBase* instance, const SurfaceDescriptor* descriptor)
|
||||||
} else if (androidDesc) {
|
} else if (androidDesc) {
|
||||||
mType = Type::AndroidWindow;
|
mType = Type::AndroidWindow;
|
||||||
mAndroidNativeWindow = androidDesc->window;
|
mAndroidNativeWindow = androidDesc->window;
|
||||||
|
} else if (waylandDesc) {
|
||||||
|
mType = Type::WaylandSurface;
|
||||||
|
mWaylandDisplay = waylandDesc->display;
|
||||||
|
mWaylandSurface = waylandDesc->surface;
|
||||||
} else if (hwndDesc) {
|
} else if (hwndDesc) {
|
||||||
mType = Type::WindowsHWND;
|
mType = Type::WindowsHWND;
|
||||||
mHInstance = hwndDesc->hinstance;
|
mHInstance = hwndDesc->hinstance;
|
||||||
|
@ -239,6 +259,16 @@ void* Surface::GetMetalLayer() const {
|
||||||
return mMetalLayer;
|
return mMetalLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* Surface::GetWaylandDisplay() const {
|
||||||
|
ASSERT(mType == Type::WaylandSurface);
|
||||||
|
return mWaylandDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* Surface::GetWaylandSurface() const {
|
||||||
|
ASSERT(mType == Type::WaylandSurface);
|
||||||
|
return mWaylandSurface;
|
||||||
|
}
|
||||||
|
|
||||||
void* Surface::GetHInstance() const {
|
void* Surface::GetHInstance() const {
|
||||||
ASSERT(!IsError());
|
ASSERT(!IsError());
|
||||||
ASSERT(mType == Type::WindowsHWND);
|
ASSERT(mType == Type::WindowsHWND);
|
||||||
|
|
|
@ -55,6 +55,7 @@ class Surface final : public ErrorMonad {
|
||||||
enum class Type {
|
enum class Type {
|
||||||
AndroidWindow,
|
AndroidWindow,
|
||||||
MetalLayer,
|
MetalLayer,
|
||||||
|
WaylandSurface,
|
||||||
WindowsHWND,
|
WindowsHWND,
|
||||||
WindowsCoreWindow,
|
WindowsCoreWindow,
|
||||||
WindowsSwapChainPanel,
|
WindowsSwapChainPanel,
|
||||||
|
@ -69,6 +70,10 @@ class Surface final : public ErrorMonad {
|
||||||
// Valid to call if the type is Android
|
// Valid to call if the type is Android
|
||||||
void* GetAndroidNativeWindow() const;
|
void* GetAndroidNativeWindow() const;
|
||||||
|
|
||||||
|
// Valid to call if the type is WaylandSurface
|
||||||
|
void* GetWaylandDisplay() const;
|
||||||
|
void* GetWaylandSurface() const;
|
||||||
|
|
||||||
// Valid to call if the type is WindowsHWND
|
// Valid to call if the type is WindowsHWND
|
||||||
void* GetHInstance() const;
|
void* GetHInstance() const;
|
||||||
void* GetHWND() const;
|
void* GetHWND() const;
|
||||||
|
@ -99,6 +104,10 @@ class Surface final : public ErrorMonad {
|
||||||
// ANativeWindow
|
// ANativeWindow
|
||||||
void* mAndroidNativeWindow = nullptr;
|
void* mAndroidNativeWindow = nullptr;
|
||||||
|
|
||||||
|
// Wayland
|
||||||
|
void* mWaylandDisplay = nullptr;
|
||||||
|
void* mWaylandSurface = nullptr;
|
||||||
|
|
||||||
// WindowsHwnd
|
// WindowsHwnd
|
||||||
void* mHInstance = nullptr;
|
void* mHInstance = nullptr;
|
||||||
void* mHWND = nullptr;
|
void* mHWND = nullptr;
|
||||||
|
|
|
@ -158,6 +158,26 @@ ResultOrError<VkSurfaceKHR> CreateVulkanSurface(Adapter* adapter, Surface* surfa
|
||||||
|
|
||||||
#endif // defined(DAWN_PLATFORM_ANDROID)
|
#endif // defined(DAWN_PLATFORM_ANDROID)
|
||||||
|
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
case Surface::Type::WaylandSurface: {
|
||||||
|
if (info.HasExt(InstanceExt::XlibSurface)) {
|
||||||
|
VkWaylandSurfaceCreateInfoKHR createInfo;
|
||||||
|
createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||||
|
createInfo.pNext = nullptr;
|
||||||
|
createInfo.flags = 0;
|
||||||
|
createInfo.display = static_cast<struct wl_display*>(surface->GetWaylandDisplay());
|
||||||
|
createInfo.surface = static_cast<struct wl_surface*>(surface->GetWaylandSurface());
|
||||||
|
|
||||||
|
VkSurfaceKHR vkSurface = VK_NULL_HANDLE;
|
||||||
|
DAWN_TRY(CheckVkSuccess(
|
||||||
|
fn.CreateWaylandSurfaceKHR(instance, &createInfo, nullptr, &*vkSurface),
|
||||||
|
"CreateWaylandSurface"));
|
||||||
|
return vkSurface;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif // defined(DAWN_USE_WAYLAND)
|
||||||
|
|
||||||
#if defined(DAWN_USE_X11)
|
#if defined(DAWN_USE_X11)
|
||||||
case Surface::Type::XlibWindow: {
|
case Surface::Type::XlibWindow: {
|
||||||
if (info.HasExt(InstanceExt::XlibSurface)) {
|
if (info.HasExt(InstanceExt::XlibSurface)) {
|
||||||
|
|
|
@ -188,6 +188,13 @@ MaybeError VulkanFunctions::LoadInstanceProcs(VkInstance instance,
|
||||||
}
|
}
|
||||||
#endif // defined(DAWN_ENABLE_BACKEND_METAL)
|
#endif // defined(DAWN_ENABLE_BACKEND_METAL)
|
||||||
|
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
if (globalInfo.HasExt(InstanceExt::WaylandSurface)) {
|
||||||
|
GET_INSTANCE_PROC(CreateWaylandSurfaceKHR);
|
||||||
|
GET_INSTANCE_PROC(GetPhysicalDeviceWaylandPresentationSupportKHR);
|
||||||
|
}
|
||||||
|
#endif // defined(DAWN_USE_WAYLAND)
|
||||||
|
|
||||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||||
if (globalInfo.HasExt(InstanceExt::Win32Surface)) {
|
if (globalInfo.HasExt(InstanceExt::Win32Surface)) {
|
||||||
GET_INSTANCE_PROC(CreateWin32SurfaceKHR);
|
GET_INSTANCE_PROC(CreateWin32SurfaceKHR);
|
||||||
|
|
|
@ -149,6 +149,13 @@ struct VulkanFunctions {
|
||||||
VkFn<PFN_vkCreateMetalSurfaceEXT> CreateMetalSurfaceEXT = nullptr;
|
VkFn<PFN_vkCreateMetalSurfaceEXT> CreateMetalSurfaceEXT = nullptr;
|
||||||
#endif // defined(DAWN_ENABLE_BACKEND_METAL)
|
#endif // defined(DAWN_ENABLE_BACKEND_METAL)
|
||||||
|
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
// KHR_wayland_surface
|
||||||
|
PFN_vkCreateWaylandSurfaceKHR CreateWaylandSurfaceKHR = nullptr;
|
||||||
|
PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
|
||||||
|
GetPhysicalDeviceWaylandPresentationSupportKHR = nullptr;
|
||||||
|
#endif // defined(DAWN_USE_WAYLAND)
|
||||||
|
|
||||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||||
// KHR_win32_surface
|
// KHR_win32_surface
|
||||||
VkFn<PFN_vkCreateWin32SurfaceKHR> CreateWin32SurfaceKHR = nullptr;
|
VkFn<PFN_vkCreateWin32SurfaceKHR> CreateWin32SurfaceKHR = nullptr;
|
||||||
|
|
|
@ -21,9 +21,13 @@
|
||||||
|
|
||||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||||
#define GLFW_EXPOSE_NATIVE_WIN32
|
#define GLFW_EXPOSE_NATIVE_WIN32
|
||||||
#elif defined(DAWN_USE_X11)
|
#endif
|
||||||
|
#if defined(DAWN_USE_X11)
|
||||||
#define GLFW_EXPOSE_NATIVE_X11
|
#define GLFW_EXPOSE_NATIVE_X11
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
#define GLFW_EXPOSE_NATIVE_WAYLAND
|
||||||
|
#endif
|
||||||
#include "GLFW/glfw3native.h"
|
#include "GLFW/glfw3native.h"
|
||||||
|
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
@ -59,28 +63,45 @@ wgpu::Surface CreateSurfaceForWindow(const wgpu::Instance& instance, GLFWwindow*
|
||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
// SetupWindowAndGetSurfaceDescriptorCocoa defined in GLFWUtils_metal.mm
|
||||||
|
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptorCocoa(GLFWwindow* window);
|
||||||
|
|
||||||
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptor(GLFWwindow* window) {
|
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptor(GLFWwindow* window) {
|
||||||
|
switch (glfwGetPlatform()) {
|
||||||
|
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||||
|
case GLFW_PLATFORM_WIN32: {
|
||||||
std::unique_ptr<wgpu::SurfaceDescriptorFromWindowsHWND> desc =
|
std::unique_ptr<wgpu::SurfaceDescriptorFromWindowsHWND> desc =
|
||||||
std::make_unique<wgpu::SurfaceDescriptorFromWindowsHWND>();
|
std::make_unique<wgpu::SurfaceDescriptorFromWindowsHWND>();
|
||||||
desc->hwnd = glfwGetWin32Window(window);
|
desc->hwnd = glfwGetWin32Window(window);
|
||||||
desc->hinstance = GetModuleHandle(nullptr);
|
desc->hinstance = GetModuleHandle(nullptr);
|
||||||
return std::move(desc);
|
return std::move(desc);
|
||||||
}
|
}
|
||||||
#elif defined(DAWN_USE_X11)
|
#endif
|
||||||
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptor(GLFWwindow* window) {
|
#if defined(DAWN_ENABLE_BACKEND_METAL)
|
||||||
|
case GLFW_PLATFORM_COCOA:
|
||||||
|
return SetupWindowAndGetSurfaceDescriptorCocoa(window);
|
||||||
|
#endif
|
||||||
|
#if defined(DAWN_USE_WAYLAND)
|
||||||
|
case GLFW_PLATFORM_WAYLAND: {
|
||||||
|
std::unique_ptr<wgpu::SurfaceDescriptorFromWaylandSurface> desc =
|
||||||
|
std::make_unique<wgpu::SurfaceDescriptorFromWaylandSurface>();
|
||||||
|
desc->display = glfwGetWaylandDisplay();
|
||||||
|
desc->surface = glfwGetWaylandWindow(window);
|
||||||
|
return std::move(desc);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(DAWN_USE_X11)
|
||||||
|
case GLFW_PLATFORM_X11: {
|
||||||
std::unique_ptr<wgpu::SurfaceDescriptorFromXlibWindow> desc =
|
std::unique_ptr<wgpu::SurfaceDescriptorFromXlibWindow> desc =
|
||||||
std::make_unique<wgpu::SurfaceDescriptorFromXlibWindow>();
|
std::make_unique<wgpu::SurfaceDescriptorFromXlibWindow>();
|
||||||
desc->display = glfwGetX11Display();
|
desc->display = glfwGetX11Display();
|
||||||
desc->window = glfwGetX11Window(window);
|
desc->window = glfwGetX11Window(window);
|
||||||
return std::move(desc);
|
return std::move(desc);
|
||||||
}
|
}
|
||||||
#elif defined(DAWN_ENABLE_BACKEND_METAL)
|
#endif
|
||||||
// SetupWindowAndGetSurfaceDescriptor defined in GLFWUtils_metal.mm
|
default:
|
||||||
#else
|
|
||||||
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptor(GLFWwindow*) {
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
|
|
||||||
} // namespace utils
|
} // namespace utils
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
|
||||||
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptor(GLFWwindow* window) {
|
std::unique_ptr<wgpu::ChainedStruct> SetupWindowAndGetSurfaceDescriptorCocoa(GLFWwindow* window) {
|
||||||
if (@available(macOS 10.11, *)) {
|
if (@available(macOS 10.11, *)) {
|
||||||
NSWindow* nsWindow = glfwGetCocoaWindow(window);
|
NSWindow* nsWindow = glfwGetCocoaWindow(window);
|
||||||
NSView* view = [nsWindow contentView];
|
NSView* view = [nsWindow contentView];
|
||||||
|
|
Loading…
Reference in New Issue