blob: 245ec85d0998d086a567c9a73da98bfc9def83a6 [file] [log] [blame]
// Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_
#include <memory>
#include "flutter/fml/closure.h"
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/embedder/embedder.h"
#include "third_party/skia/include/core/SkSize.h"
#include "third_party/skia/include/core/SkSurface.h"
namespace impeller {
class RenderTarget;
class AiksContext;
} // namespace impeller
namespace flutter {
//------------------------------------------------------------------------------
/// @brief Describes a surface whose backing store is managed by the
/// embedder. The type of surface depends on the client rendering
/// API used. The embedder is notified of the collection of this
/// render target via a callback.
///
class EmbedderRenderTarget {
public:
struct SetCurrentResult {
/// This is true if the operation succeeded (even if it was a no-op),
/// false if the surface could not be made current / the current surface
/// could not be cleared.
bool success;
/// This is true if any native graphics API (e.g. GL, but not EGL) state has
/// changed and Skia/Impeller should not assume any GL state values are the
/// same as before the context change operation was attempted.
bool gl_state_trampled;
};
using MakeOrClearCurrentCallback = std::function<SetCurrentResult()>;
//----------------------------------------------------------------------------
/// @brief Destroys this instance of the render target and invokes the
/// callback for the embedder to release its resource associated
/// with the particular backing store.
///
virtual ~EmbedderRenderTarget();
//----------------------------------------------------------------------------
/// @brief A render surface the rasterizer can use to draw into the
/// backing store of this render target.
///
/// @return The render surface.
///
virtual sk_sp<SkSurface> GetSkiaSurface() const = 0;
//----------------------------------------------------------------------------
/// @brief An impeller render target the rasterizer can use to draw into
/// the backing store.
///
/// @return The Impeller render target.
///
virtual impeller::RenderTarget* GetImpellerRenderTarget() const = 0;
//----------------------------------------------------------------------------
/// @brief Returns the AiksContext that should be used for rendering, if
/// this render target is backed by Impeller.
///
/// @return The Impeller Aiks context.
///
virtual std::shared_ptr<impeller::AiksContext> GetAiksContext() const = 0;
//----------------------------------------------------------------------------
/// @brief Returns the size of the render target.
///
/// @return The size of the render target.
///
virtual SkISize GetRenderTargetSize() const = 0;
//----------------------------------------------------------------------------
/// @brief The embedder backing store descriptor. This is the descriptor
/// that was given to the engine by the embedder. This descriptor
/// may contain context the embedder can use to associate it
/// resources with the compositor layers when they are given back
/// to it in present callback. The engine does not use this in any
/// way.
///
/// @return The backing store.
///
const FlutterBackingStore* GetBackingStore() const;
//----------------------------------------------------------------------------
/// @brief Make the render target current.
///
/// Sometimes render targets are actually (for example)
/// EGL surfaces instead of framebuffers or textures.
/// In that case, we can't fully wrap them as SkSurfaces, instead,
/// the embedder will provide a callback that should be called
/// when the target surface should be made current.
///
/// @return The result of the operation.
virtual SetCurrentResult MaybeMakeCurrent() const { return {true, false}; }
//----------------------------------------------------------------------------
/// @brief Clear the current render target. @see MaybeMakeCurrent
///
/// @return The result of the operation.
virtual SetCurrentResult MaybeClearCurrent() const { return {true, false}; }
protected:
//----------------------------------------------------------------------------
/// @brief Creates a render target whose backing store is managed by the
/// embedder. The way this render target is exposed to the engine
/// is via an SkSurface and a callback that is invoked by this
/// object in its destructor.
///
/// @param[in] backing_store The backing store describing this render
/// target.
/// @param[in] on_release The callback to invoke (eventually forwarded
/// to the embedder) when the backing store is no
/// longer required by the engine.
///
EmbedderRenderTarget(FlutterBackingStore backing_store,
fml::closure on_release);
private:
FlutterBackingStore backing_store_;
fml::closure on_release_;
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderRenderTarget);
};
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_RENDER_TARGET_H_