[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:
@@ -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 = {};
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user