From fc8e794eb863044d83d1ff7d0370f622bc527c2d Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 15 Dec 2021 15:22:45 +0800 Subject: [PATCH] optimized codes of VKDeviceTexture.cpp --- CMSceneGraph | 2 +- src/SceneGraph/Vulkan/VKDeviceTexture.cpp | 146 +++++++++------------- 2 files changed, 63 insertions(+), 85 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index c22c92c6..f2ac1fea 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit c22c92c64779b91745103c1f552d78e8c9784a85 +Subproject commit f2ac1fea2f0b7961400bd7f2744afb82f3b1c927 diff --git a/src/SceneGraph/Vulkan/VKDeviceTexture.cpp b/src/SceneGraph/Vulkan/VKDeviceTexture.cpp index ca850eab..cd3f3202 100644 --- a/src/SceneGraph/Vulkan/VKDeviceTexture.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceTexture.cpp @@ -58,53 +58,46 @@ namespace void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels) { - VkImageMemoryBarrier barrier{}; - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.image = image; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.subresourceRange.aspectMask = aspect_mask; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = 1; - barrier.subresourceRange.levelCount = 1; + ImageSubresourceRange subresourceRange(aspect_mask); VkImageBlit blit; + blit.srcOffsets[0] = {0, 0, 0}; + blit.srcSubresource.aspectMask = aspect_mask; + blit.srcSubresource.baseArrayLayer = 0; + blit.srcSubresource.layerCount = 1; + + blit.dstOffsets[0] = {0, 0, 0}; + blit.dstSubresource.aspectMask = aspect_mask; + blit.dstSubresource.baseArrayLayer = 0; + blit.dstSubresource.layerCount = 1; + int32_t width =extent.width; int32_t height =extent.height; int32_t depth =extent.depth; for (uint32_t i = 1; i < mipLevels; i++) { - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - barrier.subresourceRange.baseMipLevel = i - 1; + subresourceRange.baseMipLevel = i - 1; - texture_cmd_buf->PipelineBarrier( - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, - 0, nullptr, - 0, nullptr, - 1, &barrier); + texture_cmd_buf->ImageMemoryBarrier(image, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + subresourceRange); - blit.srcOffsets[0] = {0, 0, 0}; blit.srcOffsets[1] = {width,height,depth}; - blit.srcSubresource.aspectMask = aspect_mask; blit.srcSubresource.mipLevel = i - 1; - blit.srcSubresource.baseArrayLayer = 0; - blit.srcSubresource.layerCount = 1; if(width >1)width >>=1; if(height>1)height>>=1; if(depth >1)depth >>=1; - blit.dstOffsets[0] = {0, 0, 0}; blit.dstOffsets[1] = {width,height,depth}; - blit.dstSubresource.aspectMask = aspect_mask; blit.dstSubresource.mipLevel = i; - blit.dstSubresource.baseArrayLayer = 0; - blit.dstSubresource.layerCount = 1; texture_cmd_buf->BlitImage( image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, @@ -112,29 +105,26 @@ namespace 1, &blit, VK_FILTER_LINEAR); - barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - - texture_cmd_buf->PipelineBarrier( - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, - 0, nullptr, - 0, nullptr, - 1, &barrier); + texture_cmd_buf->ImageMemoryBarrier(image, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + subresourceRange); } - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - barrier.subresourceRange.baseMipLevel = mipLevels - 1; + subresourceRange.baseMipLevel = mipLevels - 1; - texture_cmd_buf->PipelineBarrier( - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, - 0, nullptr, - 0, nullptr, - 1, &barrier); + texture_cmd_buf->ImageMemoryBarrier(image, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + subresourceRange); } }//namespace @@ -242,29 +232,16 @@ bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,const VkBufferImag if(!tex||!buf) return(false); - VkImageSubresourceRange subresourceRange; - subresourceRange.aspectMask = tex->GetAspect(); - subresourceRange.baseMipLevel = 0; - subresourceRange.levelCount = miplevel; - subresourceRange.baseArrayLayer = 0; - subresourceRange.layerCount = 1; + ImageSubresourceRange subresourceRange(tex->GetAspect(),miplevel); - ImageMemoryBarrier imageMemoryBarrier(tex->GetImage()); - imageMemoryBarrier.srcAccessMask = 0; - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageMemoryBarrier.subresourceRange = subresourceRange; - - texture_cmd_buf->PipelineBarrier( - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - 0, nullptr, - 0, nullptr, - 1, &imageMemoryBarrier); + texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + VK_PIPELINE_STAGE_HOST_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresourceRange); texture_cmd_buf->CopyBufferToImage( buf->GetBuffer(), @@ -272,29 +249,30 @@ bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,const VkBufferImag VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, count, buffer_image_copy); - - imageMemoryBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有,一般是给自动生成mipmaps { - imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresourceRange); } else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了,证明是最后一步 { - imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + subresourceRange); } - texture_cmd_buf->PipelineBarrier( - VK_PIPELINE_STAGE_TRANSFER_BIT, - destinationStage, - 0, - 0, nullptr, - 0, nullptr, - 1, &imageMemoryBarrier); - return(true); }