blob: bf8616cb58a0f2f50ab0e1699441e602b339a975 [file] [log] [blame]
// Copyright 2018 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 UI_ACCELERATED_WIDGET_MAC_DISPLAY_CA_LAYER_TREE_H_
#define UI_ACCELERATED_WIDGET_MAC_DISPLAY_CA_LAYER_TREE_H_
#include <IOSurface/IOSurface.h>
#include "base/mac/scoped_cftyperef.h"
#import "base/mac/scoped_nsobject.h"
#include "ui/accelerated_widget_mac/accelerated_widget_mac_export.h"
#include "ui/accelerated_widget_mac/ca_layer_frame_sink.h"
@class CALayer;
@class CALayerHost;
namespace gfx {
struct CALayerParams;
class Size;
} // namespace gfx
namespace ui {
// Used to create a CALayer tree for displaying compositor output. This is
// created with a CALayer (usually the layer of a layer-hosting NSView) to use
// as the root layer of a small layer tree that displays contents specified via
// CALayerParams from a compositor's output.
class ACCELERATED_WIDGET_MAC_EXPORT DisplayCALayerTree
: public CALayerFrameSink {
public:
explicit DisplayCALayerTree(CALayer* root_layer);
~DisplayCALayerTree() override;
void UpdateCALayerTree(const gfx::CALayerParams& ca_layer_params) override;
private:
void GotCALayerFrame(uint32_t ca_context_id);
void GotIOSurfaceFrame(base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
const gfx::Size& pixel_size,
float scale_factor);
// The root layer of the tree specified at creation time.
base::scoped_nsobject<CALayer> root_layer_;
// A flipped layer, which acts as the parent of either |remote_layer_| or
// |io_surface_layer|. This layer is flipped so that the we don't need to
// recompute the origin for sub-layers when their position changes (this is
// impossible when using remote layers, as their size change cannot be
// synchronized with the window). This indirection is needed because flipping
// hosted layers (like |background_layer_|) leads to unpredictable behavior.
base::scoped_nsobject<CALayer> flipped_layer_;
// A remote CALayer with content provided by the output surface.
base::scoped_nsobject<CALayerHost> remote_layer_;
// A CALayer that has its content set to an IOSurface.
base::scoped_nsobject<CALayer> io_surface_layer_;
};
} // namespace ui
#endif // UI_ACCELERATED_WIDGET_MAC_DISPLAY_CA_LAYER_TREE_H_