增加引用ImageView和引用Texture,不会删除具体数据
This commit is contained in:
parent
282e59fc68
commit
e42e721553
@ -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 *);
|
||||
|
@ -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
|
||||
|
||||
/**
|
||||
* 创建一个引用ImageView,它的特点是不会自动删除VkImageView
|
||||
*/
|
||||
ImageView *CreateRefImageView(VkDevice device,VkImageViewType type,VkFormat format,VkImageAspectFlags aspectMask,VkImageView img_view);
|
||||
|
||||
/**
|
||||
* 根据VkImage创建一个VkImageView,在删除它时,它也会删除VkImageView
|
||||
*/
|
||||
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);}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user