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,39 +578,64 @@ void vk_create_instance(HWND hwnd) {
{ {
VkFormat depth_format = find_depth_format(vk.physical_device); VkFormat depth_format = find_depth_format(vk.physical_device);
VkImageCreateInfo desc; // create depth image
desc.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; {
desc.pNext = nullptr; VkImageCreateInfo desc;
desc.flags = 0; desc.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
desc.imageType = VK_IMAGE_TYPE_2D; desc.pNext = nullptr;
desc.format = depth_format; desc.flags = 0;
desc.extent.width = glConfig.vidWidth; desc.imageType = VK_IMAGE_TYPE_2D;
desc.extent.height = glConfig.vidHeight; desc.format = depth_format;
desc.extent.depth = 1; desc.extent.width = glConfig.vidWidth;
desc.mipLevels = 1; desc.extent.height = glConfig.vidHeight;
desc.arrayLayers = 1; desc.extent.depth = 1;
desc.samples = VK_SAMPLE_COUNT_1_BIT; desc.mipLevels = 1;
desc.tiling = VK_IMAGE_TILING_OPTIMAL; desc.arrayLayers = 1;
desc.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; desc.samples = VK_SAMPLE_COUNT_1_BIT;
desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE; desc.tiling = VK_IMAGE_TILING_OPTIMAL;
desc.queueFamilyIndexCount = 0; desc.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
desc.pQueueFamilyIndices = nullptr; desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; desc.queueFamilyIndexCount = 0;
desc.pQueueFamilyIndices = nullptr;
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;
vkGetImageMemoryRequirements(vk.device, vk.depth_image, &memory_requirements);
VkMemoryRequirements memory_requirements; VkMemoryAllocateInfo alloc_info;
vkGetImageMemoryRequirements(vk.device, vk.depth_image, &memory_requirements); alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
alloc_info.pNext = nullptr;
alloc_info.allocationSize = memory_requirements.size;
alloc_info.memoryTypeIndex = find_memory_type(vk.physical_device, memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
VkMemoryAllocateInfo alloc_info; VK_CHECK(vkAllocateMemory(vk.device, &alloc_info, nullptr, &vk.depth_image_memory));
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; VK_CHECK(vkBindImageMemory(vk.device, vk.depth_image, vk.depth_image_memory, 0));
alloc_info.pNext = nullptr; }
alloc_info.allocationSize = memory_requirements.size;
alloc_info.memoryTypeIndex = find_memory_type(vk.physical_device, memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
VK_CHECK(vkAllocateMemory(vk.device, &alloc_info, nullptr, &vk.depth_image_memory)); // create depth image view
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); 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) {
}); });
} }
VkFormat depth_format = find_depth_format(vk.physical_device); //
// Renderpass.
vk.render_pass = create_render_pass(vk.device, vk.surface_format.format, depth_format); //
{
VkFormat depth_format = find_depth_format(vk.physical_device);
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
{ {