chromium/android_webview/browser/gfx/child_frame.cc

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "android_webview/browser/gfx/child_frame.h"

#include <utility>

#include "base/trace_event/trace_event.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/quads/compositor_frame.h"

namespace android_webview {

ChildFrame::ChildFrame(
    scoped_refptr<content::SynchronousCompositor::FrameFuture> frame_future,
    const viz::FrameSinkId& frame_sink_id,
    const gfx::Size& viewport_size_for_tile_priority,
    const gfx::Transform& transform_for_tile_priority,
    bool offscreen_pre_raster,
    float device_scale_factor,
    CopyOutputRequestQueue copy_requests,
    bool did_invalidate,
    const viz::BeginFrameArgs& begin_frame_args,
    const base::flat_set<base::PlatformThreadId>& renderer_thread_ids,
    base::PlatformThreadId browser_io_thread_id)
    : frame_future(std::move(frame_future)),
      frame_sink_id(frame_sink_id),
      viewport_size_for_tile_priority(viewport_size_for_tile_priority),
      transform_for_tile_priority(transform_for_tile_priority),
      offscreen_pre_raster(offscreen_pre_raster),
      device_scale_factor(device_scale_factor),
      copy_requests(std::move(copy_requests)),
      did_invalidate(did_invalidate),
      begin_frame_args(begin_frame_args),
      renderer_thread_ids(renderer_thread_ids),
      browser_io_thread_id(browser_io_thread_id) {}

ChildFrame::~ChildFrame() {
}

void ChildFrame::WaitOnFutureIfNeeded() {
  if (!frame_future)
    return;

  TRACE_EVENT0("android_webview", "GetFrame");
  DCHECK(!frame);
  auto frame_ptr = frame_future->GetFrame();
  if (frame_ptr) {
    layer_tree_frame_sink_id = frame_ptr->layer_tree_frame_sink_id;
    frame = std::move(frame_ptr->frame);
    local_surface_id = frame_ptr->local_surface_id;
    hit_test_region_list = std::move(frame_ptr->hit_test_region_list);
  }
  frame_future = nullptr;
}

viz::SurfaceId ChildFrame::GetSurfaceId() const {
  DCHECK(!frame_future);
  return viz::SurfaceId(frame_sink_id, local_surface_id);
}

}  // namespace android_webview