| Index: cc/output/output_surface.h
|
| diff --git a/cc/output/output_surface.h b/cc/output/output_surface.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8994a6bffafbb2651874575d663061f6a1c2904d
|
| --- /dev/null
|
| +++ b/cc/output/output_surface.h
|
| @@ -0,0 +1,198 @@
|
| +// Copyright 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 CC_OUTPUT_OUTPUT_SURFACE_H_
|
| +#define CC_OUTPUT_OUTPUT_SURFACE_H_
|
| +
|
| +#include <deque>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "cc/output/context_provider.h"
|
| +#include "cc/output/overlay_candidate_validator.h"
|
| +#include "cc/output/software_output_device.h"
|
| +
|
| +namespace base { class SingleThreadTaskRunner; }
|
| +
|
| +namespace ui { struct LatencyInfo; }
|
| +
|
| +namespace gfx {
|
| +class Rect;
|
| +class Size;
|
| +class Transform;
|
| +}
|
| +
|
| +namespace cc {
|
| +
|
| +class CompositorFrame;
|
| +class CompositorFrameAck;
|
| +class OutputSurfaceClient;
|
| +
|
| +// Represents the output surface for a compositor. The compositor owns
|
| +// and manages its destruction. Its lifetime is:
|
| +// 1. Created on the main thread by the LayerTreeHost through its client.
|
| +// 2. Passed to the compositor thread and bound to a client via BindToClient.
|
| +// From here on, it will only be used on the compositor thread.
|
| +// 3. If the 3D context is lost, then the compositor will delete the output
|
| +// surface (on the compositor thread) and go back to step 1.
|
| +class OutputSurface {
|
| + public:
|
| + enum {
|
| + DEFAULT_MAX_FRAMES_PENDING = 2
|
| + };
|
| +
|
| + OutputSurface(const scoped_refptr<ContextProvider>& context_provider,
|
| + const scoped_refptr<ContextProvider>& worker_context_provider,
|
| + scoped_ptr<SoftwareOutputDevice> software_device);
|
| + OutputSurface(const scoped_refptr<ContextProvider>& context_provider,
|
| + const scoped_refptr<ContextProvider>& worker_context_provider);
|
| + explicit OutputSurface(
|
| + const scoped_refptr<ContextProvider>& context_provider);
|
| +
|
| + explicit OutputSurface(scoped_ptr<SoftwareOutputDevice> software_device);
|
| +
|
| + OutputSurface(const scoped_refptr<ContextProvider>& context_provider,
|
| + scoped_ptr<SoftwareOutputDevice> software_device);
|
| +
|
| + virtual ~OutputSurface();
|
| +
|
| + struct Capabilities {
|
| + Capabilities()
|
| + : delegated_rendering(false),
|
| + max_frames_pending(0),
|
| + deferred_gl_initialization(false),
|
| + draw_and_swap_full_viewport_every_frame(false),
|
| + adjust_deadline_for_parent(true),
|
| + uses_default_gl_framebuffer(true),
|
| + flipped_output_surface(false),
|
| + can_force_reclaim_resources(false) {}
|
| + bool delegated_rendering;
|
| + int max_frames_pending;
|
| + bool deferred_gl_initialization;
|
| + bool draw_and_swap_full_viewport_every_frame;
|
| + // This doesn't handle the <webview> case, but once BeginFrame is
|
| + // supported natively, we shouldn't need adjust_deadline_for_parent.
|
| + bool adjust_deadline_for_parent;
|
| + // Whether this output surface renders to the default OpenGL zero
|
| + // framebuffer or to an offscreen framebuffer.
|
| + bool uses_default_gl_framebuffer;
|
| + // Whether this OutputSurface is flipped or not.
|
| + bool flipped_output_surface;
|
| + // Whether ForceReclaimResources can be called to reclaim all resources
|
| + // from the OutputSurface.
|
| + bool can_force_reclaim_resources;
|
| + };
|
| +
|
| + const Capabilities& capabilities() const {
|
| + return capabilities_;
|
| + }
|
| +
|
| + virtual bool HasExternalStencilTest() const;
|
| +
|
| + // Obtain the 3d context or the software device associated with this output
|
| + // surface. Either of these may return a null pointer, but not both.
|
| + // In the event of a lost context, the entire output surface should be
|
| + // recreated.
|
| + ContextProvider* context_provider() const { return context_provider_.get(); }
|
| + ContextProvider* worker_context_provider() const {
|
| + return worker_context_provider_.get();
|
| + }
|
| + SoftwareOutputDevice* software_device() const {
|
| + return software_device_.get();
|
| + }
|
| +
|
| + // Called by the compositor on the compositor thread. This is a place where
|
| + // thread-specific data for the output surface can be initialized, since from
|
| + // this point on the output surface will only be used on the compositor
|
| + // thread.
|
| + virtual bool BindToClient(OutputSurfaceClient* client);
|
| +
|
| + // This is called by the compositor on the compositor thread inside ReleaseGL
|
| + // in order to release the ContextProvider. Only used with
|
| + // deferred_gl_initialization capability.
|
| + void ReleaseContextProvider();
|
| +
|
| + virtual void EnsureBackbuffer();
|
| + virtual void DiscardBackbuffer();
|
| +
|
| + virtual void Reshape(const gfx::Size& size, float scale_factor);
|
| + virtual gfx::Size SurfaceSize() const;
|
| +
|
| + // If supported, this causes a ReclaimResources for all resources that are
|
| + // currently in use.
|
| + virtual void ForceReclaimResources() {}
|
| +
|
| + virtual void BindFramebuffer();
|
| +
|
| + // The implementation may destroy or steal the contents of the CompositorFrame
|
| + // passed in (though it will not take ownership of the CompositorFrame
|
| + // itself). For successful swaps, the implementation must call
|
| + // OutputSurfaceClient::DidSwapBuffers() and eventually
|
| + // DidSwapBuffersComplete().
|
| + virtual void SwapBuffers(CompositorFrame* frame) = 0;
|
| + virtual void OnSwapBuffersComplete();
|
| +
|
| + // Notifies frame-rate smoothness preference. If true, all non-critical
|
| + // processing should be stopped, or lowered in priority.
|
| + virtual void UpdateSmoothnessTakesPriority(bool prefer_smoothness) {}
|
| +
|
| + bool HasClient() { return !!client_; }
|
| +
|
| + // Get the class capable of informing cc of hardware overlay capability.
|
| + OverlayCandidateValidator* overlay_candidate_validator() const {
|
| + return overlay_candidate_validator_.get();
|
| + }
|
| +
|
| + void DidLoseOutputSurface();
|
| +
|
| + protected:
|
| + OutputSurfaceClient* client_;
|
| +
|
| + // Synchronously initialize context3d and enter hardware mode.
|
| + // This can only supported in threaded compositing mode.
|
| + bool InitializeAndSetContext3d(
|
| + scoped_refptr<ContextProvider> context_provider,
|
| + scoped_refptr<ContextProvider> worker_context_provider);
|
| + void ReleaseGL();
|
| +
|
| + void PostSwapBuffersComplete();
|
| +
|
| + struct OutputSurface::Capabilities capabilities_;
|
| + scoped_refptr<ContextProvider> context_provider_;
|
| + scoped_refptr<ContextProvider> worker_context_provider_;
|
| + scoped_ptr<SoftwareOutputDevice> software_device_;
|
| + scoped_ptr<OverlayCandidateValidator> overlay_candidate_validator_;
|
| + gfx::Size surface_size_;
|
| + float device_scale_factor_;
|
| +
|
| + void CommitVSyncParameters(base::TimeTicks timebase,
|
| + base::TimeDelta interval);
|
| +
|
| + void SetNeedsRedrawRect(const gfx::Rect& damage_rect);
|
| + void ReclaimResources(const CompositorFrameAck* ack);
|
| + void SetExternalStencilTest(bool enabled);
|
| + void SetExternalDrawConstraints(
|
| + const gfx::Transform& transform,
|
| + const gfx::Rect& viewport,
|
| + const gfx::Rect& clip,
|
| + const gfx::Rect& viewport_rect_for_tile_priority,
|
| + const gfx::Transform& transform_for_tile_priority,
|
| + bool resourceless_software_draw);
|
| +
|
| + private:
|
| + void SetUpContext3d();
|
| + void ResetContext3d();
|
| +
|
| + bool external_stencil_test_enabled_;
|
| +
|
| + base::WeakPtrFactory<OutputSurface> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(OutputSurface);
|
| +};
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_OUTPUT_OUTPUT_SURFACE_H_
|
|
|