diff --git a/common/com_image.h b/common/com_image.h index a62be51f..098a0d12 100644 --- a/common/com_image.h +++ b/common/com_image.h @@ -69,6 +69,7 @@ typedef enum IL_LOAD_DECAL = BIT(5), // special mode for load gradient decals IL_OVERVIEW = BIT(6), // overview required some unque operations IL_LOAD_PLAYER_DECAL = BIT(7), // special mode for player decals + IL_KTX2_RAW = BIT(8), // renderer can consume raw KTX2 files (e.g. ref_vk) } ilFlags_t; // goes into rgbdata_t->encode diff --git a/engine/common/imagelib/img_ktx2.c b/engine/common/imagelib/img_ktx2.c index 0923644d..52f91bfc 100644 --- a/engine/common/imagelib/img_ktx2.c +++ b/engine/common/imagelib/img_ktx2.c @@ -114,6 +114,11 @@ static qboolean Image_KTX2Parse( const ktx2_header_t *header, const byte *buffer return false; } + if( !Image_CheckFlag( IL_DDS_HARDWARE ) && ImageCompressed( image.type )) { + Con_DPrintf(S_WARN "%s: has compressed format, but support is not advertized\n", __FUNCTION__); + return false; + } + if (header->pixelDepth > 1) { Con_DPrintf(S_ERROR "%s: unsupported KTX2 pixelDepth %d\n", __FUNCTION__, header->pixelDepth); return false; @@ -197,6 +202,9 @@ qboolean Image_LoadKTX2( const char *name, const byte *buffer, fs_offset_t files image.num_mips = 1; if (!Image_KTX2Parse(&header, buffer, filesize)) { + if (!Image_CheckFlag( IL_KTX2_RAW )) + return false; + // If KTX2 to imagelib conversion failed, try passing the file as raw data. // This is useful for ref_vk which can directly support hundreds of formats which we don't convert to pixformat_t here diff --git a/ref/vk/vk_textures.c b/ref/vk/vk_textures.c index 4dd6a42e..f647c142 100644 --- a/ref/vk/vk_textures.c +++ b/ref/vk/vk_textures.c @@ -52,7 +52,7 @@ void initTextures( void ) { vk_numTextures = 0; // TODO really check device caps for this - gEngine.Image_AddCmdFlags( IL_DDS_HARDWARE ); + gEngine.Image_AddCmdFlags( IL_DDS_HARDWARE | IL_KTX2_RAW ); tglob.default_sampler_fixme = pickSamplerForFlags(0); ASSERT(tglob.default_sampler_fixme != VK_NULL_HANDLE);