From: Jean-Philippe Bruyère Date: Mon, 25 Dec 2017 18:40:37 +0000 (+0100) Subject: separate view and sampler create func, vkh_image_set_layout with current layout X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=b3a528b340d162cdf2a62d0c7055b2ab7dc4be09;p=jp%2Fvkhelpers.git separate view and sampler create func, vkh_image_set_layout with current layout --- diff --git a/vkh_image.c b/vkh_image.c index a3bbf3c..34a5b57 100644 --- a/vkh_image.c +++ b/vkh_image.c @@ -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; } diff --git a/vkh_image.h b/vkh_image.h index 562f52d..6e24a9a 100644 --- a/vkh_image.h +++ b/vkh_image.h @@ -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 diff --git a/vkhelpers.h b/vkhelpers.h index 08bb4d4..1e2f6ec 100644 --- a/vkhelpers.h +++ b/vkhelpers.h @@ -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