| // 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 SERVICES_GFX_COMPOSITOR_BACKEND_GPU_RASTERIZER_H_ |
| #define SERVICES_GFX_COMPOSITOR_BACKEND_GPU_RASTERIZER_H_ |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/timer/timer.h" |
| #include "mojo/gpu/gl_context.h" |
| #include "mojo/public/cpp/bindings/binding.h" |
| #include "mojo/services/gpu/interfaces/context_provider.mojom.h" |
| #include "mojo/skia/ganesh_context.h" |
| #include "mojo/skia/ganesh_framebuffer_surface.h" |
| |
| namespace compositor { |
| |
| class RenderFrame; |
| |
| // 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: |
| // 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, |
| Callbacks* callbacks); |
| ~GpuRasterizer() override; |
| |
| // 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|: |
| void OnVSyncParametersUpdated(int64_t timebase, int64_t interval) override; |
| |
| // |GLContext::Observer|: |
| void OnContextLost() override; |
| |
| void CreateContext(); |
| void InitContext(mojo::InterfaceHandle<mojo::CommandBuffer> command_buffer); |
| void AbandonContext(); |
| void DestroyContext(); |
| void RecreateContextAfterLoss(); |
| void OnContextProviderConnectionError(); |
| void OnViewportParameterTimeout(); |
| void ApplyViewportParameters(); |
| |
| void DrawFinished(bool presented); |
| static void OnMGLEchoReply(void* context); |
| |
| mojo::ContextProviderPtr context_provider_; |
| Callbacks* callbacks_; |
| |
| scoped_refptr<mojo::GLContext> gl_context_; |
| scoped_refptr<mojo::skia::GaneshContext> ganesh_context_; |
| std::unique_ptr<mojo::skia::GaneshFramebufferSurface> ganesh_surface_; |
| |
| 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; |
| |
| bool ready_ = false; |
| uint32_t total_frames_ = 0u; |
| uint32_t frames_in_progress_ = 0u; |
| |
| base::WeakPtrFactory<GpuRasterizer> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GpuRasterizer); |
| }; |
| |
| } // namespace compositor |
| |
| #endif // SERVICES_GFX_COMPOSITOR_BACKEND_GPU_RASTERIZER_H_ |