1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// 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
|