Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Unified Diff: content/common/gpu/image_transport_surface_overlay_mac.mm

Issue 1369243005: Mac Overlays: Allow the primary plane to be optionally scheduled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor
Patch Set: For ccameron Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/image_transport_surface_overlay_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/image_transport_surface_overlay_mac.mm
diff --git a/content/common/gpu/image_transport_surface_overlay_mac.mm b/content/common/gpu/image_transport_surface_overlay_mac.mm
index f8d6fa46b828b6fa0be340d1dfe85b91daf81d33..1a18d0b717594da0fb51796777f085c514a35e62 100644
--- a/content/common/gpu/image_transport_surface_overlay_mac.mm
+++ b/content/common/gpu/image_transport_surface_overlay_mac.mm
@@ -88,26 +88,17 @@ namespace content {
class ImageTransportSurfaceOverlayMac::OverlayPlane {
public:
- enum Type {
- ROOT = 0,
- ROOT_PARTIAL_DAMAGE = 1,
- OVERLAY = 2,
- };
-
- OverlayPlane(Type type,
- int z_order,
+ OverlayPlane(int z_order,
base::ScopedCFTypeRef<IOSurfaceRef> io_surface,
const gfx::RectF& dip_frame_rect,
const gfx::RectF& contents_rect)
- : type(type),
- z_order(z_order),
+ : z_order(z_order),
io_surface(io_surface),
dip_frame_rect(dip_frame_rect),
contents_rect(contents_rect),
layer_needs_update(true) {}
~OverlayPlane() { DCHECK(!ca_layer); }
- const Type type;
const int z_order;
base::scoped_nsobject<CALayer> ca_layer;
@@ -120,28 +111,7 @@ class ImageTransportSurfaceOverlayMac::OverlayPlane {
static bool Compare(const linked_ptr<OverlayPlane>& a,
const linked_ptr<OverlayPlane>& b) {
- // Sort by z_order first.
- if (a->z_order < b->z_order)
- return true;
- if (a->z_order > b->z_order)
- return false;
- // Then ensure that the root partial damage is after the root.
- if (a->type < b->type)
- return true;
- if (a->type > b->type)
- return false;
- // Then sort by x.
- if (a->dip_frame_rect.x() < b->dip_frame_rect.x())
- return true;
- if (a->dip_frame_rect.x() > b->dip_frame_rect.x())
- return false;
- // Then sort by y.
- if (a->dip_frame_rect.y() < b->dip_frame_rect.y())
- return true;
- if (a->dip_frame_rect.y() > b->dip_frame_rect.y())
- return false;
-
- return false;
+ return (a->z_order < b->z_order);
}
void TakeCALayerFrom(OverlayPlane* other_plane) {
@@ -154,7 +124,7 @@ class ImageTransportSurfaceOverlayMac::OverlayPlane {
[ca_layer setFrame:dip_frame_rect.ToCGRect()];
[ca_layer setContentsRect:contents_rect.ToCGRect()];
id new_contents = static_cast<id>(io_surface.get());
- if ([ca_layer contents] == new_contents && type != OVERLAY) {
+ if ([ca_layer contents] == new_contents && z_order == 0) {
[ca_layer setContentsChanged];
} else {
[ca_layer setContents:new_contents];
@@ -168,7 +138,7 @@ class ImageTransportSurfaceOverlayMac::OverlayPlane {
if (!layer_needs_update) {
// Green represents contents that are unchanged across frames.
color.reset(CGColorCreateGenericRGB(0, 1, 0, 1));
- } else if (type == OverlayPlane::OVERLAY) {
+ } else if (z_order != 0) {
// Pink represents overlay planes
color.reset(CGColorCreateGenericRGB(1, 0, 1, 1));
} else {
@@ -185,8 +155,7 @@ class ImageTransportSurfaceOverlayMac::OverlayPlane {
if (!ca_layer)
return;
[ca_layer setContents:nil];
- if (type != ROOT)
- [ca_layer removeFromSuperlayer];
+ [ca_layer removeFromSuperlayer];
ca_layer.reset();
}
};
@@ -200,6 +169,7 @@ class ImageTransportSurfaceOverlayMac::PendingSwap {
float scale_factor;
gfx::Rect pixel_damage_rect;
+ linked_ptr<OverlayPlane> root_plane;
std::vector<linked_ptr<OverlayPlane>> overlay_planes;
std::vector<ui::LatencyInfo> latency_info;
@@ -299,6 +269,8 @@ gfx::SwapResult ImageTransportSurfaceOverlayMac::SwapBuffersInternal(
new_swap->pixel_size = pixel_size_;
new_swap->scale_factor = scale_factor_;
new_swap->pixel_damage_rect = pixel_damage_rect;
+ new_swap->root_plane = pending_root_plane_;
+ pending_root_plane_ = linked_ptr<OverlayPlane>();
new_swap->overlay_planes.swap(pending_overlay_planes_);
new_swap->latency_info.swap(latency_info_);
@@ -380,19 +352,18 @@ void ImageTransportSurfaceOverlayMac::DisplayFirstPendingSwapImmediately() {
// Update the plane lists.
{
- // Sort the input planes by z-index and type, and remove any overlays from
- // the damage rect.
+ // Sort the input planes by z-index, and remove any overlays from the
+ // damage rect.
gfx::RectF dip_damage_rect = ConvertRectToDIPF(
swap->scale_factor, swap->pixel_damage_rect);
std::sort(swap->overlay_planes.begin(), swap->overlay_planes.end(),
OverlayPlane::Compare);
- for (auto& plane : swap->overlay_planes) {
- if (plane->type == OverlayPlane::OVERLAY)
- dip_damage_rect.Subtract(plane->dip_frame_rect);
- }
+ for (auto& plane : swap->overlay_planes)
+ dip_damage_rect.Subtract(plane->dip_frame_rect);
ScopedCAActionDisabler disabler;
- UpdateRootAndPartialDamagePlanes(swap->overlay_planes, dip_damage_rect);
+ if (swap->root_plane.get())
+ UpdateRootAndPartialDamagePlanes(swap->root_plane, dip_damage_rect);
UpdateOverlayPlanes(swap->overlay_planes);
UpdateCALayerTree();
swap->overlay_planes.clear();
@@ -419,13 +390,11 @@ void ImageTransportSurfaceOverlayMac::UpdateOverlayPlanes(
// Move the new overlay planes into the |current_overlay_planes_| list,
// cannibalizing from the old |current_overlay_planes_| as much as possible.
for (auto& new_plane : new_overlay_planes) {
- if (new_plane->type == OverlayPlane::OVERLAY) {
- if (!old_overlay_planes.empty()) {
- new_plane->TakeCALayerFrom(old_overlay_planes.front().get());
- old_overlay_planes.pop_front();
- }
- current_overlay_planes_.push_back(new_plane);
+ if (!old_overlay_planes.empty()) {
+ new_plane->TakeCALayerFrom(old_overlay_planes.front().get());
+ old_overlay_planes.pop_front();
}
+ current_overlay_planes_.push_back(new_plane);
}
// Destroy any of the previous |current_overlay_planes_| that we couldn't
@@ -435,11 +404,10 @@ void ImageTransportSurfaceOverlayMac::UpdateOverlayPlanes(
}
void ImageTransportSurfaceOverlayMac::UpdateRootAndPartialDamagePlanes(
- const std::vector<linked_ptr<OverlayPlane>>& new_overlay_planes,
+ const linked_ptr<OverlayPlane>& new_root_plane,
const gfx::RectF& dip_damage_rect) {
std::list<linked_ptr<OverlayPlane>> old_partial_damage_planes;
old_partial_damage_planes.swap(current_partial_damage_planes_);
- linked_ptr<OverlayPlane> new_root_plane = new_overlay_planes.front();
linked_ptr<OverlayPlane> plane_for_swap;
// If the frame's size changed, if we haven't updated the root layer, or if
@@ -481,8 +449,8 @@ void ImageTransportSurfaceOverlayMac::UpdateRootAndPartialDamagePlanes(
1. / new_root_plane->dip_frame_rect.height());
plane_for_swap = linked_ptr<OverlayPlane>(new OverlayPlane(
- OverlayPlane::ROOT_PARTIAL_DAMAGE, 0, new_root_plane->io_surface,
- plane_to_reuse_dip_enlarged_rect, enlarged_contents_rect));
+ 0, new_root_plane->io_surface, plane_to_reuse_dip_enlarged_rect,
+ enlarged_contents_rect));
plane_for_swap->TakeCALayerFrom(plane_to_reuse.get());
if (plane_to_reuse != old_partial_damage_planes.back())
@@ -498,8 +466,7 @@ void ImageTransportSurfaceOverlayMac::UpdateRootAndPartialDamagePlanes(
contents_rect.Scale(1. / new_root_plane->dip_frame_rect.width(),
1. / new_root_plane->dip_frame_rect.height());
plane_for_swap = linked_ptr<OverlayPlane>(new OverlayPlane(
- OverlayPlane::ROOT_PARTIAL_DAMAGE, 0, new_root_plane->io_surface,
- dip_damage_rect, contents_rect));
+ 0, new_root_plane->io_surface, dip_damage_rect, contents_rect));
}
// And if we still don't have a layer, use the root layer.
@@ -567,7 +534,8 @@ void ImageTransportSurfaceOverlayMac::UpdateCALayerTree() {
}
// Update CALayer contents, frames, and borders.
- current_root_plane_->UpdateProperties();
+ if (current_root_plane_.get())
+ current_root_plane_->UpdateProperties();
for (auto& plane : current_partial_damage_planes_)
plane->UpdateProperties();
for (auto& plane : current_overlay_planes_)
@@ -660,24 +628,20 @@ bool ImageTransportSurfaceOverlayMac::ScheduleOverlayPlane(
gfx::GLImage* image,
const gfx::Rect& bounds_rect,
const gfx::RectF& crop_rect) {
- DCHECK_GE(z_order, 0);
DCHECK_EQ(transform, gfx::OVERLAY_TRANSFORM_NONE);
- if (z_order < 0 || transform != gfx::OVERLAY_TRANSFORM_NONE)
+ if (transform != gfx::OVERLAY_TRANSFORM_NONE)
return false;
- OverlayPlane::Type type = z_order == 0 ?
- OverlayPlane::ROOT : OverlayPlane::OVERLAY;
- gfx::RectF dip_frame_rect = ConvertRectToDIPF(
- scale_factor_, bounds_rect);
- gfx::RectF contents_rect = crop_rect;
-
- gfx::GLImageIOSurface* image_io_surface =
- static_cast<gfx::GLImageIOSurface*>(image);
+ linked_ptr<OverlayPlane> plane(
+ new OverlayPlane(z_order,
+ static_cast<gfx::GLImageIOSurface*>(image)->io_surface(),
+ ConvertRectToDIPF(scale_factor_, bounds_rect),
+ crop_rect));
+ if (z_order == 0)
+ pending_root_plane_ = plane;
+ else
+ pending_overlay_planes_.push_back(plane);
- pending_overlay_planes_.push_back(linked_ptr<OverlayPlane>(
- new OverlayPlane(
- type, z_order, image_io_surface->io_surface(), dip_frame_rect,
- contents_rect)));
return true;
}
« no previous file with comments | « content/common/gpu/image_transport_surface_overlay_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698