From f791b017057e41df0a4a37b2f3be2e358acbd59e Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Tue, 24 Jun 2025 22:32:55 -0400 Subject: [PATCH] get stuff working on macos --- CMakeLists.txt | 59 ++------- include/gryphn/gryphn_platform.h | 2 +- .../vulkan/loader/vulkan_instance_loader.c | 6 +- .../vulkan/src/uniforms/vulkan_uniform_pool.c | 5 +- .../src/vulkan_surface/vulkan_surface.h | 3 + .../src/vulkan_surface/vulkan_surface.m | 4 +- projects/core/CMakeLists.txt | 1 + .../gryphn_surface_create_functions.c | 2 +- .../gryphn_surface_create_functions.h | 6 +- projects/platform/CMakeLists.txt | 9 ++ .../platform_macos/gryphn_platform_macos.h | 4 +- .../platform_macos/gryphn_platform_macos.m | 121 +++++++----------- 12 files changed, 84 insertions(+), 138 deletions(-) create mode 100644 projects/platform/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index d823c3b..c637a91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,51 +1,20 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS on) project(Gryphn) -add_compile_definitions(GN_PLATFORM_LINUX GN_WINDOW_X11 GN_REVEAL_IMPL) +add_compile_definitions(GN_REVEAL_IMPL) add_subdirectory(projects/loader) # build gryphn loader -add_subdirectory(projects/core/) # build gryphn core -add_subdirectory(projects/apis/vulkan/) - +add_subdirectory(projects/core) # build gryphn core +add_subdirectory(projects/platform) # build gryphn platform add_library(Gryphn INTERFACE) -target_link_libraries(Gryphn INTERFACE GryphnCore GryphnLoader GryphnVulkanImpl) - -# set(CMAKE_EXPORT_COMPILE_COMMANDS on) -# project(Gryphn) -# add_library(Gryphn STATIC "") - -# # build gryphn core -# add_subdirectory(src/core/) -# target_link_libraries(Gryphn GryphnCore) - -# # build the selected apis -# if(WIN32) -# add_compile_definitions(GN_PLATFORM_WIN32) -# add_subdirectory(src/apis/vulkan/) - -# target_link_libraries(Gryphn GryphnVulkanImpl) -# endif() -# if(APPLE) -# add_compile_definitions(GN_PLATFORM_MACOS) -# add_subdirectory(src/apis/metal/) -# add_subdirectory(src/apis/vulkan/) - -# target_link_libraries(Gryphn -# "-framework IOKit" -# "-framework CoreFoundation" -# "-framework CoreGraphics" -# "-framework AppKit" -# "-framework Metal" -# "-framework QuartzCore" -# "-framework MetalKit" -# ) - -# target_link_libraries(Gryphn GryphnVulkanImpl GryphnMetalImpl) -# endif() -# if(UNIX AND NOT APPLE) -# add_compile_definitions(GN_PLATFORM_LINUX) -# add_compile_definitions(GN_WINDOW_X11) -# add_subdirectory(src/apis/vulkan/) - -# target_link_libraries(Gryphn GryphnVulkanImpl) -# endif() +if (UNIX AND NOT APPLE) + add_compile_definitions(GN_PLATFORM_LINUX GN_WINDOW_X11) + add_subdirectory(projects/apis/vulkan/) + target_link_libraries(Gryphn INTERFACE GryphnVulkanImpl) +endif() +if (APPLE) + add_compile_definitions(GN_PLATFORM_MACOS) + add_subdirectory(projects/apis/vulkan/) + target_link_libraries(Gryphn INTERFACE GryphnVulkanImpl) +endif() +target_link_libraries(Gryphn INTERFACE GryphnCore GryphnLoader GryphnPlatform) diff --git a/include/gryphn/gryphn_platform.h b/include/gryphn/gryphn_platform.h index a305056..81d2438 100644 --- a/include/gryphn/gryphn_platform.h +++ b/include/gryphn/gryphn_platform.h @@ -1,3 +1,3 @@ #pragma once #include -#include +#include diff --git a/projects/apis/vulkan/loader/vulkan_instance_loader.c b/projects/apis/vulkan/loader/vulkan_instance_loader.c index a444ed4..25c09a3 100644 --- a/projects/apis/vulkan/loader/vulkan_instance_loader.c +++ b/projects/apis/vulkan/loader/vulkan_instance_loader.c @@ -21,17 +21,17 @@ gnInstanceFunctions loadVulkanInstanceFunctions(loaderInfo info) { ._gnCreateX11WindowSurface = createX11WindowSurface, #endif #ifdef GN_WINDOW_WAYLAND - ._gnCreateWaylandWindowSurface + ._gnCreateWaylandWindowSurface, #endif #endif #ifdef GN_PLATFORM_WIN32 - ._gnCreateWin32WindowSurface + ._gnCreateWin32WindowSurface, #endif #ifdef GN_PLATFORM_MACOS - ._gnCreateMacOSWindowSurface + ._gnCreateMacOSWindowSurface = createMacOSWindowSurface, #endif ._gnDestroyWindowSurface = destroyWindowSurface, diff --git a/projects/apis/vulkan/src/uniforms/vulkan_uniform_pool.c b/projects/apis/vulkan/src/uniforms/vulkan_uniform_pool.c index 627d3d5..a809ca2 100644 --- a/projects/apis/vulkan/src/uniforms/vulkan_uniform_pool.c +++ b/projects/apis/vulkan/src/uniforms/vulkan_uniform_pool.c @@ -42,6 +42,7 @@ gnReturnCode createUniformPool(gnUniformPool pool, gnDeviceHandle device) { gnUniform* allocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInfo) { gnBool fixedAllocation = !pool->device->outputDevice->enabledOversizedDescriptorPools; + if (fixedAllocation) { VkGryphnUniformPool newPool = { .pool = VK_NULL_HANDLE, @@ -61,8 +62,8 @@ gnUniform* allocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInf for (int i = 0; i < allocInfo.setCount; i++) { for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) { - if (allocInfo.sets[i].uniformBindings[i].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; - if (allocInfo.sets[i].uniformBindings[i].type == GN_IMAGE_DESCRIPTOR) imageSize.descriptorCount++; + if (allocInfo.sets[i].uniformBindings[c].type == GN_UNIFORM_BUFFER_DESCRIPTOR) uniformBufferSize.descriptorCount++; + if (allocInfo.sets[i].uniformBindings[c].type == GN_IMAGE_DESCRIPTOR) imageSize.descriptorCount++; } } diff --git a/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.h b/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.h index 243127b..6a6ca14 100644 --- a/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.h +++ b/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.h @@ -14,6 +14,9 @@ VkColorSpaceKHR vkGryphnColorSpaceToVulkanColorSpace(gnColorSpace colorSpace); gnReturnCode createX11WindowSurface(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnX11WindowSurfaceInfo createInfo); #endif #endif +#ifdef GN_PLATFORM_MACOS +gnReturnCode createMacOSWindowSurface(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo); +#endif gnSurfaceDetails getSurfaceDetails(gnWindowSurfaceHandle windowSurface, gnPhysicalDevice device); void destroyWindowSurface(gnWindowSurface windowSurface); diff --git a/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.m b/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.m index 1517376..f6f75c1 100644 --- a/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.m +++ b/projects/apis/vulkan/src/vulkan_surface/vulkan_surface.m @@ -1,6 +1,6 @@ #ifdef GN_PLATFORM_MACOS #include "vulkan_surface.h" -#include "core/window_surface/gryphn_surface_create_functions.h" +#include "window_surface/gryphn_surface_create_functions.h" #include "../instance/vulkan_instance.h" #include #include @@ -11,7 +11,7 @@ #include "vulkan/vulkan_metal.h" -gnReturnCode gnCreateMacOSWindowSurfaceFn(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { +gnReturnCode createMacOSWindowSurface(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo) { windowSurface->windowSurface = malloc(sizeof(gnPlatformWindowSurface)); VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {}; surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; diff --git a/projects/core/CMakeLists.txt b/projects/core/CMakeLists.txt index d8eb83f..aa0a569 100644 --- a/projects/core/CMakeLists.txt +++ b/projects/core/CMakeLists.txt @@ -4,6 +4,7 @@ add_compile_definitions(GN_REVEAL_IMPL) file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS "src/*.c") if(APPLE) + add_compile_definitions(GN_PLATFORM_MACOS) file(GLOB_RECURSE METAL_FILES CONFIGURE_DEPENDS "src/*.m") endif() add_library(GryphnCore ${SOURCE_FILES} ${METAL_FILES}) diff --git a/projects/core/src/window_surface/gryphn_surface_create_functions.c b/projects/core/src/window_surface/gryphn_surface_create_functions.c index 93b6fd2..0564ed4 100644 --- a/projects/core/src/window_surface/gryphn_surface_create_functions.c +++ b/projects/core/src/window_surface/gryphn_surface_create_functions.c @@ -27,7 +27,7 @@ #endif #ifdef GN_PLATFORM_MACOS - gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { + gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo) { *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); (*windowSurface)->instance = instance; return instance->instanceFunctions._gnCreateMacOSWindowSurface(*windowSurface, instance, createInfo); diff --git a/projects/core/src/window_surface/gryphn_surface_create_functions.h b/projects/core/src/window_surface/gryphn_surface_create_functions.h index 288195e..f83354b 100644 --- a/projects/core/src/window_surface/gryphn_surface_create_functions.h +++ b/projects/core/src/window_surface/gryphn_surface_create_functions.h @@ -1,12 +1,8 @@ #pragma once -#ifndef GN_WINDOW_X11 -#define GN_WINDOW_X11 -#endif #include #include #include - #ifdef GN_PLATFORM_LINUX #ifdef GN_WINDOW_X11 typedef struct gnX11WindowSurfaceInfo { @@ -41,5 +37,5 @@ CAMetalLayer* layer; } gnMacOSWindowSurfaceInfo; - gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo createInfo); + gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, gnMacOSWindowSurfaceInfo createInfo); #endif diff --git a/projects/platform/CMakeLists.txt b/projects/platform/CMakeLists.txt new file mode 100644 index 0000000..349a9f2 --- /dev/null +++ b/projects/platform/CMakeLists.txt @@ -0,0 +1,9 @@ +set(CMAKE_EXPORT_COMPILE_COMMANDS on) +project(GryphnPlatform) + +if (APPLE) + file(GLOB_RECURSE APPLE_FILES CONFIGURE_DEPENDS "platform_macos/*.m") +endif() +add_library(GryphnPlatform STATIC ${APPLE_FILES}) +target_include_directories(GryphnPlatform PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../utils/) +target_include_directories(GryphnPlatform PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../core/) diff --git a/projects/platform/platform_macos/gryphn_platform_macos.h b/projects/platform/platform_macos/gryphn_platform_macos.h index ef44c38..cc4a60a 100644 --- a/projects/platform/platform_macos/gryphn_platform_macos.h +++ b/projects/platform/platform_macos/gryphn_platform_macos.h @@ -15,8 +15,8 @@ typedef void MTKView; // MTKView* gnCreateMTKView(NSWindow* window); // void gnWindowSetMTKView(NSWindow* window, MTKView* view); CAMetalLayer* gnCreateCAMetalLayer(NSWindow* window); -CAMetalLayer* gnGetCAMetalLayer(NSWindow* window); -void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer); +// CAMetalLayer* gnGetCAMetalLayer(NSWindow* window); +// void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer); // CAMetalLayer* gnCreateMetalLayer(NSWindow* window); // void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer); diff --git a/projects/platform/platform_macos/gryphn_platform_macos.m b/projects/platform/platform_macos/gryphn_platform_macos.m index 99f5e5f..4ca3b2d 100644 --- a/projects/platform/platform_macos/gryphn_platform_macos.m +++ b/projects/platform/platform_macos/gryphn_platform_macos.m @@ -1,8 +1,4 @@ -#ifdef GN_PLATFORM_MACOS -#undef GN_UTILS_CPP -#include "core/gryphn_rendering_api.h" -#include "core/instance/init/gryphn_dynamic_library.h" -#include "dlfcn.h" +#include "src/gryphn_rendering_api.h" #include "gryphn_platform_macos.h" #import #import @@ -19,34 +15,6 @@ gnRenderingAPI* gnGetSupportedRenderingAPIs(int* count) { return renderingAPIs; } -struct gnDynamicLibrary_t* gnLoadDynamicLibrary(const gnString path) { - struct gnDynamicLibrary_t* dll = malloc(sizeof(struct gnDynamicLibrary_t)); - dll->dllPtr = dlopen(gnToCString(gnCombineStrings(path, ".dylib")), RTLD_LAZY), - dll->isValid = true; - if (dll->dllPtr == NULL) dll->isValid = false; - return dll; -} -void* gnLoadFunctionPtr(struct gnDynamicLibrary_t* dll, const char* name) { - if (dll->isValid == false) return NULL; - return dlsym(dll->dllPtr, name); -} -void gnUnloadDynamicLibrary(struct gnDynamicLibrary_t* dll) { - if (dll->isValid) dlclose(dll->dllPtr); -} - -MTKView* gnCreateMTKView(NSWindow* window) { - MTKView* view = [[MTKView alloc] initWithFrame:window.frame]; - [view setColorPixelFormat:MTLPixelFormatBGRA8Unorm_sRGB]; - [view setPreferredFramesPerSecond:120]; - CGSize rect = { window.frame.size.width * window.backingScaleFactor, window.frame.size.height * window.backingScaleFactor }; - [view setClearColor:MTLClearColorMake(1.0f, 0.0f, 0.0f, 1.0f)]; - [view setDrawableSize:rect]; - return view; -} - -void gnWindowSetMTKView(NSWindow* window, MTKView* view) { - [window setContentView:view]; -} CAMetalLayer* gnCreateCAMetalLayer(NSWindow* window) { NSView* view = window.contentView; @@ -58,56 +26,55 @@ CAMetalLayer* gnCreateCAMetalLayer(NSWindow* window) { return layer; } -CAMetalLayer* gnGetCAMetalLayer(NSWindow* window) { - return (CAMetalLayer*)window.contentView.layer; -} +// CAMetalLayer* gnGetCAMetalLayer(NSWindow* window) { +// return (CAMetalLayer*)window.contentView.layer; +// } -void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer) { - // CGSize newSize = window.contentView.bounds.size; - // CGFloat scale = window.contentView.window.backingScaleFactor; - // layer.drawableSize = CGSizeMake(newSize.width * scale, newSize.height * scale); - // CAMetalLayer* layer = [CAMetalLayer layer]; - // layer.pixelFormat = MTLPixelFormatBGRA8Unorm; - // layer.frame = window.contentView.layer.bounds; - // window.contentView.wantsLayer = YES; - // window.contentView.layer = layer; - layer.drawableSize = CGSizeMake(window.frame.size.width, window.frame.size.height); -} +// void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer) { +// // CGSize newSize = window.contentView.bounds.size; +// // CGFloat scale = window.contentView.window.backingScaleFactor; +// // layer.drawableSize = CGSizeMake(newSize.width * scale, newSize.height * scale); +// // CAMetalLayer* layer = [CAMetalLayer layer]; +// // layer.pixelFormat = MTLPixelFormatBGRA8Unorm; +// // layer.frame = window.contentView.layer.bounds; +// // window.contentView.wantsLayer = YES; +// // window.contentView.layer = layer; +// layer.drawableSize = CGSizeMake(window.frame.size.width, window.frame.size.height); +// } -/* -CAMetalLayer* gnCreateMetalLayer(NSWindow* window) { - // CAMetalLayer* layer = [CAMetalLayer layer]; - // [window.contentView setWantsLayer:YES]; - // [layer setContentsScale:[window backingScaleFactor]]; - // [layer setFrame:window.contentView.bounds]; - // [window.contentView setLayer:layer]; - // return layer; +// /* +// CAMetalLayer* gnCreateMetalLayer(NSWindow* window) { +// // CAMetalLayer* layer = [CAMetalLayer layer]; +// // [window.contentView setWantsLayer:YES]; +// // [layer setContentsScale:[window backingScaleFactor]]; +// // [layer setFrame:window.contentView.bounds]; +// // [window.contentView setLayer:layer]; +// // return layer; - CAMetalLayer* layer = [CAMetalLayer layer]; +// CAMetalLayer* layer = [CAMetalLayer layer]; - // if (window.scaleFramebuffer) - // [window->ns.layer setContentsScale:[window->ns.object backingScaleFactor]]; +// // if (window.scaleFramebuffer) +// // [window->ns.layer setContentsScale:[window->ns.object backingScaleFactor]]; - [window.contentView layer]; - [window.contentView setWantsLayer:YES]; - return layer; -} +// [window.contentView layer]; +// [window.contentView setWantsLayer:YES]; +// return layer; +// } -void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer) { - // [window.contentView setWantsLayer:YES]; - // // [window.contentView setLayer:layer]; - // [layer setFrame:window.contentView.bounds]; - // [layer setContentsScale:[window backingScaleFactor]]; -} +// void gnAttachMetalLayer(NSWindow* window, CAMetalLayer* layer) { +// // [window.contentView setWantsLayer:YES]; +// // // [window.contentView setLayer:layer]; +// // [layer setFrame:window.contentView.bounds]; +// // [layer setContentsScale:[window backingScaleFactor]]; +// } -void gnMetalLayerSetBounds(CAMetalLayer* layer, NSWindow* window) { - // CGSize size = window.contentView.bounds.size; - // CGFloat scale = window.backingScaleFactor; +// void gnMetalLayerSetBounds(CAMetalLayer* layer, NSWindow* window) { +// // CGSize size = window.contentView.bounds.size; +// // CGFloat scale = window.backingScaleFactor; - // [layer setFrame:window.contentView.bounds]; - // [layer setDrawableSize:CGSizeMake(size.width * scale, size.height * scale)]; - // [layer setContentsScale:[window backingScaleFactor]]; -} -*/ -#endif +// // [layer setFrame:window.contentView.bounds]; +// // [layer setDrawableSize:CGSizeMake(size.width * scale, size.height * scale)]; +// // [layer setContentsScale:[window backingScaleFactor]]; +// } +// */