Create function for image creation

This commit is contained in:
Camden Dixie O'Brien committed 2025-10-04 14:25:14 +01:00
1 parent 2cf4f6832d
commit aa2fc4a41a
2 files changed
+57 -47

No files matched your search

+55 -45
View File
@@ -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);
+2 -2
View File
@@ -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;