9 Commits

Author SHA1 Message Date
0verLighT
59b3a297f9 chore: rm wrap_mode force-fallback
sdl2 warp should be used only if the system does not have sdl2 dependency
2026-03-24 23:14:42 +01:00
790e24ebdb Update meson.build 2026-03-24 23:14:42 +01:00
0verLighT
3a2563a7f5 chore: update meson.build 2026-03-24 23:14:42 +01:00
cf491fc56d fix 2026-03-23 21:45:36 +01:00
492365f6dd swithing to manual surface management 2026-03-23 21:45:36 +01:00
564942ad35 fix 2026-03-23 21:45:36 +01:00
kbJeff-8
2751206578 [BOT] update dependencies 2026-03-23 21:45:36 +01:00
kbJeff-8
002c35ccdb [BOT] update dependencies 2026-03-23 21:45:36 +01:00
kbJeff-8
36e63bbbe7 [BOT] update dependencies 2026-03-08 11:42:50 +01:00
11 changed files with 352 additions and 49 deletions

View File

@@ -1,12 +1,15 @@
project('MacroLibX', project('MacroLibX',
['c', 'cpp'], ['c', 'cpp'],
version : '2.2.4', version : '2.3.0',
license : 'MIT', license : 'MIT',
meson_version : '>= 1.9.0', meson_version : '>= 0.63.0',
default_options : ['warning_level=2', 'optimization=3', 'cpp_std=c++20']) default_options : [
'warning_level=2',
'optimization=3',
'cpp_std=c++20',
]
)
add_project_arguments('-Wno-error=', language : 'c')
add_project_arguments('-fPIC', language : 'c')
add_project_arguments('-DSDL_MAIN_HANDLED', language : 'c') add_project_arguments('-DSDL_MAIN_HANDLED', language : 'c')
if get_option('graphics_memory_dump') if get_option('graphics_memory_dump')
@@ -25,15 +28,14 @@ if get_option('disable_all_safeties')
add_project_arguments('-DDISABLE_ALL_SAFETIES', language : 'c') add_project_arguments('-DDISABLE_ALL_SAFETIES', language : 'c')
endif endif
includes_directories = [ includes_directories = include_directories(
include_directories('includes'), 'includes',
include_directories('runtime/Includes'), 'runtime/Includes',
include_directories('runtime/Sources'), 'runtime/Sources',
include_directories('third_party'), 'third_party',
] )
sources = [ sources = files(
files(
'runtime/Sources/Core/Application.cpp', 'runtime/Sources/Core/Application.cpp',
'runtime/Sources/Core/Bridge.cpp', 'runtime/Sources/Core/Bridge.cpp',
'runtime/Sources/Core/EventBus.cpp', 'runtime/Sources/Core/EventBus.cpp',
@@ -66,9 +68,8 @@ sources = [
'runtime/Sources/Renderer/RenderCore.cpp', 'runtime/Sources/Renderer/RenderCore.cpp',
'runtime/Sources/Renderer/Renderer.cpp', 'runtime/Sources/Renderer/Renderer.cpp',
'runtime/Sources/Renderer/SceneRenderer.cpp', 'runtime/Sources/Renderer/SceneRenderer.cpp',
'runtime/Sources/Renderer/Swapchain.cpp' 'runtime/Sources/Renderer/Swapchain.cpp',
) )
]
mlx_headers = [ mlx_headers = [
'includes/mlx.h', 'includes/mlx.h',
@@ -78,9 +79,7 @@ mlx_headers = [
install_headers(mlx_headers) install_headers(mlx_headers)
deps = [ deps = dependency('sdl2')
dependency('sdl2'),
]
libmlx = library('mlx', libmlx = library('mlx',
sources, sources,

View File

@@ -47,7 +47,6 @@ namespace mlx
std::unordered_map<std::string, std::pair<std::size_t, ProfileResult>> m_profile_data; std::unordered_map<std::string, std::pair<std::size_t, ProfileResult>> m_profile_data;
std::ofstream m_output_stream; std::ofstream m_output_stream;
std::mutex m_mutex;
bool m_runtime_session_began = false; bool m_runtime_session_began = false;
}; };

View File

@@ -20,7 +20,6 @@ namespace mlx
void SetInputBinding(std::function<void(SDL_Event*)> functor); void SetInputBinding(std::function<void(SDL_Event*)> functor);
VkSurfaceKHR CreateVulkanSurface(Handle window, VkInstance instance) const noexcept; VkSurfaceKHR CreateVulkanSurface(Handle window, VkInstance instance) const noexcept;
std::vector<const char*> GetRequiredVulkanInstanceExtentions(Handle window) const noexcept;
Vec2ui GetVulkanDrawableSize(Handle window) const noexcept; Vec2ui GetVulkanDrawableSize(Handle window) const noexcept;
void MoveMouseOnWindow(Handle window, int x, int y) const noexcept; void MoveMouseOnWindow(Handle window, int x, int y) const noexcept;
void GetScreenSizeWindowIsOn(Handle window, int* x, int* y) const noexcept; void GetScreenSizeWindowIsOn(Handle window, int* x, int* y) const noexcept;

View File

@@ -35,7 +35,6 @@ namespace mlx
MLX_FORCEINLINE void GetSize(int* x, int* y) { *x = GetWidth(); *y = GetHeight(); } MLX_FORCEINLINE void GetSize(int* x, int* y) { *x = GetWidth(); *y = GetHeight(); }
MLX_FORCEINLINE VkSurfaceKHR CreateVulkanSurface(VkInstance instance) const noexcept { return SDLManager::Get().CreateVulkanSurface(p_window, instance); } MLX_FORCEINLINE VkSurfaceKHR CreateVulkanSurface(VkInstance instance) const noexcept { return SDLManager::Get().CreateVulkanSurface(p_window, instance); }
MLX_FORCEINLINE std::vector<const char*> GetRequiredVulkanInstanceExtentions() const noexcept { return SDLManager::Get().GetRequiredVulkanInstanceExtentions(p_window); }
MLX_FORCEINLINE Vec2ui GetVulkanDrawableSize() const noexcept { return SDLManager::Get().GetVulkanDrawableSize(p_window); } MLX_FORCEINLINE Vec2ui GetVulkanDrawableSize() const noexcept { return SDLManager::Get().GetVulkanDrawableSize(p_window); }
[[nodiscard]] inline Handle GetRawHandle() const noexcept { return p_window; } [[nodiscard]] inline Handle GetRawHandle() const noexcept { return p_window; }

View File

@@ -25,12 +25,12 @@
#error Failed to find SDL2 headers #error Failed to find SDL2 headers
#endif #endif
#if __has_include(<SDL2/SDL_vulkan.h>) #if __has_include(<SDL2/SDL_syswm.h>)
#include <SDL2/SDL_vulkan.h> #include <SDL2/SDL_syswm.h>
#elif __has_include(<SDL_vulkan.h>) #elif __has_include(<SDL_syswm.h>)
#include <SDL_vulkan.h> #include <SDL_syswm.h>
#else #else
#error Failed to find SDL2 Vulkan headers #error Failed to find SDL2 SysWMinfo
#endif #endif
#include <functional> #include <functional>

View File

@@ -123,5 +123,41 @@
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR) MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR) MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR) MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR)
#ifdef VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_KHR_android_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateAndroidSurfaceKHR)
#endif
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
#ifdef VK_KHR_xcb_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateXcbSurfaceKHR)
#endif
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
#ifdef VK_KHR_xlib_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateXlibSurfaceKHR)
#endif
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
#ifdef VK_KHR_wayland_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateWaylandSurfaceKHR)
#endif
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_KHR_win32_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateWin32SurfaceKHR)
#endif
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
#ifdef VK_EXT_metal_surface
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateMetalSurfaceEXT)
#endif
#endif
#endif #endif
#endif #endif

