optimized codes of VKDeviceTexture.cpp

This commit is contained in:
hyzboy 2021-12-15 15:22:45 +08:00
parent bd8486da25
commit fc8e794eb8
2 changed files with 63 additions and 85 deletions

@ -1 +1 @@
Subproject commit c22c92c64779b91745103c1f552d78e8c9784a85 Subproject commit f2ac1fea2f0b7961400bd7f2744afb82f3b1c927

View File

@ -58,53 +58,46 @@ namespace
void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels) void GenerateMipmaps(TextureCmdBuffer *texture_cmd_buf,VkImage image,VkImageAspectFlags aspect_mask,VkExtent3D extent,const uint32_t mipLevels)
{ {
VkImageMemoryBarrier barrier{}; ImageSubresourceRange subresourceRange(aspect_mask);
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;
VkImageBlit blit; 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 width =extent.width;
int32_t height =extent.height; int32_t height =extent.height;
int32_t depth =extent.depth; int32_t depth =extent.depth;
for (uint32_t i = 1; i < mipLevels; i++) for (uint32_t i = 1; i < mipLevels; i++)
{ {
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; subresourceRange.baseMipLevel = i - 1;
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;
texture_cmd_buf->PipelineBarrier( texture_cmd_buf->ImageMemoryBarrier(image,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, nullptr, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT,
1, &barrier); 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.srcOffsets[1] = {width,height,depth};
blit.srcSubresource.aspectMask = aspect_mask;
blit.srcSubresource.mipLevel = i - 1; blit.srcSubresource.mipLevel = i - 1;
blit.srcSubresource.baseArrayLayer = 0;
blit.srcSubresource.layerCount = 1;
if(width >1)width >>=1; if(width >1)width >>=1;
if(height>1)height>>=1; if(height>1)height>>=1;
if(depth >1)depth >>=1; if(depth >1)depth >>=1;
blit.dstOffsets[0] = {0, 0, 0};
blit.dstOffsets[1] = {width,height,depth}; blit.dstOffsets[1] = {width,height,depth};
blit.dstSubresource.aspectMask = aspect_mask;
blit.dstSubresource.mipLevel = i; blit.dstSubresource.mipLevel = i;
blit.dstSubresource.baseArrayLayer = 0;
blit.dstSubresource.layerCount = 1;
texture_cmd_buf->BlitImage( texture_cmd_buf->BlitImage(
image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
@ -112,29 +105,26 @@ namespace
1, &blit, 1, &blit,
VK_FILTER_LINEAR); VK_FILTER_LINEAR);
barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; texture_cmd_buf->ImageMemoryBarrier(image,
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; VK_PIPELINE_STAGE_TRANSFER_BIT,
barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VK_ACCESS_TRANSFER_READ_BIT,
VK_ACCESS_SHADER_READ_BIT,
texture_cmd_buf->PipelineBarrier( VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
0, nullptr, subresourceRange);
0, nullptr,
1, &barrier);
} }
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; subresourceRange.baseMipLevel = mipLevels - 1;
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;
texture_cmd_buf->PipelineBarrier( texture_cmd_buf->ImageMemoryBarrier(image,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, nullptr, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
0, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT,
1, &barrier); VK_ACCESS_SHADER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
subresourceRange);
} }
}//namespace }//namespace
@ -242,29 +232,16 @@ bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,const VkBufferImag
if(!tex||!buf) if(!tex||!buf)
return(false); return(false);
VkImageSubresourceRange subresourceRange; ImageSubresourceRange subresourceRange(tex->GetAspect(),miplevel);
subresourceRange.aspectMask = tex->GetAspect();
subresourceRange.baseMipLevel = 0;
subresourceRange.levelCount = miplevel;
subresourceRange.baseArrayLayer = 0;
subresourceRange.layerCount = 1;
ImageMemoryBarrier imageMemoryBarrier(tex->GetImage()); texture_cmd_buf->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_HOST_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, 0,
0, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT,
0, nullptr, VK_IMAGE_LAYOUT_UNDEFINED,
1, &imageMemoryBarrier); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
subresourceRange);
texture_cmd_buf->CopyBufferToImage( texture_cmd_buf->CopyBufferToImage(
buf->GetBuffer(), buf->GetBuffer(),
@ -273,27 +250,28 @@ bool GPUDevice::CommitTexture2D(Texture2D *tex,GPUBuffer *buf,const VkBufferImag
count, count,
buffer_image_copy); 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 if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有一般是给自动生成mipmaps
{ {
imageMemoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(),
imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; 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用了证明是最后一步 else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了证明是最后一步
{ {
imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(),
imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
}
texture_cmd_buf->PipelineBarrier(
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
destinationStage, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
0, VK_ACCESS_TRANSFER_WRITE_BIT,
0, nullptr, VK_ACCESS_SHADER_READ_BIT,
0, nullptr, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &imageMemoryBarrier); VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
subresourceRange);
}
return(true); return(true);
} }