]> O.S.I.I.S - jp/vkhelpers.git/commitdiff
separate view and sampler create func, vkh_image_set_layout with current layout
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 25 Dec 2017 18:40:37 +0000 (19:40 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Mon, 25 Dec 2017 18:40:37 +0000 (19:40 +0100)
vkh_image.c
vkh_image.h
vkhelpers.h

index a3bbf3ce9d2c4c1e19ab08352193abd2b66853c7..34a5b579443b9b7170184f13889b9215b191ce8f 100644 (file)
@@ -13,6 +13,9 @@ VkhImage _vkh_image_create (VkhDevice pDev, VkImageType imageType,
     img->width = width;
     img->height = height;
     img->layout = layout;
+    img->format = format;
+    img->layers = arrayLayers;
+    img->mipLevels = mipLevels;
 
     VkImageCreateInfo image_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
                                      .imageType = imageType,
@@ -28,7 +31,7 @@ VkhImage _vkh_image_create (VkhDevice pDev, VkImageType imageType,
 
     VK_CHECK_RESULT(vkCreateImage(pDev->vkDev, &image_info, NULL, &img->image));
 
-    img->infos = image_info;
+
 
     VkMemoryRequirements memReq;
     vkGetImageMemoryRequirements(pDev->vkDev, img->image, &memReq);
@@ -45,7 +48,6 @@ VkhImage vkh_tex2d_array_create (VkhDevice pDev,
     return _vkh_image_create (pDev, VK_IMAGE_TYPE_2D, format, width, height, memprops,usage,
         VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_TILING_OPTIMAL, 1, layers, layout);
 }
-
 VkhImage vkh_image_create (VkhDevice pDev,
                            VkFormat format, uint32_t width, uint32_t height, VkImageTiling tiling,
                            VkMemoryPropertyFlags memprops,
@@ -61,19 +63,22 @@ VkhImage vkh_image_ms_create(VkhDevice pDev,
    return  _vkh_image_create (pDev, VK_IMAGE_TYPE_2D, format, width, height, memprops,usage,
                       num_samples, VK_IMAGE_TILING_OPTIMAL, 1, 1, layout);
 }
-void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags, VkFilter magFilter,
-                                 VkFilter minFilter, VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode)
-{
-    img->pDescriptor = (VkDescriptorImageInfo*)malloc(sizeof(VkDescriptorImageInfo));
-    img->pDescriptor->imageLayout = img->layout;
+void vkh_image_create_view (VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags){
+    if(img->view != VK_NULL_HANDLE)
+        vkDestroyImageView  (img->pDev->vkDev,img->view,NULL);
+
     VkImageViewCreateInfo viewInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
                                          .image = img->image,
                                          .viewType = viewType,
-                                         .format = img->infos.format,
+                                         .format = img->format,
                                          .components = {VK_COMPONENT_SWIZZLE_R,VK_COMPONENT_SWIZZLE_G,VK_COMPONENT_SWIZZLE_B,VK_COMPONENT_SWIZZLE_A},
-                                         .subresourceRange = {aspectFlags,0,1,0,img->infos.arrayLayers}};
-    VK_CHECK_RESULT(vkCreateImageView(img->pDev->vkDev, &viewInfo, NULL, &img->pDescriptor->imageView));
-
+                                         .subresourceRange = {aspectFlags,0,1,0,img->layers}};
+    VK_CHECK_RESULT(vkCreateImageView(img->pDev->vkDev, &viewInfo, NULL, &img->view));
+}
+void vkh_image_create_sampler (VkhImage img, VkFilter magFilter, VkFilter minFilter,
+                               VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode){
+    if(img->sampler != VK_NULL_HANDLE)
+        vkDestroySampler    (img->pDev->vkDev,img->sampler,NULL);
     VkSamplerCreateInfo samplerCreateInfo = { .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
                                               .maxAnisotropy= 1.0,
                                               .addressModeU = addressMode,
@@ -82,19 +87,89 @@ void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImage
                                               .magFilter    = magFilter,
                                               .minFilter    = minFilter,
                                               .mipmapMode   = mipmapMode};
-    VK_CHECK_RESULT(vkCreateSampler(img->pDev->vkDev, &samplerCreateInfo, NULL, &img->pDescriptor->sampler));
+    VK_CHECK_RESULT(vkCreateSampler(img->pDev->vkDev, &samplerCreateInfo, NULL, &img->sampler));
+}
 
+void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags, VkFilter magFilter,
+                                 VkFilter minFilter, VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode)
+{
+    vkh_image_create_view       (img, viewType, aspectFlags);
+    vkh_image_create_sampler    (img, magFilter, minFilter, mipmapMode, addressMode);
+}
+
+void vkh_image_set_layout(VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask, 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);
 }
