blob: ff0c3db9b6fad1dd43bbc68045012b014d052818 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/scenic/lib/utils/helpers.h"
#include <lib/fdio/directory.h>
#include <lib/syslog/cpp/macros.h>
#include "src/lib/fsl/handles/object_info.h"
namespace utils {
fuchsia::ui::scenic::Present2Args CreatePresent2Args(zx_time_t requested_presentation_time,
std::vector<zx::event> acquire_fences,
std::vector<zx::event> release_fences,
zx_duration_t requested_prediction_span) {
fuchsia::ui::scenic::Present2Args args;
args.set_requested_presentation_time(requested_presentation_time);
args.set_acquire_fences(std::move(acquire_fences));
args.set_release_fences(std::move(release_fences));
args.set_requested_prediction_span(requested_prediction_span);
return args;
}
zx_koid_t ExtractKoid(const fuchsia::ui::views::ViewRef& view_ref) {
zx_info_handle_basic_t info{};
if (view_ref.reference.get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr) !=
ZX_OK) {
return ZX_KOID_INVALID; // no info
}
return info.koid;
}
zx::event CopyEvent(const zx::event& event) {
zx::event event_copy;
if (event.duplicate(ZX_RIGHT_SAME_RIGHTS, &event_copy) != ZX_OK)
FX_LOGS(ERROR) << "Copying zx::event failed.";
return event_copy;
}
std::vector<zx::event> CopyEventArray(const std::vector<zx::event>& events) {
std::vector<zx::event> result;
const size_t count = events.size();
result.reserve(count);
for (size_t i = 0; i < count; i++) {
result.push_back(CopyEvent(events[i]));
}
return result;
}
bool IsEventSignalled(const zx::event& event, zx_signals_t signal) {
zx_signals_t pending = 0u;
event.wait_one(signal, zx::time(), &pending);
return (pending & signal) != 0u;
}
zx::event CreateEvent() {
zx::event event;
FX_CHECK(zx::event::create(0, &event) == ZX_OK);
return event;
}
std::vector<zx::event> CreateEventArray(size_t n) {
std::vector<zx::event> events;
events.reserve(n);
for (size_t i = 0; i < n; i++) {
events.push_back(CreateEvent());
}
return events;
}
std::vector<zx_koid_t> ExtractKoids(const std::vector<zx::event>& events) {
std::vector<zx_koid_t> result;
result.reserve(events.size());
for (auto& evt : events) {
zx_info_handle_basic_t info;
zx_status_t status = evt.get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr);
FX_DCHECK(status == ZX_OK);
result.push_back(info.koid);
}
return result;
}
fuchsia::sysmem::AllocatorSyncPtr CreateSysmemAllocatorSyncPtr(
const std::string& debug_name_suffix) {
fuchsia::sysmem::AllocatorSyncPtr sysmem_allocator;
zx_status_t status = fdio_service_connect("/svc/fuchsia.sysmem.Allocator",
sysmem_allocator.NewRequest().TakeChannel().release());
FX_DCHECK(status == ZX_OK);
sysmem_allocator->SetDebugClientInfo(fsl::GetCurrentProcessName() + debug_name_suffix,
fsl::GetCurrentProcessKoid());
return sysmem_allocator;
}
} // namespace utils