From 7dd808352d0c1ed31136658731518670f925d1d3 Mon Sep 17 00:00:00 2001 From: David Reveman Date: Fri, 2 Apr 2021 10:05:51 -0400 Subject: [PATCH] [fuchsia] Use scenic allocator service Switch to scenic allocator and Image3 API. --- shell/platform/fuchsia/flutter/BUILD.gn | 1 + .../meta/flutter_aot_product_runner.cmx | 1 + .../flutter/meta/flutter_aot_runner.cmx | 1 + .../meta/flutter_jit_product_runner.cmx | 1 + .../flutter/meta/flutter_jit_runner.cmx | 1 + .../meta/flutter_runner_scenic_tests.cmx | 1 + .../flutter/meta/flutter_runner_tests.cmx | 2 + .../fuchsia/flutter/vulkan_surface.cc | 46 +++++++++++++------ .../platform/fuchsia/flutter/vulkan_surface.h | 19 ++++---- .../fuchsia/flutter/vulkan_surface_pool.cc | 8 +++- .../fuchsia/flutter/vulkan_surface_pool.h | 2 +- testing/fuchsia/meta/fuchsia_test.cmx | 2 + 12 files changed, 59 insertions(+), 26 deletions(-) diff --git a/shell/platform/fuchsia/flutter/BUILD.gn b/shell/platform/fuchsia/flutter/BUILD.gn index 728d2c4e819d4..38c2300521089 100644 --- a/shell/platform/fuchsia/flutter/BUILD.gn +++ b/shell/platform/fuchsia/flutter/BUILD.gn @@ -134,6 +134,7 @@ template("runner_sources") { "$fuchsia_sdk_root/fidl:fuchsia.images", "$fuchsia_sdk_root/fidl:fuchsia.intl", "$fuchsia_sdk_root/fidl:fuchsia.io", + "$fuchsia_sdk_root/fidl:fuchsia.scenic.allocation", "$fuchsia_sdk_root/fidl:fuchsia.sys", "$fuchsia_sdk_root/fidl:fuchsia.ui.app", "$fuchsia_sdk_root/fidl:fuchsia.ui.scenic", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_aot_product_runner.cmx b/shell/platform/fuchsia/flutter/meta/flutter_aot_product_runner.cmx index c4aceabbacdcc..ca0dcabd09fdf 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_aot_product_runner.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_aot_product_runner.cmx @@ -20,6 +20,7 @@ "fuchsia.logger.LogSink", "fuchsia.net.NameLookup", "fuchsia.posix.socket.Provider", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.timezone.Timezone", "fuchsia.tracing.provider.Registry", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_aot_runner.cmx b/shell/platform/fuchsia/flutter/meta/flutter_aot_runner.cmx index 0a04ee5a04e5f..2f76f314f0e5a 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_aot_runner.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_aot_runner.cmx @@ -20,6 +20,7 @@ "fuchsia.logger.LogSink", "fuchsia.net.NameLookup", "fuchsia.posix.socket.Provider", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.timezone.Timezone", "fuchsia.tracing.provider.Registry", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_jit_product_runner.cmx b/shell/platform/fuchsia/flutter/meta/flutter_jit_product_runner.cmx index 2ca8ef3b7d957..f9df37222e890 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_jit_product_runner.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_jit_product_runner.cmx @@ -21,6 +21,7 @@ "fuchsia.logger.LogSink", "fuchsia.net.NameLookup", "fuchsia.posix.socket.Provider", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.timezone.Timezone", "fuchsia.tracing.provider.Registry", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_jit_runner.cmx b/shell/platform/fuchsia/flutter/meta/flutter_jit_runner.cmx index 2ca8ef3b7d957..f9df37222e890 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_jit_runner.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_jit_runner.cmx @@ -21,6 +21,7 @@ "fuchsia.logger.LogSink", "fuchsia.net.NameLookup", "fuchsia.posix.socket.Provider", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.timezone.Timezone", "fuchsia.tracing.provider.Registry", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_runner_scenic_tests.cmx b/shell/platform/fuchsia/flutter/meta/flutter_runner_scenic_tests.cmx index 073c37f00cc9c..d6de1038c1a61 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_runner_scenic_tests.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_runner_scenic_tests.cmx @@ -12,6 +12,7 @@ "services": [ "fuchsia.logger.LogSink", "fuchsia.sys.Environment", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.tracing.provider.Registry", "fuchsia.ui.input.ImeService", diff --git a/shell/platform/fuchsia/flutter/meta/flutter_runner_tests.cmx b/shell/platform/fuchsia/flutter/meta/flutter_runner_tests.cmx index 155be56e9bf21..53f4562c75329 100644 --- a/shell/platform/fuchsia/flutter/meta/flutter_runner_tests.cmx +++ b/shell/platform/fuchsia/flutter/meta/flutter_runner_tests.cmx @@ -8,6 +8,7 @@ "facets": { "fuchsia.test": { "system-services": [ + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.ui.scenic.Scenic", "fuchsia.vulkan.loader.Loader" @@ -27,6 +28,7 @@ "fuchsia.process.Launcher", "fuchsia.vulkan.loader.Loader", "fuchsia.logger.LogSink", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.ui.scenic.Scenic" ] diff --git a/shell/platform/fuchsia/flutter/vulkan_surface.cc b/shell/platform/fuchsia/flutter/vulkan_surface.cc index c5f47ed75b571..04cc439c5f95a 100644 --- a/shell/platform/fuchsia/flutter/vulkan_surface.cc +++ b/shell/platform/fuchsia/flutter/vulkan_surface.cc @@ -103,15 +103,24 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider, VulkanSurface::VulkanSurface( vulkan::VulkanProvider& vulkan_provider, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, + fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator, sk_sp context, scenic::Session* session, - const SkISize& size, - uint32_t buffer_id) + const SkISize& size) : vulkan_provider_(vulkan_provider), session_(session), wait_(this) { FML_DCHECK(session_); - if (!AllocateDeviceMemory(sysmem_allocator, std::move(context), size, - buffer_id)) { + fuchsia::scenic::allocation::BufferCollectionExportToken export_token; + fuchsia::scenic::allocation::BufferCollectionImportToken import_token; + if (zx::eventpair::create(0, &export_token.value, &import_token.value) != + ZX_OK) { + FML_DLOG(INFO) << "Failed to create event pair"; + return; + } + + if (!AllocateDeviceMemory(sysmem_allocator, scenic_allocator, + std::move(export_token), std::move(context), + size)) { FML_DLOG(INFO) << "Could not allocate device memory."; return; } @@ -121,7 +130,7 @@ VulkanSurface::VulkanSurface( return; } - PushSessionImageSetupOps(session); + PushSessionImageSetupOps(session, std::move(import_token)); std::fill(size_history_.begin(), size_history_.end(), SkISize::MakeEmpty()); @@ -136,9 +145,6 @@ VulkanSurface::~VulkanSurface() { if (image_id_) { session_->Enqueue(scenic::NewReleaseResourceCmd(image_id_)); } - if (buffer_id_) { - session_->DeregisterBufferCollection(buffer_id_); - } wait_.Cancel(); wait_.set_object(ZX_HANDLE_INVALID); } @@ -224,9 +230,10 @@ bool VulkanSurface::CreateFences() { bool VulkanSurface::AllocateDeviceMemory( fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, + fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator, + fuchsia::scenic::allocation::BufferCollectionExportToken export_token, sk_sp context, - const SkISize& size, - uint32_t buffer_id) { + const SkISize& size) { if (size.isEmpty()) { return false; } @@ -242,8 +249,14 @@ bool VulkanSurface::AllocateDeviceMemory( status = vulkan_token->Sync(); LOG_AND_RETURN(status != ZX_OK, "Failed to sync token"); - session_->RegisterBufferCollection(buffer_id, std::move(scenic_token)); - buffer_id_ = buffer_id; + scenic_allocator->RegisterBufferCollection( + std::move(export_token), std::move(scenic_token), + [](fuchsia::scenic::allocation::Allocator_RegisterBufferCollection_Result + result) { + if (result.is_err()) { + FML_DLOG(ERROR) << "RegisterBufferCollection failed"; + } + }); VkBufferCollectionCreateInfoFUCHSIA import_info; import_info.collectionToken = vulkan_token.Unbind().TakeChannel().release(); @@ -370,11 +383,14 @@ bool VulkanSurface::SetupSkiaSurface(sk_sp context, return true; } -void VulkanSurface::PushSessionImageSetupOps(scenic::Session* session) { +void VulkanSurface::PushSessionImageSetupOps( + scenic::Session* session, + fuchsia::scenic::allocation::BufferCollectionImportToken import_token) { if (image_id_ == 0) image_id_ = session->AllocResourceId(); - session->Enqueue(scenic::NewCreateImage2Cmd( - image_id_, sk_surface_->width(), sk_surface_->height(), buffer_id_, 0)); + session->Enqueue(scenic::NewCreateImage3Cmd(image_id_, sk_surface_->width(), + sk_surface_->height(), + std::move(import_token), 0)); } uint32_t VulkanSurface::GetImageId() { diff --git a/shell/platform/fuchsia/flutter/vulkan_surface.h b/shell/platform/fuchsia/flutter/vulkan_surface.h index 7e54bd23688df..f71b6446b2156 100644 --- a/shell/platform/fuchsia/flutter/vulkan_surface.h +++ b/shell/platform/fuchsia/flutter/vulkan_surface.h @@ -71,10 +71,10 @@ class VulkanSurface final : public SurfaceProducerSurface { public: VulkanSurface(vulkan::VulkanProvider& vulkan_provider, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, + fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator, sk_sp context, scenic::Session* session, - const SkISize& size, - uint32_t buffer_id); + const SkISize& size); ~VulkanSurface() override; @@ -144,10 +144,12 @@ class VulkanSurface final : public SurfaceProducerSurface { zx_status_t status, const zx_packet_signal_t* signal); - bool AllocateDeviceMemory(fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, - sk_sp context, - const SkISize& size, - uint32_t buffer_id); + bool AllocateDeviceMemory( + fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, + fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator, + fuchsia::scenic::allocation::BufferCollectionExportToken export_token, + sk_sp context, + const SkISize& size); bool CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider, const SkISize& size, @@ -161,7 +163,9 @@ class VulkanSurface final : public SurfaceProducerSurface { bool CreateFences(); - void PushSessionImageSetupOps(scenic::Session* session); + void PushSessionImageSetupOps( + scenic::Session* session, + fuchsia::scenic::allocation::BufferCollectionImportToken import_token); void Reset(); @@ -175,7 +179,6 @@ class VulkanSurface final : public SurfaceProducerSurface { VkMemoryAllocateInfo vk_memory_info_; vulkan::VulkanHandle command_buffer_fence_; sk_sp sk_surface_; - uint32_t buffer_id_ = 0; uint32_t image_id_ = 0; vulkan::VulkanHandle collection_; zx::event acquire_event_; diff --git a/shell/platform/fuchsia/flutter/vulkan_surface_pool.cc b/shell/platform/fuchsia/flutter/vulkan_surface_pool.cc index b9f83e8eabb30..7d29d3fd3d110 100644 --- a/shell/platform/fuchsia/flutter/vulkan_surface_pool.cc +++ b/shell/platform/fuchsia/flutter/vulkan_surface_pool.cc @@ -41,6 +41,10 @@ VulkanSurfacePool::VulkanSurfacePool(vulkan::VulkanProvider& vulkan_provider, sysmem_allocator_->SetDebugClientInfo(GetCurrentProcessName(), GetCurrentProcessId()); FML_DCHECK(status != ZX_OK); + status = fdio_service_connect( + "/svc/fuchsia.scenic.allocation.Allocator", + scenic_allocator_.NewRequest().TakeChannel().release()); + FML_DCHECK(status != ZX_OK); } VulkanSurfacePool::~VulkanSurfacePool() {} @@ -114,8 +118,8 @@ std::unique_ptr VulkanSurfacePool::CreateSurface( TRACE_EVENT2("flutter", "VulkanSurfacePool::CreateSurface", "width", size.width(), "height", size.height()); auto surface = std::make_unique( - vulkan_provider_, sysmem_allocator_, context_, scenic_session_, size, - buffer_id_++); + vulkan_provider_, sysmem_allocator_, scenic_allocator_, context_, + scenic_session_, size); if (!surface->IsValid()) { return nullptr; } diff --git a/shell/platform/fuchsia/flutter/vulkan_surface_pool.h b/shell/platform/fuchsia/flutter/vulkan_surface_pool.h index 00686f54183ac..27ed4eede737c 100644 --- a/shell/platform/fuchsia/flutter/vulkan_surface_pool.h +++ b/shell/platform/fuchsia/flutter/vulkan_surface_pool.h @@ -42,10 +42,10 @@ class VulkanSurfacePool final { sk_sp context_; scenic::Session* scenic_session_; fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_; + fuchsia::scenic::allocation::AllocatorPtr scenic_allocator_; std::vector> available_surfaces_; std::unordered_map> pending_surfaces_; - uint32_t buffer_id_ = 1; size_t trace_surfaces_created_ = 0; size_t trace_surfaces_reused_ = 0; diff --git a/testing/fuchsia/meta/fuchsia_test.cmx b/testing/fuchsia/meta/fuchsia_test.cmx index 8b72b155c4225..b492c645065b4 100644 --- a/testing/fuchsia/meta/fuchsia_test.cmx +++ b/testing/fuchsia/meta/fuchsia_test.cmx @@ -5,6 +5,7 @@ "facets": { "fuchsia.test": { "system-services": [ + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.vulkan.loader.Loader" ] @@ -25,6 +26,7 @@ "fuchsia.logger.LogSink", "fuchsia.process.Launcher", "fuchsia.settings.Intl", + "fuchsia.scenic.allocation.Allocator", "fuchsia.sysmem.Allocator", "fuchsia.tracing.provider.Registry", "fuchsia.ui.input3.Keyboard",