From 7ae56421ae5cc41f230610e3042839e4586d4cfc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Wed, 6 Jun 2018 17:46:35 +0200 Subject: [PATCH] use image create struct for keeping infos, don't rely on current img layout field of vkh_image for old_layout in transitionning, img being automatically transitionned in various steps --- CMakeLists.txt | 2 +- include/vkh.h | 4 +-- src/vkh_image.c | 80 ++++++++++++++++++++++----------------------- src/vkh_image.h | 8 ++--- src/vkh_presenter.c | 9 +++-- 5 files changed, 51 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7f100d..4e26493 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ MESSAGE(STATUS "VULKAN_SDK = $ENV{VULKAN_SDK}") MESSAGE(STATUS "VK_LAYER_PATH = $ENV{VK_LAYER_PATH}") FIND_PACKAGE(Vulkan REQUIRED) -FIND_PACKAGE(GLFW3 REQUIRED) +FIND_PACKAGE(GLFW3) INCLUDE(GNUInstallDirs) diff --git a/include/vkh.h b/include/vkh.h index 67134e4..98836dd 100644 --- a/include/vkh.h +++ b/include/vkh.h @@ -105,9 +105,9 @@ void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImage void vkh_image_create_view (VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags); void vkh_image_create_sampler (VkhImage img, VkFilter magFilter, VkFilter minFilter, VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode); -void vkh_image_set_layout (VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask, +void vkh_image_set_layout (VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages); -void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange, +void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange, VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages); void vkh_image_destroy (VkhImage img); void* vkh_image_map (VkhImage img); diff --git a/src/vkh_image.c b/src/vkh_image.c index 821eb73..d89d6e2 100644 --- a/src/vkh_image.c +++ b/src/vkh_image.c @@ -30,42 +30,31 @@ VkhImage _vkh_image_create (VkhDevice pDev, VkImageType imageType, VkhImage img = (VkhImage)calloc(1,sizeof(vkh_image_t)); img->pDev = pDev; - img->width = width; - img->height = height; - img->layout = VK_IMAGE_LAYOUT_UNDEFINED; - img->format = format; - img->layers = arrayLayers; - img->mipLevels = mipLevels; - img->imported = false; - img->alloc = VK_NULL_HANDLE; - img->image = VK_NULL_HANDLE; - - VkImageCreateInfo image_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .imageType = imageType, - .tiling = tiling, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .sharingMode = VK_SHARING_MODE_EXCLUSIVE, - .usage = usage, - .format = format, - .extent = {width,height,1}, - .mipLevels = mipLevels, - .arrayLayers = arrayLayers, - .samples = samples }; - - VmaAllocationCreateInfo allocInfo = { .usage = memprops }; - VK_CHECK_RESULT(vmaCreateImage (pDev->allocator, &image_info, &allocInfo, &img->image, &img->alloc, &img->allocInfo)); - /*VK_CHECK_RESULT(vkCreateImage(pDev->dev, &image_info, NULL, &img->image)); + VkImageCreateInfo* pInfo = &img->infos; + pInfo->sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + pInfo->imageType = imageType; + pInfo->tiling = tiling; + pInfo->initialLayout = (tiling == VK_IMAGE_TILING_OPTIMAL) ? VK_IMAGE_LAYOUT_UNDEFINED : VK_IMAGE_LAYOUT_PREINITIALIZED; + pInfo->sharingMode = VK_SHARING_MODE_EXCLUSIVE; + pInfo->usage = usage; + pInfo->format = format; + pInfo->extent.width = width; + pInfo->extent.height = height; + pInfo->extent.depth = 1; + pInfo->mipLevels = mipLevels; + pInfo->arrayLayers = arrayLayers; + pInfo->samples = samples; - VkMemoryRequirements memReq; - vkGetImageMemoryRequirements(pDev->dev, img->image, &memReq); + img->imported = false; - VkMemoryAllocateInfo memAllocInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .allocationSize = memReq.size }; - assert(vkh_memory_type_from_properties(&pDev->phyMemProps, memReq.memoryTypeBits, memprops,&memAllocInfo.memoryTypeIndex)); + img->alloc = VK_NULL_HANDLE; + img->image = VK_NULL_HANDLE; + img->sampler= VK_NULL_HANDLE; + img->view = VK_NULL_HANDLE; - VK_CHECK_RESULT(vkAllocateMemory(pDev->dev, &memAllocInfo, NULL, &img->memory)); - VK_CHECK_RESULT(vkBindImageMemory(pDev->dev, img->image, img->memory, offset));*/ + VmaAllocationCreateInfo allocInfo = { .usage = memprops }; + VK_CHECK_RESULT(vmaCreateImage (pDev->allocator, pInfo, &allocInfo, &img->image, &img->alloc, &img->allocInfo)); return img; } @@ -88,10 +77,18 @@ VkhImage vkh_image_import (VkhDevice pDev, VkImage vkImg, VkFormat format, uint3 VkhImage img = (VkhImage)calloc(1,sizeof(vkh_image_t)); img->pDev = pDev; img->image = vkImg; - img->format = format; - img->width = width; - img->height = height; img->imported = true; + + VkImageCreateInfo* pInfo = &img->infos; + pInfo->imageType = VK_IMAGE_TYPE_2D; + pInfo->format = format; + pInfo->extent.width = width; + pInfo->extent.height = height; + pInfo->extent.depth = 1; + pInfo->mipLevels = 1; + pInfo->arrayLayers = 1; + //pInfo->samples = samples; + return img; } VkhImage vkh_image_ms_create(VkhDevice pDev, @@ -108,9 +105,9 @@ void vkh_image_create_view (VkhImage img, VkImageViewType viewType, VkImageAspec VkImageViewCreateInfo viewInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .image = img->image, .viewType = viewType, - .format = img->format, + .format = img->infos.format, .components = {VK_COMPONENT_SWIZZLE_R,VK_COMPONENT_SWIZZLE_G,VK_COMPONENT_SWIZZLE_B,VK_COMPONENT_SWIZZLE_A}, - .subresourceRange = {aspectFlags,0,1,0,img->layers}}; + .subresourceRange = {aspectFlags,0,1,0,img->infos.arrayLayers}}; VK_CHECK_RESULT(vkCreateImageView(img->pDev->dev, &viewInfo, NULL, &img->view)); } void vkh_image_create_sampler (VkhImage img, VkFilter magFilter, VkFilter minFilter, @@ -153,14 +150,15 @@ VkDescriptorImageInfo vkh_image_get_descriptor (VkhImage img, VkImageLayout imag return desc; } -void vkh_image_set_layout(VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask, VkImageLayout new_image_layout, +void vkh_image_set_layout(VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask, + VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages) { VkImageSubresourceRange subres = {aspectMask,0,1,0,1}; - vkh_image_set_layout_subres(cmdBuff, image, subres, new_image_layout, src_stages, dest_stages); + vkh_image_set_layout_subres(cmdBuff, image, subres, old_image_layout, new_image_layout, src_stages, dest_stages); } void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange, - VkImageLayout new_image_layout, + VkImageLayout old_image_layout, VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages) { VkImageMemoryBarrier image_memory_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, .oldLayout = image->layout, @@ -170,7 +168,7 @@ void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImag .image = image->image, .subresourceRange = subresourceRange}; - switch (image->layout) { + switch (old_image_layout) { case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: image_memory_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; break; diff --git a/src/vkh_image.h b/src/vkh_image.h index fb67512..397e5cd 100644 --- a/src/vkh_image.h +++ b/src/vkh_image.h @@ -30,18 +30,16 @@ extern "C" { typedef struct _vkh_image_t { VkhDevice pDev; - VkFormat format; - uint32_t layers; - uint32_t mipLevels; - uint32_t width, height; + VkImageCreateInfo infos; VkImage image; VmaAllocation alloc; VmaAllocationInfo allocInfo; VkSampler sampler; VkImageView view; VkImageLayout layout; //current layout - bool imported; + bool imported;//dont destroy vkimage at end }vkh_image_t; + #ifdef __cplusplus } #endif diff --git a/src/vkh_presenter.c b/src/vkh_presenter.c index a629116..1c0ae5d 100644 --- a/src/vkh_presenter.c +++ b/src/vkh_presenter.c @@ -109,11 +109,11 @@ void vkh_presenter_build_blit_cmd (VkhPresenter r, VkImage blitSource){ set_image_layout(cb, bltDstImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); set_image_layout(cb, blitSource, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}, @@ -127,6 +127,9 @@ void vkh_presenter_build_blit_cmd (VkhPresenter r, VkImage blitSource){ set_image_layout(cb, bltDstImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT); + set_image_layout(cb, blitSource, VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); vkh_cmd_end(cb); } -- 2.47.3