From 7805494ca9e73ce91fb18a0d90787e4bf7e4480e Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 25 Sep 2023 14:44:53 +0800 Subject: [PATCH] created a new GPUDevice::CopyBufferToImage(CopyBufferToImageInfo *,..) --- inc/hgl/graph/VKDevice.h | 31 ++---- .../Vulkan/Texture/VKDeviceTexture.cpp | 95 ++++++++++++++++--- 2 files changed, 92 insertions(+), 34 deletions(-) diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 8e8124f1..563c50a6 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -24,29 +24,16 @@ class TileFont; class FontSource; class GPUArrayBuffer; -struct Image2DSubresourceRange:public VkImageSubresourceRange +struct CopyBufferToImageInfo { - Image2DSubresourceRange(Texture2D *tex) - { - this->aspectMask =tex->GetAspect(); - this->baseMipLevel =0; - this->levelCount =tex->GetMipLevel(); - this->baseArrayLayer=0; - this->layerCount =1; - } -};//struct Image2DSubresourceRange:public VkImageSubresourceRange + VkImage image; + VkBuffer buffer; -struct ImageCubeSubresourceRange:public VkImageSubresourceRange -{ - ImageCubeSubresourceRange(TextureCube *tex) - { - this->aspectMask =tex->GetAspect(); - this->baseMipLevel =0; - this->levelCount =tex->GetMipLevel(); - this->baseArrayLayer=0; - this->layerCount =6; - } -};//struct ImageCubeSubresourceRange:public VkImageSubresourceRange + VkImageSubresourceRange isr; + + const VkBufferImageCopy * bic_list; + uint32_t bic_count; +}; class GPUDevice { @@ -175,6 +162,8 @@ public: //Image private: //texture + bool CopyBufferToImage (const CopyBufferToImageInfo *info,VkPipelineStageFlags destinationStage); + bool CopyBufferToImage (Texture *,DeviceBuffer *buf,const VkBufferImageCopy *,const int count,const uint32_t layer_count,VkPipelineStageFlags);//=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); bool CommitTexture2D (Texture2D *,DeviceBuffer *buf,VkPipelineStageFlags stage); diff --git a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp index 6f4769be..59d093b7 100644 --- a/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp +++ b/src/SceneGraph/Vulkan/Texture/VKDeviceTexture.cpp @@ -24,55 +24,124 @@ void GPUDevice::Clear(TextureCreateInfo *tci) delete tci; } -bool GPUDevice::CopyBufferToImage(Texture *tex,DeviceBuffer *buf,const VkBufferImageCopy *buffer_image_copy,const int count,const uint32_t layer_count,VkPipelineStageFlags destinationStage) +bool GPUDevice::CopyBufferToImage(const CopyBufferToImageInfo *info,VkPipelineStageFlags destinationStage) { - if(!tex||!buf) + if(!info) return(false); - ImageSubresourceRange subresourceRange(tex->GetAspect(),tex->GetMipLevel(),layer_count); + if(info->bic_count==0) + return(false); - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + texture_cmd_buf->ImageMemoryBarrier(info->image, 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); + info->isr); texture_cmd_buf->CopyBufferToImage( - buf->GetBuffer(), - tex->GetImage(), + info->buffer, + info->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - count, - buffer_image_copy); + info->bic_count, + info->bic_list); if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有,一般是给自动生成mipmaps { - //texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + //texture_cmd_buf->ImageMemoryBarrier(info->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); + // info->isr); } else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了,证明是最后一步 { - texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + texture_cmd_buf->ImageMemoryBarrier(info->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); + info->isr); } return(true); } +bool GPUDevice::CopyBufferToImage(Texture *tex,DeviceBuffer *buf,const VkBufferImageCopy *buffer_image_copy,const int count,const uint32_t layer_count,VkPipelineStageFlags destinationStage) +{ + if(!tex||!buf) + return(false); + + CopyBufferToImageInfo info; + + info.image =tex->GetImage(); + info.buffer =buf->GetBuffer(); + + info.isr.aspectMask =tex->GetAspect(); + info.isr.baseMipLevel =0; + info.isr.levelCount =tex->GetMipLevel(); + info.isr.baseArrayLayer =0; + info.isr.layerCount =layer_count; + + info.bic_list =buffer_image_copy; + info.bic_count =count; + + return CopyBufferToImage(&info,destinationStage); + + //下面这段是原始能跑的,上面的是走新的接口的,本质一样,待完全测试后,删掉下面的。 +//-------------------------------------------------------------------------------------------------- + + //ImageSubresourceRange subresourceRange(tex->GetAspect(),tex->GetMipLevel(),layer_count); + + //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(), + // tex->GetImage(), + // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + // count, + // buffer_image_copy); + + //if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有,一般是给自动生成mipmaps + //{ + // //texture_cmd_buf->ImageMemoryBarrier(tex->GetImage(), + // // 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); + //} + //else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了,证明是最后一步 + //{ + // 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); + //} + + //return(true); +} + bool GPUDevice::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count) { if(!cmd_bufs||count<=0)