From 0eff3c62ee1efba66d5bd3b01b2c00df4af21669 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Mon, 25 May 2026 12:52:56 -0400 Subject: [PATCH] get vulkan functions up and running --- .../ext/device/swapchain/gryphn_swapchain.c | 10 ++++++ .../ext/device/swapchain/gryphn_swapchain.h | 20 +++++++++++ .../dispatch/gryphn_device_dispatch_table.h | 5 +++ ...{vulkan_surface.c => vulkan_ext_surface.c} | 0 .../src/extensions/vulkan_ext_swapchain.c | 9 +++++ Gryphn/apis/GryphnVulkan/src/vulkan_device.c | 2 ++ .../apis/GryphnVulkan/src/vulkan_functions.h | 2 ++ Gryphn/gryphn.h | 1 + main.cpp | 34 +++++++++---------- 9 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.c create mode 100644 Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.h rename Gryphn/apis/GryphnVulkan/src/extensions/{vulkan_surface.c => vulkan_ext_surface.c} (100%) create mode 100644 Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_swapchain.c diff --git a/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.c b/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.c new file mode 100644 index 0000000..cdac85a --- /dev/null +++ b/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.c @@ -0,0 +1,10 @@ +#include "gryphn_swapchain.h" +#include "gryphn_return_code.h" +#include + +gnReturnCode gnCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* createInfo, gnSwapchain* swapchain) { + return device->dispatchTable.createSwapchain(device, createInfo, swapchain); +} +gnReturnCode gnDestroySwapchain(gnDevice device, gnSwapchain* swapchain) { + return device->dispatchTable.destroySwapchain(device, swapchain); +} diff --git a/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.h b/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.h new file mode 100644 index 0000000..5dc189f --- /dev/null +++ b/Gryphn/GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.h @@ -0,0 +1,20 @@ +#pragma once +#include +#include "core/gryphn_format.h" +#include "core/gryphn_present_mode.h" +#include "core/gryphn_vec2d.h" +#include "gryphn_return_code.h" +#include "stdint.h" + +typedef struct gnSwapchainCreateInfo { + gnSurface surface; + uint32_t minImageCount; + gnFormat imageFormat; + gnColorSpace imageColorSpace; + gnExtent2D imageExtent; + uint32_t imageArrayLayers; + gnPresentMode presentMode; +} gnSwapchainCreateInfo; + +gnReturnCode gnCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* createInfo, gnSwapchain* swapchain); +gnReturnCode gnDestroySwapchain(gnDevice device, gnSwapchain* swapchain); diff --git a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h index a281544..e804eba 100644 --- a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h +++ b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_device_dispatch_table.h @@ -1,8 +1,13 @@ #pragma once #include "gryphn_handle.h" +typedef struct gnSwapchainCreateInfo gnSwapchainCreateInfo; typedef gnReturnCode (*PFN_gnDestroyDevice)(gnDevice); +typedef gnReturnCode (*PFN_gnCreateSwapchain)(gnDevice, gnSwapchainCreateInfo*, gnSwapchain*); +typedef gnReturnCode (*PFN_gnDestroySwapchain)(gnDevice, gnSwapchain*); typedef struct gnDeviceDispatchTable { PFN_gnDestroyDevice destroyDevice; + PFN_gnCreateSwapchain createSwapchain; + PFN_gnDestroySwapchain destroySwapchain; } gnDeviceDispatchTable; diff --git a/Gryphn/apis/GryphnVulkan/src/extensions/vulkan_surface.c b/Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_surface.c similarity index 100% rename from Gryphn/apis/GryphnVulkan/src/extensions/vulkan_surface.c rename to Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_surface.c diff --git a/Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_swapchain.c b/Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_swapchain.c new file mode 100644 index 0000000..8db0f15 --- /dev/null +++ b/Gryphn/apis/GryphnVulkan/src/extensions/vulkan_ext_swapchain.c @@ -0,0 +1,9 @@ +#include "../vulkan_functions.h" +#include "gryphn_return_code.h" + +gnReturnCode vulkanCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* createInfo, gnSwapchain* swapchain) { + return GN_UNSUPPORTED_BACKEND; +} +gnReturnCode vulkanDestroySwapchain(gnDevice device, gnSwapchain* swapchain) { + return GN_UNSUPPORTED_BACKEND; +} diff --git a/Gryphn/apis/GryphnVulkan/src/vulkan_device.c b/Gryphn/apis/GryphnVulkan/src/vulkan_device.c index 0713270..e3ce558 100644 --- a/Gryphn/apis/GryphnVulkan/src/vulkan_device.c +++ b/Gryphn/apis/GryphnVulkan/src/vulkan_device.c @@ -64,6 +64,8 @@ gnReturnCode vulkanCreateDevice(gnInstance instance, gnDeviceCreateInfo* info, g if (strcmp(info->enabledExtensions[i], "GN_EXT_swapchain") == 0) { extensions[realEnabledExtensionCount] = VK_KHR_SWAPCHAIN_EXTENSION_NAME; realEnabledExtensionCount++; + device->dispatchTable.createSwapchain = vulkanCreateSwapchain; + device->dispatchTable.destroySwapchain = vulkanDestroySwapchain; } } diff --git a/Gryphn/apis/GryphnVulkan/src/vulkan_functions.h b/Gryphn/apis/GryphnVulkan/src/vulkan_functions.h index 5b14532..a499f34 100644 --- a/Gryphn/apis/GryphnVulkan/src/vulkan_functions.h +++ b/Gryphn/apis/GryphnVulkan/src/vulkan_functions.h @@ -15,3 +15,5 @@ gnReturnCode vulkanGetSurfaceCapabilities(gnPhysicalDevice device, gnSurface sur gnReturnCode vulkanGetSurfaceFormats(gnPhysicalDevice device, gnSurface surface, uint32_t* formatCount, gnSurfaceFormat* formats); gnReturnCode vulkanGetSurfacePresentModes(gnPhysicalDevice device, gnSurface surface, uint32_t* presentModeCount, gnPresentMode* presentModes); gnReturnCode vulkanDestroySurface(gnInstance instance, gnSurface* surface); +gnReturnCode vulkanCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* createInfo, gnSwapchain* swapchain); +gnReturnCode vulkanDestroySwapchain(gnDevice device, gnSwapchain* swapchain); diff --git a/Gryphn/gryphn.h b/Gryphn/gryphn.h index 76fbaa0..cdc2c5b 100644 --- a/Gryphn/gryphn.h +++ b/Gryphn/gryphn.h @@ -7,6 +7,7 @@ extern "C" { #include "GryphnLoader/src/device/gryphn_physical_device.h" #include "GryphnLoader/src/device/gryphn_device.h" #include "GryphnLoader/src/ext/instance/surface/gryphn_surface.h" +#include "GryphnLoader/src/ext/device/swapchain/gryphn_swapchain.h" #ifdef __cplusplus } #endif diff --git a/main.cpp b/main.cpp index 85e04c1..8f33a42 100644 --- a/main.cpp +++ b/main.cpp @@ -23,7 +23,7 @@ gnDevice device; gnSurface surface; gnSwapchain swapchain; -int min(int a, int b) { +uint32_t min(uint32_t a, uint32_t b) { if (a < b) return a; return b; } @@ -129,25 +129,25 @@ gnPresentMode getPresentMode() { void createSwapchain() { - // gnSurfaceCapabilities capabilites; - // gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites); + gnSurfaceCapabilities capabilites; + gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites); - // gnSurfaceFormat chosenFormat = getSurfaceFormat(); - // gnPresentMode chosenMode = getPresentMode(); + gnSurfaceFormat chosenFormat = getSurfaceFormat(); + gnPresentMode chosenMode = getPresentMode(); - // int width, height; - // glfwGetWindowSize(window, &width, &height); + int width, height; + glfwGetWindowSize(window, &width, &height); - // gnSwapchainCreateInfo createInfo = { - // .surface = surface, - // .minImageCount = min(capabilites.minImageCount + 1, capabilites.maxImageCount), - // .imageFormat = chosenFormat.format, - // .imageColorSpace = chosenFormat.colorSpace, - // .imageExtent = { width, height }, - // .imageArrayLayers = 1, - // .presentMode = chosenMode, - // }; - // CHECK(gnCreateSwapchain(device, &createInfo, &swapchain)); + gnSwapchainCreateInfo createInfo = { + .surface = surface, + .minImageCount = min(capabilites.minImageCount + 1, capabilites.maxImageCount), + .imageFormat = chosenFormat.format, + .imageColorSpace = chosenFormat.colorSpace, + .imageExtent = { (uint32_t)width, (uint32_t)height }, + .imageArrayLayers = 1, + .presentMode = chosenMode, + }; + CHECK(gnCreateSwapchain(device, &createInfo, &swapchain)); } int main() {