Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 33 additions & 2 deletions code/graphics/vulkan/VulkanTexture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "ddsutils/bcdec.h"
#include "globalincs/systemvars.h"
#include "ktxutils/ktxutils.h"
#include "ktxutils/etcdec.h"

namespace graphics::vulkan {

Expand Down Expand Up @@ -1857,7 +1858,13 @@ ubyte* VulkanTextureManager::get_bitmap_from_texture(int bitmap_num, int* width_
ts->format == vk::Format::eBc1RgbaUnormBlock ||
ts->format == vk::Format::eBc2UnormBlock ||
ts->format == vk::Format::eBc3UnormBlock ||
ts->format == vk::Format::eBc7UnormBlock,
ts->format == vk::Format::eBc7UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8SrgbBlock ||
ts->format == vk::Format::eEtc2R8G8B8A1UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8A1SrgbBlock ||
ts->format == vk::Format::eEtc2R8G8B8A8UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8A8SrgbBlock,
"get_bitmap_from_texture: unsupported format %d on bitmap %d"
" — may be a render target or dynamic texture",
static_cast<int>(ts->format), bitmap_num);
Expand All @@ -1868,7 +1875,13 @@ ubyte* VulkanTextureManager::get_bitmap_from_texture(int bitmap_num, int* width_
const bool isCompressed = (ts->format == vk::Format::eBc1RgbaUnormBlock ||
ts->format == vk::Format::eBc2UnormBlock ||
ts->format == vk::Format::eBc3UnormBlock ||
ts->format == vk::Format::eBc7UnormBlock);
ts->format == vk::Format::eBc7UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8SrgbBlock ||
ts->format == vk::Format::eEtc2R8G8B8A1UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8A1SrgbBlock ||
ts->format == vk::Format::eEtc2R8G8B8A8UnormBlock ||
ts->format == vk::Format::eEtc2R8G8B8A8SrgbBlock);
const bool hasAlpha = bm_has_alpha_channel(bitmap_num);
const int outChannels = hasAlpha ? 4 : 3;

Expand All @@ -1885,6 +1898,12 @@ ubyte* VulkanTextureManager::get_bitmap_from_texture(int bitmap_num, int* width_
case vk::Format::eBc2UnormBlock: blockSize = BCDEC_BC2_BLOCK_SIZE; break;
case vk::Format::eBc3UnormBlock: blockSize = BCDEC_BC3_BLOCK_SIZE; break;
case vk::Format::eBc7UnormBlock: blockSize = BCDEC_BC7_BLOCK_SIZE; break;
case vk::Format::eEtc2R8G8B8UnormBlock:
case vk::Format::eEtc2R8G8B8SrgbBlock: blockSize = ETCDEC_ETC_RGB_BLOCK_SIZE; break;
case vk::Format::eEtc2R8G8B8A1UnormBlock:
case vk::Format::eEtc2R8G8B8A1SrgbBlock: blockSize = ETCDEC_ETC_RGB_A1_BLOCK_SIZE; break;
case vk::Format::eEtc2R8G8B8A8UnormBlock:
case vk::Format::eEtc2R8G8B8A8SrgbBlock: blockSize = ETCDEC_EAC_RGBA_BLOCK_SIZE; break;
default: return nullptr;
}
blockW = (w + 3) / 4;
Expand Down Expand Up @@ -2038,6 +2057,18 @@ void VulkanTextureManager::decodeReadbackBuffer(const void* mapped, vk::Format f
case vk::Format::eBc7UnormBlock:
bcdec_bc7(srcBlock, blockColBase, static_cast<int>(copyW * 4));
break;
case vk::Format::eEtc2R8G8B8UnormBlock:
case vk::Format::eEtc2R8G8B8SrgbBlock:
etcdec_etc_rgb(srcBlock, blockColBase, static_cast<int>(copyW * 4));
break;
case vk::Format::eEtc2R8G8B8A1UnormBlock:
case vk::Format::eEtc2R8G8B8A1SrgbBlock:
etcdec_etc_rgb_a1(srcBlock, blockColBase, static_cast<int>(copyW * 4));
break;
case vk::Format::eEtc2R8G8B8A8UnormBlock:
case vk::Format::eEtc2R8G8B8A8SrgbBlock:
etcdec_eac_rgba(srcBlock, blockColBase, static_cast<int>(copyW * 4));
break;
default: break;
}
srcBlock += blockSize;
Expand Down
19 changes: 17 additions & 2 deletions code/graphics/vulkan/VulkanTextureAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "ddsutils/ddsutils.h"
#include "ddsutils/bcdec.h"
#include "globalincs/systemvars.h"

#include "ktxutils/ktxutils.h"

namespace graphics::vulkan {

Expand All @@ -32,7 +32,7 @@ int vulkan_preload(int bitmap_num, int /*is_aabitmap*/)
// raw compressed data with all pre-baked mipmap levels.
int compType = bm_is_compressed(bitmap_num);
int lockBpp = 32;
ubyte lockFlags = BMP_TEX_XPARENT;
uint lockFlags = BMP_TEX_XPARENT;

switch (compType) {
case DDS_DXT1:
Expand Down Expand Up @@ -60,6 +60,21 @@ int vulkan_preload(int bitmap_num, int /*is_aabitmap*/)
lockBpp = 32;
lockFlags = BMP_TEX_CUBEMAP;
break;
case KTX_ETC2_RGB:
case KTX_ETC2_SRGB:
lockBpp = 24;
lockFlags = BMP_TEX_ETC2_RGB8;
break;
case KTX_ETC2_RGBA_EAC:
case KTX_ETC2_SRGBA_EAC:
lockBpp = 32;
lockFlags = BMP_TEX_ETC2_RGBA8;
break;
case KTX_ETC2_RGB_A1:
case KTX_ETC2_SRGB_A1:
lockBpp = 24;
lockFlags = BMP_TEX_ETC2_RGBA1;
break;
default:
// Uncompressed — use 32bpp decompressed
compType = 0;
Expand Down
Loading
Loading