2
3
4
5
9#include "Core/Timer/ScopeTimer.h"
10#include "Render/Vulkan/VulkanDevice.h"
11#include "Render/Vulkan/VulkanRenderBackend.h"
13#include <../external/basisu/transcoder/basisu_transcoder.h>
15#include <../lib/vkformat_enum.h>
20#define KTX_CHECK(expr)
22 if (expr == KTX_SUCCESS) {}
26 ss << "Assert Failed \n At File: " << __FILE__ << " \n At Line: " << __LINE__ << "\n ";
27 SPICES_CORE_ERROR(ss.str());
36
37
38 basist::basisu_transcoder_init();
41 ktxTexture2*
Transcoder::CreateKTX2Texture(
int& width,
int& height)
46
47
48 ktxTextureCreateInfo createInfo;
49 createInfo.vkFormat = VK_FORMAT_R8G8B8A8_UNORM;
50 createInfo.baseWidth = width;
51 createInfo.baseHeight = height;
52 createInfo.baseDepth = 1;
53 createInfo.numDimensions = 2;
54 createInfo.numLevels =
static_cast<uint32_t>(std::floor(std::log2(std::max(width, height)))) + 1;
55 createInfo.numLayers = 1;
56 createInfo.numFaces = 1;
57 createInfo.isArray = KTX_FALSE;
58 createInfo.generateMipmaps = KTX_FALSE;
63 KTX_CHECK(ktxTexture2_Create(&createInfo, KTX_TEXTURE_CREATE_ALLOC_STORAGE, &texture))
68 bool Transcoder::WriteData(ktxTexture2* texture, uint32_t mipLevel,
const unsigned char* data, uint32_t size)
72 KTX_CHECK(ktxTexture_SetImageFromMemory(ktxTexture(texture), mipLevel, 0, 0, data, size))
77 bool Transcoder::SaveToDisk(ktxTexture2* texture,
const std::string& filePath)
82
83
84
85
86 ktxBasisParams params{0};
87 params.structSize =
sizeof(params);
88 params.uastc = KTX_TRUE;
89 params.verbose = KTX_FALSE;
90 params.noSSE = KTX_TRUE;
93 params.threadCount = std::thread::hardware_concurrency();
94 params.compressionLevel = 0;
95 params.qualityLevel = 128;
98 params.uastcFlags = KTX_PACK_UASTC_LEVEL_FASTEST;
99 params.uastcRDO = KTX_TRUE;
100 params.uastcRDONoMultithreading = KTX_TRUE;
103
104
105 KTX_CHECK(ktxTexture2_CompressBasisEx(texture, ¶ms))
108
109
110 std::filesystem::create_directories(std::filesystem::path(filePath).parent_path());
111 ktxTexture_WriteToNamedFile(ktxTexture(texture), filePath.c_str());
112 ktxTexture_Destroy(ktxTexture(texture));
117
118
119 KTX_CHECK(ktxTexture2_CreateFromNamedFile(filePath.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture))
120 texture->generateMipmaps = KTX_TRUE;
123
124
125 ktxTexture_WriteToNamedFile(ktxTexture(texture), filePath.c_str());
126 ktxTexture_Destroy(ktxTexture(texture));
133 bool Transcoder::LoadFromKTX(
const std::string& filePath, ktxTexture2*& texture)
137 KTX_CHECK(ktxTexture2_CreateFromNamedFile(filePath.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &texture))
139 if (ktxTexture2_NeedsTranscoding(texture))
141 ktx_transcode_fmt_e tf = GetAvailableTargetFormats();
143 khr_df_model_e colorModel = ktxTexture2_GetColorModel_e(texture);
145 KTX_CHECK(ktxTexture2_TranscodeBasis(texture, tf, 0))
151
152
153 ktxVulkanDeviceInfo vdi{};
154 VulkanState& state = VulkanRenderBackend::GetState();
156 KTX_CHECK(ktxVulkanDeviceInfo_Construct(
158 state.m_PhysicalDevice,
160 state.m_GraphicQueue,
161 state.m_GraphicCommandPool,
165 KTX_CHECK(ktxTexture2_VkUploadEx(
169 VK_IMAGE_TILING_OPTIMAL ,
170 VK_IMAGE_USAGE_SAMPLED_BIT ,
171 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
175
176
179 KTX_CHECK(ktxHashList_FindValue(
180 &texture->kvDataHead ,
181 KTX_ORIENTATION_KEY ,
188 if (sscanf(pValue, KTX_ORIENTATION2_FMT, &s, &t) == 2)
194 ktxTexture_Destroy(ktxTexture(texture));
195 ktxVulkanDeviceInfo_Destruct(&vdi);
206 ktxTexture_Destroy(ktxTexture(texture));
211 ktx_size_t
Transcoder::GetMipmapOffset(ktxTexture2* texture, uint32_t mipLevel)
216 KTX_CHECK(ktxTexture_GetImageOffset((ktxTexture*)texture, mipLevel, 0, 0, &offset))
225 VkFormatProperties properties{};
228 vkGetPhysicalDeviceFormatProperties(state.m_PhysicalDevice, format, &properties);
231 VkFormatFeatureFlags neededFeatures
232 = VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT;
235 return ((properties.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) &&
236 (properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT));
243 VkPhysicalDeviceFeatures feature = VulkanDevice::GetDeviceFeatures();
246 if (feature.textureCompressionBC)
249 if (FormatSupported(VK_FORMAT_BC7_SRGB_BLOCK))
251 return KTX_TTF_BC7_RGBA;
254 if (FormatSupported(VK_FORMAT_BC3_SRGB_BLOCK))
256 return KTX_TTF_BC3_RGBA;
261 if (feature.textureCompressionASTC_LDR)
263 if (FormatSupported(VK_FORMAT_ASTC_4x4_SRGB_BLOCK))
265 return KTX_TTF_ASTC_4x4_RGBA;
270 if (feature.textureCompressionETC2)
272 if (FormatSupported(VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK))
274 return KTX_TTF_ETC2_RGBA;
280
281
282
283
284
285
288 return KTX_TTF_RGBA32;
#define SPICES_PROFILE_ZONE
static void Init()
Init basisu.
Transcoder of Texture Container format and Transform format and GPU compress format.
static VulkanState & GetState()
Get VulkanState in use.
This class defines the render backend behaves of Vulkan.
This struct contains all Vulkan object in used global.