diff --git a/include/zwidget/window/cocoanativehandle.h b/include/zwidget/window/cocoanativehandle.h index 7d85013..61d700f 100644 --- a/include/zwidget/window/cocoanativehandle.h +++ b/include/zwidget/window/cocoanativehandle.h @@ -5,9 +5,14 @@ @class NSView; @class CAMetalLayer; #else -class NSWindow; -class NSView; -class CAMetalLayer; +// Forward declarations for C++ - use opaque pointers to avoid conflicts with Metal headers +typedef struct NSWindow_t* NSWindow; +typedef struct NSView_t* NSView; + +// CAMetalLayer may already be defined by vulkan_metal.h, so guard against redefinition +#ifndef VK_EXT_metal_surface +typedef struct CAMetalLayer_t* CAMetalLayer; +#endif #endif @@ -15,5 +20,7 @@ struct CocoaNativeHandle { NSWindow* nsWindow = nullptr; NSView* nsView = nullptr; - CAMetalLayer* metalLayer = nullptr; + + // Use void* to avoid typedef conflicts when CAMetalLayer is defined differently by Vulkan headers + void* metalLayer = nullptr; }; \ No newline at end of file diff --git a/src/window/cocoa/cocoa_display_window.h b/src/window/cocoa/cocoa_display_window.h index 770964a..dc1d726 100644 --- a/src/window/cocoa/cocoa_display_window.h +++ b/src/window/cocoa/cocoa_display_window.h @@ -6,12 +6,6 @@ #include #include -#ifdef HAVE_VULKAN -struct VkInstance_T; -typedef struct VkInstance_T* VkInstance; -#endif - - struct CocoaDisplayWindowImpl; class CocoaDisplayWindow : public DisplayWindow diff --git a/src/window/cocoa/cocoa_display_window.mm b/src/window/cocoa/cocoa_display_window.mm index e54f3e0..ac91852 100644 --- a/src/window/cocoa/cocoa_display_window.mm +++ b/src/window/cocoa/cocoa_display_window.mm @@ -5,10 +5,42 @@ #include #include #include -#ifdef HAVE_VULKAN -#define VK_USE_PLATFORM_METAL_EXT -#include -#include +// Minimal Vulkan type definitions (no headers required) +#ifndef VK_VERSION_1_0 + +#define VKAPI_CALL +#define VKAPI_PTR VKAPI_CALL + +typedef uint32_t VkFlags; +typedef enum VkStructureType { + VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000, + VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkStructureType; +typedef enum VkResult { + VK_SUCCESS = 0, + VK_RESULT_MAX_ENUM = 0x7FFFFFFF +} VkResult; +typedef struct VkAllocationCallbacks VkAllocationCallbacks; + +typedef void (VKAPI_PTR* PFN_vkVoidFunction)(void); +typedef PFN_vkVoidFunction(VKAPI_PTR* PFN_vkGetInstanceProcAddr)(VkInstance instance, const char* pName); + +#ifndef VK_EXT_metal_surface +typedef VkFlags VkMetalSurfaceCreateFlagsEXT; +typedef struct VkMetalSurfaceCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkMetalSurfaceCreateFlagsEXT flags; + const void* pLayer; // CAMetalLayer* +} VkMetalSurfaceCreateInfoEXT; + +typedef VkResult(VKAPI_PTR* PFN_vkCreateMetalSurfaceEXT)( + VkInstance instance, + const VkMetalSurfaceCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + #endif #include #include "zwidget/window/cocoanativehandle.h" @@ -1053,7 +1085,7 @@ - (id)initWithImpl:(CocoaDisplayWindowImpl*)d handle->nsWindow = impl->window; handle->nsView = [impl->window contentView]; #ifdef HAVE_METAL - handle->metalLayer = impl->metalLayer; + handle->metalLayer = (__bridge void*)impl->metalLayer; #endif } return handle; @@ -1063,15 +1095,12 @@ - (id)initWithImpl:(CocoaDisplayWindowImpl*)d std::vector CocoaDisplayWindow::GetVulkanInstanceExtensions() { std::vector extensions; -#ifdef HAVE_VULKAN extensions.push_back("VK_KHR_surface"); extensions.push_back("VK_EXT_metal_surface"); -#endif return extensions; } VkSurfaceKHR CocoaDisplayWindow::CreateVulkanSurface(VkInstance instance) { -#ifdef HAVE_VULKAN if (impl->window && impl->metalLayer) { // Dynamically load vkCreateMetalSurfaceEXT @@ -1089,7 +1118,7 @@ - (id)initWithImpl:(CocoaDisplayWindowImpl*)d { VkMetalSurfaceCreateInfoEXT surfaceInfo = {}; surfaceInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; - surfaceInfo.pLayer = impl->metalLayer; + surfaceInfo.pLayer = (__bridge void*)impl->metalLayer; VkSurfaceKHR surface = nullptr; VkResult err = vkCreateMetalSurfaceEXT(instance, &surfaceInfo, nullptr, &surface); @@ -1099,9 +1128,6 @@ - (id)initWithImpl:(CocoaDisplayWindowImpl*)d } } throw std::runtime_error("Could not create vulkan surface: no metal layer"); -#else - throw std::runtime_error("Vulkan support not compiled into zwidget"); -#endif } void* CocoaDisplayWindow::GetMetalDevice() diff --git a/src/window/sdl2/sdl2_display_window.cpp b/src/window/sdl2/sdl2_display_window.cpp index 35276ec..03c192f 100644 --- a/src/window/sdl2/sdl2_display_window.cpp +++ b/src/window/sdl2/sdl2_display_window.cpp @@ -1,5 +1,7 @@ #include "sdl2_display_window.h" #include +#include +#include #include Uint32 SDL2DisplayWindow::PaintEventNumber = 0xffffffff;