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);
|
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)
|
void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
||||||
{
|
{
|
||||||
// Initialise Vulkan instance.
|
// Initialise Vulkan instance.
|
||||||
@@ -348,48 +394,12 @@ void gpu_init(gpu_ctx_t *ctx, GLFWwindow *window, const char *name)
|
|||||||
|
|
||||||
// Set up depth image
|
// Set up depth image
|
||||||
const VkFormat depth_img_fmt = VK_FORMAT_D32_SFLOAT;
|
const VkFormat depth_img_fmt = VK_FORMAT_D32_SFLOAT;
|
||||||
const VkImageCreateInfo depth_img_config = {
|
create_img(
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
|
ctx, depth_img_fmt, ctx->swapchain_extent.width,
|
||||||
.imageType = VK_IMAGE_TYPE_2D,
|
ctx->swapchain_extent.height,
|
||||||
.extent = {
|
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
|
||||||
.width = ctx->swapchain_extent.width,
|
VK_IMAGE_ASPECT_DEPTH_BIT, &ctx->depth_img, &ctx->depth_mem,
|
||||||
.height = ctx->swapchain_extent.height,
|
&ctx->depth_view);
|
||||||
.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);
|
|
||||||
|
|
||||||
// Set up viewport configuration
|
// Set up viewport configuration
|
||||||
const VkViewport viewport = {
|
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) {
|
for (unsigned i = 0; i < ctx->swapchain_img_count; ++i) {
|
||||||
VkImageView attachments[] = {
|
VkImageView attachments[] = {
|
||||||
ctx->swapchain_img_views[i],
|
ctx->swapchain_img_views[i],
|
||||||
ctx->depth_img_view,
|
ctx->depth_view,
|
||||||
};
|
};
|
||||||
const VkFramebufferCreateInfo framebuffer_config = {
|
const VkFramebufferCreateInfo framebuffer_config = {
|
||||||
.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
|
.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);
|
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);
|
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) {
|
for (unsigned i = 0; i < ctx->swapchain_img_count; ++i) {
|
||||||
vkDestroyFramebuffer(ctx->dev, ctx->framebuffers[i], nullptr);
|
vkDestroyFramebuffer(ctx->dev, ctx->framebuffers[i], nullptr);
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ typedef struct {
|
|||||||
uint32_t swapchain_img_count;
|
uint32_t swapchain_img_count;
|
||||||
VkImageView swapchain_img_views[MAX_FRAMES_IN_FLIGHT];
|
VkImageView swapchain_img_views[MAX_FRAMES_IN_FLIGHT];
|
||||||
VkImage depth_img;
|
VkImage depth_img;
|
||||||
VkDeviceMemory depth_img_mem;
|
VkDeviceMemory depth_mem;
|
||||||
VkImageView depth_img_view;
|
VkImageView depth_view;
|
||||||
VkFramebuffer framebuffers[MAX_FRAMES_IN_FLIGHT];
|
VkFramebuffer framebuffers[MAX_FRAMES_IN_FLIGHT];
|
||||||
VkShaderModule floor_vert_shader;
|
VkShaderModule floor_vert_shader;
|
||||||
VkShaderModule model_vert_shader;
|
VkShaderModule model_vert_shader;
|
||||||
|
|||||||
Reference in new issue
Block a user