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

Unified Diff: cc/output/ca_layer_overlay.cc

Issue 2156913003: Refactor CALayerOverlay to pull out CALayerOverlaySharedState. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp36
Patch Set: Rebase. Created 4 years, 5 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 | « cc/output/ca_layer_overlay.h ('k') | cc/output/gl_renderer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/ca_layer_overlay.cc
diff --git a/cc/output/ca_layer_overlay.cc b/cc/output/ca_layer_overlay.cc
index 998cf882d158b35a2d2a108910827dccb83eadb1..ac61db0ac9dbaf9f216124193ab6c703767c6aef 100644
--- a/cc/output/ca_layer_overlay.cc
+++ b/cc/output/ca_layer_overlay.cc
@@ -78,9 +78,9 @@ CALayerResult FromTextureQuad(ResourceProvider* resource_provider,
// transformation that flips the contents of the layer without changing its
// frame is the composition of a vertical flip about the anchor point, and a
// translation by the height of the layer.
- ca_layer_overlay->transform.preTranslate(
+ ca_layer_overlay->shared_state->transform.preTranslate(
0, ca_layer_overlay->bounds_rect.height(), 0);
- ca_layer_overlay->transform.preScale(1, -1, 1);
+ ca_layer_overlay->shared_state->transform.preScale(1, -1, 1);
}
ca_layer_overlay->contents_resource_id = resource_id;
ca_layer_overlay->contents_rect =
@@ -90,7 +90,7 @@ CALayerResult FromTextureQuad(ResourceProvider* resource_provider,
if (quad->vertex_opacity[i] != quad->vertex_opacity[0])
return CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES;
}
- ca_layer_overlay->opacity *= quad->vertex_opacity[0];
+ ca_layer_overlay->shared_state->opacity *= quad->vertex_opacity[0];
ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR;
return CA_LAYER_SUCCESS;
}
@@ -108,73 +108,89 @@ CALayerResult FromTileQuad(ResourceProvider* resource_provider,
return CA_LAYER_SUCCESS;
}
-CALayerResult FromDrawQuad(ResourceProvider* resource_provider,
- const gfx::RectF& display_rect,
- const DrawQuad* quad,
- CALayerOverlay* ca_layer_overlay,
- bool* skip) {
- if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode)
- return CA_LAYER_FAILED_QUAD_BLEND_MODE;
+class CALayerOverlayProcessor {
+ public:
+ CALayerResult FromDrawQuad(ResourceProvider* resource_provider,
+ const gfx::RectF& display_rect,
+ const DrawQuad* quad,
+ CALayerOverlay* ca_layer_overlay,
+ bool* skip) {
+ if (quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode)
+ return CA_LAYER_FAILED_QUAD_BLEND_MODE;
+
+ // Early-out for invisible quads.
+ if (quad->shared_quad_state->opacity == 0.f) {
+ *skip = true;
+ return CA_LAYER_SUCCESS;
+ }
- // Early-out for invisible quads.
- if (quad->shared_quad_state->opacity == 0.f) {
- *skip = true;
- return CA_LAYER_SUCCESS;
- }
+ // Enable edge anti-aliasing only on layer boundaries.
+ ca_layer_overlay->edge_aa_mask = 0;
+ if (quad->IsLeftEdge())
+ ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_LEFT_CHROMIUM;
+ if (quad->IsRightEdge())
+ ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_RIGHT_CHROMIUM;
+ if (quad->IsBottomEdge())
+ ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM;
+ if (quad->IsTopEdge())
+ ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_TOP_CHROMIUM;
+
+ if (most_recent_shared_quad_state_ != quad->shared_quad_state) {
+ most_recent_shared_quad_state_ = quad->shared_quad_state;
+ most_recent_overlay_shared_state_ = new CALayerOverlaySharedState;
+ // Set rect clipping and sorting context ID.
+ most_recent_overlay_shared_state_->sorting_context_id =
+ quad->shared_quad_state->sorting_context_id;
+ most_recent_overlay_shared_state_->is_clipped =
+ quad->shared_quad_state->is_clipped;
+ most_recent_overlay_shared_state_->clip_rect =
+ gfx::RectF(quad->shared_quad_state->clip_rect);
+
+ most_recent_overlay_shared_state_->opacity =
+ quad->shared_quad_state->opacity;
+ most_recent_overlay_shared_state_->transform =
+ quad->shared_quad_state->quad_to_target_transform.matrix();
+ }
+ ca_layer_overlay->shared_state = most_recent_overlay_shared_state_;
+
+ ca_layer_overlay->bounds_rect = gfx::RectF(quad->rect);
+
+ switch (quad->material) {
+ case DrawQuad::TEXTURE_CONTENT:
+ return FromTextureQuad(resource_provider,
+ TextureDrawQuad::MaterialCast(quad),
+ ca_layer_overlay);
+ case DrawQuad::TILED_CONTENT:
+ return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad),
+ ca_layer_overlay);
+ case DrawQuad::SOLID_COLOR:
+ return FromSolidColorDrawQuad(SolidColorDrawQuad::MaterialCast(quad),
+ ca_layer_overlay, skip);
+ case DrawQuad::STREAM_VIDEO_CONTENT:
+ return FromStreamVideoQuad(resource_provider,
+ StreamVideoDrawQuad::MaterialCast(quad),
+ ca_layer_overlay);
+ case DrawQuad::DEBUG_BORDER:
+ return CA_LAYER_FAILED_DEBUG_BORDER;
+ case DrawQuad::PICTURE_CONTENT:
+ return CA_LAYER_FAILED_PICTURE_CONTENT;
+ case DrawQuad::RENDER_PASS:
+ return CA_LAYER_FAILED_RENDER_PASS;
+ case DrawQuad::SURFACE_CONTENT:
+ return CA_LAYER_FAILED_SURFACE_CONTENT;
+ case DrawQuad::YUV_VIDEO_CONTENT:
+ return CA_LAYER_FAILED_YUV_VIDEO_CONTENT;
+ default:
+ break;
+ }
- // Enable edge anti-aliasing only on layer boundaries.
- ca_layer_overlay->edge_aa_mask = 0;
- if (quad->IsLeftEdge())
- ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_LEFT_CHROMIUM;
- if (quad->IsRightEdge())
- ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_RIGHT_CHROMIUM;
- if (quad->IsBottomEdge())
- ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM;
- if (quad->IsTopEdge())
- ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_TOP_CHROMIUM;
-
- // Set rect clipping and sorting context ID.
- ca_layer_overlay->sorting_context_id =
- quad->shared_quad_state->sorting_context_id;
- ca_layer_overlay->is_clipped = quad->shared_quad_state->is_clipped;
- ca_layer_overlay->clip_rect = gfx::RectF(quad->shared_quad_state->clip_rect);
-
- ca_layer_overlay->opacity = quad->shared_quad_state->opacity;
- ca_layer_overlay->bounds_rect = gfx::RectF(quad->rect);
- ca_layer_overlay->transform =
- quad->shared_quad_state->quad_to_target_transform.matrix();
-
- switch (quad->material) {
- case DrawQuad::TEXTURE_CONTENT:
- return FromTextureQuad(resource_provider,
- TextureDrawQuad::MaterialCast(quad),
- ca_layer_overlay);
- case DrawQuad::TILED_CONTENT:
- return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad),
- ca_layer_overlay);
- case DrawQuad::SOLID_COLOR:
- return FromSolidColorDrawQuad(SolidColorDrawQuad::MaterialCast(quad),
- ca_layer_overlay, skip);
- case DrawQuad::STREAM_VIDEO_CONTENT:
- return FromStreamVideoQuad(resource_provider,
- StreamVideoDrawQuad::MaterialCast(quad),
- ca_layer_overlay);
- case DrawQuad::DEBUG_BORDER:
- return CA_LAYER_FAILED_DEBUG_BORDER;
- case DrawQuad::PICTURE_CONTENT:
- return CA_LAYER_FAILED_PICTURE_CONTENT;
- case DrawQuad::RENDER_PASS:
- return CA_LAYER_FAILED_RENDER_PASS;
- case DrawQuad::SURFACE_CONTENT:
- return CA_LAYER_FAILED_SURFACE_CONTENT;
- case DrawQuad::YUV_VIDEO_CONTENT:
- return CA_LAYER_FAILED_YUV_VIDEO_CONTENT;
- default:
- break;
+ return CA_LAYER_FAILED_UNKNOWN;
}
- return CA_LAYER_FAILED_UNKNOWN;
-}
+ private:
+ const SharedQuadState* most_recent_shared_quad_state_ = nullptr;
+ scoped_refptr<CALayerOverlaySharedState> most_recent_overlay_shared_state_;
+};
} // namespace
@@ -191,13 +207,14 @@ bool ProcessForCALayerOverlays(ResourceProvider* resource_provider,
CALayerResult result = CA_LAYER_SUCCESS;
ca_layer_overlays->reserve(quad_list.size());
+ CALayerOverlayProcessor processor;
for (auto it = quad_list.BackToFrontBegin(); it != quad_list.BackToFrontEnd();
++it) {
const DrawQuad* quad = *it;
CALayerOverlay ca_layer;
bool skip = false;
- result =
- FromDrawQuad(resource_provider, display_rect, quad, &ca_layer, &skip);
+ result = processor.FromDrawQuad(resource_provider, display_rect, quad,
+ &ca_layer, &skip);
if (result != CA_LAYER_SUCCESS)
break;
@@ -208,10 +225,13 @@ bool ProcessForCALayerOverlays(ResourceProvider* resource_provider,
// within one sorting context.
if (!ca_layer_overlays->empty()) {
const CALayerOverlay& previous_ca_layer = ca_layer_overlays->back();
- if (ca_layer.sorting_context_id &&
- previous_ca_layer.sorting_context_id == ca_layer.sorting_context_id) {
- if (previous_ca_layer.is_clipped != ca_layer.is_clipped ||
- previous_ca_layer.clip_rect != ca_layer.clip_rect) {
+ if (ca_layer.shared_state->sorting_context_id &&
+ previous_ca_layer.shared_state->sorting_context_id ==
+ ca_layer.shared_state->sorting_context_id) {
+ if (previous_ca_layer.shared_state->is_clipped !=
+ ca_layer.shared_state->is_clipped ||
+ previous_ca_layer.shared_state->clip_rect !=
+ ca_layer.shared_state->clip_rect) {
result = CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS;
break;
}
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/gl_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698