From 98092cf7e7fc6775daaef0bd110af55817160810 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Sat, 24 Feb 2024 11:42:49 -0800 Subject: [PATCH 1/2] test readback --- impeller/core/device_buffer_descriptor.h | 3 +++ impeller/entity/contents/content_context.h | 2 +- .../renderer/backend/vulkan/allocator_vk.cc | 23 +++++++++++++------ lib/ui/painting/image_encoding_impeller.cc | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/impeller/core/device_buffer_descriptor.h b/impeller/core/device_buffer_descriptor.h index d1bf458942273..6c7c0ca1d29fc 100644 --- a/impeller/core/device_buffer_descriptor.h +++ b/impeller/core/device_buffer_descriptor.h @@ -14,6 +14,9 @@ namespace impeller { struct DeviceBufferDescriptor { StorageMode storage_mode = StorageMode::kDeviceTransient; size_t size = 0u; + // Perhaps we could combine this with storage mode and create appropriate + // host-write and host-read flags. + bool readback = false; }; } // namespace impeller diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index 6d4fc90298689..d38df9ae03b5a 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -408,7 +408,7 @@ class ContentContext { /// // TODO(bdero): Remove this setting once StC is fully de-risked // https://github.com/flutter/flutter/issues/123671 - static constexpr bool kEnableStencilThenCover = false; + static constexpr bool kEnableStencilThenCover = true; #if IMPELLER_ENABLE_3D std::shared_ptr GetSceneContext() const; diff --git a/impeller/renderer/backend/vulkan/allocator_vk.cc b/impeller/renderer/backend/vulkan/allocator_vk.cc index 2f90cd768dc4e..0a9547e6b64c1 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -30,16 +30,23 @@ ToVKBufferMemoryPropertyFlags(StorageMode mode) { } static VmaAllocationCreateFlags ToVmaAllocationBufferCreateFlags( - StorageMode mode) { + StorageMode mode, + bool readback) { VmaAllocationCreateFlags flags = 0; switch (mode) { case StorageMode::kHostVisible: - flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; - flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; + if (!readback) { + flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; + } else { + flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; + } return flags; case StorageMode::kDevicePrivate: + FML_DCHECK(!readback); return flags; case StorageMode::kDeviceTransient: + FML_DCHECK(!readback); return flags; } FML_UNREACHABLE(); @@ -62,8 +69,8 @@ static PoolVMA CreateBufferPool(VmaAllocator allocator) { allocation_info.usage = VMA_MEMORY_USAGE_AUTO; allocation_info.preferredFlags = static_cast( ToVKBufferMemoryPropertyFlags(StorageMode::kHostVisible)); - allocation_info.flags = - ToVmaAllocationBufferCreateFlags(StorageMode::kHostVisible); + allocation_info.flags = ToVmaAllocationBufferCreateFlags( + StorageMode::kHostVisible, /*readback=*/false); uint32_t memTypeIndex; auto result = vk::Result{vmaFindMemoryTypeIndexForBufferInfo( @@ -455,8 +462,10 @@ std::shared_ptr AllocatorVK::OnCreateBuffer( allocation_info.usage = ToVMAMemoryUsage(); allocation_info.preferredFlags = static_cast( ToVKBufferMemoryPropertyFlags(desc.storage_mode)); - allocation_info.flags = ToVmaAllocationBufferCreateFlags(desc.storage_mode); - if (created_buffer_pool_ && desc.storage_mode == StorageMode::kHostVisible) { + allocation_info.flags = + ToVmaAllocationBufferCreateFlags(desc.storage_mode, desc.readback); + if (created_buffer_pool_ && desc.storage_mode == StorageMode::kHostVisible && + !desc.readback) { allocation_info.pool = staging_buffer_pool_.get().pool; } diff --git a/lib/ui/painting/image_encoding_impeller.cc b/lib/ui/painting/image_encoding_impeller.cc index e2e7cf9e9642d..ec61bd93116bd 100644 --- a/lib/ui/painting/image_encoding_impeller.cc +++ b/lib/ui/painting/image_encoding_impeller.cc @@ -157,6 +157,7 @@ void ImageEncodingImpeller::ConvertDlImageToSkImage( impeller::DeviceBufferDescriptor buffer_desc; buffer_desc.storage_mode = impeller::StorageMode::kHostVisible; + buffer_desc.readback = true; buffer_desc.size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel(); auto buffer = From 7733526729420d24f58d0e00439ce2fbb9597f8a Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Sat, 24 Feb 2024 12:04:52 -0800 Subject: [PATCH 2/2] Update allocator_vk.cc --- impeller/renderer/backend/vulkan/allocator_vk.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/impeller/renderer/backend/vulkan/allocator_vk.cc b/impeller/renderer/backend/vulkan/allocator_vk.cc index 0a9547e6b64c1..3120c7a2852e5 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -40,6 +40,7 @@ static VmaAllocationCreateFlags ToVmaAllocationBufferCreateFlags( flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; } else { flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; + flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; } return flags; case StorageMode::kDevicePrivate: