增加引用ImageView和引用Texture,不会删除具体数据

This commit is contained in:
hyzboy 2019-06-14 18:04:41 +08:00
parent 282e59fc68
commit e42e721553
6 changed files with 72 additions and 16 deletions

View File

@ -93,6 +93,8 @@ public: //Buffer相关
public: //material相关
Texture2D *CreateRefTexture2D(uint32_t width,uint32_t height,VkFormat format,VkImageAspectFlagBits flag,VkImage image,VkImageView image_view);
Texture2D *CreateTexture2D(const VkFormat video_format,void *data,uint32_t width,uint32_t height,uint32_t size,bool force_linear=false);
bool ChangeTexture2D(Texture2D *,void *data,uint32_t left,uint32_t top,uint32_t width,uint32_t height,uint32_t size);
Sampler *CreateSampler(VkSamplerCreateInfo *);

View File

@ -5,34 +5,49 @@
VK_NAMESPACE_BEGIN
class ImageView
{
protected:
VkDevice device;
VkImageView image_view;
VkImageViewCreateInfo info;
VkImageViewType view_type;
VkFormat format;
VkImageAspectFlags aspect_mask;
private:
friend ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img);
friend ImageView *CreateRefImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImageView img_view);
ImageView(VkDevice dev,VkImageView iv,const VkImageViewCreateInfo &ci)
ImageView(VkDevice dev,VkImageView iv,const VkImageViewType vt,const VkFormat fmt,const VkImageAspectFlags am)
{
device=dev;
image_view=iv;
info=ci;
device =dev;
image_view =iv;
view_type =vt;
format =fmt;
aspect_mask =am;
}
public:
~ImageView();
virtual ~ImageView()=default;
operator VkImageView(){return image_view;}
public:
const VkImageViewType GetViewType ()const{return info.viewType;}
const VkFormat GetFormat ()const{return info.format;}
const VkImageAspectFlags GetAspectFlags ()const{return info.subresourceRange.aspectMask;}
const VkImageViewType GetViewType ()const{return view_type;}
const VkFormat GetFormat ()const{return format;}
const VkImageAspectFlags GetAspectFlags ()const{return aspect_mask;}
};//class ImageView
/**
* ImageViewVkImageView
*/
ImageView *CreateRefImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImageView img_view);
/**
* VkImage创建一个VkImageViewVkImageView
*/
ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img=nullptr);
#define CREATE_IMAGE_VIEW(short_name,larget_name) inline ImageView *CreateImageView##short_name(VkDevice device,VkFormat format,VkImageAspectFlags aspectMask,VkImage img=nullptr){return CreateImageView(device,VK_IMAGE_VIEW_TYPE_##larget_name,format,aspectMask,img);}

View File

@ -12,6 +12,15 @@ struct TextureData
ImageView *image_view;
uint32 mip_levels;
bool linear;
bool ref; //是否是引用
public:
TextureData(bool r=false)
{
ref=r;
}
};//struct TextureData
class Texture

View File

@ -45,7 +45,7 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,void *data,uint32
return(nullptr); //这个我们暂时不支持
}
TextureData *tex_data=new TextureData();
TextureData *tex_data=new TextureData(false);
tex_data->memory=nullptr;
tex_data->image=nullptr;
@ -163,6 +163,20 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,void *data,uint32
return(new Texture2D(width,height,attr->device,tex_data));
}
Texture2D *Device::CreateRefTexture2D(uint32_t width,uint32_t height,VkFormat format,VkImageAspectFlagBits flag,VkImage image,VkImageView image_view)
{
TextureData *tex_data=new TextureData(true);
tex_data->memory=nullptr;
tex_data->image=image;
tex_data->image_view=CreateRefImageView(attr->device,VK_IMAGE_VIEW_TYPE_2D,format,flag,image_view);
tex_data->mip_levels=0;
tex_data->linear=false;
return(new Texture2D(width,height,attr->device,tex_data));
}
bool Device::ChangeTexture2D(Texture2D *tex,void *data,uint32_t left,uint32_t top,uint32_t width,uint32_t height,uint32_t size)
{
if(!tex||!data

View File

@ -1,9 +1,23 @@
#include<hgl/graph/vulkan/VKImageView.h>
VK_NAMESPACE_BEGIN
ImageView::~ImageView()
class StandaloneImageView:public ImageView
{
vkDestroyImageView(device,image_view,nullptr);
friend ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img);
using ImageView::ImageView;
public:
~StandaloneImageView()
{
vkDestroyImageView(device,image_view,nullptr);
}
};
ImageView *CreateRefImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImageView img_view)
{
return(new ImageView(device,img_view,type,format,aspectMask));
}
ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImage img)
@ -26,11 +40,11 @@ ImageView *CreateImageView(VkDevice device,VkImageViewType type,VkFormat format,
iv_createinfo.subresourceRange.baseArrayLayer=0;
iv_createinfo.subresourceRange.layerCount=1;
VkImageView iv;
VkImageView img_view;
if(vkCreateImageView(device,&iv_createinfo,nullptr,&iv)!=VK_SUCCESS)
if(vkCreateImageView(device,&iv_createinfo,nullptr,&img_view)!=VK_SUCCESS)
return(nullptr);
return(new ImageView(device,iv,iv_createinfo));
return(new StandaloneImageView(device,img_view,type,format,aspectMask));
}
VK_NAMESPACE_END

View File

@ -8,6 +8,8 @@ Texture::~Texture()
if(data->image_view)
delete data->image_view;
if(data->ref)return;
if(data->image)
vkDestroyImage(device,data->image,nullptr);