From 6c1b48507f4dccf7353b17a0bd39e5ff8742af71 Mon Sep 17 00:00:00 2001 From: assiduous Date: Fri, 2 Oct 2020 15:56:31 -0700 Subject: GLTF loader: fixed issue with state transition for DDS/KTX textures --- AssetLoader/src/GLTFLoader.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'AssetLoader/src/GLTFLoader.cpp') diff --git a/AssetLoader/src/GLTFLoader.cpp b/AssetLoader/src/GLTFLoader.cpp index 558f3ae..ac161d6 100644 --- a/AssetLoader/src/GLTFLoader.cpp +++ b/AssetLoader/src/GLTFLoader.cpp @@ -643,7 +643,7 @@ void Model::LoadTextures(IRenderDevice* pDevice, const std::string& BaseDir, TextureCacheType* pTextureCache) { - std::vector MipMapGenList; + std::vector NewTextures; for (const tinygltf::Texture& gltf_tex : gltf_model.textures) { const tinygltf::Image& gltf_image = gltf_model.images[gltf_tex.source]; @@ -692,7 +692,7 @@ void Model::LoadTextures(IRenderDevice* pDevice, if (gltf_image.width > 0 && gltf_image.height > 0) { pTexture = TextureFromGLTFImage(pDevice, pCtx, gltf_image, pSampler, AlphaCutoff); - MipMapGenList.push_back(pTexture); + pCtx->GenerateMips(pTexture->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE)); } else if (gltf_image.pixel_type == IMAGE_FILE_FORMAT_DDS || gltf_image.pixel_type == IMAGE_FILE_FORMAT_KTX) { @@ -714,6 +714,9 @@ void Model::LoadTextures(IRenderDevice* pDevice, } } + VERIFY_EXPR(pTexture); + NewTextures.emplace_back(pTexture); + if (pTextureCache != nullptr) { pTextureCache->emplace(BaseDir + gltf_image.uri, pTexture); @@ -723,17 +726,22 @@ void Model::LoadTextures(IRenderDevice* pDevice, Textures.push_back(std::move(pTexture)); } - std::vector Barriers; - for (auto& Tex : MipMapGenList) + if (!NewTextures.empty()) { - pCtx->GenerateMips(Tex->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE)); - - StateTransitionDesc Barrier{Tex, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE}; - Barrier.UpdateResourceState = true; - Barriers.emplace_back(Barrier); + std::vector Barriers; + Barriers.reserve(NewTextures.size()); + for (auto& Tex : NewTextures) + { + if (Tex) + { + StateTransitionDesc Barrier{Tex, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE}; + Barrier.UpdateResourceState = true; + Barriers.emplace_back(Barrier); + } + } + if (!Barriers.empty()) + pCtx->TransitionResourceStates(static_cast(Barriers.size()), Barriers.data()); } - if (!Barriers.empty()) - pCtx->TransitionResourceStates(static_cast(Barriers.size()), Barriers.data()); } namespace -- cgit v1.2.3