From aa2fc4a41a8743bd1a1a95701a313b9e944265b5 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Sat, 4 Oct 2025 14:25:14 +0100 Subject: [PATCH] Create function for image creation --- gpu.c | 100 ++++++++++++++++++++++++++++++++-------------------------- gpu.h | 4 +-- 2 files changed, 57 insertions(+), 47 deletions(-) diff --git a/gpu.c b/gpu.c index b265459..911a83b 100644 --- a/gpu.c +++ b/gpu.c @@ -146,6 +146,52 @@ static void load_buffer( vkFreeCommandBuffers(ctx->dev, ctx->transient_cmd_pool, 1, &cmd_buf); } +static void create_img( + const gpu_ctx_t *ctx, VkFormat fmt, uint32_t width, uint32_t height, + VkImageUsageFlags usage, VkImageAspectFlags aspect, VkImage *img, + VkDeviceMemory *mem, VkImageView *view) +{ + VkResult result; + + // Create image + const VkImageCreateInfo img_config = { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .imageType = VK_IMAGE_TYPE_2D, + .extent = { .width = width, .height = height, .depth = 1 }, + .mipLevels = 1, + .arrayLayers = 1, + .format = fmt, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .usage = usage, + .samples = VK_SAMPLE_COUNT_1_BIT, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + }; + result = vkCreateImage(ctx->dev, &img_config, nullptr, img); + assert(result == VK_SUCCESS); + + // Allocate and bind memory + VkMemoryRequirements mem_reqs; + vkGetImageMemoryRequirements(ctx->dev, *img, &mem_reqs); + alloc_dev_mem(ctx, mem_reqs, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mem); + vkBindImageMemory(ctx->dev, *img, *mem, 0); + + // Create view + const VkImageViewCreateInfo view_config = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = *img, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = fmt, + .subresourceRange = { + .aspectMask = aspect, + .levelCount = 1, + .layerCount = 1, + }, + }; + result = vkCreateImageView(ctx->dev, &view_config, nullptr, view); + assert(result == VK_SUCCESS); +} + void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name) { // Initialise Vulkan instance. @@ -348,48 +394,12 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name) // Set up depth image const VkFormat depth_img_fmt = VK_FORMAT_D32_SFLOAT; - const VkImageCreateInfo depth_img_config = { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .imageType = VK_IMAGE_TYPE_2D, - .extent = { - .width = ctx->swapchain_extent.width, - .height = ctx->swapchain_extent.height, - .depth = 1, - }, - .mipLevels = 1, - .arrayLayers = 1, - .format = depth_img_fmt, - .tiling = VK_IMAGE_TILING_OPTIMAL, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, - .samples = VK_SAMPLE_COUNT_1_BIT, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - }; - result = vkCreateImage( - ctx->dev, &depth_img_config, nullptr, &ctx->depth_img); - assert(result == VK_SUCCESS); - VkMemoryRequirements mem_reqs; - vkGetImageMemoryRequirements(ctx->dev, ctx->depth_img, &mem_reqs); - alloc_dev_mem( - ctx, mem_reqs, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - &ctx->depth_img_mem); - vkBindImageMemory(ctx->dev, ctx->depth_img, ctx->depth_img_mem, 0); - - // Create depth image view - const VkImageViewCreateInfo depth_img_view_config = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .image = ctx->depth_img, - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = depth_img_fmt, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, - .levelCount = 1, - .layerCount = 1, - }, - }; - result = vkCreateImageView( - ctx->dev, &depth_img_view_config, nullptr, &ctx->depth_img_view); - assert(result == VK_SUCCESS); + create_img( + ctx, depth_img_fmt, ctx->swapchain_extent.width, + ctx->swapchain_extent.height, + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + VK_IMAGE_ASPECT_DEPTH_BIT, &ctx->depth_img, &ctx->depth_mem, + &ctx->depth_view); // Set up viewport configuration const VkViewport viewport = { @@ -720,7 +730,7 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name) for (unsigned i = 0; i < ctx->swapchain_img_count; ++i) { VkImageView attachments[] = { ctx->swapchain_img_views[i], - ctx->depth_img_view, + ctx->depth_view, }; const VkFramebufferCreateInfo framebuffer_config = { .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, @@ -825,9 +835,9 @@ void gpu_cleanup(const gpu_ctx_t *ctx) vkDestroyRenderPass(ctx->dev, ctx->render_pass, nullptr); - vkDestroyImageView(ctx->dev, ctx->depth_img_view, nullptr); + vkDestroyImageView(ctx->dev, ctx->depth_view, nullptr); vkDestroyImage(ctx->dev, ctx->depth_img, nullptr); - vkFreeMemory(ctx->dev, ctx->depth_img_mem, nullptr); + vkFreeMemory(ctx->dev, ctx->depth_mem, nullptr); for (unsigned i = 0; i < ctx->swapchain_img_count; ++i) { vkDestroyFramebuffer(ctx->dev, ctx->framebuffers[i], nullptr); diff --git a/gpu.h b/gpu.h index c4f7e10..c67a68b 100644 --- a/gpu.h +++ b/gpu.h @@ -20,8 +20,8 @@ typedef struct { uint32_t swapchain_img_count; VkImageView swapchain_img_views[MAX_FRAMES_IN_FLIGHT]; VkImage depth_img; - VkDeviceMemory depth_img_mem; - VkImageView depth_img_view; + VkDeviceMemory depth_mem; + VkImageView depth_view; VkFramebuffer framebuffers[MAX_FRAMES_IN_FLIGHT]; VkShaderModule floor_vert_shader; VkShaderModule model_vert_shader;