Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 1eac5f85d19fd7268dc7b9c2d33a9288ab115f9b..1fc9ece2979bb98609006801d559893607a54d5a 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -2442,6 +2442,7 @@ void GLRenderer::FinishDrawingFrame() { |
blend_shadow_ = false; |
ScheduleCALayers(); |
+ ScheduleDCLayers(); |
ScheduleOverlays(); |
} |
@@ -3177,6 +3178,64 @@ void GLRenderer::ScheduleCALayers() { |
} |
} |
+void GLRenderer::ScheduleDCLayers() { |
+ if (overlay_resource_pool_) { |
+ overlay_resource_pool_->CheckBusyResources(); |
+ } |
+ |
+ scoped_refptr<DCLayerOverlaySharedState> shared_state; |
+ size_t copied_render_pass_count = 0; |
+ for (const DCLayerOverlay& dc_layer_overlay : |
+ current_frame()->dc_layer_overlay_list) { |
+ DCHECK(!dc_layer_overlay.rpdq); |
+ |
+ ResourceId contents_resource_id = dc_layer_overlay.contents_resource_id; |
+ unsigned texture_id = 0; |
+ if (contents_resource_id) { |
+ pending_overlay_resources_.push_back( |
+ base::MakeUnique<ResourceProvider::ScopedReadLockGL>( |
+ resource_provider_, contents_resource_id)); |
+ texture_id = pending_overlay_resources_.back()->texture_id(); |
+ } |
+ GLfloat contents_rect[4] = { |
+ dc_layer_overlay.contents_rect.x(), dc_layer_overlay.contents_rect.y(), |
+ dc_layer_overlay.contents_rect.width(), |
+ dc_layer_overlay.contents_rect.height(), |
+ }; |
+ GLfloat bounds_rect[4] = { |
+ dc_layer_overlay.bounds_rect.x(), dc_layer_overlay.bounds_rect.y(), |
+ dc_layer_overlay.bounds_rect.width(), |
+ dc_layer_overlay.bounds_rect.height(), |
+ }; |
+ GLboolean is_clipped = dc_layer_overlay.shared_state->is_clipped; |
+ GLfloat clip_rect[4] = {dc_layer_overlay.shared_state->clip_rect.x(), |
+ dc_layer_overlay.shared_state->clip_rect.y(), |
+ dc_layer_overlay.shared_state->clip_rect.width(), |
+ dc_layer_overlay.shared_state->clip_rect.height()}; |
+ GLint z_order = dc_layer_overlay.shared_state->z_order; |
+ GLfloat transform[16]; |
+ dc_layer_overlay.shared_state->transform.asColMajorf(transform); |
+ unsigned filter = dc_layer_overlay.filter; |
+ |
+ if (dc_layer_overlay.shared_state != shared_state) { |
+ shared_state = dc_layer_overlay.shared_state; |
+ gl_->ScheduleDCLayerSharedStateCHROMIUM( |
+ dc_layer_overlay.shared_state->opacity, is_clipped, clip_rect, |
+ z_order, transform); |
+ } |
+ gl_->ScheduleDCLayerCHROMIUM( |
+ texture_id, contents_rect, dc_layer_overlay.background_color, |
+ dc_layer_overlay.edge_aa_mask, bounds_rect, filter); |
+ } |
+ |
+ // Take the number of copied render passes in this frame, and use 3 times that |
+ // amount as the cache limit. |
+ if (overlay_resource_pool_) { |
+ overlay_resource_pool_->SetResourceUsageLimits( |
+ std::numeric_limits<std::size_t>::max(), copied_render_pass_count * 5); |
+ } |
+} |
+ |
void GLRenderer::ScheduleOverlays() { |
if (current_frame()->overlay_list.empty()) |
return; |