blob: 65eb5bb8a7275123d3c0e0fe6b15204c9da94505 [file] [log] [blame]
// 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/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/task_runner.h"
#include "mojo/gpu/gl_context.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/functions.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;
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.
class GpuRasterizer : public mojo::ViewportParameterListener,
public mojo::GLContext::Observer {
public:
GpuRasterizer(mojo::ContextProviderPtr context_provider,
const std::shared_ptr<VsyncScheduler>& scheduler,
const scoped_refptr<base::TaskRunner>& task_runner,
const base::Closure& error_callback);
~GpuRasterizer() override;
void SubmitFrame(const std::shared_ptr<RenderFrame>& frame);
private:
// |ViewportParameterListener|:
void OnVSyncParametersUpdated(int64_t timebase, int64_t interval) override;
// |GLContext::Observer|:
void OnContextLost() override;
void CreateContext();
void InitContext(mojo::CommandBufferPtr command_buffer);
void DestroyContext();
void OnContextProviderConnectionError();
void Draw();
void PostErrorCallback();
mojo::ContextProviderPtr context_provider_;
std::shared_ptr<VsyncScheduler> scheduler_;
scoped_refptr<base::TaskRunner> task_runner_;
base::Closure error_callback_;
base::WeakPtr<mojo::GLContext> gl_context_;
std::unique_ptr<mojo::skia::GaneshContext> ganesh_context_;
std::unique_ptr<mojo::skia::GaneshFramebufferSurface> ganesh_surface_;
std::shared_ptr<RenderFrame> current_frame_;
mojo::Binding<ViewportParameterListener> viewport_parameter_listener_binding_;
DISALLOW_COPY_AND_ASSIGN(GpuRasterizer);
};
} // namespace compositor
#endif // SERVICES_GFX_COMPOSITOR_BACKEND_GPU_RASTERIZER_H_