View File

@@ -8,7 +8,6 @@ namespace mlx
void Profiler::BeginRuntimeSession() void Profiler::BeginRuntimeSession()
{ {
std::lock_guard lock(m_mutex);
if(m_runtime_session_began) if(m_runtime_session_began)
return; return;
m_output_stream.open("./runtime_profile.mlx.json", std::ofstream::out | std::ofstream::trunc); m_output_stream.open("./runtime_profile.mlx.json", std::ofstream::out | std::ofstream::trunc);
@@ -22,7 +21,6 @@ namespace mlx
void Profiler::AppendProfileData(ProfileResult&& result) void Profiler::AppendProfileData(ProfileResult&& result)
{ {
std::lock_guard lock(m_mutex);
auto it = m_profile_data.find(result.name); auto it = m_profile_data.find(result.name);
if(it != m_profile_data.end()) if(it != m_profile_data.end())
{ {
@@ -49,7 +47,6 @@ namespace mlx
void Profiler::EndRuntimeSession() void Profiler::EndRuntimeSession()
{ {
std::lock_guard lock(m_mutex);
if(!m_runtime_session_began) if(!m_runtime_session_began)
return; return;
for(auto& [_, pair] : m_profile_data) for(auto& [_, pair] : m_profile_data)

View File

@@ -43,7 +43,7 @@ namespace mlx
Internal::WindowInfos* infos = new Internal::WindowInfos; Internal::WindowInfos* infos = new Internal::WindowInfos;
Verify(infos != nullptr, "SDL: window allocation failed"); Verify(infos != nullptr, "SDL: window allocation failed");
std::uint32_t flags = SDL_WINDOW_VULKAN; std::uint32_t flags = 0;
if(hidden) if(hidden)
flags |= SDL_WINDOW_HIDDEN; flags |= SDL_WINDOW_HIDDEN;
else else
@@ -88,28 +88,38 @@ namespace mlx
VkSurfaceKHR SDLManager::CreateVulkanSurface(Handle window, VkInstance instance) const noexcept VkSurfaceKHR SDLManager::CreateVulkanSurface(Handle window, VkInstance instance) const noexcept
{ {
VkSurfaceKHR surface; SDL_SysWMinfo info;
if(!SDL_Vulkan_CreateSurface(static_cast<Internal::WindowInfos*>(window)->window, instance, &surface)) SDL_VERSION(&info.version);
FatalError("SDL: could not create a Vulkan surface; %", SDL_GetError()); if(SDL_GetWindowWMInfo(static_cast<Internal::WindowInfos*>(window)->window, &info) != SDL_TRUE)
return surface; FatalError("SDL Manager: cannot retrieve window informations");
}
std::vector<const char*> SDLManager::GetRequiredVulkanInstanceExtentions(Handle window) const noexcept switch(info.subsystem)
{ {
std::uint32_t count; #ifdef SDL_VIDEO_DRIVER_WINDOWS
if(!SDL_Vulkan_GetInstanceExtensions(static_cast<Internal::WindowInfos*>(window)->window, &count, nullptr)) case SDL_SYSWM_WINDOWS: return kvfCreateSurfaceKHR(instance, KVF_SURFACE_WINDOWS, static_cast<void*>(info.info.win.hinstance), static_cast<void*>(info.info.win.window));
FatalError("SDL Manager: could not retrieve Vulkan instance extensions"); #endif
std::vector<const char*> extensions(count); #ifdef SDL_VIDEO_DRIVER_X11
if(!SDL_Vulkan_GetInstanceExtensions(static_cast<Internal::WindowInfos*>(window)->window, &count, extensions.data())) case SDL_SYSWM_X11: return kvfCreateSurfaceKHR(instance, KVF_SURFACE_XLIB, static_cast<void*>(info.info.x11.display), static_cast<void*>(&info.info.x11.window));
FatalError("SDL Manager: could not retrieve Vulkan instance extensions"); #endif
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef SDL_VIDEO_DRIVER_COCOA
return extensions; case SDL_SYSWM_COCOA: FatalError("SDL Manager: Vulkan surfaces over Metal are not supported yet. Please fill an issue here https://github.com/seekrs/MacroLibX/issues/new");
#endif
#ifdef SDL_VIDEO_DRIVER_WAYLAND
case SDL_SYSWM_WAYLAND: return kvfCreateSurfaceKHR(instance, KVF_SURFACE_WAYLAND, static_cast<void*>(info.info.wl.display), static_cast<void*>(info.info.wl.surface));
#endif
#ifdef SDL_VIDEO_DRIVER_ANDROID
case SDL_SYSWM_ANDROID: return kvfCreateSurfaceKHR(instance, KVF_SURFACE_ANDROID, nullptr, static_cast<void*>(info.info.android.window));
#endif
default : FatalError("SDL Manager: unsupported windowing system"); break;
}
return VK_NULL_HANDLE;
} }
Vec2ui SDLManager::GetVulkanDrawableSize(Handle window) const noexcept Vec2ui SDLManager::GetVulkanDrawableSize(Handle window) const noexcept
{ {
Vec2i extent; Vec2i extent;
SDL_Vulkan_GetDrawableSize(static_cast<Internal::WindowInfos*>(window)->window, &extent.x, &extent.y); SDL_GetWindowSizeInPixels(static_cast<Internal::WindowInfos*>(window)->window, &extent.x, &extent.y);
return Vec2ui{ extent }; return Vec2ui{ extent };
} }
@@ -266,6 +276,7 @@ namespace mlx
case SDL_WINDOWEVENT_LEAVE: functor(MLX_WINDOW_EVENT, id, 6); break; case SDL_WINDOWEVENT_LEAVE: functor(MLX_WINDOW_EVENT, id, 6); break;
case SDL_WINDOWEVENT_FOCUS_LOST: functor(MLX_WINDOW_EVENT, id, 7); break; case SDL_WINDOWEVENT_FOCUS_LOST: functor(MLX_WINDOW_EVENT, id, 7); break;
case SDL_WINDOWEVENT_SIZE_CHANGED: functor(MLX_WINDOW_EVENT, id, 8); break; case SDL_WINDOWEVENT_SIZE_CHANGED: functor(MLX_WINDOW_EVENT, id, 8); break;
case SDL_WINDOWEVENT_RESTORED: functor(MLX_WINDOW_EVENT, id, 11); break;
default : break; default : break;
} }
@@ -284,6 +295,7 @@ namespace mlx
{ {
if(m_drop_sdl_responsability) if(m_drop_sdl_responsability)
return; return;
SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS); SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS);
SDL_Quit(); SDL_Quit();
s_instance = nullptr; s_instance = nullptr;

View File

@@ -127,6 +127,9 @@ namespace mlx
void GraphicPipeline::Destroy() noexcept void GraphicPipeline::Destroy() noexcept
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
if(m_pipeline == VK_NULL_HANDLE)
return;
p_vertex_shader.reset(); p_vertex_shader.reset();
p_fragment_shader.reset(); p_fragment_shader.reset();
for(auto fb : m_framebuffers) for(auto fb : m_framebuffers)

View File

@@ -100,8 +100,25 @@ namespace mlx
info.width = 1; info.width = 1;
info.height = 1; info.height = 1;
window = std::make_unique<Window>(&info, true); window = std::make_unique<Window>(&info, true);
instance_extensions = window->GetRequiredVulkanInstanceExtentions(); instance_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
#ifdef MLX_PLAT_MACOS #ifdef VK_USE_PLATFORM_XCB_KHR
instance_extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
instance_extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
instance_extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
instance_extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
instance_extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
#endif #endif
} }
@@ -185,6 +202,41 @@ namespace mlx
MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR); MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR);
MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR); MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR);
MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR); MLX_LOAD_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR);
#ifdef VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_KHR_android_surface
MLX_LOAD_FUNCTION(vkCreateAndroidSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
#ifdef VK_KHR_xcb_surface
MLX_LOAD_FUNCTION(vkCreateXcbSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
#ifdef VK_KHR_xlib_surface
MLX_LOAD_FUNCTION(vkCreateXlibSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
#ifdef VK_KHR_wayland_surface
MLX_LOAD_FUNCTION(vkCreateWaylandSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_KHR_win32_surface
MLX_LOAD_FUNCTION(vkCreateWin32SurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
#ifdef VK_EXT_metal_surface
MLX_LOAD_FUNCTION(vkCreateMetalSurfaceEXT);
#endif
#endif
kvfPassInstanceVulkanFunctionPointers(&pfns); kvfPassInstanceVulkanFunctionPointers(&pfns);
} }

207
third_party/kvf.h vendored
View File

@@ -55,6 +55,46 @@
#define VK_NO_PROTOTYPES #define VK_NO_PROTOTYPES
#endif #endif
#ifndef KVF_NO_KHR
#ifdef VK_USE_PLATFORM_ANDROID_KHR
#include <vulkan/vulkan_android.h>
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
#include <vulkan/vulkan_wayland.h>
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
typedef struct HINSTANCE__* HINSTANCE;
typedef struct HWND__* HWND;
typedef struct HMONITOR__* HMONITOR;
typedef void* HANDLE;
typedef /*_Null_terminated_*/ const wchar_t* LPCWSTR;
typedef unsigned long DWORD;
typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES;
#include <vulkan/vulkan_win32.h>
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
struct xcb_connection_t;
typedef uint32_t xcb_window_t;
typedef uint32_t xcb_visualid_t;
#include <vulkan/vulkan_xcb.h>
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
#include <vulkan/vulkan_metal.h>
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
typedef struct _XDisplay Display;
typedef unsigned long XID;
typedef XID Window;
typedef unsigned long VisualID;
#include <vulkan/vulkan_xlib.h>
#endif
#endif
#include <vulkan/vulkan_core.h> #include <vulkan/vulkan_core.h>
#include <stdint.h> #include <stdint.h>
@@ -82,6 +122,18 @@ typedef enum
KVF_IMAGE_OTHER = 4, KVF_IMAGE_OTHER = 4,
} KvfImageType; } KvfImageType;
#ifndef KVF_NO_KHR
typedef enum
{
KVF_SURFACE_ANDROID = 0,
KVF_SURFACE_XLIB = 1,
KVF_SURFACE_XCB = 2,
KVF_SURFACE_WAYLAND = 3,
KVF_SURFACE_WINDOWS = 4,
KVF_SURFACE_METAL = 5,
} KvfSurfaceType;
#endif
typedef void (*KvfErrorCallback)(const char* message); typedef void (*KvfErrorCallback)(const char* message);
#ifdef KVF_IMPL_VK_NO_PROTOTYPES #ifdef KVF_IMPL_VK_NO_PROTOTYPES
@@ -148,6 +200,33 @@ void kvfDestroySemaphore(VkDevice device, VkSemaphore semaphore);
uint32_t kvfGetSwapchainMinImagesCount(VkSwapchainKHR swapchain); uint32_t kvfGetSwapchainMinImagesCount(VkSwapchainKHR swapchain);
VkExtent2D kvfGetSwapchainImagesSize(VkSwapchainKHR swapchain); VkExtent2D kvfGetSwapchainImagesSize(VkSwapchainKHR swapchain);
void kvfDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain); void kvfDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain);
/**
* For Windows:
* - instance_handle -> HINSTANCE
* - window_handle -> HWND window handle
*
* For Wayland:
* - instance_handle -> wl_display
* - window_handle -> wl_surface
*
* For XLIB:
* - instance_handle -> Display
* - window_handle -> Window
*
* For XCB:
* - instance_handle -> xcb_connection_t
* - window_handle -> xcb_window_t
*
* For Metal:
* - instance_handle -> ignored
* - window_handle -> CAMetalLayer
*
* For Android:
* - instance_handle -> ignored
* - window_handle -> ANativeWindow
*/
VkSurfaceKHR kvfCreateSurfaceKHR(VkInstance instance, KvfSurfaceType type, void* instance_handle, void* window_handle);
#endif #endif
VkImage kvfCreateImage(VkDevice device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, KvfImageType type); VkImage kvfCreateImage(VkDevice device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, KvfImageType type);
@@ -272,6 +351,42 @@ int32_t kvfFindMemoryType(VkPhysicalDevice physical_device, uint32_t type_filter
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfaceFormatsKHR); KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfaceFormatsKHR);
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfacePresentModesKHR); KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfacePresentModesKHR);
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfaceSupportKHR); KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkGetPhysicalDeviceSurfaceSupportKHR);
#ifdef VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_KHR_android_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateAndroidSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
#ifdef VK_KHR_xcb_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateXcbSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
#ifdef VK_KHR_xlib_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateXlibSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
#ifdef VK_KHR_wayland_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateWaylandSurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_KHR_win32_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateWin32SurfaceKHR);
#endif
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
#ifdef VK_EXT_metal_surface
KVF_DEFINE_VULKAN_FUNCTION_PROTOTYPE(vkCreateMetalSurfaceEXT);
#endif
#endif
#endif #endif
}; };
@@ -2093,6 +2208,98 @@ void kvfDestroySemaphore(VkDevice device, VkSemaphore semaphore)
KVF_ASSERT(device != VK_NULL_HANDLE); KVF_ASSERT(device != VK_NULL_HANDLE);
__kvfDestroySwapchain(device, swapchain); __kvfDestroySwapchain(device, swapchain);
} }
VkSurfaceKHR kvfCreateSurfaceKHR(VkInstance instance, KvfSurfaceType type, void* instance_handle, void* window_handle)
{
VkSurfaceKHR surface = VK_NULL_HANDLE;
switch(type)
{
#ifdef VK_USE_PLATFORM_ANDROID_KHR
case KVF_SURFACE_ANDROID:
{
VkAndroidSurfaceCreateInfoKHR create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.window = (ANativeWindow*)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateAndroidSurfaceKHR)(instance, &create_info, NULL, &surface));
break;
}
#endif
#ifdef VK_USE_PLATFORM_XLIB_KHR
case KVF_SURFACE_XLIB:
{
VkXlibSurfaceCreateInfoKHR create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.dpy = (Display*)instance_handle;
create_info.window = *(Window*)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateXlibSurfaceKHR)(instance, &create_info, NULL, &surface));
break;
}
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
case KVF_SURFACE_XCB:
{
VkXcbSurfaceCreateInfoKHR create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.connection = (xcb_connection_t*)instance_handle;
create_info.window = (*xcb_window_t*)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateXcbSurfaceKHR)(instance, &create_info, NULL, &surface));
break;
}
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
case KVF_SURFACE_WAYLAND:
{
VkWaylandSurfaceCreateInfoKHR create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.display = (wl_display*)instance_handle;
create_info.surface = (wl_surface*)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateWaylandSurfaceKHR)(instance, &create_info, NULL, &surface));
break;
}
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
case KVF_SURFACE_WINDOWS:
{
VkWin32SurfaceCreateInfoKHR create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.hinstance = (HINSTANCE)instance_handle;
create_info.hwnd = (HWND)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateWin32SurfaceKHR)(instance, &create_info, NULL, &surface));
break;
}
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
case KVF_SURFACE_METAL:
{
VkMetalSurfaceCreateInfoEXT create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
create_info.pNext = nullptr;
create_info.flags = 0;
create_info.pLayer = (CAMetalLayer*)window_handle;
kvfCheckVk(KVF_GET_INSTANCE_FUNCTION(vkCreateMetalSurfaceEXT)(instance, &create_info, NULL, &surface));
break;
}
#endif
default: break;
}
return surface;
}
#endif #endif
VkImage kvfCreateImage(VkDevice device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, KvfImageType type) VkImage kvfCreateImage(VkDevice device, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, KvfImageType type)