From d596dfc579d87662f84254a51d0e5e1d1b1c6299 Mon Sep 17 00:00:00 2001 From: Warwick New Date: Mon, 6 Jan 2025 14:51:40 +0000 Subject: [PATCH] Added helper function for loading shaders into buffers --- src/main.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index ad51a50..efaad3b 100644 --- a/src/main.c +++ b/src/main.c @@ -183,17 +183,12 @@ void createInstance(Application *app) { } } - // This currently leaks memory :( + // This currently leaks memory on laptop :( VkResult result = vkCreateInstance(&createInfo, NULL, &app->instance); if (result != VK_SUCCESS) { fprintf(stderr, "Failed to create vulkan instance\n"); exit(EXIT_FAILURE); } - - //printf("Instance Extentions Available:\n"); - //for (uint i = 0; i < extensionCount; i++) { - // printf("\t%s\n", extensions[i].extensionName); - //} } void initWindow(Application *app) { @@ -615,6 +610,61 @@ void createImageViews(Application *app) { } } +// Buffer should be freed +typedef struct { + char *buffer; + size_t bufferSize; +} ShaderBuffer; + +ShaderBuffer loadShaderIntoBuffer(const char *fileLocation) { + ShaderBuffer buf = {.buffer = NULL, .bufferSize = 0}; + FILE *file = fopen(fileLocation, "r"); + + if (file == NULL) { + fprintf(stderr, "Could not open file \"%s\"!\n", fileLocation); + exit(EXIT_FAILURE); + } + + if (fseek(file, 0L, SEEK_END) != 0) { + fprintf(stderr, "Could not seek to the end of file \"%s\"!\n", + fileLocation); + exit(EXIT_FAILURE); + } + buf.bufferSize = ftell(file); + + if (fseek(file, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Could not seek to the start of file \"%s\"!\n", + fileLocation); + exit(EXIT_FAILURE); + } + buf.buffer = malloc(sizeof(char) * (buf.bufferSize)); // Not '\0' terminting ourselves + + size_t tempSize = fread(buf.buffer, sizeof(char), buf.bufferSize, file); + if (ferror(file) != 0) { + fprintf(stderr, "Error reading file into buffer \"%s\"!\n", fileLocation); + exit(EXIT_FAILURE); + } + fclose(file); + + return buf; +} + +void createGraphicsPipeline(Application *app) { + ShaderBuffer vertShader = loadShaderIntoBuffer("shaders/shader.vert.spv"); + for (int i = 0; i < vertShader.bufferSize;i++){ + printf("%c",vertShader.buffer[i]); + } + printf("\n"); + ShaderBuffer fragShader = loadShaderIntoBuffer("shaders/shader.frag.spv"); + for (int i = 0; i < fragShader.bufferSize;i++){ + printf("%c",fragShader.buffer[i]); + } + printf("\n"); + + free(vertShader.buffer); + free(fragShader.buffer); +} + void initVulkan(Application *app) { createInstance(app); setupDebugMessenger(app); @@ -623,6 +673,7 @@ void initVulkan(Application *app) { createLogicalDevice(app); createSwapChain(app); createImageViews(app); + createGraphicsPipeline(app); } void mainLoop(Application *app) {