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

Unified Diff: cc/layer_tree_host_impl.cc

Issue 11413106: cc: Make RenderPass into a struct-like class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 1 month 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/gl_renderer_unittest.cc ('k') | cc/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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++)
« no previous file with comments | « cc/gl_renderer_unittest.cc ('k') | cc/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698