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