blob: cb98e2debec7e3ea192ae3280db1070e2e06aadb [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/mac/mtl_shared_event_fence.h"
#include "base/check.h"
#include "base/containers/flat_map.h"
namespace gfx {
struct MTLSharedEventFence::ObjCStorage {
explicit ObjCStorage(id<MTLSharedEvent> shared_event)
: shared_event(shared_event) {}
id<MTLSharedEvent> __strong shared_event;
};
MTLSharedEventFence::MTLSharedEventFence() = default;
MTLSharedEventFence::~MTLSharedEventFence() = default;
MTLSharedEventFence::MTLSharedEventFence(MTLSharedEventFence&&) = default;
MTLSharedEventFence& MTLSharedEventFence::operator=(
MTLSharedEventFence&&) = default;
MTLSharedEventFence::MTLSharedEventFence(id<MTLSharedEvent> shared_event,
uint64_t fence_value)
: objc_storage_(std::make_unique<ObjCStorage>(shared_event)),
fence_value_(fence_value) {}
std::vector<MTLSharedEventFence> MTLSharedEventFence::Reduce(
std::vector<MTLSharedEventFence> fences) {
std::vector<MTLSharedEventFence> reduced;
base::flat_map<id<MTLSharedEvent>, uint64_t> shared_events;
for (const auto& fence : fences) {
if (id<MTLSharedEvent> shared_event = fence.GetSharedEvent()) {
shared_events[shared_event] =
std::max(shared_events[shared_event], fence.fence_value());
}
}
for (const auto& [shared_event, fence_value] : shared_events) {
reduced.emplace_back(shared_event, fence_value);
}
return reduced;
}
id<MTLSharedEvent> MTLSharedEventFence::GetSharedEvent() const {
CHECK(objc_storage_);
return objc_storage_->shared_event;
}
bool MTLSharedEventFence::HasSignaled() const {
if (id<MTLSharedEvent> shared_event = GetSharedEvent()) {
return shared_event.signaledValue >= fence_value_;
}
return true;
}
} // namespace gfx