From 2c6c2b25922af5a0ed6d705b49451f49819012a5 Mon Sep 17 00:00:00 2001 From: Warwick New Date: Sun, 26 Jan 2025 12:34:48 +0000 Subject: [PATCH] Moved functions and the like to appropriate enough file structure for now --- src/main.c | 14 +++++++---- src/vulkan_wrapper.c | 55 +++++++++++++++++--------------------------- src/vulkan_wrapper.h | 11 +++++---- src/window.c | 18 +++++++++++++++ src/window.h | 6 +++++ 5 files changed, 60 insertions(+), 44 deletions(-) diff --git a/src/main.c b/src/main.c index 0d68a26..594a0cf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,13 +1,17 @@ #include "vulkan_wrapper.h" +#include "window.h" #include int main(void) { - Application app = {0}; + VulkanApp app = {0}; - initWindow(&app); - initVulkan(&app); - mainLoop(&app); - cleanup(&app); + window_init(&app); + vulkan_init(&app); + + mainLoop(&app); // TODO: pull this out of vulkan_wrapper + + vulkan_deinit(&app); + window_deinit(&app); return EXIT_SUCCESS; } diff --git a/src/vulkan_wrapper.c b/src/vulkan_wrapper.c index 9efbc8e..146f584 100644 --- a/src/vulkan_wrapper.c +++ b/src/vulkan_wrapper.c @@ -43,7 +43,6 @@ size_t validationLayerCount = static bool framebufferResized; // initialised to 0 - typedef struct SwapChainSupportDetails { VkSurfaceCapabilitiesKHR capabilities; uint32_t numFormats; @@ -106,7 +105,7 @@ void populateDebugMessengerCreateInfo( createInfo->pfnUserCallback = debugCallback; } -void createInstance(Application *app) { +void createInstance(VulkanApp *app) { if (enableValidationLayers && !checkValidationLayerSupport()) { fprintf(stderr, "Validation layers requested, but not available!\n"); exit(EXIT_FAILURE); @@ -178,20 +177,10 @@ void createInstance(Application *app) { } } -static void framebufferResizeCallback(GLFWwindow *window, int width, - int height) { +void framebufferResizeCallback(GLFWwindow *window, int width, int height) { framebufferResized = true; } -void initWindow(Application *app) { - glfwInit(); - glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); - app->window = glfwCreateWindow(800, 600, "Vulkan", NULL, NULL); - - glfwSetFramebufferSizeCallback(app->window, framebufferResizeCallback); -} - VkResult CreateDebugUtilsMessengerEXT( VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -206,7 +195,7 @@ VkResult CreateDebugUtilsMessengerEXT( } } -void setupDebugMessenger(Application *app) { +void setupDebugMessenger(VulkanApp *app) { if (!enableValidationLayers) { return; } @@ -401,7 +390,7 @@ bool isDeviceSuitable(VkPhysicalDevice device, VkSurfaceKHR *surface) { return completeIndeces && extensionsSupported && swapChainAdequate; } -void pickPhysicalDevice(Application *app) { +void pickPhysicalDevice(VulkanApp *app) { VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; uint32_t physicalDeviceCount; @@ -431,7 +420,7 @@ void pickPhysicalDevice(Application *app) { app->physicalDevice = physicalDevice; } -void createLogicalDevice(Application *app) { +void createLogicalDevice(VulkanApp *app) { QueueFamilyIndices indices = findQueueFamilies(app->physicalDevice, &app->surface); @@ -499,14 +488,14 @@ void createLogicalDevice(Application *app) { vkGetDeviceQueue(app->device, indices.presentFamily, 0, &app->presentQueue); } -void createSurface(Application *app) { +void createSurface(VulkanApp *app) { if (glfwCreateWindowSurface(app->instance, app->window, NULL, &app->surface) != VK_SUCCESS) { fprintf(stderr, "Error creating vulkan surface in glfw window."); exit(EXIT_FAILURE); } } -void createSwapChain(Application *app) { +void createSwapChain(VulkanApp *app) { SwapChainSupportDetails swapChainSupport = querySwapchainSupport(app->physicalDevice, &app->surface); VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat( @@ -572,7 +561,7 @@ void createSwapChain(Application *app) { free(swapChainSupport.formats); } -void createImageViews(Application *app) { +void createImageViews(VulkanApp *app) { app->swapChainImageViewCount = app->swapChainImageCount; app->swapChainImageViews = malloc(app->swapChainImageViewCount * sizeof(VkImageView)); @@ -659,7 +648,7 @@ VkShaderModule createShaderModule(VkDevice device, ShaderBuffer code) { return shaderModule; } -void createGraphicsPipeline(Application *app) { +void createGraphicsPipeline(VulkanApp *app) { ShaderBuffer vertShaderCode = loadShaderIntoBuffer("shaders/shader.vert.spv"); ShaderBuffer fragShaderCode = loadShaderIntoBuffer("shaders/shader.frag.spv"); @@ -812,7 +801,7 @@ void createGraphicsPipeline(Application *app) { vkDestroyShaderModule(app->device, vertShaderModule, NULL); } -void createRenderPass(Application *app) { +void createRenderPass(VulkanApp *app) { VkAttachmentDescription colorAttachment = {0}; colorAttachment.format = app->swapChainImageFormat; colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; @@ -856,7 +845,7 @@ void createRenderPass(Application *app) { } } -void createFramebuffers(Application *app) { +void createFramebuffers(VulkanApp *app) { app->swapChainFramebufferCount = app->swapChainImageViewCount; app->swapChainFramebuffers = malloc(app->swapChainFramebufferCount * sizeof(VkFramebuffer)); @@ -881,7 +870,7 @@ void createFramebuffers(Application *app) { } } -void CreateCommandPool(Application *app) { +void CreateCommandPool(VulkanApp *app) { QueueFamilyIndices queueFamilyIndices = findQueueFamilies(app->physicalDevice, &app->surface); @@ -897,7 +886,7 @@ void CreateCommandPool(Application *app) { } } -void recordCommandBuffer(Application *app, VkCommandBuffer commandBuffer, +void recordCommandBuffer(VulkanApp *app, VkCommandBuffer commandBuffer, uint32_t imageIndex) { VkCommandBufferBeginInfo beginInfo = {0}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -953,7 +942,7 @@ void recordCommandBuffer(Application *app, VkCommandBuffer commandBuffer, } } -void createCommandBuffer(Application *app) { +void createCommandBuffer(VulkanApp *app) { VkCommandBufferAllocateInfo allocInfo = {0}; allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; allocInfo.commandPool = app->commandPool; @@ -967,7 +956,7 @@ void createCommandBuffer(Application *app) { } } -void createSyncObjects(Application *app) { +void createSyncObjects(VulkanApp *app) { VkSemaphoreCreateInfo semaphoreInfo = {0}; semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; @@ -988,7 +977,7 @@ void createSyncObjects(Application *app) { } } -void cleanupSwapChain(Application *app) { +void cleanupSwapChain(VulkanApp *app) { for (size_t i = 0; i < app->swapChainFramebufferCount; i++) { vkDestroyFramebuffer(app->device, app->swapChainFramebuffers[i], NULL); @@ -1005,7 +994,7 @@ void cleanupSwapChain(Application *app) { vkDestroySwapchainKHR(app->device, app->swapChain, NULL); } -void recreateSwapChain(Application *app) { +void recreateSwapChain(VulkanApp *app) { int width = 0, height = 0; glfwGetFramebufferSize(app->window, &width, &height); while (width == 0 || height == 0) { @@ -1021,7 +1010,7 @@ void recreateSwapChain(Application *app) { createFramebuffers(app); } -void initVulkan(Application *app) { +void vulkan_init(VulkanApp *app) { createInstance(app); setupDebugMessenger(app); createSurface(app); @@ -1037,7 +1026,7 @@ void initVulkan(Application *app) { createSyncObjects(app); } -void drawFrame(Application *app) { +void drawFrame(VulkanApp *app) { vkWaitForFences(app->device, 1, &app->inFlightFences[app->currentFrame], VK_TRUE, UINT64_MAX); @@ -1106,7 +1095,7 @@ void drawFrame(Application *app) { app->currentFrame = (app->currentFrame + 1) % MAX_FRAMES_IN_FLIGHT; } -void mainLoop(Application *app) { +void mainLoop(VulkanApp *app) { while (!glfwWindowShouldClose(app->window)) { glfwPollEvents(); drawFrame(app); @@ -1115,7 +1104,7 @@ void mainLoop(Application *app) { vkDeviceWaitIdle(app->device); } -void cleanup(Application *app) { +void vulkan_deinit(VulkanApp *app) { cleanupSwapChain(app); for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { @@ -1136,6 +1125,4 @@ void cleanup(Application *app) { } vkDestroySurfaceKHR(app->instance, app->surface, NULL); vkDestroyInstance(app->instance, NULL); - glfwDestroyWindow(app->window); - glfwTerminate(); } diff --git a/src/vulkan_wrapper.h b/src/vulkan_wrapper.h index 047f99b..9942739 100644 --- a/src/vulkan_wrapper.h +++ b/src/vulkan_wrapper.h @@ -34,9 +34,10 @@ typedef struct { VkSemaphore renderFinishedSemaphore[MAX_FRAMES_IN_FLIGHT]; VkFence inFlightFences[MAX_FRAMES_IN_FLIGHT]; uint32_t currentFrame; // initialised to 0 -} Application; +} VulkanApp; -void initWindow(Application *app); -void initVulkan(Application *app); -void mainLoop(Application *app); -void cleanup(Application *app); +void vulkan_init(VulkanApp *app); +void mainLoop(VulkanApp *app); +void vulkan_deinit(VulkanApp *app); + +void framebufferResizeCallback(GLFWwindow *window, int width, int height); diff --git a/src/window.c b/src/window.c index e69de29..42562a2 100644 --- a/src/window.c +++ b/src/window.c @@ -0,0 +1,18 @@ +#include "window.h" + +#define GLFW_INCLUDE_VULKAN +#include + +void window_init(VulkanApp *app) { + glfwInit(); + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); + app->window = glfwCreateWindow(800, 600, "Vulkan", NULL, NULL); + + glfwSetFramebufferSizeCallback(app->window, framebufferResizeCallback); +} + +void window_deinit(VulkanApp *app) { + glfwDestroyWindow(app->window); + glfwTerminate(); +} diff --git a/src/window.h b/src/window.h index 6f70f09..09d3f96 100644 --- a/src/window.h +++ b/src/window.h @@ -1 +1,7 @@ #pragma once + +#include "vulkan_wrapper.h" + +void window_init(VulkanApp *app); + +void window_deinit(VulkanApp *app);