[Impeller] cleanup and test vk image usage flags. (flutter/engine#51301)

Cleanups to the vk::ImageUsageFlagBits

* add unit tests
* remove input attachment from depth stencil
* remove defensive checks
This commit is contained in:
Jonah Williams
2024-03-13 12:39:01 -07:00
committed by GitHub
parent 8f4cbc1831
commit b5e86684b0
3 changed files with 31 additions and 19 deletions

View File

@@ -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 = {};

View File

@@ -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;

View File

@@ -13,6 +13,25 @@
namespace impeller {
namespace testing {
TEST(AllocatorVKTest, ToVKImageUsageFlags) {
EXPECT_EQ(AllocatorVK::ToVKImageUsageFlags(
PixelFormat::kR8G8B8A8UNormInt,
static_cast<TextureUsageMask>(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<TextureUsageMask>(TextureUsage::kRenderTarget),
StorageMode::kDeviceTransient,
/*supports_memoryless_textures=*/true),
vk::ImageUsageFlagBits::eDepthStencilAttachment |
vk::ImageUsageFlagBits::eTransientAttachment);
}
TEST(AllocatorVKTest, MemoryTypeSelectionSingleHeap) {
vk::PhysicalDeviceMemoryProperties properties;
properties.memoryTypeCount = 1;