blob: a5e8c37091b72076aed359bf80d1b5f8800a5527 [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.
#include <map>
#include "flutter/fml/macros.h"
#include "flutter/shell/platform/darwin/macos/framework/Source/FlutterBackingStoreData.h"
#include "flutter/shell/platform/darwin/macos/framework/Source/FlutterCompositor.h"
#include "flutter/shell/platform/darwin/macos/framework/Source/FlutterSurfaceManager.h"
#include "flutter/shell/platform/embedder/embedder.h"
#include "third_party/skia/include/gpu/GrDirectContext.h"
namespace flutter {
// FlutterGLCompositor creates and manages the backing stores used for
// rendering Flutter content and presents Flutter content and Platform views.
// Platform views are not yet supported.
// FlutterGLCompositor is created and destroyed by FlutterEngine.
class FlutterGLCompositor : public FlutterCompositor {
public:
FlutterGLCompositor(FlutterViewController* view_controller,
NSOpenGLContext* opengl_context);
virtual ~FlutterGLCompositor() = default;
// Creates a BackingStore and saves updates the backing_store_out
// data with the new BackingStore data.
// If the backing store is being requested for the first time
// for a given frame, we do not create a new backing store but
// rather return the backing store associated with the
// FlutterView's FlutterSurfaceManager.
//
// Any additional state allocated for the backing store and
// saved as user_data in the backing store must be collected
// in the backing_store's destruction_callback field which will
// be called when the embedder collects the backing store.
bool CreateBackingStore(const FlutterBackingStoreConfig* config,
FlutterBackingStore* backing_store_out) override;
// Releases the memory for any state used by the backing store.
bool CollectBackingStore(const FlutterBackingStore* backing_store) override;
// Presents the FlutterLayers by updating FlutterView(s) using the
// layer content.
// Present sets frame_started_ to false.
bool Present(const FlutterLayer** layers, size_t layers_count) override;
private:
const NSOpenGLContext* open_gl_context_;
// Count for how many CALayers have been created for a frame.
// Resets when a frame is finished.
// ca_layer_count_ is also used as a layerId.
size_t ca_layer_count_ = 0;
// Maps a layer_id (size_t) to a CALayer.
// The layer_id starts at 0 for a given frame
// and increments by 1 for each new CALayer.
std::map<size_t, CALayer*> ca_layer_map_;
// frame_started_ keeps track of if a layer has been
// created for the frame.
bool frame_started_ = false;
// Set frame_started_ to true and reset all layer state.
void StartFrame();
// Creates a CALayer and adds it to ca_layer_map_ and increments
// ca_layer_count_; Returns the key value (size_t) for the layer in
// ca_layer_map_.
size_t CreateCALayer();
FML_DISALLOW_COPY_AND_ASSIGN(FlutterGLCompositor);
};
} // namespace flutter