]> O.S.I.I.S - jp/vkhelpers.git/commitdiff
use image create struct for keeping infos, don't rely on current img layout field...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 6 Jun 2018 15:46:35 +0000 (17:46 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 6 Jun 2018 15:46:35 +0000 (17:46 +0200)
CMakeLists.txt
include/vkh.h
src/vkh_image.c
src/vkh_image.h
src/vkh_presenter.c

index d7f100d24b82d84b0e39b6027f3e3d3292df6341..4e264937d3de782b6abf59aeb4658635a52e37f9 100644 (file)
@@ -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)
 
index 67134e42d66b900c7a18ef31ea639c48c23587ad..98836ddcff1ef557e4b3c4e02c3cfe9df4d6723d 100644 (file)
@@ -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);
index 821eb739a79050f56d578b1dbd3dee6b72440cf3..d89d6e2e61ef3f796bf436966423b0d38972e3a6 100644 (file)
@@ -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;
index fb675120593f092dfbd99deb57c6f50447d71609..397e5cdde88db9eaea15a9ba8978fed961702959 100644 (file)
@@ -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
index a6291160b29a1198b5a6248deda3ac0057238196..1c0ae5dd48a247760a4cad6273ab77318c1bed55 100644 (file)
@@ -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);
     }