blob: e044ca67ee2a8bcf79c773b1bea94a38430c8cf8 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/surface_embed/dummy_surface_provider.h"
#include "components/viz/common/quads/compositor_frame.h"
#include "components/viz/common/quads/compositor_render_pass.h"
#include "components/viz/common/quads/solid_color_draw_quad.h"
#include "content/public/browser/context_factory.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/compositor/compositor.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/transform.h"
namespace content {
DummySurfaceProvider::DummySurfaceProvider()
: frame_sink_manager_(GetContextFactory()->GetHostFrameSinkManager()) {
frame_sink_id_ = GetContextFactory()->AllocateFrameSinkId();
frame_sink_manager_->RegisterFrameSinkId(
frame_sink_id_, this, viz::ReportFirstSurfaceActivation::kNo);
frame_sink_manager_->CreateCompositorFrameSink(
frame_sink_id_,
compositor_frame_sink_remote_.BindNewPipeAndPassReceiver(),
compositor_frame_sink_client_receiver_.BindNewPipeAndPassRemote());
}
DummySurfaceProvider::~DummySurfaceProvider() {
frame_sink_manager_->InvalidateFrameSinkId(frame_sink_id_, this, {});
}
void DummySurfaceProvider::SubmitCompositorFrame(
const viz::LocalSurfaceId& local_surface_id,
float device_scale_factor,
const gfx::Size& frame_size_in_pixels) {
viz::CompositorFrame frame;
frame.metadata.begin_frame_ack =
viz::BeginFrameAck::CreateManualAckWithDamage();
frame.metadata.device_scale_factor = device_scale_factor;
frame.metadata.frame_token = ++frame_token_generator_;
const gfx::Rect output_rect(frame_size_in_pixels);
auto pass = viz::CompositorRenderPass::Create();
pass->SetNew(viz::CompositorRenderPassId{1}, output_rect, output_rect,
gfx::Transform());
viz::SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState();
sqs->SetAll(gfx::Transform(), /*layer_rect=*/output_rect,
/*visible_layer_rect=*/output_rect,
/*filter_info=*/gfx::MaskFilterInfo(),
/*clip=*/std::nullopt,
/*contents_opaque=*/true, /*opacity_f=*/1.f,
SkBlendMode::kSrcOver, /*sorting_context=*/0,
/*layer_id=*/0, /*fast_rounded_corner=*/false);
viz::SolidColorDrawQuad* quad =
pass->CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
quad->SetNew(sqs, output_rect, output_rect, SkColors::kRed,
/*anti_aliasing_off=*/false);
frame.render_pass_list.push_back(std::move(pass));
compositor_frame_sink_remote_->SubmitCompositorFrame(
local_surface_id, std::move(frame), std::nullopt, 0);
}
void DummySurfaceProvider::OnFirstSurfaceActivation(
const viz::SurfaceInfo& surface_info) {}
void DummySurfaceProvider::OnFrameTokenChanged(
uint32_t frame_token,
base::TimeTicks activation_time) {}
void DummySurfaceProvider::DidReceiveCompositorFrameAck(
std::vector<viz::ReturnedResource> resources) {}
void DummySurfaceProvider::OnBeginFrame(
const viz::BeginFrameArgs& args,
const base::flat_map<uint32_t, viz::FrameTimingDetails>& details,
std::vector<viz::ReturnedResource> resources) {}
void DummySurfaceProvider::OnBeginFramePausedChanged(bool paused) {}
void DummySurfaceProvider::ReclaimResources(
std::vector<viz::ReturnedResource> resources) {}
void DummySurfaceProvider::OnCompositorFrameTransitionDirectiveProcessed(
uint32_t sequence_id) {}
void DummySurfaceProvider::OnSurfaceEvicted(
const viz::LocalSurfaceId& local_surface_id) {}
} // namespace content