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 6f0894b46c62062b9d99bdc325853b3262da5dcd Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Sat, 24 Feb 2024 11:45:17 -0800 Subject: [PATCH 2/2] Remove early reset. --- lib/ui/painting/image_encoding_impeller.cc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/ui/painting/image_encoding_impeller.cc b/lib/ui/painting/image_encoding_impeller.cc index ec61bd93116bd..4bdb188d97e29 100644 --- a/lib/ui/painting/image_encoding_impeller.cc +++ b/lib/ui/painting/image_encoding_impeller.cc @@ -34,22 +34,13 @@ sk_sp ConvertBufferToSkImage( const std::shared_ptr& buffer, SkColorType color_type, SkISize dimensions) { - auto buffer_view = impeller::DeviceBuffer::AsBufferView(buffer); - SkImageInfo image_info = SkImageInfo::Make(dimensions, color_type, SkAlphaType::kPremul_SkAlphaType); SkBitmap bitmap; - auto func = [](void* addr, void* context) { - auto buffer = - static_cast*>(context); - buffer->reset(); - delete buffer; - }; auto bytes_per_pixel = image_info.bytesPerPixel(); bitmap.installPixels(image_info, buffer->OnGetContents(), - dimensions.width() * bytes_per_pixel, func, - new std::shared_ptr(buffer)); + dimensions.width() * bytes_per_pixel); bitmap.setImmutable(); sk_sp raster_image = SkImages::RasterFromBitmap(bitmap); @@ -157,7 +148,7 @@ void ImageEncodingImpeller::ConvertDlImageToSkImage( impeller::DeviceBufferDescriptor buffer_desc; buffer_desc.storage_mode = impeller::StorageMode::kHostVisible; - buffer_desc.readback = true; + buffer_desc.readback = false; // set to false for testing. buffer_desc.size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel(); auto buffer =