Image view creation code cleanup.

This commit is contained in:
Artem Kharytoniuk 2017-04-26 19:32:58 +03:00
parent a8fc2da718
commit d66d7c4363

View File

@ -323,30 +323,6 @@ static VkRenderPass create_render_pass(VkDevice device, VkFormat color_format, V
return render_pass; return render_pass;
} }
static VkImageView create_image_view(VkImage image, VkFormat format, VkImageAspectFlags aspect_flags) {
VkImageViewCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
desc.pNext = nullptr;
desc.flags = 0;
desc.image = image;
desc.viewType = VK_IMAGE_VIEW_TYPE_2D;
desc.format = format;
desc.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.subresourceRange.aspectMask = aspect_flags;
desc.subresourceRange.baseMipLevel = 0;
desc.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
desc.subresourceRange.baseArrayLayer = 0;
desc.subresourceRange.layerCount = 1;
VkImageView image_view;
VK_CHECK(vkCreateImageView(vk.device, &desc, nullptr, &image_view));
return image_view;
}
static void record_and_run_commands(VkCommandPool command_pool, VkQueue queue, std::function<void(VkCommandBuffer)> recorder) { static void record_and_run_commands(VkCommandPool command_pool, VkQueue queue, std::function<void(VkCommandBuffer)> recorder) {
VkCommandBufferAllocateInfo alloc_info; VkCommandBufferAllocateInfo alloc_info;
@ -602,6 +578,8 @@ void vk_create_instance(HWND hwnd) {
{ {
VkFormat depth_format = find_depth_format(vk.physical_device); VkFormat depth_format = find_depth_format(vk.physical_device);
// create depth image
{
VkImageCreateInfo desc; VkImageCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; desc.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
desc.pNext = nullptr; desc.pNext = nullptr;
@ -620,9 +598,11 @@ void vk_create_instance(HWND hwnd) {
desc.queueFamilyIndexCount = 0; desc.queueFamilyIndexCount = 0;
desc.pQueueFamilyIndices = nullptr; desc.pQueueFamilyIndices = nullptr;
desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
VK_CHECK(vkCreateImage(vk.device, &desc, nullptr, &vk.depth_image)); VK_CHECK(vkCreateImage(vk.device, &desc, nullptr, &vk.depth_image));
}
// allocate depth image memory
{
VkMemoryRequirements memory_requirements; VkMemoryRequirements memory_requirements;
vkGetImageMemoryRequirements(vk.device, vk.depth_image, &memory_requirements); vkGetImageMemoryRequirements(vk.device, vk.depth_image, &memory_requirements);
@ -634,7 +614,28 @@ void vk_create_instance(HWND hwnd) {
VK_CHECK(vkAllocateMemory(vk.device, &alloc_info, nullptr, &vk.depth_image_memory)); VK_CHECK(vkAllocateMemory(vk.device, &alloc_info, nullptr, &vk.depth_image_memory));
VK_CHECK(vkBindImageMemory(vk.device, vk.depth_image, vk.depth_image_memory, 0)); VK_CHECK(vkBindImageMemory(vk.device, vk.depth_image, vk.depth_image_memory, 0));
vk.depth_image_view = create_image_view(vk.depth_image, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT); }
// create depth image view
{
VkImageViewCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
desc.pNext = nullptr;
desc.flags = 0;
desc.image = vk.depth_image;
desc.viewType = VK_IMAGE_VIEW_TYPE_2D;
desc.format = depth_format;
desc.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
desc.subresourceRange.baseMipLevel = 0;
desc.subresourceRange.levelCount = 1;
desc.subresourceRange.baseArrayLayer = 0;
desc.subresourceRange.layerCount = 1;
VK_CHECK(vkCreateImageView(vk.device, &desc, nullptr, &vk.depth_image_view));
}
record_and_run_commands(vk.command_pool, vk.queue, [&depth_format](VkCommandBuffer command_buffer) { record_and_run_commands(vk.command_pool, vk.queue, [&depth_format](VkCommandBuffer command_buffer) {
record_image_layout_transition(command_buffer, vk.depth_image, depth_format, 0, VK_IMAGE_LAYOUT_UNDEFINED, record_image_layout_transition(command_buffer, vk.depth_image, depth_format, 0, VK_IMAGE_LAYOUT_UNDEFINED,
@ -642,10 +643,17 @@ void vk_create_instance(HWND hwnd) {
}); });
} }
//
// Renderpass.
//
{
VkFormat depth_format = find_depth_format(vk.physical_device); VkFormat depth_format = find_depth_format(vk.physical_device);
vk.render_pass = create_render_pass(vk.device, vk.surface_format.format, depth_format); vk.render_pass = create_render_pass(vk.device, vk.surface_format.format, depth_format);
}
//
// Framebuffers for each swapchain image.
//
{ {
VkImageView attachments[2] = {VK_NULL_HANDLE, vk.depth_image_view}; VkImageView attachments[2] = {VK_NULL_HANDLE, vk.depth_image_view};
@ -1008,7 +1016,26 @@ Vk_Image vk_create_image(int width, int height, int mip_levels) {
allocate_and_bind_image_memory(image.handle); allocate_and_bind_image_memory(image.handle);
} }
image.view = create_image_view(image.handle, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT); // create image view
{
VkImageViewCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
desc.pNext = nullptr;
desc.flags = 0;
desc.image = image.handle;
desc.viewType = VK_IMAGE_VIEW_TYPE_2D;
desc.format = VK_FORMAT_R8G8B8A8_UNORM;
desc.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
desc.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
desc.subresourceRange.baseMipLevel = 0;
desc.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
desc.subresourceRange.baseArrayLayer = 0;
desc.subresourceRange.layerCount = 1;
VK_CHECK(vkCreateImageView(vk.device, &desc, nullptr, &image.view));
}
// create associated descriptor set // create associated descriptor set
{ {