blob: d1a8fb7ee12be6ee5bc2caf953888288a045c7d6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/service/frame_sinks/surface_resource_holder.h"
#include <utility>
#include "base/check.h"
#include "components/viz/service/frame_sinks/surface_resource_holder_client.h"
namespace viz {
ReservedResourceDelegate::~ReservedResourceDelegate() = default;
SurfaceResourceHolder::SurfaceResourceHolder(
SurfaceResourceHolderClient* client)
: client_(client) {}
SurfaceResourceHolder::~SurfaceResourceHolder() = default;
void SurfaceResourceHolder::Reset() {
resource_id_info_map_.clear();
}
void SurfaceResourceHolder::ReceiveFromChild(
const std::vector<TransferableResource>& resources) {
for (const auto& resource : resources) {
// We don't handle reserved resources here. CompositorFrames from clients
// can never contain reserved ResourceIds, but viz may handle resources
// of its own (e.g. see `SurfaceAnimationManager`), so skip them here.
if (resource.id >= kVizReservedRangeStartId) {
continue;
}
ResourceRefs& ref = resource_id_info_map_[resource.id];
ref.refs_holding_resource_alive++;
ref.refs_received_from_child++;
}
}
void SurfaceResourceHolder::RefResources(
const std::vector<TransferableResource>& resources) {
for (const auto& resource : resources) {
// We don't handle reserved resources here.
if (resource.id >= kVizReservedRangeStartId)
continue;
auto count_it = resource_id_info_map_.find(resource.id);
DCHECK(count_it != resource_id_info_map_.end())
<< "ResourceId: " << resource.id;
count_it->second.refs_holding_resource_alive++;
}
}
void SurfaceResourceHolder::UnrefResources(
std::vector<ReturnedResource> resources) {
std::vector<ReturnedResource> resources_available_to_return;
for (auto& resource : resources) {
// We don't handle reserved resources here.
if (resource.id >= kVizReservedRangeStartId)
continue;
auto count_it = resource_id_info_map_.find(resource.id);
if (count_it == resource_id_info_map_.end())
continue;
ResourceRefs& ref = count_it->second;
ref.refs_holding_resource_alive -= resource.count;
// Keep the newest return sync token that has data.
// TODO(jbauman): Handle the case with two valid sync tokens.
if (resource.sync_token.HasData())
ref.sync_token = resource.sync_token;
if (ref.refs_holding_resource_alive == 0) {
resource.sync_token = ref.sync_token;
resource.count = ref.refs_received_from_child;
resources_available_to_return.push_back(std::move(resource));
resource_id_info_map_.erase(count_it);
}
}
client_->ReturnResources(std::move(resources_available_to_return));
}
} // namespace viz