| 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++)
|
|
|