Index: cc/layer_tree_host_impl.cc |
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc |
index a3f865611f7a0695c766c36ff4fb05958660af4f..a8a3faae276bbe07ce031349488be941567726af 100644 |
--- a/cc/layer_tree_host_impl.cc |
+++ b/cc/layer_tree_host_impl.cc |
@@ -23,12 +23,15 @@ |
#include "cc/overdraw_metrics.h" |
#include "cc/page_scale_animation.h" |
#include "cc/prioritized_resource_manager.h" |
+#include "cc/quad_culler.h" |
#include "cc/render_pass_draw_quad.h" |
#include "cc/rendering_stats.h" |
#include "cc/scrollbar_animation_controller.h" |
#include "cc/scrollbar_layer_impl.h" |
+#include "cc/shared_quad_state.h" |
#include "cc/single_thread_proxy.h" |
#include "cc/software_renderer.h" |
+#include "cc/solid_color_draw_quad.h" |
#include "cc/texture_uploader.h" |
#include "ui/gfx/size_conversions.h" |
#include "ui/gfx/vector2d_conversions.h" |
@@ -380,7 +383,90 @@ void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> rende |
{ |
RenderPass* pass = renderPass.get(); |
renderPasses.push_back(pass); |
- renderPassesById.set(pass->id(), renderPass.Pass()); |
+ renderPassesById.set(pass->id, renderPass.Pass()); |
+} |
+ |
+static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer, OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) |
+{ |
+ bool forSurface = false; |
+ QuadCuller quadCuller(targetRenderPass->quad_list, |
+ targetRenderPass->shared_quad_state_list, |
+ layer, |
+ occlusionTracker, |
+ layer->showDebugBorders(), |
+ forSurface); |
+ layer->appendQuads(quadCuller, appendQuadsData); |
+} |
+ |
+static void appendQuadsForRenderSurfaceLayer(RenderPass* targetRenderPass, LayerImpl* layer, const RenderPass* contributingRenderPass, OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData) |
+{ |
+ bool forSurface = true; |
+ QuadCuller quadCuller(targetRenderPass->quad_list, |
+ targetRenderPass->shared_quad_state_list, |
+ layer, |
+ occlusionTracker, |
+ layer->showDebugBorders(), |
+ forSurface); |
+ |
+ bool isReplica = false; |
+ layer->renderSurface()->appendQuads(quadCuller, |
+ appendQuadsData, |
+ isReplica, |
+ contributingRenderPass->id); |
+ |
+ // Add replica after the surface so that it appears below the surface. |
+ if (layer->hasReplica()) { |
+ isReplica = true; |
+ layer->renderSurface()->appendQuads(quadCuller, |
+ appendQuadsData, |
+ isReplica, |
+ contributingRenderPass->id); |
+ } |
+} |
+ |
+static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* rootLayer, SkColor screenBackgroundColor, const OcclusionTrackerImpl& occlusionTracker) |
+{ |
+ if (!rootLayer || !SkColorGetA(screenBackgroundColor)) |
+ return; |
+ |
+ Region fillRegion = occlusionTracker.computeVisibleRegionInScreen(); |
+ if (fillRegion.IsEmpty()) |
+ return; |
+ |
+ bool forSurface = false; |
+ QuadCuller quadCuller(targetRenderPass->quad_list, |
+ targetRenderPass->shared_quad_state_list, |
+ rootLayer, |
+ occlusionTracker, |
+ rootLayer->showDebugBorders(), |
+ forSurface); |
+ |
+ // Manually create the quad state for the gutter quads, as the root layer |
+ // doesn't have any bounds and so can't generate this itself. |
+ // FIXME: Make the gutter quads generated by the solid color layer (make it smarter about generating quads to fill unoccluded areas). |
+ |
+ DCHECK(rootLayer->screenSpaceTransform().isInvertible()); |
+ |
+ gfx::Rect rootTargetRect = rootLayer->renderSurface()->contentRect(); |
+ float opacity = 1; |
+ SharedQuadState* sharedQuadState = quadCuller.useSharedQuadState(SharedQuadState::Create()); |
+ sharedQuadState->SetAll(rootLayer->drawTransform(), |
+ rootTargetRect, |
+ rootTargetRect, |
+ opacity); |
+ |
+ AppendQuadsData appendQuadsData; |
+ WebTransformationMatrix transformToLayerSpace = rootLayer->screenSpaceTransform().inverse(); |
+ for (Region::Iterator fillRects(fillRegion); fillRects.has_rect(); fillRects.next()) { |
+ // The root layer transform is composed of translations and scales only, |
+ // no perspective, so mapping is sufficient. |
+ gfx::Rect layerRect = MathUtil::mapClippedRect(transformToLayerSpace, fillRects.rect()); |
+ // Skip the quad culler and just append the quads directly to avoid |
+ // occlusion checks. |
+ scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); |
+ quad->SetNew(sharedQuadState, layerRect, screenBackgroundColor); |
+ quadCuller.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
+ } |
} |
bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
@@ -421,12 +507,12 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
occlusionTracker.enterLayer(it); |
- AppendQuadsData appendQuadsData(targetRenderPass->id()); |
+ AppendQuadsData appendQuadsData(targetRenderPass->id); |
if (it.representsContributingRenderSurface()) { |
RenderPass::Id contributingRenderPassId = it->renderSurface()->renderPassId(); |
RenderPass* contributingRenderPass = frame.renderPassesById.get(contributingRenderPassId); |
- targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributingRenderPass, &occlusionTracker, appendQuadsData); |
+ appendQuadsForRenderSurfaceLayer(targetRenderPass, *it, contributingRenderPass, occlusionTracker, appendQuadsData); |
} else if (it.representsItself() && !it->visibleContentRect().IsEmpty()) { |
bool hasOcclusionFromOutsideTargetSurface; |
bool implDrawTransformIsUnknown = false; |
@@ -441,19 +527,19 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
while (frame.renderPassesById.contains(contributingRenderPassId)) { |
RenderPass* renderPass = frame.renderPassesById.get(contributingRenderPassId); |
- AppendQuadsData appendQuadsData(renderPass->id()); |
- renderPass->appendQuadsForLayer(*it, &occlusionTracker, appendQuadsData); |
+ AppendQuadsData appendQuadsData(renderPass->id); |
+ appendQuadsForLayer(renderPass, *it, occlusionTracker, appendQuadsData); |
contributingRenderPassId = it->nextContributingRenderPassId(contributingRenderPassId); |
} |
} |
- targetRenderPass->appendQuadsForLayer(*it, &occlusionTracker, appendQuadsData); |
+ appendQuadsForLayer(targetRenderPass, *it, occlusionTracker, appendQuadsData); |
} |
} |
if (appendQuadsData.hadOcclusionFromOutsideTargetSurface) |
- targetRenderPass->setHasOcclusionFromOutsideTargetSurface(true); |
+ targetRenderPass->has_occlusion_from_outside_target_surface = true; |
if (appendQuadsData.hadMissingTiles) { |
bool layerHasAnimatingTransform = it->screenSpaceTransformIsAnimating() || it->drawTransformIsAnimating(); |
@@ -466,15 +552,15 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame) |
#ifndef NDEBUG |
for (size_t i = 0; i < frame.renderPasses.size(); ++i) { |
- for (size_t j = 0; j < frame.renderPasses[i]->quadList().size(); ++j) |
- DCHECK(frame.renderPasses[i]->quadList()[j]->shared_quad_state); |
- DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id())); |
+ for (size_t j = 0; j < frame.renderPasses[i]->quad_list.size(); ++j) |
+ DCHECK(frame.renderPasses[i]->quad_list[j]->shared_quad_state); |
+ DCHECK(frame.renderPassesById.contains(frame.renderPasses[i]->id)); |
} |
#endif |
if (!m_hasTransparentBackground) { |
- frame.renderPasses.back()->setHasTransparentBackground(false); |
- frame.renderPasses.back()->appendQuadsToFillScreen(m_rootLayerImpl.get(), m_backgroundColor, occlusionTracker); |
+ frame.renderPasses.back()->has_transparent_background = false; |
+ appendQuadsToFillScreen(frame.renderPasses.back(), m_rootLayerImpl.get(), m_backgroundColor, occlusionTracker); |
} |
if (drawFrame) |
@@ -555,7 +641,7 @@ static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, Layer |
frame.renderPasses.erase(toRemove); |
// Now follow up for all RenderPass quads and remove their RenderPasses recursively. |
- const QuadList& quadList = removedPass->quadList(); |
+ const QuadList& quadList = removedPass->quad_list; |
QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBegin(); |
for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
DrawQuad* currentQuad = (*quadListIterator); |
@@ -583,7 +669,7 @@ bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons |
return false; |
// If any quad or RenderPass draws into this RenderPass, then keep it. |
- const QuadList& quadList = (*foundPass)->quadList(); |
+ const QuadList& quadList = (*foundPass)->quad_list; |
for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
DrawQuad* currentQuad = *quadListIterator; |
@@ -608,7 +694,7 @@ void LayerTreeHostImpl::removeRenderPasses(RenderPassCuller culler, FrameData& f |
{ |
for (size_t it = culler.renderPassListBegin(frame.renderPasses); it != culler.renderPassListEnd(frame.renderPasses); it = culler.renderPassListNext(it)) { |
const RenderPass* currentPass = frame.renderPasses[it]; |
- const QuadList& quadList = currentPass->quadList(); |
+ const QuadList& quadList = currentPass->quad_list; |
QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBegin(); |
for (; quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) { |
@@ -721,7 +807,7 @@ void LayerTreeHostImpl::drawLayers(const FrameData& frame) |
// Once a RenderPass has been drawn, its damage should be cleared in |
// case the RenderPass will be reused next frame. |
for (unsigned int i = 0; i < frame.renderPasses.size(); i++) |
- frame.renderPasses[i]->setDamageRect(gfx::RectF()); |
+ frame.renderPasses[i]->damage_rect = gfx::RectF(); |
// The next frame should start by assuming nothing has changed, and changes are noted as they occur. |
for (unsigned int i = 0; i < frame.renderSurfaceLayerList->size(); i++) |