[go: nahoru, domu]

blob: f71be02ba7b461e250b1e5fa20b7b50609d64b1c [file] [log] [blame]
// 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.
#ifndef ANDROID_WEBVIEW_BROWSER_GFX_CHILD_FRAME_H_
#define ANDROID_WEBVIEW_BROWSER_GFX_CHILD_FRAME_H_
#include <memory>
#include <vector>
#include "base/containers/circular_deque.h"
#include "components/viz/common/frame_sinks/begin_frame_args.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/common/surfaces/surface_id.h"
#include "content/public/browser/android/synchronous_compositor.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/transform.h"
namespace viz {
class CompositorFrame;
class CopyOutputRequest;
}
namespace android_webview {
using CopyOutputRequestQueue =
std::vector<std::unique_ptr<viz::CopyOutputRequest>>;
// Lifetime: WebView
class ChildFrame {
public:
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);
ChildFrame(const ChildFrame&) = delete;
ChildFrame& operator=(const ChildFrame&) = delete;
~ChildFrame();
// Helper to move frame from |frame_future| to |frame|.
void WaitOnFutureIfNeeded();
viz::SurfaceId GetSurfaceId() const;
// The frame is either in |frame_future| or |frame|. It's illegal if both
// are non-null.
scoped_refptr<content::SynchronousCompositor::FrameFuture> frame_future;
uint32_t layer_tree_frame_sink_id = 0u;
std::unique_ptr<viz::CompositorFrame> frame;
absl::optional<viz::HitTestRegionList> hit_test_region_list;
// The id of the compositor this |frame| comes from.
const viz::FrameSinkId frame_sink_id;
// Local surface id of the frame. Invalid if |frame| is null.
viz::LocalSurfaceId local_surface_id;
const gfx::Size viewport_size_for_tile_priority;
const gfx::Transform transform_for_tile_priority;
const bool offscreen_pre_raster;
const float device_scale_factor;
CopyOutputRequestQueue copy_requests;
// Used for metrics, indicates that we invalidated for this frame.
const bool did_invalidate;
// Latest BeginFrameArgs this frame is being presented for so far. Normally
// this corresponds to the begin frame of the current draw cycle (BeginFrame
// => DrawOnUI => Sync => DrawOnRT), but in cases when DrawOnRT doesn't happen
// (e.g webview is offscreen) this will be updated to more recent draws.
// See: `HardwareRenderer::WaitAndPruneFrameQueue()` for details.
viz::BeginFrameArgs begin_frame_args;
// Indicates if this ChildFrame was rendered at least once.
bool rendered = false;
};
using ChildFrameQueue = base::circular_deque<std::unique_ptr<ChildFrame>>;
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_GFX_CHILD_FRAME_H_