51 lines
2.2 KiB
C
51 lines
2.2 KiB
C
#include "vulkan_present.h"
|
|
#include "extensions/synchronization/commands/gryphn_sync_present.h"
|
|
|
|
gnReturnCode vulkanPresentSync(gnDevice device, gnPresentSyncInfo 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);
|
|
|
|
VkResult result = vkQueuePresentKHR(queue, &presentInfo);
|
|
if (result == VK_ERROR_OUT_OF_DATE_KHR) return GN_OUT_OF_DATE_PRESENTATION_QUEUE;
|
|
if (result == VK_SUBOPTIMAL_KHR) return GN_SUBOPTIMAL_PRESENTATION_QUEUE;
|
|
return GN_SUCCESS;
|
|
}
|
|
|
|
|
|
gnReturnCode vulkanPresent(gnDevice device, gnPresentInfo info) {
|
|
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 = 0,
|
|
.pWaitSemaphores = NULL,
|
|
.swapchainCount = info.presentationQueueCount,
|
|
.pSwapchains = swapchains,
|
|
.pImageIndices = info.imageIndices
|
|
};
|
|
|
|
VkQueue queue;
|
|
vkGetDeviceQueue(device->outputDevice->device, info.queueIndex, 0, &queue);
|
|
|
|
VkResult result = vkQueuePresentKHR(queue, &presentInfo);
|
|
if (result == VK_ERROR_OUT_OF_DATE_KHR) return GN_OUT_OF_DATE_PRESENTATION_QUEUE;
|
|
if (result == VK_SUBOPTIMAL_KHR) return GN_SUBOPTIMAL_PRESENTATION_QUEUE;
|
|
return GN_SUCCESS;
|
|
}
|