blob: 12dfc9f6db45060f81d2d6aa73ad1602038821be [file] [log] [blame]
// Copyright 2015 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.
#ifndef CONTENT_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_HOST_H_
#define CONTENT_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_HOST_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h"
#include "cc/output/compositor_frame.h"
#include "content/common/input/input_event_ack_state.h"
#include "content/public/browser/android/synchronous_compositor.h"
#include "ui/gfx/geometry/scroll_offset.h"
#include "ui/gfx/geometry/size_f.h"
namespace IPC {
class Message;
class Sender;
}
namespace ui {
class WindowAndroid;
struct DidOverscrollParams;
}
namespace content {
class RenderWidgetHostViewAndroid;
class SynchronousCompositorClient;
class SynchronousCompositorBrowserFilter;
struct SyncCompositorCommonRendererParams;
class SynchronousCompositorHost : public SynchronousCompositor {
public:
static std::unique_ptr<SynchronousCompositorHost> Create(
RenderWidgetHostViewAndroid* rwhva);
~SynchronousCompositorHost() override;
// SynchronousCompositor overrides.
SynchronousCompositor::Frame DemandDrawHw(
const gfx::Size& viewport_size,
const gfx::Rect& viewport_rect_for_tile_priority,
const gfx::Transform& transform_for_tile_priority) override;
scoped_refptr<FrameFuture> DemandDrawHwAsync(
const gfx::Size& viewport_size,
const gfx::Rect& viewport_rect_for_tile_priority,
const gfx::Transform& transform_for_tile_priority) override;
bool DemandDrawSw(SkCanvas* canvas) override;
void ReturnResources(
uint32_t layer_tree_frame_sink_id,
const std::vector<viz::ReturnedResource>& resources) override;
void SetMemoryPolicy(size_t bytes_limit) override;
void DidChangeRootLayerScrollOffset(
const gfx::ScrollOffset& root_offset) override;
void SynchronouslyZoomBy(float zoom_delta, const gfx::Point& anchor) override;
void OnComputeScroll(base::TimeTicks animation_time) override;
void DidOverscroll(const ui::DidOverscrollParams& over_scroll_params);
void DidSendBeginFrame(ui::WindowAndroid* window_android);
bool OnMessageReceived(const IPC::Message& message);
// Called by SynchronousCompositorBrowserFilter.
int routing_id() const { return routing_id_; }
void UpdateFrameMetaData(cc::CompositorFrameMetadata frame_metadata);
void ProcessCommonParams(const SyncCompositorCommonRendererParams& params);
SynchronousCompositorClient* client() { return client_; }
private:
class ScopedSendZeroMemory;
struct SharedMemoryWithSize;
friend class ScopedSetZeroMemory;
friend class SynchronousCompositorBase;
SynchronousCompositorHost(RenderWidgetHostViewAndroid* rwhva,
bool use_in_proc_software_draw);
void LayerTreeFrameSinkCreated();
bool DemandDrawSwInProc(SkCanvas* canvas);
void SetSoftwareDrawSharedMemoryIfNeeded(size_t stride, size_t buffer_size);
void SendZeroMemory();
SynchronousCompositorBrowserFilter* GetFilter();
RenderWidgetHostViewAndroid* const rwhva_;
SynchronousCompositorClient* const client_;
const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
const int process_id_;
const int routing_id_;
IPC::Sender* const sender_;
const bool use_in_process_zero_copy_software_draw_;
bool registered_with_filter_ = false;
size_t bytes_limit_;
std::unique_ptr<SharedMemoryWithSize> software_draw_shm_;
// Indicates the next draw needs to be synchronous
bool compute_scroll_needs_synchronous_draw_ = false;
// Updated by both renderer and browser.
gfx::ScrollOffset root_scroll_offset_;
// From renderer.
uint32_t renderer_param_version_;
bool need_animate_scroll_;
uint32_t need_invalidate_count_;
uint32_t did_activate_pending_tree_count_;
DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorHost);
};
} // namespace content
#endif // CONTENT_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_HOST_H_