From 8515f41718b7e41e765b1ecfe73bdc14d6040567 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 3 Dec 2019 20:48:42 +0800 Subject: [PATCH] exchange LoadTGATexture to CreateTextureFromFile for texture_rect sample --- example/Vulkan/CMakeLists.txt | 2 +- example/Vulkan/texture_rect.cpp | 4 +- inc/hgl/graph/vulkan/VKFormat.h | 4 +- src/RenderDevice/Vulkan/CMakeLists.txt | 81 +++++---- .../Vulkan/POD/VKTextureLoader.cpp | 164 ++++++++++++++++++ 5 files changed, 221 insertions(+), 34 deletions(-) create mode 100644 src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 08fa592d..c203b2b0 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -11,7 +11,7 @@ endmacro() CreateProject(00.triangle first_triangle.cpp) CreateProject(01.indices_rect indices_rect.cpp) -CreateProject(02.1.texture_rect texture_rect.cpp TGATexture.cpp) +CreateProject(02.1.texture_rect texture_rect.cpp) #CreateProject(02.2.texture_linear texture_linear.cpp TGATexture.cpp) CreateProject(03.HQFilterTexture HQFilterTexture.cpp TGATexture.cpp) CreateProject(04.Geometry2D Geometry2D.cpp) diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 53898b73..d20bb37b 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -10,7 +10,7 @@ using namespace hgl; using namespace hgl::graph; VK_NAMESPACE_BEGIN -Texture2D *LoadTGATexture(const OSString &filename,Device *device,bool use_optimal=true); +Texture2D *CreateTextureFromFile(Device *device,const OSString &filename,bool use_optimar=true); VK_NAMESPACE_END constexpr uint32_t SCREEN_WIDTH=128; @@ -92,7 +92,7 @@ private: render_obj=material->CreateRenderable(VERTEX_COUNT); descriptor_sets=material->CreateDescriptorSets(); - texture=vulkan::LoadTGATexture(OS_TEXT("res/image/lena.tga"),device); + texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); VkSamplerCreateInfo sampler_create_info; diff --git a/inc/hgl/graph/vulkan/VKFormat.h b/inc/hgl/graph/vulkan/VKFormat.h index 23fda6fb..eb282b62 100644 --- a/inc/hgl/graph/vulkan/VKFormat.h +++ b/inc/hgl/graph/vulkan/VKFormat.h @@ -288,7 +288,7 @@ constexpr size_t FMT_PVRTC_RANGE_SIZE=FMT_PVRTC_END_RANGE-FMT_PVRTC_BEGIN_RANGE+ //以下为AMD/NVIDIA/INTEL/QUALCOMM/ARM/POWERVR全部可用的通用格式 #define UFMT_BGRA4 FMT_BGRA4 #define UFMT_RGB565 FMT_RGB565 -#define UFMT_A4RGB5 FMT_A1RGB5 +#define UFMT_A1RGB5 FMT_A1RGB5 #define UFMT_R8 FMT_R8UN #define UFMT_RG8 FMT_RG8UN #define UFMT_RGBA8 FMT_RGBA8UN @@ -340,6 +340,8 @@ enum class VulkanDataType UFLOAT, SFLOAT, SRGB, + + END };// struct VulkanFormat diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index 14959f64..81a8a45b 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -1,43 +1,57 @@ file(GLOB RENDER_DEVICE_VULKAN_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/*.h) +SET(VK_DEVICE_SOURCE VKDeviceAttribute.cpp + VKDeviceCreater.cpp + VKDevice.cpp + VKDeviceBuffer.cpp + VKDeviceImage.cpp + VKDeviceTexture.cpp + VKDeviceSwapchain.cpp + VKDeviceRenderPass.cpp) + +SET(VK_DESCRIPTOR_SETS_SOURCE VKDescriptorSets.cpp + VKDescriptorSetLayoutCreater.cpp + VKDescriptorSetLayoutCreater.h) + +SET(VK_SHADER_SOURCE VKShaderParse.h + VKShaderModule.cpp + VKShaderModuleManage.cpp) + +SET(VK_MATERIAL_SOURCE VKImageView.cpp + VKTexture.cpp + VKMaterial.cpp) + +SET(VK_RENDER_PASS_SOURCE VKFramebuffer.cpp + VKPipeline.cpp + VKRenderPass.cpp + VKRenderTarget.cpp + VKSwapchain.cpp + VKCommandBuffer.cpp) + + SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp VKMemory.cpp - VKProperties.cpp - VKDebugOut.cpp + VKProperties.cpp + VKDebugOut.cpp VKInstance.cpp - VKPhysicalDevice.cpp - VKImageView.cpp - VKCommandBuffer.cpp - VKDeviceAttribute.cpp - VKDeviceCreater.cpp - VKDevice.cpp - VKDeviceBuffer.cpp - VKDeviceImage.cpp - VKDeviceTexture.cpp - VKDeviceSwapchain.cpp - VKDeviceRenderPass.cpp + VKPhysicalDevice.cpp VKBuffer.cpp - VKDescriptorSets.cpp - VKDescriptorSetLayoutCreater.cpp - VKDescriptorSetLayoutCreater.h - VKRenderPass.cpp - VKRenderTarget.cpp - VKShaderParse.h - VKShaderModule.cpp - VKShaderModuleManage.cpp VKVertexAttributeBinding.cpp - VKPipeline.cpp VKSemaphore.cpp - VKFramebuffer.cpp VKFence.cpp - VKMaterial.cpp VKRenderable.cpp - VKTexture.cpp - VKSampler.cpp - VKSwapchain.cpp - ) + VKSampler.cpp) -SET(RENDER_DEVICE_VULKAN_POD_SOURCE pod/VKPipelineCreateInfo.POD.cpp) +SET(RENDER_DEVICE_VULKAN_POD_SOURCE pod/VKPipelineCreateInfo.POD.cpp + pod/VKTextureLoader.cpp) + +SOURCE_GROUP("Device" FILES ${VK_DEVICE_SOURCE}) +SOURCE_GROUP("Descriptor Sets" FILES ${VK_DESCRIPTOR_SETS_SOURCE}) + +SOURCE_GROUP("Material\\Shader" FILES ${VK_SHADER_SOURCE}) +SOURCE_GROUP("Material" FILES ${VK_MATERIAL_SOURCE}) + +SOURCE_GROUP("Render Pass" FILES ${VK_RENDER_PASS_SOURCE}) SOURCE_GROUP("Header Files" FILES ${RENDER_DEVICE_VULKAN_HEADER}) SOURCE_GROUP("Source Files" FILES ${RENDER_DEVICE_VULKAN_SOURCE}) @@ -45,6 +59,13 @@ SOURCE_GROUP("POD Source Files" FILES ${RENDER_DEVICE_VULKAN_POD_SOURCE}) add_library(ULRE.RenderDevice.Vulkan STATIC ${RENDER_DEVICE_VULKAN_HEADER} ${RENDER_DEVICE_VULKAN_SOURCE} - ${RENDER_DEVICE_VULKAN_POD_SOURCE}) + ${RENDER_DEVICE_VULKAN_POD_SOURCE} + + ${VK_DEVICE_SOURCE} + ${VK_DESCRIPTOR_SETS_SOURCE} + ${VK_SHADER_SOURCE} + ${VK_MATERIAL_SOURCE} + ${VK_RENDER_PASS_SOURCE} + ${RENDER_DEVICE_VULKAN_SOURCE}) set_property(TARGET ULRE.RenderDevice.Vulkan PROPERTY FOLDER "ULRE") diff --git a/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp b/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp new file mode 100644 index 00000000..42ed9598 --- /dev/null +++ b/src/RenderDevice/Vulkan/POD/VKTextureLoader.cpp @@ -0,0 +1,164 @@ +#include +#include +#include +#include +#include + +VK_NAMESPACE_BEGIN +namespace +{ + struct PixelFormat + { + VkFormat format; + + uint8 channels; //颜色通道数 + char colors[4]; + uint8 bits[4]; + VulkanDataType type; + + public: + + const uint GetPixelBytes()const{return (bits[0]+bits[1]+bits[2]+bits[3])>>3;} ///<获取单个象素所需字节数 + };// + + constexpr PixelFormat pf_list[]= + { + {UFMT_BGRA4, 4,{'B','G','R','A'},{ 4, 4, 4, 4},VulkanDataType::UNORM}, + {UFMT_RGB565, 3,{'R','G','B', 0 },{ 5, 6, 5, 0},VulkanDataType::UNORM}, + {UFMT_A1RGB5, 4,{'A','R','G','B'},{ 1, 5, 5, 5},VulkanDataType::UNORM}, + {UFMT_R8, 1,{'R', 0 , 0 , 0 },{ 8, 0, 0, 0},VulkanDataType::UNORM}, + {UFMT_RG8, 2,{'R','G', 0 , 0 },{ 8, 8, 0, 0},VulkanDataType::UNORM}, + {UFMT_RGBA8, 4,{'R','G','B','A'},{ 8, 8, 8, 8},VulkanDataType::UNORM}, + {UFMT_A2BGR10, 4,{'A','B','G','R'},{ 2,10,10,10},VulkanDataType::UNORM}, + {UFMT_R16, 1,{'R', 0 , 0 , 0 },{16, 0, 0, 0},VulkanDataType::UNORM}, + {UFMT_R16F, 1,{'R', 0 , 0 , 0 },{16, 0, 0, 0},VulkanDataType::SFLOAT}, + {UFMT_RG16, 2,{'R','G', 0 , 0 },{16,16, 0, 0},VulkanDataType::UNORM}, + {UFMT_RG16F, 2,{'R','G', 0 , 0 },{16,16, 0, 0},VulkanDataType::SFLOAT}, + {UFMT_RGBA16, 4,{'R','G','B','A'},{16,16,16,16},VulkanDataType::UNORM}, + {UFMT_RGBA16F, 4,{'R','G','B','A'},{16,16,16,16},VulkanDataType::SFLOAT}, + {UFMT_R32U, 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},VulkanDataType::UINT}, + {UFMT_R32I, 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},VulkanDataType::SINT}, + {UFMT_R32F, 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},VulkanDataType::SFLOAT}, + {UFMT_RG32U, 2,{'R','G', 0 , 0 },{32,32, 0, 0},VulkanDataType::UINT}, + {UFMT_RG32I, 2,{'R','G', 0 , 0 },{32,32, 0, 0},VulkanDataType::SINT}, + {UFMT_RG32F, 2,{'R','G', 0 , 0 },{32,32, 0, 0},VulkanDataType::SFLOAT}, + {UFMT_RGB32U, 3,{'R','G','B', 0 },{32,32,32, 0},VulkanDataType::UINT}, + {UFMT_RGB32I, 3,{'R','G','B', 0 },{32,32,32, 0},VulkanDataType::SINT}, + {UFMT_RGB32F, 3,{'R','G','B', 0 },{32,32,32, 0},VulkanDataType::SFLOAT}, + {UFMT_RGBA32U, 4,{'R','G','B','A'},{32,32,32,32},VulkanDataType::UINT}, + {UFMT_RGBA32I, 4,{'R','G','B','A'},{32,32,32,32},VulkanDataType::SINT}, + {UFMT_RGBA32F, 4,{'R','G','B','A'},{32,32,32,32},VulkanDataType::SFLOAT} + }; + + constexpr uint PixelFormatCount=sizeof(pf_list)/sizeof(PixelFormat); + + #pragma pack(push,1) + struct Tex2DFileHeader + { + uint8 id[6]; ///>3;} + const uint total_bytes()const{return pixel_count()*pixel_bytes();} + + const VkFormat vk_format()const + { + const PixelFormat *pf=pf_list; + + for(uint i=0;ichannels)continue; + if(datatype!=(uint8)pf->type)continue; + + if(colors[0]!=pf->colors[0])continue; + if(colors[1]!=pf->colors[1])continue; + if(colors[2]!=pf->colors[2])continue; + if(colors[3]!=pf->colors[3])continue; + + if(bits[0]!=pf->bits[0])continue; + if(bits[1]!=pf->bits[1])continue; + if(bits[2]!=pf->bits[2])continue; + if(bits[3]!=pf->bits[3])continue; + + return pf->format; + } + + return VK_FORMAT_UNDEFINED; + } + };// + #pragma pack(pop) +}//namespace + +Texture2D *CreateTextureFromFile(Device *device,const OSString &filename,bool use_optimar) +{ + if(!device) + return(nullptr); + + io::OpenFileInputStream fis(filename); + + if(!fis) + { + LOG_ERROR(OS_TEXT("[ERROR] open texture file<")+filename+OS_TEXT("> failed.")); + return(nullptr); + } + + const int64 file_length=fis->GetSize(); + + if(file_lengthRead(&file_header,sizeof(Tex2DFileHeader))!=sizeof(Tex2DFileHeader)) + return(nullptr); + + if(file_header.version!=2) + return(nullptr); + + if(file_header.total_bytes()==0) + return(nullptr); + + const VkFormat format=file_header.vk_format(); + + if(format<=VK_FORMAT_BEGIN_RANGE + ||format>=VK_FORMAT_END_RANGE) + return(nullptr); + + const uint total_bytes=file_header.total_bytes(); + + if(file_lengthCreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,total_bytes); + + if(!buf) + return(nullptr); + + void *pixel_data=buf->Map(); + + fis->Read(pixel_data,total_bytes); + + buf->Unmap(); + + Texture2D *tex=device->CreateTexture2D(format,buf,file_header.width,file_header.height); + + return tex; + } + else + { + return nullptr; + } +} +VK_NAMESPACE_END