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..3120c7a2852e5 100644 --- a/impeller/renderer/backend/vulkan/allocator_vk.cc +++ b/impeller/renderer/backend/vulkan/allocator_vk.cc @@ -30,16 +30,24 @@ 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; + flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT; + } return flags; case StorageMode::kDevicePrivate: + FML_DCHECK(!readback); return flags; case StorageMode::kDeviceTransient: + FML_DCHECK(!readback); return flags; } FML_UNREACHABLE(); @@ -62,8 +70,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 +463,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 =