1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_OZONE_DEMO_SKIA_SKIA_GL_RENDERER_H_
#define UI_OZONE_DEMO_SKIA_SKIA_GL_RENDERER_H_
#include <memory>
#include "base/containers/queue.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
#include "base/threading/simple_thread.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/ganesh/GrDirectContext.h"
#include "third_party/skia/include/private/chromium/GrDeferredDisplayListRecorder.h"
#include "ui/gfx/swap_result.h"
#include "ui/ozone/demo/renderer_base.h"
namespace gfx {
struct PresentationFeedback;
} // namespace gfx
namespace gl {
class GLContext;
class GLSurface;
} // namespace gl
namespace ui {
class PlatformWindowSurface;
class SkiaGlRenderer : public RendererBase,
public base::DelegateSimpleThread::Delegate {
public:
SkiaGlRenderer(gfx::AcceleratedWidget widget,
std::unique_ptr<PlatformWindowSurface> window_surface,
const scoped_refptr<gl::GLSurface>& gl_surface,
const gfx::Size& size);
SkiaGlRenderer(const SkiaGlRenderer&) = delete;
SkiaGlRenderer& operator=(const SkiaGlRenderer&) = delete;
~SkiaGlRenderer() override;
// Renderer:
bool Initialize() override;
protected:
virtual void RenderFrame();
virtual void PostRenderFrameTask(gfx::SwapCompletionResult result);
void Draw(SkCanvas* canvas, float fraction);
void StartDDLRenderThreadIfNecessary(SkSurface* sk_surface);
void StopDDLRenderThread();
sk_sp<GrDeferredDisplayList> GetDDL();
std::unique_ptr<PlatformWindowSurface> window_surface_;
scoped_refptr<gl::GLSurface> gl_surface_;
scoped_refptr<gl::GLContext> gl_context_;
sk_sp<GrDirectContext> gr_context_;
const bool use_ddl_;
private:
// base::DelegateSimpleThread::Delegate:
void Run() override;
void OnPresentation(const gfx::PresentationFeedback& feedback);
sk_sp<SkSurface> sk_surface_;
float rotation_angle_ = 0.f;
std::unique_ptr<base::SimpleThread> ddl_render_thread_;
// The lock to protect |surface_charaterization_| and |ddls_|.
base::Lock lock_;
// The condition variable for signalling change of |ddls_|.
base::ConditionVariable condition_variable_;
GrSurfaceCharacterization surface_charaterization_;
base::queue<sk_sp<GrDeferredDisplayList>> ddls_;
base::WeakPtrFactory<SkiaGlRenderer> weak_ptr_factory_{this};
};
} // namespace ui
#endif // UI_OZONE_DEMO_SKIA_SKIA_GL_RENDERER_H_
|