diff --git a/filament/src/driver/vulkan/VulkanHandles.cpp b/filament/src/driver/vulkan/VulkanHandles.cpp index 0501e199c0..7f841d01cb 100644 --- a/filament/src/driver/vulkan/VulkanHandles.cpp +++ b/filament/src/driver/vulkan/VulkanHandles.cpp @@ -410,15 +410,12 @@ VulkanTexture::VulkanTexture(VulkanContext& context, SamplerType target, uint8_t imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; } if (usage & TextureUsage::UPLOADABLE) { - imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + // Uploadable textures can be used as a blit source (e.g. for mipmap generation) + // therefore we must set both the TRANSFER_DST and TRANSFER_SRC flags. + imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; } if (usage & TextureUsage::DEPTH_ATTACHMENT) { imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - } else { - // If it's a not an FBO target or a depth attachment, then it's safe to assume that it will - // need to be uploaded or blitted to, so we should set USAGE_TRANSFER_DST. Also, since we - // need to support GenerateMipmaps, it can be a blit source; ergo we set USAGE_TRANSFER_SRC. - imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; } VkResult error = vkCreateImage(context.device, &imageInfo, VKALLOC, &textureImage);