diff --git a/impeller/renderer/backend/vulkan/allocator_vk.cc b/impeller/renderer/backend/vulkan/allocator_vk.cc index 332e234531913..364b9aa49afbd 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -196,7 +196,7 @@ int32_t AllocatorVK::FindMemoryTypeIndex( return type_index; } -static constexpr vk::ImageUsageFlags ToVKImageUsageFlags( +vk::ImageUsageFlags AllocatorVK::ToVKImageUsageFlags( PixelFormat format, TextureUsageMask usage, StorageMode mode, @@ -219,30 +219,16 @@ static constexpr vk::ImageUsageFlags ToVKImageUsageFlags( vk_usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment; } else { vk_usage |= vk::ImageUsageFlagBits::eColorAttachment; + vk_usage |= vk::ImageUsageFlagBits::eInputAttachment; } - vk_usage |= vk::ImageUsageFlagBits::eInputAttachment; } if (usage & TextureUsage::kShaderRead) { vk_usage |= vk::ImageUsageFlagBits::eSampled; - // Device transient images can only be used as attachments. The caller - // specified incorrect usage flags and is attempting to read a device - // transient image in a shader. Unset the transient attachment flag. See: - // https://github.com/flutter/flutter/issues/121633 - if (mode == StorageMode::kDeviceTransient) { - vk_usage &= ~vk::ImageUsageFlagBits::eTransientAttachment; - } } if (usage & TextureUsage::kShaderWrite) { vk_usage |= vk::ImageUsageFlagBits::eStorage; - // Device transient images can only be used as attachments. The caller - // specified incorrect usage flags and is attempting to read a device - // transient image in a shader. Unset the transient attachment flag. See: - // https://github.com/flutter/flutter/issues/121633 - if (mode == StorageMode::kDeviceTransient) { - vk_usage &= ~vk::ImageUsageFlagBits::eTransientAttachment; - } } if (mode != StorageMode::kDeviceTransient) { @@ -314,9 +300,9 @@ class AllocatedTextureSourceVK final : public TextureSourceVK { image_info.arrayLayers = ToArrayLayerCount(desc.type); image_info.tiling = vk::ImageTiling::eOptimal; image_info.initialLayout = vk::ImageLayout::eUndefined; - image_info.usage = - ToVKImageUsageFlags(desc.format, desc.usage, desc.storage_mode, - supports_memoryless_textures); + image_info.usage = AllocatorVK::ToVKImageUsageFlags( + desc.format, desc.usage, desc.storage_mode, + supports_memoryless_textures); image_info.sharingMode = vk::SharingMode::eExclusive; VmaAllocationCreateInfo alloc_nfo = {}; diff --git a/impeller/renderer/backend/vulkan/allocator_vk.h b/impeller/renderer/backend/vulkan/allocator_vk.h index 92b488c4b8c7c..a664c84f4a9af 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.h +++ b/impeller/renderer/backend/vulkan/allocator_vk.h @@ -32,6 +32,13 @@ class AllocatorVK final : public Allocator { uint32_t memory_type_bits_requirement, vk::PhysicalDeviceMemoryProperties& memory_properties); + // Visible for testing. + static vk::ImageUsageFlags ToVKImageUsageFlags( + PixelFormat format, + TextureUsageMask usage, + StorageMode mode, + bool supports_memoryless_textures); + private: friend class ContextVK; diff --git a/impeller/renderer/backend/vulkan/allocator_vk_unittests.cc b/impeller/renderer/backend/vulkan/allocator_vk_unittests.cc index 1b0b85871231c..f8326c983345c 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk_unittests.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk_unittests.cc @@ -13,6 +13,25 @@ namespace impeller { namespace testing { +TEST(AllocatorVKTest, ToVKImageUsageFlags) { + EXPECT_EQ(AllocatorVK::ToVKImageUsageFlags( + PixelFormat::kR8G8B8A8UNormInt, + static_cast(TextureUsage::kRenderTarget), + StorageMode::kDeviceTransient, + /*supports_memoryless_textures=*/true), + vk::ImageUsageFlagBits::eInputAttachment | + vk::ImageUsageFlagBits::eColorAttachment | + vk::ImageUsageFlagBits::eTransientAttachment); + + EXPECT_EQ(AllocatorVK::ToVKImageUsageFlags( + PixelFormat::kD24UnormS8Uint, + static_cast(TextureUsage::kRenderTarget), + StorageMode::kDeviceTransient, + /*supports_memoryless_textures=*/true), + vk::ImageUsageFlagBits::eDepthStencilAttachment | + vk::ImageUsageFlagBits::eTransientAttachment); +} + TEST(AllocatorVKTest, MemoryTypeSelectionSingleHeap) { vk::PhysicalDeviceMemoryProperties properties; properties.memoryTypeCount = 1;