created a new GPUDevice::CopyBufferToImage(CopyBufferToImageInfo *,..)

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-09-25 14:44:53 +08:00
parent ac4c97d33a
commit 7805494ca9
2 changed files with 92 additions and 34 deletions

View File

@ -24,29 +24,16 @@ class TileFont;
class FontSource; class FontSource;
class GPUArrayBuffer; class GPUArrayBuffer;
struct Image2DSubresourceRange:public VkImageSubresourceRange struct CopyBufferToImageInfo
{ {
Image2DSubresourceRange(Texture2D *tex) VkImage image;
{ VkBuffer buffer;
this->aspectMask =tex->GetAspect();
this->baseMipLevel =0;
this->levelCount =tex->GetMipLevel();
this->baseArrayLayer=0;
this->layerCount =1;
}
};//struct Image2DSubresourceRange:public VkImageSubresourceRange
struct ImageCubeSubresourceRange:public VkImageSubresourceRange VkImageSubresourceRange isr;
{
ImageCubeSubresourceRange(TextureCube *tex) const VkBufferImageCopy * bic_list;
{ uint32_t bic_count;
this->aspectMask =tex->GetAspect(); };
this->baseMipLevel =0;
this->levelCount =tex->GetMipLevel();
this->baseArrayLayer=0;
this->layerCount =6;
}
};//struct ImageCubeSubresourceRange:public VkImageSubresourceRange
class GPUDevice class GPUDevice
{ {
@ -175,6 +162,8 @@ public: //Image
private: //texture 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 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); bool CommitTexture2D (Texture2D *,DeviceBuffer *buf,VkPipelineStageFlags stage);

View File

@ -24,55 +24,124 @@ void GPUDevice::Clear(TextureCreateInfo *tci)
delete 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); 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_HOST_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, 0,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
subresourceRange); info->isr);
texture_cmd_buf->CopyBufferToImage( texture_cmd_buf->CopyBufferToImage(
buf->GetBuffer(), info->buffer,
tex->GetImage(), info->image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
count, info->bic_count,
buffer_image_copy); info->bic_list);
if(destinationStage==VK_PIPELINE_STAGE_TRANSFER_BIT) //接下来还有一般是给自动生成mipmaps 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_PIPELINE_STAGE_TRANSFER_BIT, // VK_PIPELINE_STAGE_TRANSFER_BIT,
// VK_ACCESS_TRANSFER_WRITE_BIT, // VK_ACCESS_TRANSFER_WRITE_BIT,
// VK_ACCESS_TRANSFER_READ_BIT, // VK_ACCESS_TRANSFER_READ_BIT,
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
// VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
// subresourceRange); // info->isr);
} }
else// if(destinationStage==VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) //接下来就给fragment shader用了证明是最后一步 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_TRANSFER_BIT,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_SHADER_READ_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
subresourceRange); info->isr);
} }
return(true); 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) bool GPUDevice::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count)
{ {
if(!cmd_bufs||count<=0) if(!cmd_bufs||count<=0)