+
+void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange,
+                             VkImageLayout new_image_layout,
+                             VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages) {
+    VkImageMemoryBarrier image_memory_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                                                  .oldLayout = image->layout,
+                                                  .newLayout = new_image_layout,
+                                                  .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                                  .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                                  .image = image->image,
+                                                  .subresourceRange = subresourceRange};
+
+    switch (image->layout) {
+        case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+            image_memory_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
+            image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_PREINITIALIZED:
+            image_memory_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
+            break;
+
+        default:
+            break;
+    }
+
+    switch (new_image_layout) {
+        case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
+            image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
+            image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+            image_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+            image_memory_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+            break;
+
+        case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
+            image_memory_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+            break;
+
+        default:
+            break;
+    }
+
+    vkCmdPipelineBarrier(cmdBuff, src_stages, dest_stages, 0, 0, NULL, 0, NULL, 1, &image_memory_barrier);
+    image->layout = new_image_layout;
+}
+
 void vkh_image_destroy(VkhImage img)
 {
-    if (img->pDescriptor != NULL){
-        vkDestroyImageView(img->pDev->vkDev,img->pDescriptor->imageView,NULL);
-        if(img->pDescriptor->sampler != VK_NULL_HANDLE)
-            vkDestroySampler(img->pDev->vkDev,img->pDescriptor->sampler,NULL);
-    }
-    free(img->pDescriptor);
-    vkDestroyImage(img->pDev->vkDev,img->image,NULL);
-    vkFreeMemory(img->pDev->vkDev, img->memory, NULL);
+    if(img->view != VK_NULL_HANDLE)
+        vkDestroyImageView  (img->pDev->vkDev,img->view,NULL);
+    if(img->sampler != VK_NULL_HANDLE)
+        vkDestroySampler    (img->pDev->vkDev,img->sampler,NULL);
+
+    vkDestroyImage                  (img->pDev->vkDev, img->image, NULL);
+    vkFreeMemory                    (img->pDev->vkDev, img->memory, NULL);
+
     free(img);
     img = NULL;
 }
index 562f52db3fb2eedc1626fe1a075ce9bc2aef2025..6e24a9aea233692ab2b2fd86c3faaa007cab7acf 100644 (file)
@@ -5,11 +5,14 @@
 
 typedef struct _vkh_image_t {
     VkhDevice                          pDev;
-    VkImageCreateInfo          infos;
+    VkFormat                format;
+    uint32_t                layers;
+    uint32_t                mipLevels;
     uint32_t                           width, height;
     VkImage                                    image;
     VkDeviceMemory                     memory;
-    VkDescriptorImageInfo*     pDescriptor;
-    VkImageLayout           layout;//used for descriptor creation
+    VkSampler               sampler;
+    VkImageView             view;
+    VkImageLayout           layout; //current layout
 }vkh_image_t;
 #endif
index 08bb4d4e8f73cf227e21474f1816a26df0eeec69..1e2f6ecd095b02eab3fbfb463dc76455767a7e34 100644 (file)
@@ -35,6 +35,13 @@ VkhImage vkh_tex2d_array_create (VkhDevice pDev, VkFormat format, uint32_t width
                                     VkMemoryPropertyFlags memprops, VkImageUsageFlags usage, VkImageLayout layout);
 void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags, VkFilter magFilter, VkFilter minFilter,
                                     VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode);
+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,
+                                    VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange,
+                                    VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
 void vkh_image_destroy          (VkhImage img);
 
 ////////////////////////////////
@@ -62,16 +69,15 @@ VkPhysicalDevice vkh_find_phy (VkInstance inst, VkPhysicalDeviceType phyType);
 
 VkShaderModule vkh_load_module(VkDevice dev, const char* path);
 
-void        set_image_layout(VkCommandBuffer cmdBuff, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout,
-                      VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
-void        set_image_layout_subres(VkCommandBuffer cmdBuff, VkImage image, VkImageSubresourceRange subresourceRange, VkImageLayout old_image_layout,
-                      VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
-
-
 bool        memory_type_from_properties(VkPhysicalDeviceMemoryProperties* memory_properties, uint32_t typeBits,
                                         VkFlags requirements_mask, uint32_t *typeIndex);
 char *      read_spv(const char *filename, size_t *psize);
 uint32_t*   readFile(uint32_t* length, const char* filename);
 
 void dumpLayerExts ();
+
+void        set_image_layout(VkCommandBuffer cmdBuff, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout,
+                      VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+void        set_image_layout_subres(VkCommandBuffer cmdBuff, VkImage image, VkImageSubresourceRange subresourceRange, VkImageLayout old_image_layout,
+                      VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
 #endif