Index: services/gfx/compositor/backend/gpu_rasterizer.h |
diff --git a/services/gfx/compositor/backend/gpu_rasterizer.h b/services/gfx/compositor/backend/gpu_rasterizer.h |
index 12d780c01f1f7770501c51a8fe127fd7f5666ad7..303b86efd8ca90c137c2821c053d8c979f4b2dc1 100644 |
--- a/services/gfx/compositor/backend/gpu_rasterizer.h |
+++ b/services/gfx/compositor/backend/gpu_rasterizer.h |
@@ -7,11 +7,9 @@ |
#include <memory> |
-#include "base/callback.h" |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/weak_ptr.h" |
-#include "base/task_runner.h" |
#include "base/timer/timer.h" |
#include "mojo/gpu/gl_context.h" |
#include "mojo/public/cpp/bindings/binding.h" |
@@ -22,30 +20,48 @@ |
namespace compositor { |
class RenderFrame; |
-class VsyncScheduler; |
-// Ganesh-based rasterizer which runs on a separate thread from the compositor. |
-// Calls into this object, including its creation, must be posted to the |
-// correct message loop by the output. |
+// Ganesh-based rasterizer. |
+// Maintains a GL context and draws frames on demand. |
+// |
+// This object runs on a separate thread from the rest of the compositor. |
+// It is not threadsafe; all calls into this object, including its creation, |
+// must run on the rasterizer thread. |
class GpuRasterizer : public mojo::ViewportParameterListener, |
public mojo::GLContext::Observer { |
public: |
- // Callback invoked when a frame completes. |
- // |presented| is true if the frame was actually presented, false if |
- // the frame was discarded. |
- using FrameCallback = base::Callback<void(bool presented)>; |
+ // Callbacks from the rasterizer. |
+ // These calls always run on the rasterizer thread. |
+ class Callbacks { |
+ public: |
+ virtual ~Callbacks() {} |
+ |
+ // Called when the rasterizer is ready to start drawing. |
+ // May be called repeatedly with new parameters. |
+ virtual void OnRasterizerReady(int64_t vsync_timebase, |
+ int64_t vsync_interval) = 0; |
+ |
+ // Called when the rasterizer can't draw anymore. |
+ virtual void OnRasterizerSuspended() = 0; |
+ |
+ // Called when the rasterizer finished drawing a frame. |
+ // |presented| is true if the frame was actually presented, false if |
+ // the frame was discarded. |
+ virtual void OnRasterizerFinishedDraw(bool presented) = 0; |
+ |
+ // Called when an unrecoverable error occurs and the rasterizer needs |
+ // to be shut down soon. |
+ virtual void OnRasterizerError() = 0; |
+ }; |
GpuRasterizer(mojo::ContextProviderPtr context_provider, |
- const scoped_refptr<VsyncScheduler>& scheduler, |
- const scoped_refptr<base::TaskRunner>& task_runner, |
- const base::Closure& error_callback); |
+ Callbacks* callbacks); |
~GpuRasterizer() override; |
- // Submits a frame to be drawn. |
- // If the GL context isn't ready yet, the frame will be retained unless |
- // superceded by another frame. |
- void SubmitFrame(const scoped_refptr<RenderFrame>& frame, |
- const FrameCallback& frame_callback); |
+ // Draws the specified frame. |
+ // Each frame will be acknowledged by a called to |OnRasterizerFinishedDraw| |
+ // in the order submitted. The rasterizer must be in a ready state. |
+ void DrawFrame(const scoped_refptr<RenderFrame>& frame); |
private: |
// |ViewportParameterListener|: |
@@ -63,29 +79,25 @@ class GpuRasterizer : public mojo::ViewportParameterListener, |
void OnViewportParameterTimeout(); |
void ApplyViewportParameters(); |
- void DidEchoCallback(FrameCallback frame_callback); |
- void Draw(); |
- |
- void PostErrorCallback(); |
+ void DrawFinished(bool presented); |
+ static void OnMGLEchoReply(void* context); |
mojo::ContextProviderPtr context_provider_; |
- scoped_refptr<VsyncScheduler> scheduler_; |
- scoped_refptr<base::TaskRunner> task_runner_; |
- base::Closure error_callback_; |
+ Callbacks* callbacks_; |
scoped_refptr<mojo::GLContext> gl_context_; |
scoped_refptr<mojo::skia::GaneshContext> ganesh_context_; |
std::unique_ptr<mojo::skia::GaneshFramebufferSurface> ganesh_surface_; |
- scoped_refptr<RenderFrame> frame_; |
- FrameCallback frame_callback_; |
- |
mojo::Binding<ViewportParameterListener> viewport_parameter_listener_binding_; |
base::Timer viewport_parameter_timeout_; |
bool have_viewport_parameters_ = false; |
int64_t vsync_timebase_ = 0u; |
int64_t vsync_interval_ = 0u; |
- uint32_t frames_pending_ = 0u; |
+ |
+ bool ready_ = false; |
+ uint32_t total_frames_ = 0u; |
+ uint32_t frames_in_progress_ = 0u; |
base::WeakPtrFactory<GpuRasterizer> weak_ptr_factory_; |