diff --git a/CMakeLists.txt b/CMakeLists.txt index d844d5f..d823c3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,8 +3,8 @@ project(Gryphn) add_compile_definitions(GN_PLATFORM_LINUX GN_WINDOW_X11 GN_REVEAL_IMPL) -add_subdirectory(projects/core/) # build gryphn core add_subdirectory(projects/loader) # build gryphn loader +add_subdirectory(projects/core/) # build gryphn core add_subdirectory(projects/apis/vulkan/) add_library(Gryphn INTERFACE) diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index c6a4b6c..3313275 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -1,10 +1,10 @@ #pragma once #define GRYPHN_INCLUDE -#include #include #include #include #include +#include #include #include #include diff --git a/projects/core/CMakeLists.txt b/projects/core/CMakeLists.txt index eac8e32..d8eb83f 100644 --- a/projects/core/CMakeLists.txt +++ b/projects/core/CMakeLists.txt @@ -12,4 +12,3 @@ target_include_directories(GryphnCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../) target_include_directories(GryphnCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/) target_include_directories(GryphnCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../include/) target_include_directories(GryphnCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../utils) -target_include_directories(GryphnCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../utils) diff --git a/projects/core/src/command/command_pool/gryphn_command_pool.c b/projects/core/src/command/command_pool/gryphn_command_pool.c index 9d402a6..d6c9b72 100644 --- a/projects/core/src/command/command_pool/gryphn_command_pool.c +++ b/projects/core/src/command/command_pool/gryphn_command_pool.c @@ -1,14 +1,8 @@ #include "gryphn_command_pool.h" #include "gryphn_platform_functions.h" -#include "instance/init/gryphn_init.h" gnReturnCode gnCreateCommandPool(gnCommandPoolHandle* commandPool, gnOutputDeviceHandle device, struct gnCommandPoolInfo_t info) { *commandPool = malloc(sizeof(struct gnCommandPool_t)); - if (!device->instance->loadCommandFunctions) { - device->instance->commandFunctions = malloc(sizeof(struct gnCommandFunctions_t)); - gnLoadCommandFunctions(device->instance->dynamicLib, device->instance->commandFunctions); - device->instance->loadCommandFunctions = gnTrue; - } (*commandPool)->commandFunctions = device->instance->commandFunctions; (*commandPool)->device = device; diff --git a/projects/core/src/gryphn_platform_functions.h b/projects/core/src/gryphn_platform_functions.h index f048f2f..7eb5b79 100644 --- a/projects/core/src/gryphn_platform_functions.h +++ b/projects/core/src/gryphn_platform_functions.h @@ -20,39 +20,6 @@ #include "textures/gryphn_texture.h" #include "uniforms/gryphn_uniform_pool.h" -typedef struct gnInstanceFunctions { - gnReturnCode (*_gnCreateInstance)(gnInstanceHandle instance, gnInstanceInfo info); - void (*_gnDestroyInstance)(gnInstanceHandle instance); - - gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstanceHandle instance, uint32_t* count); - gnBool (*_gnQueueCanPresentToSurface)(const gnPhysicalDevice device, uint32_t queueIndex, const gnWindowSurfaceHandle windowSurface); - - gnReturnCode (*_gnCreateOutputDevice)(gnOutputDeviceHandle device, gnInstanceHandle instance, struct gnOutputDeviceInfo_t deviceInfo); - void (*_gnDestroyOutputDevice)(gnOutputDeviceHandle device); - - - #ifdef GN_PLATFORM_LINUX - #ifdef GN_WINDOW_X11 - gnReturnCode (*_gnCreateX11WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnX11WindowSurfaceInfo createInfo); - #endif - #ifdef GN_WINDOW_WAYLAND - gnReturnCode (*_gnCreateWaylandWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); - #endif - #endif - - - #ifdef GN_PLATFORM_WIN32 - gnReturnCode (*_gnCreateWin32WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); - #endif - - #ifdef GN_PLATFORM_MACOS - gnReturnCode (*_gnCreateMacOSWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); - #endif - - void (*_gnDestroyWindowSurface)(gnWindowSurfaceHandle windowSurface); - gnSurfaceDetails (*_gnGetSurfaceDetails)(gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device); -} gnInstanceFunctions; - #include "presentation_queue/gryphn_presentation_queue.h" typedef struct gnDeviceFunctions_t { gnReturnCode (*_gnCreatePresentationQueue)(gnPresentationQueueHandle presentationQueue, const gnOutputDeviceHandle device, gnPresentationQueueInfo presentationInfo); diff --git a/projects/core/src/instance/gryphn_instance.c b/projects/core/src/instance/gryphn_instance.c index 45eff1d..076fa1c 100644 --- a/projects/core/src/instance/gryphn_instance.c +++ b/projects/core/src/instance/gryphn_instance.c @@ -1,10 +1,13 @@ #include "gryphn_instance.h" #include #include "instance/gryphn_instance.h" +#include #include "loader/src/gryphn_loader.h" gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceInfo info) { *instance = malloc(sizeof(struct gnInstance_t)); + (*instance)->instanceFunctions = loadInstanceFunctions(info.renderingAPI); + // instance->dynamicLib = gnLoadRenderingDLL(info.renderingAPI); // if (instance->dynamicLib == NULL) return GN_UNABLE_TO_LOAD_DYNAMIC_LIBARRY; // instance->functions = gnLoadFunctions(instance); @@ -12,10 +15,9 @@ gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceInfo info) { // if (info.debugger) // instance->debugger = info.debugger; - // return instance->functions->_gnCreateInstance(instance, info); - return GN_SUCCESS; + return (*instance)->instanceFunctions._gnCreateInstance((*instance), info); } void gnDestroyInstance(gnInstanceHandle instance) { - instance->functions->_gnDestroyInstance(instance); + instance->instanceFunctions._gnDestroyInstance(instance); } diff --git a/projects/core/src/instance/gryphn_instance.h b/projects/core/src/instance/gryphn_instance.h index eff2eb4..3513363 100644 --- a/projects/core/src/instance/gryphn_instance.h +++ b/projects/core/src/instance/gryphn_instance.h @@ -1,11 +1,11 @@ #pragma once -#include #include "gryphn_rendering_api.h" #include "gryphn_handles.h" +#include "utils/gryphn_version.h" +#include "utils/gryphn_error_code.h" +#include "loader/src/gryphn_instance_functions.h" -typedef struct gnInstanceFunctions gnInstanceFunctions; - -typedef struct gnInstanceInfo_t { +typedef struct gnInstanceInfo { gnString applicationName; gnVersion applicationVersion; @@ -20,12 +20,10 @@ typedef struct gnInstanceInfo_t { struct gnInstance_t { struct gnPlatformInstance_t* instance; gnBool valid, - loadDeviceFunctions, - loadCommandFunctions; + loadDeviceFunctions, + loadCommandFunctions; - struct gnDynamicLibrary_t* dynamicLib; - - gnInstanceFunctions *functions, *unvalidatedFunctions; + gnInstanceFunctions instanceFunctions; struct gnDeviceFunctions_t* deviceFunctions; struct gnCommandFunctions_t* commandFunctions; @@ -33,5 +31,5 @@ struct gnInstance_t { }; #endif -gnReturnCode gnCreateInstance(gnInstanceHandle* instance, struct gnInstanceInfo_t info); +gnReturnCode gnCreateInstance(gnInstanceHandle* instance, gnInstanceInfo info); void gnDestroyInstance(gnInstanceHandle instance); diff --git a/projects/core/src/instance/init/gryphn_init.c b/projects/core/src/instance/init/gryphn_init.c deleted file mode 100644 index d84f5b8..0000000 --- a/projects/core/src/instance/init/gryphn_init.c +++ /dev/null @@ -1,126 +0,0 @@ -// #undef GN_UTILS_CPP -#include "gryphn_init.h" -#include -// #include -#include "stdbool.h" -#include "stdio.h" - -// gnBool gnIsAPISupported(gnRenderingAPI api) { -// int renderingAPICount = 0; -// gnRenderingAPI* supportedRenderingAPIS = gnGetSupportedRenderingAPIs(&renderingAPICount); -// for (int i = 0; i < renderingAPICount; i++) if (supportedRenderingAPIS[i] == api) return true; -// return false; -// } - -// struct gnDynamicLibrary_t* gnLoadRenderingDLL(gnRenderingAPI renderingAPI) { -// gnString libName = gnCreateEmptyString(); - -// switch (renderingAPI) { -// case GN_RENDERINGAPI_NONE: return NULL; -// case GN_RENDERINGAPI_SOFTWARE: return NULL; -// case GN_RENDERINGAPI_OPENGL: return NULL; -// case GN_RENDERINGAPI_VULKAN: { -// if (!gnIsAPISupported(GN_RENDERINGAPI_VULKAN)) return NULL; -// libName = gnCreateString("GryphnVulkanImpl"); -// break; -// } -// case GN_RENDERINGAPI_DIRECTX11: return NULL; -// case GN_RENDERINGAPI_DIRECTX12: return NULL; -// case GN_RENDERINGAPI_METAL: { -// if (!gnIsAPISupported(GN_RENDERINGAPI_METAL)) return NULL; -// libName = gnCreateString("GryphnMetalImpl"); -// break; -// } -// } - -// return gnLoadDynamicLibrary(gnCombineStrings(gnCreateString("gryphn/rendering_apis/"), libName)); -// } - -gnInstanceFunctions* gnLoadFunctions(gnInstanceHandle instance) { - gnInstanceFunctions* functions = malloc(sizeof(gnInstanceFunctions)); - - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateInstance, "gnCreateInstanceFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnDestroyInstance, "gnDestroyInstanceFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnGetPhysicalDevices, "gnGetPhysicalDevicesFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnQueueCanPresentToSurface, "gnQueueCanPresentToSurfaceFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateOutputDevice, "gnCreateOutputDeviceFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnDestroyOutputDevice, "gnDestroyOutputDeviceFn"); - - // #ifdef GN_PLATFORM_LINUX - // #ifdef GN_WINDOW_X11 - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateX11WindowSurface, "gnCreateX11WindowSurfaceFn"); - // #endif - // #ifdef GN_WINDOW_WAYLAND - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateWaylandWindowSurface, "gnCreateWaylandWindowSurfaceFn"); - // #endif - // #endif - - - // #ifdef GN_PLATFORM_WIN32 - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateWin32WindowSurface, "gnCreateWin32WindowSurfaceFn"); - // #endif - - // #ifdef GN_PLATFORM_MACOS - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnCreateMacOSWindowSurface, "gnCreateMacOSWindowSurfaceFn"); - // #endif - - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnDestroyWindowSurface, "gnDestroyWindowSurfaceFn"); - // gnLoadDLLFunction(instance->dynamicLib, functions->_gnGetSurfaceDetails, "gnGetSurfaceDetailsFn"); - - return functions; -} - -void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions) { - // gnLoadDLLFunction(lib, functions->_gnCreatePresentationQueue, "gnCreatePresentationQueueFn"); - // gnLoadDLLFunction(lib, functions->_gnPresentationQueueGetImage, "gnPresentationQueueGetImageFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyPresentationQueue, "gnDestroyPresentationQueueFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateShaderModule, "gnCreateShaderModuleFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyShaderModule, "gnDestroyShaderModuleFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateRenderPassDescriptor, "gnCreateRenderPassDescriptorFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyRenderPassDescriptor, "gnDestroyRenderPassDescriptorFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateGraphicsPipeline, "gnCreateGraphicsPipelineFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyGraphicsPipeline, "gnDestroyGraphicsPipelineFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateFramebuffer, "gnCreateFramebufferFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyFramebuffer, "gnDestroyFramebufferFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateCommandPool, "gnCreateCommandPoolFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyCommandPool, "gnDestroyCommandPoolFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateSemaphore, "gnCreateSemaphoreFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroySemaphore, "gnDestroySemaphoreFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateBuffer, "gnCreateBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnBufferData, "gnBufferDataFn"); - // gnLoadDLLFunction(lib, functions->_gnMapBuffer, "gnMapBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyBuffer, "gnDestroyBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateUniformPool, "gnCreateUniformPoolFn"); - // gnLoadDLLFunction(lib, functions->_gnUniformPoolAllocateUniforms, "gnUniformPoolAllocateUniformsFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyUniformPool, "gnDestroyUniformPoolFn"); - // gnLoadDLLFunction(lib, functions->_gnUpdateBufferUniform, "gnUpdateBufferUniformFn"); - // gnLoadDLLFunction(lib, functions->_gnUpdateImageUniform, "gnUpdateImageUniformFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateTexture, "gnCreateTextureFn"); - // gnLoadDLLFunction(lib, functions->_gnTextureData, "gnTextureDataFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyTexture, "gnDestroyTextureFn"); - // gnLoadDLLFunction(lib, functions->_gnCreateFence, "gnCreateFenceFn"); - // gnLoadDLLFunction(lib, functions->_gnSignalFence, "gnSignalFenceFn"); - // gnLoadDLLFunction(lib, functions->_gnWaitForFence, "gnWaitForFenceFn"); - // gnLoadDLLFunction(lib, functions->_gnResetFence, "gnResetFenceFn"); - // gnLoadDLLFunction(lib, functions->_gnDestroyFence, "gnDestroyFenceFn"); - // gnLoadDLLFunction(lib, functions->_gnSubmit, "gnSubmitFn"); - // gnLoadDLLFunction(lib, functions->_gnPresent, "gnPresentFn"); - // gnLoadDLLFunction(lib, functions->_gnWaitForDevice, "gnWaitForDeviceFn"); -} - -void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunctions_t* functions) { - // gnLoadDLLFunction(lib, functions->_gnCommandPoolAllocateCommandBuffers, "gnCommandPoolAllocateCommandBuffersFn"); - // gnLoadDLLFunction(lib, functions->_gnBeginCommandBuffer, "gnBeginCommandBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnResetCommandBuffer, "gnResetCommandBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnEndCommandBuffer, "gnEndCommandBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandBeginRenderPass, "gnCommandBeginRenderPassFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandEndRenderPass, "gnCommandEndRenderPassFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandBindGraphicsPipeline, "gnCommandBindGraphicsPipelineFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandSetViewport, "gnCommandSetViewportFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandSetScissor, "gnCommandSetScissorFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandBindUniform, "gnCommandBindUniformFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandBindBuffer, "gnCommandBindBufferFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandPushConstant, "gnCommandPushConstantFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandDraw, "gnCommandDrawFn"); - // gnLoadDLLFunction(lib, functions->_gnCommandDrawIndexed, "gnCommandDrawIndexedFn"); -} diff --git a/projects/core/src/instance/init/gryphn_init.h b/projects/core/src/instance/init/gryphn_init.h deleted file mode 100644 index 413d16d..0000000 --- a/projects/core/src/instance/init/gryphn_init.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include -#include -#include "gryphn_platform_functions.h" -// #include "utils/gryphn_error_code.h" - -gnBool gnIsAPISupported(gnRenderingAPI RenderingAPI); -struct gnDynamicLibrary_t* gnLoadRenderingDLL(gnRenderingAPI RenderingAPI); -gnInstanceFunctions* gnLoadFunctions(gnInstance instance); -void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFunctions_t* functions); -void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunctions_t* function); diff --git a/projects/core/src/output_device/gryphn_output_device.c b/projects/core/src/output_device/gryphn_output_device.c index 974c857..c1228c6 100644 --- a/projects/core/src/output_device/gryphn_output_device.c +++ b/projects/core/src/output_device/gryphn_output_device.c @@ -1,29 +1,20 @@ #include "gryphn_output_device.h" #include "instance/gryphn_instance.h" #include "gryphn_platform_functions.h" -#include "instance/init/gryphn_init.h" -#include "utils/gryphn_bool.h" -gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstanceHandle instance, struct gnOutputDeviceInfo_t deviceInfo) { +gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo) { *outputDevice = malloc(sizeof(struct gnOutputDevice_t)); - - if (instance->loadDeviceFunctions == gnFalse) { - instance->deviceFunctions = malloc(sizeof(struct gnDeviceFunctions_t)); - gnLoadDeviceFunctions(instance->dynamicLib, instance->deviceFunctions); - instance->loadDeviceFunctions = gnTrue; - } - (*outputDevice)->deviceFunctions = instance->deviceFunctions; (*outputDevice)->instance = instance; (*outputDevice)->physicalDevice = deviceInfo.physicalDevice; (*outputDevice)->deviceInfo = deviceInfo; - return instance->functions->_gnCreateOutputDevice(*outputDevice, instance, deviceInfo); + return instance->instanceFunctions._gnCreateOutputDevice(*outputDevice, instance, deviceInfo); } void gnWaitForDevice(gnOutputDeviceHandle device) { device->deviceFunctions->_gnWaitForDevice(device); } void gnDestroyOutputDevice(gnOutputDeviceHandle device) { - device->instance->functions->_gnDestroyOutputDevice(device); + device->instance->instanceFunctions._gnDestroyOutputDevice(device); free(device); } diff --git a/projects/core/src/output_device/gryphn_output_device.h b/projects/core/src/output_device/gryphn_output_device.h index f64f0ab..c1c6065 100644 --- a/projects/core/src/output_device/gryphn_output_device.h +++ b/projects/core/src/output_device/gryphn_output_device.h @@ -2,32 +2,29 @@ #include #include -struct gnPlatformOutputDevice_t; -struct gnDeviceFunctions_t; - -typedef struct gnDeviceQueueInfo_t { +typedef struct gnDeviceQueueInfo { int queueIndex; int queueCount; // float* queuePriority; } gnDeviceQueueInfo; -typedef struct gnOutputDeviceInfo_t { +typedef struct gnOutputDeviceInfo { uint32_t queueInfoCount; - struct gnDeviceQueueInfo_t* queueInfos; - struct gnPhysicalDeviceFeatures_t enabledFeatures; - struct gnPhysicalDevice_t physicalDevice; + gnDeviceQueueInfo* queueInfos; + gnPhysicalDeviceFeatures enabledFeatures; + gnPhysicalDevice physicalDevice; } gnOutputDeviceInfo; #ifdef GN_REVEAL_IMPL struct gnOutputDevice_t { struct gnPlatformOutputDevice_t* outputDevice; struct gnDeviceFunctions_t* deviceFunctions; - struct gnOutputDeviceInfo_t deviceInfo; + gnOutputDeviceInfo deviceInfo; gnInstanceHandle instance; gnPhysicalDevice physicalDevice; }; #endif -gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstanceHandle instance, struct gnOutputDeviceInfo_t deviceInfo); +gnReturnCode gnCreateOutputDevice(gnOutputDeviceHandle* outputDevice, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); void gnWaitForDevice(gnOutputDeviceHandle device); void gnDestroyOutputDevice(gnOutputDeviceHandle device); diff --git a/projects/core/src/output_device/gryphn_physical_output_device.c b/projects/core/src/output_device/gryphn_physical_output_device.c index adb012b..697b162 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.c +++ b/projects/core/src/output_device/gryphn_physical_output_device.c @@ -1,15 +1,15 @@ #include "gryphn_physical_output_device.h" -#include "gryphn_platform_functions.h" +#include "instance/gryphn_instance.h" gnPhysicalDevice* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count) { - gnPhysicalDevice* devices = instance->functions->_gnGetPhysicalDevices(instance, count); + gnPhysicalDevice* devices = instance->instanceFunctions._gnGetPhysicalDevices(instance, count); for (int i = 0; i < *count; i++) { devices[i].instance = instance; } return devices; } -gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) { +gnBool gnQueueCanPresentToSurface(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) { // if (queueIndex >= device.queueProperties.queueCount) { // gnDebuggerSetErrorMessage(device.instance->debugger, // (gnMessageData){ @@ -18,10 +18,10 @@ gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32 // ); // return gnFalse; // } - return device.instance->functions->_gnQueueCanPresentToSurface(device, queueIndex, windowSurface); + return device.instance->instanceFunctions._gnQueueCanPresentToSurface(device, queueIndex, windowSurface); } -gnBool gnHasGraphicsQueue(const struct gnPhysicalDevice_t device) { +gnBool gnHasGraphicsQueue(const gnPhysicalDevice device) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) { return gnTrue; @@ -29,7 +29,7 @@ gnBool gnHasGraphicsQueue(const struct gnPhysicalDevice_t device) { } return gnFalse; } -gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface) { +gnBool gnHasPresentQueue(const gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (gnQueueCanPresentToSurface(device, i, windowSurface)) { return gnTrue; @@ -38,31 +38,21 @@ gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, gnWindowSurface return gnFalse; } -int gnGetGraphicsQueueIndex(const struct gnPhysicalDevice_t device) { +int gnGetGraphicsQueueIndex(const gnPhysicalDevice device) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) { return i; break; } } - // gnDebuggerSetErrorMessage(device.instance->debugger, - // (gnMessageData){ - // .message = gnCreateString("gnGetGraphicsQueueIndex failed no queue that support graphics on this device") - // } - // ); return -1; } -int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface) { +int gnGetPresentQueueIndex(const gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (gnQueueCanPresentToSurface(device, i, windowSurface)) { return i; break; } } - // gnDebuggerSetErrorMessage(device.instance->debugger, - // (gnMessageData){ - // .message = gnCreateString("gnGetPresentQueueIndex failed no queue that support presenting to this window surface") - // } - // ); return -1; } diff --git a/projects/core/src/output_device/gryphn_physical_output_device.h b/projects/core/src/output_device/gryphn_physical_output_device.h index b8cfdcb..7fc6e72 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.h +++ b/projects/core/src/output_device/gryphn_physical_output_device.h @@ -3,52 +3,50 @@ #include "utils/gryphn_string.h" #include "gryphn_handles.h" -struct gnPlatformPhysicalDevice_t; - -typedef enum gnDeviceType_e { +typedef enum gnDeviceType { GN_DEDICATED_DEVICE, GN_INTEGRATED_DEVICE, GN_EXTERNAL_DEVICE } gnDeviceType; -typedef struct gnPhysicalDeviceProperties_t { +typedef struct gnPhysicalDeviceProperties { gnString name; gnDeviceType deviceType; } gnPhysicalDeviceProperties; -typedef struct gnPhysicalDeviceFeatures_t { +typedef struct gnPhysicalDeviceFeatures { gnBool supportsGeometryShader; } gnPhysicalDeviceFeatures; -typedef enum gnQueueTypeFlags_e { +typedef enum gnQueueTypeFlags { GN_QUEUE_GRAPHICS = 0x00000001, GN_QUEUE_COMPUTE = 0x00000002, GN_QUEUE_TRANSFER = 0x00000004, GN_QUEUE_SPARSE_BINDING = 0x00000008 } gnQueueTypeFlags; -typedef struct gnQueueProperties_t { +typedef struct gnQueueProperties { uint32_t queueCount; - enum gnQueueTypeFlags_e queueType; + gnQueueTypeFlags queueType; } gnQueueProperties; -typedef struct gnPhysicalDeviceQueueProperties_t { +typedef struct gnPhysicalDeviceQueueProperties { uint32_t queueCount; - struct gnQueueProperties_t* queueProperties; + gnQueueProperties* queueProperties; } gnPhysicalDeviceQueueProperties; -typedef struct gnPhysicalDevice_t { +typedef struct gnPhysicalDevice { struct gnPlatformPhysicalDevice_t* physicalDevice; - struct gnPhysicalDeviceProperties_t properties; - struct gnPhysicalDeviceFeatures_t features; - struct gnPhysicalDeviceQueueProperties_t queueProperties; + gnPhysicalDeviceProperties properties; + gnPhysicalDeviceFeatures features; + gnPhysicalDeviceQueueProperties queueProperties; gnInstanceHandle instance; } gnPhysicalDevice; gnPhysicalDevice* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count); -gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface); +gnBool gnQueueCanPresentToSurface(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface); -gnBool gnHasGraphicsQueue(const struct gnPhysicalDevice_t device); -gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface); +gnBool gnHasGraphicsQueue(const gnPhysicalDevice device); +gnBool gnHasPresentQueue(const gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface); -int gnGetGraphicsQueueIndex(const struct gnPhysicalDevice_t device); -int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface); +int gnGetGraphicsQueueIndex(const gnPhysicalDevice device); +int gnGetPresentQueueIndex(const gnPhysicalDevice device, gnWindowSurfaceHandle windowSurface); diff --git a/projects/core/src/window_surface/gryphn_surface.c b/projects/core/src/window_surface/gryphn_surface.c index 4d02df9..d0bb4e0 100644 --- a/projects/core/src/window_surface/gryphn_surface.c +++ b/projects/core/src/window_surface/gryphn_surface.c @@ -1,24 +1,23 @@ #include "gryphn_surface.h" -#include "gryphn_platform_functions.h" void gnDestroyWindowSurface(gnWindowSurfaceHandle windowSurface) { - windowSurface->instance->functions->_gnDestroyWindowSurface(windowSurface); + windowSurface->instance->instanceFunctions._gnDestroyWindowSurface(windowSurface); } -struct gnSurfaceFormat_t* gnGetSupportedSurfaceFormats( +gnSurfaceFormat* gnGetSupportedSurfaceFormats( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, + gnPhysicalDevice device, uint32_t* formatCount ) { - gnSurfaceDetails surfaceDetails = windowSurface->instance->functions->_gnGetSurfaceDetails(windowSurface, device); + gnSurfaceDetails surfaceDetails = windowSurface->instance->instanceFunctions._gnGetSurfaceDetails(windowSurface, device); *formatCount = surfaceDetails.formatCount; return surfaceDetails.formats; } gnBool gnIsSurfaceFormatSupported( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, - struct gnSurfaceFormat_t format + gnPhysicalDevice device, + gnSurfaceFormat format ) { uint32_t formatCount = 0; gnSurfaceFormat* formats = gnGetSupportedSurfaceFormats(windowSurface, device, &formatCount); @@ -30,10 +29,10 @@ gnBool gnIsSurfaceFormatSupported( return gnFalse; } -struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( +gnSurfaceFormat gnGetPreferredSurfaceFormat( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, - struct gnSurfaceFormat_t format + gnPhysicalDevice device, + gnSurfaceFormat format ) { uint32_t formatCount = 0; gnSurfaceFormat* formats = gnGetSupportedSurfaceFormats(windowSurface, device, &formatCount); @@ -53,17 +52,17 @@ struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( return formats[0]; } -uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { - gnSurfaceDetails surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); +uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device) { + gnSurfaceDetails surfaceDetails = surface->instance->instanceFunctions._gnGetSurfaceDetails(surface, device); return surfaceDetails.minImageCount; } -uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { - gnSurfaceDetails surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); +uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device) { + gnSurfaceDetails surfaceDetails = surface->instance->instanceFunctions._gnGetSurfaceDetails(surface, device); return surfaceDetails.maxImageCount; } -uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { - gnSurfaceDetails surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); +uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device) { + gnSurfaceDetails surfaceDetails = surface->instance->instanceFunctions._gnGetSurfaceDetails(surface, device); uint32_t imageCount = surfaceDetails.minImageCount + 1; if (surfaceDetails.maxImageCount > 0 && imageCount > surfaceDetails.maxImageCount) { @@ -72,4 +71,4 @@ uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, struct gnPhysi return imageCount; } -gnSurfaceDetails gnGetSurfaceDetails(gnWindowSurfaceHandle surface, gnPhysicalDevice device) { return surface->instance->functions->_gnGetSurfaceDetails(surface, device); } +gnSurfaceDetails gnGetSurfaceDetails(gnWindowSurfaceHandle surface, gnPhysicalDevice device) { return surface->instance->instanceFunctions._gnGetSurfaceDetails(surface, device); } diff --git a/projects/core/src/window_surface/gryphn_surface.h b/projects/core/src/window_surface/gryphn_surface.h index 96c0d1a..184efdf 100644 --- a/projects/core/src/window_surface/gryphn_surface.h +++ b/projects/core/src/window_surface/gryphn_surface.h @@ -3,15 +3,16 @@ #include #include #include "output_device/gryphn_physical_output_device.h" +#include "utils/math/gryphn_vec2.h" -typedef struct gnSurfaceFormat_t { +typedef struct gnSurfaceFormat { gnImageFormat format; gnColorSpace colorSpace; } gnSurfaceFormat; typedef struct gnSurfaceDetails { uint32_t formatCount; - struct gnSurfaceFormat_t* formats; + gnSurfaceFormat* formats; uint32_t minImageCount, maxImageCount; gnUInt2 minImageSize, maxImageSize, currentSize; @@ -27,27 +28,27 @@ struct gnWindowSurface_t { void gnDestroyWindowSurface(gnWindowSurfaceHandle windowSurface); -struct gnSurfaceFormat_t* gnGetSupportedSurfaceFormats( +gnSurfaceFormat* gnGetSupportedSurfaceFormats( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, + gnPhysicalDevice device, uint32_t* formatCount ); gnBool gnIsSurfaceFormatSupported( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, - struct gnSurfaceFormat_t format + gnPhysicalDevice device, + gnSurfaceFormat format ); // this function will give you you're preferred surface format // unless its not supported then it will give you the first supported surface format // at some point this function will attempt to give you the most simmilar surface format -struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( +gnSurfaceFormat gnGetPreferredSurfaceFormat( gnWindowSurfaceHandle windowSurface, - struct gnPhysicalDevice_t device, - struct gnSurfaceFormat_t format + gnPhysicalDevice device, + gnSurfaceFormat format ); -uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); -uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); -uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); +uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device); +uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device); +uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, gnPhysicalDevice device); gnSurfaceDetails gnGetSurfaceDetails(gnWindowSurfaceHandle surface, gnPhysicalDevice device); 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 08e0650..93b6fd2 100644 --- a/projects/core/src/window_surface/gryphn_surface_create_functions.c +++ b/projects/core/src/window_surface/gryphn_surface_create_functions.c @@ -1,19 +1,19 @@ #include "gryphn_surface_create_functions.h" +#include "gryphn_surface.h" #include "instance/gryphn_instance.h" -#include "gryphn_platform_functions.h" #ifdef GN_PLATFORM_LINUX #ifdef GN_WINDOW_X11 gnReturnCode gnCreateX11WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, gnX11WindowSurfaceInfo createInfo) { *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); (*windowSurface)->instance = instance; - return instance->functions->_gnCreateX11WindowSurface(*windowSurface, instance, createInfo); + return instance->instanceFunctions._gnCreateX11WindowSurface(*windowSurface, instance, createInfo); } #endif #ifdef GN_WINDOW_WAYLAND gnReturnCode gnCreateWaylandWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo) { *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); - return instance->functions->_gnCreateWaylandWindowSurface(windowSurface, instance, createInfo); + return instance->instanceFunctions._gnCreateWaylandWindowSurface(windowSurface, instance, createInfo); } #endif #endif @@ -22,7 +22,7 @@ #ifdef GN_PLATFORM_WIN32 gnReturnCode gnCreateWin32WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo) { *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); - return instance->functions->_gnCreateWin32WindowSurface(windowSurface, instance, createInfo); + return instance->instanceFunctions._gnCreateWin32WindowSurface(windowSurface, instance, createInfo); } #endif @@ -30,6 +30,6 @@ gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); (*windowSurface)->instance = instance; - return instance->functions->_gnCreateMacOSWindowSurface(*windowSurface, instance, createInfo); + return instance->instanceFunctions._gnCreateMacOSWindowSurface(*windowSurface, instance, createInfo); } #endif 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 5a5d070..288195e 100644 --- a/projects/core/src/window_surface/gryphn_surface_create_functions.h +++ b/projects/core/src/window_surface/gryphn_surface_create_functions.h @@ -17,29 +17,29 @@ gnReturnCode gnCreateX11WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, gnX11WindowSurfaceInfo createInfo); #endif #ifdef GN_WINDOW_WAYLAND - typedef struct gnWaylandWindowSurfaceInfo_t { + typedef struct gnWaylandWindowSurfaceInfo { wl_display* display; wl_surface* surface; } gnWaylandWindowSurfaceInfo; - gnReturnCode gnCreateWaylandWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateWaylandWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo createInfo); #endif #endif #ifdef GN_PLATFORM_WIN32 - typedef struct gnWin32WindowSurfaceInfo_t { + typedef struct gnWin32WindowSurfaceInfo { HWND* window; HINSTANCE* instance; } gnWin32WindowSurfaceInfo; - gnReturnCode gnCreateWin32WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateWin32WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo createInfo); #endif #ifdef GN_PLATFORM_MACOS - typedef struct gnMacOSWindowSurfaceInfo_t { + typedef struct gnMacOSWindowSurfaceInfo { CAMetalLayer* layer; } gnMacOSWindowSurfaceInfo; - gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo createInfo); #endif diff --git a/projects/loader/CMakeLists.txt b/projects/loader/CMakeLists.txt index b78d9a6..72d3fb5 100644 --- a/projects/loader/CMakeLists.txt +++ b/projects/loader/CMakeLists.txt @@ -3,3 +3,6 @@ project(GryphnLoader) file(GLOB_RECURSE SOURCE_FILES CONFIGURE_DEPENDS "src/*.c") add_library(GryphnLoader STATIC ${SOURCE_FILES}) +target_include_directories(GryphnLoader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../utils) +target_include_directories(GryphnLoader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../) +target_include_directories(GryphnLoader PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../core/src/) diff --git a/projects/loader/src/gryphn_instance_functions.h b/projects/loader/src/gryphn_instance_functions.h new file mode 100644 index 0000000..b40b7a9 --- /dev/null +++ b/projects/loader/src/gryphn_instance_functions.h @@ -0,0 +1,50 @@ +#pragma once +#include "stdint.h" +#include "utils/gryphn_error_code.h" +#include "utils/gryphn_bool.h" +#include "gryphn_handles.h" + +typedef struct gnInstanceInfo gnInstanceInfo; +typedef struct gnPhysicalDevice gnPhysicalDevice; +typedef struct gnSurfaceDetails gnSurfaceDetails; +typedef struct gnOutputDeviceInfo gnOutputDeviceInfo; + + +#ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + typedef struct gnX11WindowSurfaceInfo gnX11WindowSurfaceInfo; + #endif +#endif + +typedef struct gnInstanceFunctions { + gnReturnCode (*_gnCreateInstance)(gnInstanceHandle instance, gnInstanceInfo info); + void (*_gnDestroyInstance)(gnInstanceHandle instance); + + gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstanceHandle instance, uint32_t* count); + gnBool (*_gnQueueCanPresentToSurface)(const gnPhysicalDevice device, uint32_t queueIndex, const gnWindowSurfaceHandle windowSurface); + + gnReturnCode (*_gnCreateOutputDevice)(gnOutputDeviceHandle device, gnInstanceHandle instance, gnOutputDeviceInfo deviceInfo); + void (*_gnDestroyOutputDevice)(gnOutputDeviceHandle device); + + + #ifdef GN_PLATFORM_LINUX + #ifdef GN_WINDOW_X11 + gnReturnCode (*_gnCreateX11WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, gnX11WindowSurfaceInfo createInfo); + #endif + #ifdef GN_WINDOW_WAYLAND + gnReturnCode (*_gnCreateWaylandWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + #endif + #endif + + + #ifdef GN_PLATFORM_WIN32 + gnReturnCode (*_gnCreateWin32WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); + #endif + + #ifdef GN_PLATFORM_MACOS + gnReturnCode (*_gnCreateMacOSWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); + #endif + + void (*_gnDestroyWindowSurface)(gnWindowSurfaceHandle windowSurface); + gnSurfaceDetails (*_gnGetSurfaceDetails)(gnWindowSurfaceHandle windowSurface, gnPhysicalDevice device); +} gnInstanceFunctions; diff --git a/projects/loader/src/gryphn_loader.c b/projects/loader/src/gryphn_loader.c index 7a286f7..566b492 100644 --- a/projects/loader/src/gryphn_loader.c +++ b/projects/loader/src/gryphn_loader.c @@ -1,5 +1,7 @@ +#include "gryphn_loader.h" #include "stdio.h" -void test_loader() { - printf("Loader works %i\n", 32); +gnInstanceFunctions loadInstanceFunctions(gnRenderingAPI api) { + printf("Loading instance functions"); + return (gnInstanceFunctions){ NULL }; } diff --git a/projects/loader/src/gryphn_loader.h b/projects/loader/src/gryphn_loader.h index 5aa59e4..c874e48 100644 --- a/projects/loader/src/gryphn_loader.h +++ b/projects/loader/src/gryphn_loader.h @@ -1,3 +1,5 @@ #pragma once +#include "gryphn_rendering_api.h" +#include "gryphn_instance_functions.h" -void test_loader(); +gnInstanceFunctions loadInstanceFunctions(gnRenderingAPI api);