1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
// Copyright (c) 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.
#ifndef CONTENT_BROWSER_RENDERER_HOST_COMPOSITOR_IMPL_ANDROID_H_
#define CONTENT_BROWSER_RENDERER_HOST_COMPOSITOR_IMPL_ANDROID_H_
#include "base/basictypes.h"
#include "base/cancelable_callback.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "cc/trees/layer_tree_host_client.h"
#include "cc/trees/layer_tree_host_single_thread_client.h"
#include "content/common/content_export.h"
#include "content/common/gpu/client/context_provider_command_buffer.h"
#include "content/public/browser/android/compositor.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "ui/android/resources/resource_manager_impl.h"
#include "ui/android/resources/ui_resource_provider.h"
#include "ui/base/android/window_android_compositor.h"
class SkBitmap;
struct ANativeWindow;
namespace cc {
class Layer;
class LayerTreeHost;
class SurfaceIdAllocator;
}
namespace content {
class CompositorClient;
class OnscreenDisplayClient;
// -----------------------------------------------------------------------------
// Browser-side compositor that manages a tree of content and UI layers.
// -----------------------------------------------------------------------------
class CONTENT_EXPORT CompositorImpl
: public Compositor,
public cc::LayerTreeHostClient,
public cc::LayerTreeHostSingleThreadClient,
public ui::WindowAndroidCompositor {
public:
CompositorImpl(CompositorClient* client, gfx::NativeWindow root_window);
virtual ~CompositorImpl();
static bool IsInitialized();
void PopulateGpuCapabilities(gpu::Capabilities gpu_capabilities);
private:
// Compositor implementation.
virtual void SetRootLayer(scoped_refptr<cc::Layer> root) override;
virtual void SetSurface(jobject surface) override;
virtual void SetVisible(bool visible) override;
virtual void setDeviceScaleFactor(float factor) override;
virtual void SetWindowBounds(const gfx::Size& size) override;
virtual void SetHasTransparentBackground(bool flag) override;
virtual void SetNeedsComposite() override;
virtual ui::UIResourceProvider& GetUIResourceProvider() override;
virtual ui::ResourceManager& GetResourceManager() override;
// LayerTreeHostClient implementation.
virtual void WillBeginMainFrame(int frame_id) override {}
virtual void DidBeginMainFrame() override {}
virtual void BeginMainFrame(const cc::BeginFrameArgs& args) override {}
virtual void Layout() override;
virtual void ApplyViewportDeltas(
const gfx::Vector2d& inner_delta,
const gfx::Vector2d& outer_delta,
const gfx::Vector2dF& elastic_overscroll_delta,
float page_scale,
float top_controls_delta) override {}
virtual void ApplyViewportDeltas(
const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) override {}
virtual void RequestNewOutputSurface() override;
virtual void DidInitializeOutputSurface() override;
virtual void DidFailToInitializeOutputSurface() override;
virtual void WillCommit() override {}
virtual void DidCommit() override;
virtual void DidCommitAndDrawFrame() override {}
virtual void DidCompleteSwapBuffers() override;
// LayerTreeHostSingleThreadClient implementation.
virtual void ScheduleComposite() override;
virtual void ScheduleAnimation() override;
virtual void DidPostSwapBuffers() override;
virtual void DidAbortSwapBuffers() override;
// WindowAndroidCompositor implementation.
virtual void AttachLayerForReadback(scoped_refptr<cc::Layer> layer) override;
virtual void RequestCopyOfOutputOnRootLayer(
scoped_ptr<cc::CopyOutputRequest> request) override;
virtual void OnVSync(base::TimeTicks frame_time,
base::TimeDelta vsync_period) override;
virtual void SetNeedsAnimate() override;
void SetWindowSurface(ANativeWindow* window);
enum CompositingTrigger {
DO_NOT_COMPOSITE,
COMPOSITE_IMMEDIATELY,
COMPOSITE_EVENTUALLY,
};
void PostComposite(CompositingTrigger trigger);
void Composite(CompositingTrigger trigger);
void CreateOutputSurface();
bool WillCompositeThisFrame() const {
return current_composite_task_ &&
!current_composite_task_->callback().is_null();
}
bool DidCompositeThisFrame() const {
return current_composite_task_ &&
current_composite_task_->callback().is_null();
}
bool WillComposite() const {
return WillCompositeThisFrame() ||
composite_on_vsync_trigger_ != DO_NOT_COMPOSITE;
}
void CancelComposite() {
DCHECK(WillComposite());
if (WillCompositeThisFrame())
current_composite_task_->Cancel();
current_composite_task_.reset();
composite_on_vsync_trigger_ = DO_NOT_COMPOSITE;
will_composite_immediately_ = false;
}
void CreateLayerTreeHost();
// root_layer_ is the persistent internal root layer, while subroot_layer_
// is the one attached by the compositor client.
scoped_refptr<cc::Layer> root_layer_;
scoped_refptr<cc::Layer> subroot_layer_;
scoped_ptr<cc::LayerTreeHost> host_;
ui::UIResourceProvider ui_resource_provider_;
ui::ResourceManagerImpl resource_manager_;
scoped_ptr<OnscreenDisplayClient> display_client_;
scoped_ptr<cc::SurfaceIdAllocator> surface_id_allocator_;
gfx::Size size_;
bool has_transparent_background_;
float device_scale_factor_;
ANativeWindow* window_;
int surface_id_;
CompositorClient* client_;
gfx::NativeWindow root_window_;
// Used locally to track whether a call to LTH::Composite() did result in
// a posted SwapBuffers().
bool did_post_swapbuffers_;
// Used locally to inhibit ScheduleComposite() during Layout().
bool ignore_schedule_composite_;
// Whether we need to composite in general because of any invalidation or
// explicit request.
bool needs_composite_;
// Whether we need to update animations on the next composite.
bool needs_animate_;
// Whether we posted a task and are about to composite.
bool will_composite_immediately_;
// How we should schedule Composite during the next vsync.
CompositingTrigger composite_on_vsync_trigger_;
// The Composite operation scheduled for the current vsync interval.
scoped_ptr<base::CancelableClosure> current_composite_task_;
// The number of SwapBuffer calls that have not returned and ACK'd from
// the GPU thread.
unsigned int pending_swapbuffers_;
size_t num_successive_context_creation_failures_;
base::TimeDelta vsync_period_;
base::TimeTicks last_vsync_;
// If set, a pending task to request or create a new OutputSurface for the
// current host. Cancelled when |host_| gets destroyed, so we don't call
// into the new LayerTreeHost with an old LTH's request.
scoped_ptr<base::CancelableClosure> output_surface_task_for_host_;
base::WeakPtrFactory<CompositorImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(CompositorImpl);
};
} // namespace content
#endif // CONTENT_BROWSER_RENDERER_HOST_COMPOSITOR_IMPL_ANDROID_H_
|