optimized codes of Texture Loader
This commit is contained in:
parent
89d27962b2
commit
7c575e6e37
@ -1 +1 @@
|
|||||||
Subproject commit c1a42765331c8c6161e12805f19877e53003cb07
|
Subproject commit bb671a9674155a184671caa047844dd9e82f2ad5
|
@ -92,7 +92,7 @@ private:
|
|||||||
{
|
{
|
||||||
const VkExtent2D extent=sc_render_target->GetExtent();
|
const VkExtent2D extent=sc_render_target->GetExtent();
|
||||||
|
|
||||||
cam.vp_width=cam.width=extent.width;
|
cam.vp_width =cam.width =extent.width;
|
||||||
cam.vp_height=cam.height=extent.height;
|
cam.vp_height=cam.height=extent.height;
|
||||||
|
|
||||||
cam.Refresh();
|
cam.Refresh();
|
||||||
|
@ -17,7 +17,7 @@ namespace hgl
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
using Texture2DLoader::Texture2DLoader;
|
Bitmap2DLoader():Texture2DLoader(){}
|
||||||
~Bitmap2DLoader();
|
~Bitmap2DLoader();
|
||||||
|
|
||||||
void *OnBegin(uint32 total_bytes) override;
|
void *OnBegin(uint32 total_bytes) override;
|
||||||
|
@ -71,8 +71,6 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
VkImageViewType type;
|
|
||||||
|
|
||||||
TextureFileHeader file_header;
|
TextureFileHeader file_header;
|
||||||
|
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
@ -93,9 +91,8 @@ namespace hgl
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TextureLoader(const VkImageViewType &ivt)
|
TextureLoader()
|
||||||
{
|
{
|
||||||
type=ivt;
|
|
||||||
format=VK_FORMAT_UNDEFINED;
|
format=VK_FORMAT_UNDEFINED;
|
||||||
mipmap_zero_total_bytes=0;
|
mipmap_zero_total_bytes=0;
|
||||||
total_bytes=0;
|
total_bytes=0;
|
||||||
@ -121,12 +118,12 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes;
|
return mipmap_zero_total_bytes;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.length,
|
return ComputeMipmapBytes( file_header.length,
|
||||||
mipmap_zero_total_bytes);
|
mipmap_zero_total_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Texture1DLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_1D){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~Texture1DLoader()=default;
|
virtual ~Texture1DLoader()=default;
|
||||||
};//class Texture1DLoader
|
};//class Texture1DLoader
|
||||||
|
|
||||||
@ -144,13 +141,13 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes;
|
return mipmap_zero_total_bytes;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.width,
|
return ComputeMipmapBytes( file_header.width,
|
||||||
file_header.height,
|
file_header.height,
|
||||||
mipmap_zero_total_bytes);
|
mipmap_zero_total_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Texture2DLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_2D){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~Texture2DLoader()=default;
|
virtual ~Texture2DLoader()=default;
|
||||||
};//class Texture2DLoader
|
};//class Texture2DLoader
|
||||||
|
|
||||||
@ -168,14 +165,14 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes;
|
return mipmap_zero_total_bytes;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.width,
|
return ComputeMipmapBytes( file_header.width,
|
||||||
file_header.height,
|
file_header.height,
|
||||||
file_header.depth,
|
file_header.depth,
|
||||||
mipmap_zero_total_bytes);
|
mipmap_zero_total_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Texture3DLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_3D){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~Texture3DLoader()=default;
|
virtual ~Texture3DLoader()=default;
|
||||||
};//class Texture3DLoader
|
};//class Texture3DLoader
|
||||||
|
|
||||||
@ -193,13 +190,13 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes*6;
|
return mipmap_zero_total_bytes*6;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.width,
|
return ComputeMipmapBytes( file_header.width,
|
||||||
file_header.height,
|
file_header.height,
|
||||||
mipmap_zero_total_bytes)*6;
|
mipmap_zero_total_bytes)*6;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TextureCubeLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_CUBE){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~TextureCubeLoader()=default;
|
virtual ~TextureCubeLoader()=default;
|
||||||
};//class TextureCubeLoader
|
};//class TextureCubeLoader
|
||||||
|
|
||||||
@ -217,12 +214,12 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes*file_header.layers;
|
return mipmap_zero_total_bytes*file_header.layers;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.length,
|
return ComputeMipmapBytes( file_header.length,
|
||||||
mipmap_zero_total_bytes)*file_header.layers;;
|
mipmap_zero_total_bytes)*file_header.layers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Texture1DArrayLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_1D_ARRAY){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~Texture1DArrayLoader()=default;
|
virtual ~Texture1DArrayLoader()=default;
|
||||||
};//class Texture1DArrayLoader
|
};//class Texture1DArrayLoader
|
||||||
|
|
||||||
@ -240,13 +237,13 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes*file_header.layers;
|
return mipmap_zero_total_bytes*file_header.layers;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.width,
|
return ComputeMipmapBytes( file_header.width,
|
||||||
file_header.height,
|
file_header.height,
|
||||||
mipmap_zero_total_bytes)*file_header.layers;
|
mipmap_zero_total_bytes)*file_header.layers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Texture2DArrayLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_2D_ARRAY){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~Texture2DArrayLoader()=default;
|
virtual ~Texture2DArrayLoader()=default;
|
||||||
};//class Texture2DArrayLoader
|
};//class Texture2DArrayLoader
|
||||||
|
|
||||||
@ -264,13 +261,13 @@ namespace hgl
|
|||||||
return mipmap_zero_total_bytes*6*file_header.layers;
|
return mipmap_zero_total_bytes*6*file_header.layers;
|
||||||
else
|
else
|
||||||
return ComputeMipmapBytes( file_header.width,
|
return ComputeMipmapBytes( file_header.width,
|
||||||
file_header.height,
|
file_header.height,
|
||||||
mipmap_zero_total_bytes)*6*file_header.layers;
|
mipmap_zero_total_bytes)*6*file_header.layers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TextureCubeArrayLoader():TextureLoader(VK_IMAGE_VIEW_TYPE_CUBE_ARRAY){}
|
using TextureLoader::TextureLoader;
|
||||||
virtual ~TextureCubeArrayLoader()=default;
|
virtual ~TextureCubeArrayLoader()=default;
|
||||||
};//class TextureCubeArrayLoader
|
};//class TextureCubeArrayLoader
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
|
@ -30,3 +30,4 @@ public:
|
|||||||
};//class MaterialInstance
|
};//class MaterialInstance
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
#endif//HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE
|
#endif//HGL_GRAPH_VULKAN_MATERIAL_INSTANCE_INCLUDE
|
||||||
|
|
@ -21,7 +21,7 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
const DescriptorSetsType GetType (){return ds_type;}
|
const DescriptorSetsType GetType (){return ds_type;}
|
||||||
DescriptorSets * GetDescriptorSet (){return descriptor_sets;}
|
DescriptorSets * GetDescriptorSet (){return descriptor_sets;}
|
||||||
const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_sets->GetDescriptorSet();}
|
const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_sets->GetDescriptorSet();}
|
||||||
|
|
||||||
|
@ -66,6 +66,8 @@ public:
|
|||||||
Texture2D(VkDevice dev,TextureData *td):Texture(dev,td){}
|
Texture2D(VkDevice dev,TextureData *td):Texture(dev,td){}
|
||||||
~Texture2D()=default;
|
~Texture2D()=default;
|
||||||
|
|
||||||
|
static VkImageViewType GetImageViewType(){return VK_IMAGE_VIEW_TYPE_2D;}
|
||||||
|
|
||||||
const uint32_t GetWidth ()const{return data?data->image_view->GetExtent().width:0;}
|
const uint32_t GetWidth ()const{return data?data->image_view->GetExtent().width:0;}
|
||||||
const uint32_t GetHeight()const{return data?data->image_view->GetExtent().height:0;}
|
const uint32_t GetHeight()const{return data?data->image_view->GetExtent().height:0;}
|
||||||
};//class Texture2D:public Texture
|
};//class Texture2D:public Texture
|
||||||
|
@ -187,8 +187,8 @@ namespace hgl
|
|||||||
if(file_header.version!=0)
|
if(file_header.version!=0)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
if(file_header.type!=type)
|
// if(file_header.type!=type)
|
||||||
return(false);
|
// return(false);
|
||||||
|
|
||||||
if(file_header.pixel_format.channels==0)
|
if(file_header.pixel_format.channels==0)
|
||||||
{
|
{
|
||||||
|
@ -1,107 +1,23 @@
|
|||||||
#include<hgl/graph/VK.h>
|
#include"VKTextureLoader.h"
|
||||||
#include<hgl/graph/VKDevice.h>
|
|
||||||
#include<hgl/graph/VKBuffer.h>
|
|
||||||
#include<hgl/graph/TextureLoader.h>
|
|
||||||
#include<hgl/io/FileInputStream.h>
|
#include<hgl/io/FileInputStream.h>
|
||||||
#include<hgl/log/LogInfo.h>
|
#include<hgl/log/LogInfo.h>
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
namespace
|
template<> void VkTextureLoader<Texture2D,Texture2DLoader>::OnExtent(VkExtent3D &extent)
|
||||||
{
|
{
|
||||||
class VkTextureLoader
|
extent.width =file_header.width;
|
||||||
{
|
extent.height =file_header.height;
|
||||||
};
|
extent.depth =1;
|
||||||
|
}
|
||||||
|
|
||||||
class VkTexture2DLoader:public Texture2DLoader
|
template<> Texture2D *VkTextureLoader<Texture2D,Texture2DLoader>::OnCreateTexture(TextureCreateInfo *tci)
|
||||||
{
|
{
|
||||||
protected:
|
return device->CreateTexture2D(tci);
|
||||||
|
}
|
||||||
GPUDevice *device;
|
|
||||||
GPUBuffer *buf;
|
|
||||||
|
|
||||||
bool auto_mipmaps;
|
|
||||||
|
|
||||||
Texture2D *tex;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
VkTexture2DLoader(GPUDevice *dev,const bool am):device(dev)
|
|
||||||
{
|
|
||||||
buf=nullptr;
|
|
||||||
tex=nullptr;
|
|
||||||
auto_mipmaps=am;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~VkTexture2DLoader()
|
|
||||||
{
|
|
||||||
SAFE_CLEAR(buf);
|
|
||||||
SAFE_CLEAR(tex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *OnBegin(uint32 total_bytes) override
|
|
||||||
{
|
|
||||||
SAFE_CLEAR(buf);
|
|
||||||
SAFE_CLEAR(tex);
|
|
||||||
|
|
||||||
if(!CheckVulkanFormat(format))
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
buf=device->CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,total_bytes);
|
|
||||||
|
|
||||||
if(!buf)
|
|
||||||
return(nullptr);
|
|
||||||
|
|
||||||
return buf->Map();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnEnd() override
|
|
||||||
{
|
|
||||||
buf->Unmap();
|
|
||||||
|
|
||||||
TextureCreateInfo *tci=new TextureCreateInfo(format);
|
|
||||||
|
|
||||||
VkExtent3D extent;
|
|
||||||
|
|
||||||
extent.width =file_header.width;
|
|
||||||
extent.height =file_header.height;
|
|
||||||
extent.depth =1;
|
|
||||||
|
|
||||||
tci->SetData(buf,extent);
|
|
||||||
|
|
||||||
if(auto_mipmaps&&file_header.mipmaps<=1)
|
|
||||||
{
|
|
||||||
if(device->CheckFormatSupport(format,VK_FORMAT_FEATURE_BLIT_DST_BIT))
|
|
||||||
{
|
|
||||||
tci->usage|=VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
|
||||||
tci->SetAutoMipmaps();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tci->origin_mipmaps=
|
|
||||||
tci->target_mipmaps=file_header.mipmaps;
|
|
||||||
}
|
|
||||||
|
|
||||||
tci->mipmap_zero_total_bytes=mipmap_zero_total_bytes;
|
|
||||||
|
|
||||||
tex=device->CreateTexture2D(tci);
|
|
||||||
|
|
||||||
if(tex)
|
|
||||||
buf=nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Texture2D *GetTexture()
|
|
||||||
{
|
|
||||||
Texture2D *result=tex;
|
|
||||||
tex=nullptr;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
};//class VkTexture2DLoader
|
|
||||||
}//namespace
|
|
||||||
|
|
||||||
Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps)
|
Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename,bool auto_mipmaps)
|
||||||
{
|
{
|
||||||
VkTexture2DLoader loader(device,auto_mipmaps);
|
VkTextureLoader<Texture2D,Texture2DLoader> loader(device,auto_mipmaps);
|
||||||
|
|
||||||
if(!loader.Load(filename))
|
if(!loader.Load(filename))
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
95
src/SceneGraph/Vulkan/VKTextureLoader.h
Normal file
95
src/SceneGraph/Vulkan/VKTextureLoader.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#pragma once
|
||||||
|
#include<hgl/graph/VK.h>
|
||||||
|
#include<hgl/graph/VKDevice.h>
|
||||||
|
#include<hgl/graph/VKBuffer.h>
|
||||||
|
#include<hgl/graph/TextureLoader.h>
|
||||||
|
#include<hgl/graph/VKTextureCreateInfo.h>
|
||||||
|
|
||||||
|
VK_NAMESPACE_BEGIN
|
||||||
|
template<typename T,typename TL> class VkTextureLoader:public TL
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
GPUDevice *device;
|
||||||
|
GPUBuffer *buf;
|
||||||
|
T *tex;
|
||||||
|
|
||||||
|
bool auto_mipmaps;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
VkTextureLoader(GPUDevice *dev,const bool am)
|
||||||
|
{
|
||||||
|
device=dev;
|
||||||
|
buf=nullptr;
|
||||||
|
tex=nullptr;
|
||||||
|
auto_mipmaps=am;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~VkTextureLoader()
|
||||||
|
{
|
||||||
|
SAFE_CLEAR(tex);
|
||||||
|
SAFE_CLEAR(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *OnBegin(uint32 total_bytes) override
|
||||||
|
{
|
||||||
|
SAFE_CLEAR(buf);
|
||||||
|
|
||||||
|
if(!CheckVulkanFormat(format))
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
buf=device->CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,total_bytes);
|
||||||
|
|
||||||
|
if(!buf)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
return buf->Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnExtent(VkExtent3D &extent);
|
||||||
|
T *OnCreateTexture(TextureCreateInfo *);
|
||||||
|
|
||||||
|
void OnEnd() override
|
||||||
|
{
|
||||||
|
buf->Unmap();
|
||||||
|
|
||||||
|
TextureCreateInfo *tci=new TextureCreateInfo(format);
|
||||||
|
|
||||||
|
VkExtent3D extent;
|
||||||
|
|
||||||
|
OnExtent(extent);
|
||||||
|
|
||||||
|
tci->SetData(buf,extent);
|
||||||
|
|
||||||
|
if(auto_mipmaps&&file_header.mipmaps<=1)
|
||||||
|
{
|
||||||
|
if(device->CheckFormatSupport(format,VK_FORMAT_FEATURE_BLIT_DST_BIT))
|
||||||
|
{
|
||||||
|
tci->usage|=VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
tci->SetAutoMipmaps();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tci->origin_mipmaps=
|
||||||
|
tci->target_mipmaps=file_header.mipmaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
tci->mipmap_zero_total_bytes=mipmap_zero_total_bytes;
|
||||||
|
|
||||||
|
SAFE_CLEAR(tex);
|
||||||
|
tex=OnCreateTexture(tci);
|
||||||
|
|
||||||
|
if(tex)
|
||||||
|
buf=nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
T *GetTexture()
|
||||||
|
{
|
||||||
|
T *result=tex;
|
||||||
|
tex=nullptr;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};//class VkTextureLoader
|
||||||
|
VK_NAMESPACE_END
|
Loading…
x
Reference in New Issue
Block a user