From 40a16ac48a4b926f3d166fbbad93766ece90d141 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 3 Aug 2019 10:00:29 +0200 Subject: [PATCH] Replaced gli with libktx for cubemap texture loading sample --- examples/texture/texture.cpp | 2 +- examples/texturecubemap/texturecubemap.cpp | 50 ++++++++++++++-------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/examples/texture/texture.cpp b/examples/texture/texture.cpp index 394095c0..80d2c0cb 100644 --- a/examples/texture/texture.cpp +++ b/examples/texture/texture.cpp @@ -219,7 +219,7 @@ public: uint32_t offset = 0; for (uint32_t i = 0; i < texture.mipLevels; i++) { - // Calculate offset into staging buffer for the current mip lavel + // Calculate offset into staging buffer for the current mip level ktx_size_t offset; assert(ktxTexture_GetImageOffset(ktxTexture, i, 0, 0, &offset) == KTX_SUCCESS); // Setup a buffer image copy structure for the current mip level diff --git a/examples/texturecubemap/texturecubemap.cpp b/examples/texturecubemap/texturecubemap.cpp index cbb2fc20..3b18d1f3 100644 --- a/examples/texturecubemap/texturecubemap.cpp +++ b/examples/texturecubemap/texturecubemap.cpp @@ -17,13 +17,13 @@ #include #include -#include - #include #include "vulkanexamplebase.h" #include "VulkanBuffer.hpp" #include "VulkanTexture.hpp" #include "VulkanModel.hpp" +#include +#include #define ENABLE_VALIDATION false @@ -127,11 +127,16 @@ public: void loadCubemap(std::string filename, VkFormat format, bool forceLinearTiling) { + ktxResult result; + ktxTexture* ktxTexture; + #if defined(__ANDROID__) // Textures are stored inside the apk on Android (compressed) // So they need to be loaded via the asset manager AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING); - assert(asset); + if (!asset) { + vks::tools::exitFatal("Could not load texture from " + filename + "\n\nThe file may be part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", -1); + } size_t size = AAsset_getLength(asset); assert(size > 0); @@ -139,16 +144,23 @@ public: AAsset_read(asset, textureData, size); AAsset_close(asset); - gli::texture_cube texCube(gli::load((const char*)textureData, size)); + result = ktxTexture_CreateFromMemory(textureData, size, KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, target); + + free(textureData); #else - gli::texture_cube texCube(gli::load(filename)); -#endif + if (!vks::tools::fileExists(filename)) { + vks::tools::exitFatal("Could not load texture from " + filename + "\n\nThe file may be part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", -1); + } + result = ktxTexture_CreateFromNamedFile(filename.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &ktxTexture); +#endif + assert(result == KTX_SUCCESS); - assert(!texCube.empty()); - - cubeMap.width = texCube.extent().x; - cubeMap.height = texCube.extent().y; - cubeMap.mipLevels = texCube.levels(); + // Get properties required for using and upload texture data from the ktx texture object + cubeMap.width = ktxTexture->baseWidth; + cubeMap.height = ktxTexture->baseHeight; + cubeMap.mipLevels = ktxTexture->numLevels; + ktx_uint8_t *ktxTextureData = ktxTexture_GetData(ktxTexture); + ktx_size_t ktxTextureSize = ktxTexture_GetSize(ktxTexture); VkMemoryAllocateInfo memAllocInfo = vks::initializers::memoryAllocateInfo(); VkMemoryRequirements memReqs; @@ -158,7 +170,7 @@ public: VkDeviceMemory stagingMemory; VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(); - bufferCreateInfo.size = texCube.size(); + bufferCreateInfo.size = ktxTextureSize; // This buffer is used as a transfer source for the buffer copy bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; @@ -176,7 +188,7 @@ public: // Copy texture data into staging buffer uint8_t *data; VK_CHECK_RESULT(vkMapMemory(device, stagingMemory, 0, memReqs.size, 0, (void **)&data)); - memcpy(data, texCube.data(), texCube.size()); + memcpy(data, ktxTextureData, ktxTextureSize); vkUnmapMemory(device, stagingMemory); // Create optimal tiled target image @@ -215,20 +227,19 @@ public: { for (uint32_t level = 0; level < cubeMap.mipLevels; level++) { + // Calculate offset into staging buffer for the current mip level and face + ktx_size_t offset; + assert(ktxTexture_GetImageOffset(ktxTexture, level, 0, face, &offset) == KTX_SUCCESS); VkBufferImageCopy bufferCopyRegion = {}; bufferCopyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; bufferCopyRegion.imageSubresource.mipLevel = level; bufferCopyRegion.imageSubresource.baseArrayLayer = face; bufferCopyRegion.imageSubresource.layerCount = 1; - bufferCopyRegion.imageExtent.width = texCube[face][level].extent().x; - bufferCopyRegion.imageExtent.height = texCube[face][level].extent().y; + bufferCopyRegion.imageExtent.width = ktxTexture->baseWidth >> level; + bufferCopyRegion.imageExtent.height = ktxTexture->baseHeight >> level; bufferCopyRegion.imageExtent.depth = 1; bufferCopyRegion.bufferOffset = offset; - bufferCopyRegions.push_back(bufferCopyRegion); - - // Increase offset into staging buffer for next level / face - offset += texCube[face][level].size(); } } @@ -306,6 +317,7 @@ public: // Clean up staging resources vkFreeMemory(device, stagingMemory, nullptr); vkDestroyBuffer(device, stagingBuffer, nullptr); + ktxTexture_Destroy(ktxTexture); } void loadTextures()