created a new GPUDevice::CopyBufferToImage(CopyBufferToImageInfo *,..)
This commit is contained in:
parent
ac4c97d33a
commit
7805494ca9
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user