Files
Gryphn/rendering_api/vulkan/src/commands/vulkan_command_submit.cpp
2025-05-05 19:29:42 -04:00

57 lines
2.4 KiB
C++

#include <gryphn/gryphn_utils.h>
#include "core/commands/submit_command/gryphn_command_submit.h"
#include "../sync_objects/vulkan_sync_semaphore.h"
#include "vulkan_command_buffer.h"
#include "../sync_objects/vulkan_fence.h"
struct gnPlatformCommandSubmitData {
VkSubmitInfo submitInfo{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO
};
VkResult result;
};
VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
void gnCommandSubmitDataSetWaitSemaphoreFn(gnCommandSubmitData& data, const gnSyncSemaphore& semaphore) {
data.commandSubmitData->submitInfo.waitSemaphoreCount = 1;
data.commandSubmitData->submitInfo.pWaitSemaphores = &semaphore.semaphore->semaphore;
data.commandSubmitData->submitInfo.pWaitDstStageMask = waitStages;
}
void gnCommandSubmitDataSetCommandBufferFn(gnCommandSubmitData& data, const gnCommandBuffer& commandBuffer) {
data.commandSubmitData->submitInfo.commandBufferCount = 1;
data.commandSubmitData->submitInfo.pCommandBuffers = &commandBuffer.commandBuffer->commandBuffer;
}
void gnCommandSubmitDataSetSignalSemaphoreFn(gnCommandSubmitData& data, const gnSyncSemaphore& semaphore) {
data.commandSubmitData->submitInfo.signalSemaphoreCount = 1;
data.commandSubmitData->submitInfo.pSignalSemaphores = &semaphore.semaphore->semaphore;
}
GN_EXPORT gnPresentationQueueState gnCommandSubmitGetValidPresentationQueueFn(gnCommandSubmitData& data) {
if (data.commandSubmitData->result == VK_ERROR_OUT_OF_DATE_KHR) {
return GN_OUT_OF_DATE;
} else if (data.commandSubmitData->result == VK_SUBOPTIMAL_KHR) {
return GN_SUBOPTIMAL;
}
else if (data.commandSubmitData->result == VK_SUCCESS) {
return GN_VALID;
}
return GN_VALID;
}
GN_EXPORT gnReturnCode gnCommandSubmitFn(gnCommandSubmitData& data, const gnFence& fence) {
if (data.commandSubmitData == nullptr) data.commandSubmitData = new gnPlatformCommandSubmitData();
gnCommandSubmitDataSetWaitSemaphoreFn(data, *data.waitSemaphore);
gnCommandSubmitDataSetCommandBufferFn(data, *data.commandBuffer);
gnCommandSubmitDataSetSignalSemaphoreFn(data, *data.signalSemaphore);
data.commandSubmitData->result = vkQueueSubmit(fence.fence->device->outputDevice->graphicsQueue, 1, &data.commandSubmitData->submitInfo, fence.fence->fence);
if (data.commandSubmitData->result != VK_SUCCESS) {
return GN_FAILED;
}
return GN_SUCCESS;
}