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_ |