From 7ebb109c445cde3c5ce47b49674c07bf5a47ee6f Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Fri, 30 May 2025 13:28:10 -0400 Subject: [PATCH] present stuff --- include/gryphn/gryphn.h | 1 + .../vulkan/src/present/vulkan_present.c | 28 +++++++++++++++++++ src/core/gryphn_platform_functions.h | 2 ++ src/core/instance/init/gryphn_init.c | 1 + src/core/present/gryphn_present.c | 6 ++++ src/core/present/gryphn_present.h | 14 ++++++++++ 6 files changed, 52 insertions(+) create mode 100644 rendering_api/vulkan/src/present/vulkan_present.c create mode 100644 src/core/present/gryphn_present.c create mode 100644 src/core/present/gryphn_present.h diff --git a/include/gryphn/gryphn.h b/include/gryphn/gryphn.h index ccd94a0..802a566 100644 --- a/include/gryphn/gryphn.h +++ b/include/gryphn/gryphn.h @@ -20,3 +20,4 @@ #include #include #include +#include diff --git a/rendering_api/vulkan/src/present/vulkan_present.c b/rendering_api/vulkan/src/present/vulkan_present.c new file mode 100644 index 0000000..6b6b811 --- /dev/null +++ b/rendering_api/vulkan/src/present/vulkan_present.c @@ -0,0 +1,28 @@ +#include "core/present/gryphn_present.h" +#include "sync/semaphore/vulkan_semaphore.h" +#include "presentation_queue/vulkan_presentation_queue.h" +#include "output_device/vulkan_output_devices.h" + +gnReturnCode gnPresentFn(struct gnOutputDevice_t* device, struct gnPresentInfo_t info) { + VkSemaphore* waitSemaphores = malloc(sizeof(VkSemaphore) * info.waitCount); + for (int i = 0; i < info.waitCount; i++) waitSemaphores[i] = info.waitSemaphores[i].semaphore->semaphore; + + VkSwapchainKHR* swapchains = malloc(sizeof(VkSwapchainKHR) * info.presentationQueueCount); + for (int i = 0; i < info.presentationQueueCount; i++) swapchains[i] = info.presentationQueues[i].presentationQueue->swapChain; + + VkPresentInfoKHR presentInfo = { + .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, + .waitSemaphoreCount = info.waitCount, + .pWaitSemaphores = waitSemaphores, + .swapchainCount = info.presentationQueueCount, + .pSwapchains = swapchains, + .pImageIndices = info.imageIndices + }; + + VkQueue queue; + vkGetDeviceQueue(device->outputDevice->device, info.queueIndex, 0, &queue); + + vkQueuePresentKHR(queue, &presentInfo); + + return GN_SUCCESS; +} diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 2cb0385..cb91dbb 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -17,6 +17,7 @@ #include "sync/fence/gryphn_fence.h" #include "sync/semaphore/gryphn_semaphore.h" #include "core/submit/gryphn_submit.h" +#include "core/present/gryphn_present.h" typedef struct gnFunctions_t { gnReturnCode (*_gnCreateInstance)(gnInstance* instance, struct gnInstanceInfo_t info); @@ -87,6 +88,7 @@ typedef struct gnDeviceFunctions_t { void (*_gnDestroyFence)(struct gnFence_t* fence); gnReturnCode (*_gnSubmit)(struct gnOutputDevice_t* device, struct gnSubmitInfo_t submit); + gnReturnCode (*_gnPresent)(struct gnOutputDevice_t* device, struct gnPresentInfo_t info); } gnDeviceFunctions; typedef struct gnCommandFunctions_t { diff --git a/src/core/instance/init/gryphn_init.c b/src/core/instance/init/gryphn_init.c index b41d08b..719d679 100644 --- a/src/core/instance/init/gryphn_init.c +++ b/src/core/instance/init/gryphn_init.c @@ -90,6 +90,7 @@ void gnLoadDeviceFunctions(struct gnDynamicLibrary_t* lib, struct gnDeviceFuncti gnLoadDLLFunction(lib, functions->_gnResetFence, "gnResetFenceFn"); gnLoadDLLFunction(lib, functions->_gnDestroyFence, "gnDestroyFenceFn"); gnLoadDLLFunction(lib, functions->_gnSubmit, "gnSubmitFn"); + gnLoadDLLFunction(lib, functions->_gnPresent, "gnPresentFn"); } void gnLoadCommandFunctions(struct gnDynamicLibrary_t* lib, struct gnCommandFunctions_t* functions) { diff --git a/src/core/present/gryphn_present.c b/src/core/present/gryphn_present.c new file mode 100644 index 0000000..100cad1 --- /dev/null +++ b/src/core/present/gryphn_present.c @@ -0,0 +1,6 @@ +#include "core/gryphn_platform_functions.h" +#include "gryphn_present.h" + +gnReturnCode gnPresent(struct gnOutputDevice_t* device, struct gnPresentInfo_t info) { + return device->deviceFunctions->_gnPresent(device, info); +} diff --git a/src/core/present/gryphn_present.h b/src/core/present/gryphn_present.h new file mode 100644 index 0000000..bc9dd97 --- /dev/null +++ b/src/core/present/gryphn_present.h @@ -0,0 +1,14 @@ +#pragma once +#include "core/sync/semaphore/gryphn_semaphore.h" +#include "core/presentation_queue/gryphn_presentation_queue.h" + +typedef struct gnPresentInfo_t { + uint32_t waitCount; + struct gnSemaphore_t* waitSemaphores; + uint32_t presentationQueueCount; + struct gnPresentationQueue_t* presentationQueues; + uint32_t* imageIndices; + uint32_t queueIndex; +} gnPresentInfo; + +gnReturnCode gnPresent(struct gnOutputDevice_t* device, struct gnPresentInfo_t info);