未验证 提交 8c14250f 编写于 作者: D David Reveman 提交者: GitHub

[fuchsia] Use scenic allocator service (#25385)

Switch to scenic allocator and Image3 API.
Co-authored-by: NDavid Reveman <reveman@google.com>
上级 9483e756
...@@ -134,6 +134,7 @@ template("runner_sources") { ...@@ -134,6 +134,7 @@ template("runner_sources") {
"$fuchsia_sdk_root/fidl:fuchsia.images", "$fuchsia_sdk_root/fidl:fuchsia.images",
"$fuchsia_sdk_root/fidl:fuchsia.intl", "$fuchsia_sdk_root/fidl:fuchsia.intl",
"$fuchsia_sdk_root/fidl:fuchsia.io", "$fuchsia_sdk_root/fidl:fuchsia.io",
"$fuchsia_sdk_root/fidl:fuchsia.scenic.allocation",
"$fuchsia_sdk_root/fidl:fuchsia.sys", "$fuchsia_sdk_root/fidl:fuchsia.sys",
"$fuchsia_sdk_root/fidl:fuchsia.ui.app", "$fuchsia_sdk_root/fidl:fuchsia.ui.app",
"$fuchsia_sdk_root/fidl:fuchsia.ui.scenic", "$fuchsia_sdk_root/fidl:fuchsia.ui.scenic",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.net.NameLookup", "fuchsia.net.NameLookup",
"fuchsia.posix.socket.Provider", "fuchsia.posix.socket.Provider",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.timezone.Timezone", "fuchsia.timezone.Timezone",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.net.NameLookup", "fuchsia.net.NameLookup",
"fuchsia.posix.socket.Provider", "fuchsia.posix.socket.Provider",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.timezone.Timezone", "fuchsia.timezone.Timezone",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.net.NameLookup", "fuchsia.net.NameLookup",
"fuchsia.posix.socket.Provider", "fuchsia.posix.socket.Provider",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.timezone.Timezone", "fuchsia.timezone.Timezone",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.net.NameLookup", "fuchsia.net.NameLookup",
"fuchsia.posix.socket.Provider", "fuchsia.posix.socket.Provider",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.timezone.Timezone", "fuchsia.timezone.Timezone",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"services": [ "services": [
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.sys.Environment", "fuchsia.sys.Environment",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
"fuchsia.ui.input.ImeService", "fuchsia.ui.input.ImeService",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
"facets": { "facets": {
"fuchsia.test": { "fuchsia.test": {
"system-services": [ "system-services": [
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.ui.scenic.Scenic", "fuchsia.ui.scenic.Scenic",
"fuchsia.vulkan.loader.Loader" "fuchsia.vulkan.loader.Loader"
...@@ -27,6 +28,7 @@ ...@@ -27,6 +28,7 @@
"fuchsia.process.Launcher", "fuchsia.process.Launcher",
"fuchsia.vulkan.loader.Loader", "fuchsia.vulkan.loader.Loader",
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.ui.scenic.Scenic" "fuchsia.ui.scenic.Scenic"
] ]
......
...@@ -103,15 +103,24 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider, ...@@ -103,15 +103,24 @@ bool VulkanSurface::CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider,
VulkanSurface::VulkanSurface( VulkanSurface::VulkanSurface(
vulkan::VulkanProvider& vulkan_provider, vulkan::VulkanProvider& vulkan_provider,
fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator,
sk_sp<GrDirectContext> context, sk_sp<GrDirectContext> context,
scenic::Session* session, scenic::Session* session,
const SkISize& size, const SkISize& size)
uint32_t buffer_id)
: vulkan_provider_(vulkan_provider), session_(session), wait_(this) { : vulkan_provider_(vulkan_provider), session_(session), wait_(this) {
FML_DCHECK(session_); FML_DCHECK(session_);
if (!AllocateDeviceMemory(sysmem_allocator, std::move(context), size, fuchsia::scenic::allocation::BufferCollectionExportToken export_token;
buffer_id)) { 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."; FML_DLOG(INFO) << "Could not allocate device memory.";
return; return;
} }
...@@ -121,7 +130,7 @@ VulkanSurface::VulkanSurface( ...@@ -121,7 +130,7 @@ VulkanSurface::VulkanSurface(
return; return;
} }
PushSessionImageSetupOps(session); PushSessionImageSetupOps(session, std::move(import_token));
std::fill(size_history_.begin(), size_history_.end(), SkISize::MakeEmpty()); std::fill(size_history_.begin(), size_history_.end(), SkISize::MakeEmpty());
...@@ -136,9 +145,6 @@ VulkanSurface::~VulkanSurface() { ...@@ -136,9 +145,6 @@ VulkanSurface::~VulkanSurface() {
if (image_id_) { if (image_id_) {
session_->Enqueue(scenic::NewReleaseResourceCmd(image_id_)); session_->Enqueue(scenic::NewReleaseResourceCmd(image_id_));
} }
if (buffer_id_) {
session_->DeregisterBufferCollection(buffer_id_);
}
wait_.Cancel(); wait_.Cancel();
wait_.set_object(ZX_HANDLE_INVALID); wait_.set_object(ZX_HANDLE_INVALID);
} }
...@@ -224,9 +230,10 @@ bool VulkanSurface::CreateFences() { ...@@ -224,9 +230,10 @@ bool VulkanSurface::CreateFences() {
bool VulkanSurface::AllocateDeviceMemory( bool VulkanSurface::AllocateDeviceMemory(
fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator,
fuchsia::scenic::allocation::BufferCollectionExportToken export_token,
sk_sp<GrDirectContext> context, sk_sp<GrDirectContext> context,
const SkISize& size, const SkISize& size) {
uint32_t buffer_id) {
if (size.isEmpty()) { if (size.isEmpty()) {
return false; return false;
} }
...@@ -242,8 +249,14 @@ bool VulkanSurface::AllocateDeviceMemory( ...@@ -242,8 +249,14 @@ bool VulkanSurface::AllocateDeviceMemory(
status = vulkan_token->Sync(); status = vulkan_token->Sync();
LOG_AND_RETURN(status != ZX_OK, "Failed to sync token"); LOG_AND_RETURN(status != ZX_OK, "Failed to sync token");
session_->RegisterBufferCollection(buffer_id, std::move(scenic_token)); scenic_allocator->RegisterBufferCollection(
buffer_id_ = buffer_id; 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; VkBufferCollectionCreateInfoFUCHSIA import_info;
import_info.collectionToken = vulkan_token.Unbind().TakeChannel().release(); import_info.collectionToken = vulkan_token.Unbind().TakeChannel().release();
...@@ -370,11 +383,14 @@ bool VulkanSurface::SetupSkiaSurface(sk_sp<GrDirectContext> context, ...@@ -370,11 +383,14 @@ bool VulkanSurface::SetupSkiaSurface(sk_sp<GrDirectContext> context,
return true; return true;
} }
void VulkanSurface::PushSessionImageSetupOps(scenic::Session* session) { void VulkanSurface::PushSessionImageSetupOps(
scenic::Session* session,
fuchsia::scenic::allocation::BufferCollectionImportToken import_token) {
if (image_id_ == 0) if (image_id_ == 0)
image_id_ = session->AllocResourceId(); image_id_ = session->AllocResourceId();
session->Enqueue(scenic::NewCreateImage2Cmd( session->Enqueue(scenic::NewCreateImage3Cmd(image_id_, sk_surface_->width(),
image_id_, sk_surface_->width(), sk_surface_->height(), buffer_id_, 0)); sk_surface_->height(),
std::move(import_token), 0));
} }
uint32_t VulkanSurface::GetImageId() { uint32_t VulkanSurface::GetImageId() {
......
...@@ -71,10 +71,10 @@ class VulkanSurface final : public SurfaceProducerSurface { ...@@ -71,10 +71,10 @@ class VulkanSurface final : public SurfaceProducerSurface {
public: public:
VulkanSurface(vulkan::VulkanProvider& vulkan_provider, VulkanSurface(vulkan::VulkanProvider& vulkan_provider,
fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator,
sk_sp<GrDirectContext> context, sk_sp<GrDirectContext> context,
scenic::Session* session, scenic::Session* session,
const SkISize& size, const SkISize& size);
uint32_t buffer_id);
~VulkanSurface() override; ~VulkanSurface() override;
...@@ -144,10 +144,12 @@ class VulkanSurface final : public SurfaceProducerSurface { ...@@ -144,10 +144,12 @@ class VulkanSurface final : public SurfaceProducerSurface {
zx_status_t status, zx_status_t status,
const zx_packet_signal_t* signal); const zx_packet_signal_t* signal);
bool AllocateDeviceMemory(fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator, bool AllocateDeviceMemory(
sk_sp<GrDirectContext> context, fuchsia::sysmem::AllocatorSyncPtr& sysmem_allocator,
const SkISize& size, fuchsia::scenic::allocation::AllocatorPtr& scenic_allocator,
uint32_t buffer_id); fuchsia::scenic::allocation::BufferCollectionExportToken export_token,
sk_sp<GrDirectContext> context,
const SkISize& size);
bool CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider, bool CreateVulkanImage(vulkan::VulkanProvider& vulkan_provider,
const SkISize& size, const SkISize& size,
...@@ -161,7 +163,9 @@ class VulkanSurface final : public SurfaceProducerSurface { ...@@ -161,7 +163,9 @@ class VulkanSurface final : public SurfaceProducerSurface {
bool CreateFences(); bool CreateFences();
void PushSessionImageSetupOps(scenic::Session* session); void PushSessionImageSetupOps(
scenic::Session* session,
fuchsia::scenic::allocation::BufferCollectionImportToken import_token);
void Reset(); void Reset();
...@@ -175,7 +179,6 @@ class VulkanSurface final : public SurfaceProducerSurface { ...@@ -175,7 +179,6 @@ class VulkanSurface final : public SurfaceProducerSurface {
VkMemoryAllocateInfo vk_memory_info_; VkMemoryAllocateInfo vk_memory_info_;
vulkan::VulkanHandle<VkFence> command_buffer_fence_; vulkan::VulkanHandle<VkFence> command_buffer_fence_;
sk_sp<SkSurface> sk_surface_; sk_sp<SkSurface> sk_surface_;
uint32_t buffer_id_ = 0;
uint32_t image_id_ = 0; uint32_t image_id_ = 0;
vulkan::VulkanHandle<VkBufferCollectionFUCHSIA> collection_; vulkan::VulkanHandle<VkBufferCollectionFUCHSIA> collection_;
zx::event acquire_event_; zx::event acquire_event_;
......
...@@ -41,6 +41,10 @@ VulkanSurfacePool::VulkanSurfacePool(vulkan::VulkanProvider& vulkan_provider, ...@@ -41,6 +41,10 @@ VulkanSurfacePool::VulkanSurfacePool(vulkan::VulkanProvider& vulkan_provider,
sysmem_allocator_->SetDebugClientInfo(GetCurrentProcessName(), sysmem_allocator_->SetDebugClientInfo(GetCurrentProcessName(),
GetCurrentProcessId()); GetCurrentProcessId());
FML_DCHECK(status != ZX_OK); 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() {} VulkanSurfacePool::~VulkanSurfacePool() {}
...@@ -114,8 +118,8 @@ std::unique_ptr<VulkanSurface> VulkanSurfacePool::CreateSurface( ...@@ -114,8 +118,8 @@ std::unique_ptr<VulkanSurface> VulkanSurfacePool::CreateSurface(
TRACE_EVENT2("flutter", "VulkanSurfacePool::CreateSurface", "width", TRACE_EVENT2("flutter", "VulkanSurfacePool::CreateSurface", "width",
size.width(), "height", size.height()); size.width(), "height", size.height());
auto surface = std::make_unique<VulkanSurface>( auto surface = std::make_unique<VulkanSurface>(
vulkan_provider_, sysmem_allocator_, context_, scenic_session_, size, vulkan_provider_, sysmem_allocator_, scenic_allocator_, context_,
buffer_id_++); scenic_session_, size);
if (!surface->IsValid()) { if (!surface->IsValid()) {
return nullptr; return nullptr;
} }
......
...@@ -42,10 +42,10 @@ class VulkanSurfacePool final { ...@@ -42,10 +42,10 @@ class VulkanSurfacePool final {
sk_sp<GrDirectContext> context_; sk_sp<GrDirectContext> context_;
scenic::Session* scenic_session_; scenic::Session* scenic_session_;
fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_; fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator_;
fuchsia::scenic::allocation::AllocatorPtr scenic_allocator_;
std::vector<std::unique_ptr<VulkanSurface>> available_surfaces_; std::vector<std::unique_ptr<VulkanSurface>> available_surfaces_;
std::unordered_map<uintptr_t, std::unique_ptr<VulkanSurface>> std::unordered_map<uintptr_t, std::unique_ptr<VulkanSurface>>
pending_surfaces_; pending_surfaces_;
uint32_t buffer_id_ = 1;
size_t trace_surfaces_created_ = 0; size_t trace_surfaces_created_ = 0;
size_t trace_surfaces_reused_ = 0; size_t trace_surfaces_reused_ = 0;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
"facets": { "facets": {
"fuchsia.test": { "fuchsia.test": {
"system-services": [ "system-services": [
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.vulkan.loader.Loader" "fuchsia.vulkan.loader.Loader"
] ]
...@@ -25,6 +26,7 @@ ...@@ -25,6 +26,7 @@
"fuchsia.logger.LogSink", "fuchsia.logger.LogSink",
"fuchsia.process.Launcher", "fuchsia.process.Launcher",
"fuchsia.settings.Intl", "fuchsia.settings.Intl",
"fuchsia.scenic.allocation.Allocator",
"fuchsia.sysmem.Allocator", "fuchsia.sysmem.Allocator",
"fuchsia.tracing.provider.Registry", "fuchsia.tracing.provider.Registry",
"fuchsia.ui.input3.Keyboard", "fuchsia.ui.input3.Keyboard",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册