diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index c6459fde..1fa4e3d6 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -107,27 +107,27 @@ public: //Image public: //Texture - Texture2D *CreateTexture2D(Memory *mem,VkImage image,ImageView *image_view,VkImageLayout image_layout,bool linear); - Texture2D *CreateTexture2D(VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout,bool linear=false); + Texture2D *CreateTexture2D(Memory *mem,VkImage image,ImageView *image_view,VkImageLayout image_layout,VkImageTiling tiling); + Texture2D *CreateTexture2D(VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout,VkImageTiling tiling=VK_IMAGE_TILING_OPTIMAL); - Texture2D *CreateTexture2D(const VkFormat format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,bool linear=false); + Texture2D *CreateTexture2D(const VkFormat format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,VkImageTiling tiling=VK_IMAGE_TILING_OPTIMAL); - Texture2D *CreateTexture2DColor(const VkFormat video_format,uint32_t width,uint32_t height,bool linear=false) + Texture2D *CreateTexture2DColor(const VkFormat video_format,uint32_t width,uint32_t height,const VkImageTiling tiling=VK_IMAGE_TILING_OPTIMAL) { return CreateTexture2D(video_format,width,height, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - linear); + (tiling==VK_IMAGE_TILING_OPTIMAL?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:VK_IMAGE_LAYOUT_GENERAL), + tiling); } - Texture2D *CreateTexture2DDepth(const VkFormat video_format,uint32_t width,uint32_t height,bool linear=false) + Texture2D *CreateTexture2DDepth(const VkFormat video_format,uint32_t width,uint32_t height,const VkImageTiling tiling=VK_IMAGE_TILING_OPTIMAL) { return CreateTexture2D(video_format,width,height, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - linear); + (tiling==VK_IMAGE_TILING_OPTIMAL?VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:VK_IMAGE_LAYOUT_GENERAL), + tiling); } Texture2D *CreateAttachmentTexture(const VkFormat video_format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout) @@ -155,13 +155,13 @@ public: //Texture const VkImageAspectFlags aspectMask =VK_IMAGE_ASPECT_COLOR_BIT, const uint usage =VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, const VkImageLayout image_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - const bool linear =false); + const VkImageTiling tiling =VK_IMAGE_TILING_OPTIMAL); Texture2D *CreateTexture2D( const VkFormat video_format,void *data,uint32_t width,uint32_t height,uint32_t size, const VkImageAspectFlags aspectMask =VK_IMAGE_ASPECT_COLOR_BIT, const uint usage =VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, const VkImageLayout image_layout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - const bool linear =false); + const VkImageTiling tiling =VK_IMAGE_TILING_OPTIMAL); bool ChangeTexture2D(Texture2D *,Buffer *buf,uint32_t left,uint32_t top,uint32_t width,uint32_t height); bool ChangeTexture2D(Texture2D *,void *data,uint32_t left,uint32_t top,uint32_t width,uint32_t height,uint32_t size); diff --git a/inc/hgl/graph/vulkan/VKTexture.h b/inc/hgl/graph/vulkan/VKTexture.h index 075bde9c..41affce7 100644 --- a/inc/hgl/graph/vulkan/VKTexture.h +++ b/inc/hgl/graph/vulkan/VKTexture.h @@ -12,7 +12,7 @@ struct TextureData VkImageLayout image_layout=VK_IMAGE_LAYOUT_UNDEFINED; ImageView * image_view =nullptr; uint32 mip_levels =0; - bool linear =false; + VkImageTiling tiling =VK_IMAGE_TILING_OPTIMAL; };//struct TextureData class Texture @@ -35,7 +35,8 @@ public: ImageView * GetImageView (){return data?data->image_view:nullptr;} const uint32 GetMipLevels()const{return data?data->mip_levels:0;} - const bool IsLinear ()const{return data?data->linear:false;} + const bool IsOptimal ()const{return data?data->tiling==VK_IMAGE_TILING_OPTIMAL:false;} + const bool IsLinear ()const{return data?data->tiling==VK_IMAGE_TILING_LINEAR:false;} const VkFormat GetFormat ()const{return data?data->image_view->GetFormat():VK_FORMAT_UNDEFINED;} const VkImageAspectFlags GetAspect ()const{return data?data->image_view->GetAspectFlags():0;} diff --git a/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp b/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp index 814da6b7..1ae9adf3 100644 --- a/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp +++ b/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp @@ -99,7 +99,7 @@ namespace #pragma pack(pop) }//namespace -Texture2D *CreateTextureFromFile(Device *device,const OSString &filename,bool use_optimar) +Texture2D *CreateTextureFromFile(Device *device,const OSString &filename) { if(!device) return(nullptr); @@ -139,7 +139,6 @@ Texture2D *CreateTextureFromFile(Device *device,const OSString &filename,bool us if(file_lengthCreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,total_bytes); @@ -157,9 +156,5 @@ Texture2D *CreateTextureFromFile(Device *device,const OSString &filename,bool us delete buf; return tex; } - else - { - return nullptr; - } } VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp index ed3ebcb1..d643d9dd 100644 --- a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp @@ -20,7 +20,7 @@ namespace } }//namespace -Texture2D *Device::CreateTexture2D(Memory *mem,VkImage image,ImageView *image_view,VkImageLayout image_layout,bool linear) +Texture2D *Device::CreateTexture2D(Memory *mem,VkImage image,ImageView *image_view,VkImageLayout image_layout,VkImageTiling tiling) { TextureData *tex_data=new TextureData; @@ -30,50 +30,39 @@ Texture2D *Device::CreateTexture2D(Memory *mem,VkImage image,ImageView *image_vi tex_data->image_view = image_view; tex_data->mip_levels = 0; - tex_data->linear = linear; + tex_data->tiling = tiling; return(new Texture2D(attr->device,tex_data)); } -Texture2D *Device::CreateTexture2D(VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout,bool linear) +Texture2D *Device::CreateTexture2D(VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout,VkImageTiling tiling) { VkExtent3D extent={width,height,1}; ImageView *iv=CreateImageView(attr->device,VK_IMAGE_VIEW_TYPE_2D,format,extent,aspectMask,image); - return this->CreateTexture2D(nullptr,image,iv,image_layout,false); + return this->CreateTexture2D(nullptr,image,iv,image_layout,tiling); } -Texture2D *Device::CreateTexture2D(const VkFormat format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,bool linear) +Texture2D *Device::CreateTexture2D(const VkFormat format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,VkImageTiling tiling) { const VkFormatProperties fp=attr->physical_device->GetFormatProperties(format); - enum VkImageTiling tiling; + if(tiling==VK_IMAGE_TILING_OPTIMAL) + { + if(fp.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) + tiling=VK_IMAGE_TILING_OPTIMAL; + else + tiling=VK_IMAGE_TILING_LINEAR; + } - if(linear) + if(tiling==VK_IMAGE_TILING_LINEAR) { if(fp.linearTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) tiling=VK_IMAGE_TILING_LINEAR; else return(nullptr); } - else - { - if(fp.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) - { - tiling=VK_IMAGE_TILING_OPTIMAL; - } - else - { - if(fp.linearTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) - { - tiling=VK_IMAGE_TILING_LINEAR; - linear=true; - } - else - return(nullptr); - } - } VkImage img=CreateImage(format,width,height,usage,tiling); @@ -92,14 +81,14 @@ Texture2D *Device::CreateTexture2D(const VkFormat format,uint32_t width,uint32_t ImageView *iv=CreateImageView2D(attr->device,format,ext,aspectMask,img); - return CreateTexture2D(mem,img,iv,image_layout,linear); + return CreateTexture2D(mem,img,iv,image_layout,tiling); } -Texture2D *Device::CreateTexture2D(const VkFormat format,Buffer *buf,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,const bool linear) +Texture2D *Device::CreateTexture2D(const VkFormat format,Buffer *buf,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,const VkImageTiling tiling) { if(!buf)return(nullptr); - Texture2D *tex=CreateTexture2D(format,width,height,aspectMask,usage,image_layout,false); + Texture2D *tex=CreateTexture2D(format,width,height,aspectMask,usage,image_layout,tiling); if(!tex)return(nullptr); @@ -108,13 +97,13 @@ Texture2D *Device::CreateTexture2D(const VkFormat format,Buffer *buf,uint32_t wi return(tex); } -Texture2D *Device::CreateTexture2D(const VkFormat format,void *data,uint32_t width,uint32_t height,uint32_t size,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,const bool linear) +Texture2D *Device::CreateTexture2D(const VkFormat format,void *data,uint32_t width,uint32_t height,uint32_t size,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,const VkImageTiling tiling) { Buffer *buf=CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,size,data); if(!buf)return(nullptr); - Texture2D *tex=CreateTexture2D(format,buf,width,height,aspectMask,image_layout,linear); + Texture2D *tex=CreateTexture2D(format,buf,width,height,aspectMask,image_layout,tiling); delete buf; return(tex);