Create function for image creation
This commit is contained in:
1 parent
2cf4f6832d
commit
aa2fc4a41a
2 files changed
+57
-47
No files matched your search
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user