blob: 6d8ef89b6e724da72b7fac5ed1df06a222f412e5 [file] [log] [blame]
// Copyright 2012 The Chromium 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 "cc/test/fake_layer_tree_frame_sink.h"
#include "base/bind.h"
#include "base/stl_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "cc/trees/layer_tree_frame_sink_client.h"
#include "components/viz/common/frame_sinks/begin_frame_source.h"
#include "components/viz/common/frame_sinks/delay_based_time_source.h"
#include "components/viz/common/resources/returned_resource.h"
#include "components/viz/test/begin_frame_args_test.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cc {
FakeLayerTreeFrameSink::Builder::Builder()
: compositor_context_provider_(viz::TestContextProvider::Create()),
worker_context_provider_(viz::TestContextProvider::CreateWorker()) {}
FakeLayerTreeFrameSink::Builder::~Builder() = default;
std::unique_ptr<FakeLayerTreeFrameSink>
FakeLayerTreeFrameSink::Builder::Build() {
DCHECK(compositor_context_provider_);
DCHECK(worker_context_provider_);
return FakeLayerTreeFrameSink::Create3d(
std::move(compositor_context_provider_),
std::move(worker_context_provider_));
}
FakeLayerTreeFrameSink::FakeLayerTreeFrameSink(
scoped_refptr<viz::ContextProvider> context_provider,
scoped_refptr<viz::RasterContextProvider> worker_context_provider)
: LayerTreeFrameSink(std::move(context_provider),
std::move(worker_context_provider),
base::ThreadTaskRunnerHandle::Get(),
nullptr),
weak_ptr_factory_(this) {
gpu_memory_buffer_manager_ =
context_provider_ ? &test_gpu_memory_buffer_manager_ : nullptr;
}
FakeLayerTreeFrameSink::~FakeLayerTreeFrameSink() = default;
bool FakeLayerTreeFrameSink::BindToClient(LayerTreeFrameSinkClient* client) {
if (!LayerTreeFrameSink::BindToClient(client))
return false;
begin_frame_source_ = std::make_unique<viz::BackToBackBeginFrameSource>(
std::make_unique<viz::DelayBasedTimeSource>(
base::ThreadTaskRunnerHandle::Get().get()));
client_->SetBeginFrameSource(begin_frame_source_.get());
return true;
}
void FakeLayerTreeFrameSink::DetachFromClient() {
ReturnResourcesHeldByParent();
LayerTreeFrameSink::DetachFromClient();
}
void FakeLayerTreeFrameSink::SubmitCompositorFrame(
viz::CompositorFrame frame,
bool hit_test_data_changed,
bool submit_hit_test_borders) {
ReturnResourcesHeldByParent();
last_sent_frame_ = std::make_unique<viz::CompositorFrame>(std::move(frame));
++num_sent_frames_;
last_swap_rect_ = last_sent_frame_->render_pass_list.back()->damage_rect;
resources_held_by_parent_.insert(resources_held_by_parent_.end(),
last_sent_frame_->resource_list.begin(),
last_sent_frame_->resource_list.end());
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&FakeLayerTreeFrameSink::DidReceiveCompositorFrameAck,
weak_ptr_factory_.GetWeakPtr()));
}
void FakeLayerTreeFrameSink::DidNotProduceFrame(const viz::BeginFrameAck& ack) {
}
void FakeLayerTreeFrameSink::DidAllocateSharedBitmap(
mojo::ScopedSharedBufferHandle buffer,
const viz::SharedBitmapId& id) {
DCHECK(!base::ContainsValue(shared_bitmaps_, id));
shared_bitmaps_.push_back(id);
}
void FakeLayerTreeFrameSink::DidDeleteSharedBitmap(
const viz::SharedBitmapId& id) {
DCHECK(base::ContainsValue(shared_bitmaps_, id));
base::Erase(shared_bitmaps_, id);
}
void FakeLayerTreeFrameSink::DidReceiveCompositorFrameAck() {
client_->DidReceiveCompositorFrameAck();
}
void FakeLayerTreeFrameSink::ReturnResourcesHeldByParent() {
if (last_sent_frame_) {
// Return the last frame's resources immediately.
std::vector<viz::ReturnedResource> resources;
for (const auto& resource : resources_held_by_parent_)
resources.push_back(resource.ToReturnedResource());
resources_held_by_parent_.clear();
client_->ReclaimResources(resources);
}
}
} // namespace cc