blob: 5ae861a22d85804fccc5d30b628e4feef893a06e [file] [log] [blame]
// Copyright 2017 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 CC_OUTPUT_DC_LAYER_OVERLAY_H_
#define CC_OUTPUT_DC_LAYER_OVERLAY_H_
#include "base/memory/ref_counted.h"
#include "cc/quads/render_pass.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkMatrix44.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gl/dc_renderer_layer_params.h"
namespace cc {
class DrawQuad;
class ResourceProvider;
class CC_EXPORT DCLayerOverlaySharedState
: public base::RefCounted<DCLayerOverlaySharedState> {
public:
DCLayerOverlaySharedState() {}
int z_order = 0;
// If |is_clipped| is true, then clip to |clip_rect| in the target space.
bool is_clipped = false;
gfx::RectF clip_rect;
// The opacity property for the CAayer.
float opacity = 1;
// The transform to apply to the DCLayer.
SkMatrix44 transform = SkMatrix44(SkMatrix44::kIdentity_Constructor);
private:
friend class base::RefCounted<DCLayerOverlaySharedState>;
~DCLayerOverlaySharedState() {}
};
// Holds all information necessary to construct a DCLayer from a DrawQuad.
class CC_EXPORT DCLayerOverlay {
public:
DCLayerOverlay();
DCLayerOverlay(const DCLayerOverlay& other);
~DCLayerOverlay();
// State that is frequently shared between consecutive DCLayerOverlays.
scoped_refptr<DCLayerOverlaySharedState> shared_state;
// Resource ids that correspond to the DXGI textures to set as the contents
// of the DCLayer.
DrawQuad::Resources resources;
// The contents rect property for the DCLayer.
gfx::RectF contents_rect;
// The bounds for the DCLayer in pixels.
gfx::RectF bounds_rect;
// The background color property for the DCLayer.
SkColor background_color = SK_ColorTRANSPARENT;
// The edge anti-aliasing mask property for the DCLayer.
unsigned edge_aa_mask = 0;
// The minification and magnification filters for the DCLayer.
unsigned filter;
// If |rpdq| is present, then the renderer must draw the filter effects and
// copy the result into an IOSurface.
const RenderPassDrawQuad* rpdq = nullptr;
};
typedef std::vector<DCLayerOverlay> DCLayerOverlayList;
class DCLayerOverlayProcessor {
public:
enum DCLayerResult {
DC_LAYER_SUCCESS,
DC_LAYER_FAILED_QUAD_BLEND_MODE,
DC_LAYER_FAILED_TEXTURE_NOT_CANDIDATE,
DC_LAYER_FAILED_OCCLUDED,
DC_LAYER_FAILED_UNKNOWN
};
void Process(ResourceProvider* resource_provider,
const gfx::RectF& display_rect,
QuadList* quad_list,
gfx::Rect* overlay_damage_rect,
gfx::Rect* damage_rect,
DCLayerOverlayList* ca_layer_overlays);
void ClearOverlayState() {
previous_frame_underlay_rect_ = gfx::Rect();
previous_occlusion_bounding_box_ = gfx::Rect();
}
private:
DCLayerResult FromDrawQuad(ResourceProvider* resource_provider,
const gfx::RectF& display_rect,
QuadList::ConstIterator quad_list_begin,
QuadList::ConstIterator quad,
DCLayerOverlay* ca_layer_overlay);
gfx::Rect previous_frame_underlay_rect_;
gfx::Rect previous_occlusion_bounding_box_;
gfx::RectF previous_display_rect_;
};
} // namespace cc
#endif // CC_OUTPUT_DC_LAYER_OVERLAY_H_