| Index: cc/layer_tree_host_impl.cc
|
| diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
|
| index 685effb47e7a80462231a78598cc5a6abaa6a54b..2b7b689280de8e1c61380e0adeb2333e11c21c9b 100644
|
| --- a/cc/layer_tree_host_impl.cc
|
| +++ b/cc/layer_tree_host_impl.cc
|
| @@ -410,9 +410,8 @@ void LayerTreeHostImpl::updateDrawProperties()
|
|
|
| void LayerTreeHostImpl::FrameData::appendRenderPass(scoped_ptr<RenderPass> renderPass)
|
| {
|
| - RenderPass* pass = renderPass.get();
|
| - renderPasses.push_back(pass);
|
| - renderPassesById.set(pass->id, renderPass.Pass());
|
| + renderPassesById[renderPass->id] = renderPass.get();
|
| + renderPasses.append(renderPass.Pass());
|
| }
|
|
|
| static void appendQuadsForLayer(RenderPass* targetRenderPass, LayerImpl* layer, OcclusionTrackerImpl& occlusionTracker, AppendQuadsData& appendQuadsData)
|
| @@ -502,7 +501,7 @@ static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* roo
|
|
|
| bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
|
| {
|
| - DCHECK(frame.renderPasses.empty());
|
| + DCHECK(frame.renderPasses.isEmpty());
|
|
|
| updateDrawProperties();
|
| if (!canDraw())
|
| @@ -538,7 +537,7 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
|
| LayerIteratorType end = LayerIteratorType::end(frame.renderSurfaceLayerList);
|
| for (LayerIteratorType it = LayerIteratorType::begin(frame.renderSurfaceLayerList); it != end; ++it) {
|
| RenderPass::Id targetRenderPassId = it.targetRenderSurfaceLayer()->renderSurface()->renderPassId();
|
| - RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPassId);
|
| + RenderPass* targetRenderPass = frame.renderPassesById[targetRenderPassId];
|
|
|
| occlusionTracker.enterLayer(it);
|
|
|
| @@ -546,7 +545,7 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
|
|
|
| if (it.representsContributingRenderSurface()) {
|
| RenderPass::Id contributingRenderPassId = it->renderSurface()->renderPassId();
|
| - RenderPass* contributingRenderPass = frame.renderPassesById.get(contributingRenderPassId);
|
| + RenderPass* contributingRenderPass = frame.renderPassesById[contributingRenderPassId];
|
| appendQuadsForRenderSurfaceLayer(targetRenderPass, *it, contributingRenderPass, occlusionTracker, appendQuadsData);
|
| } else if (it.representsItself() && !it->visibleContentRect().IsEmpty()) {
|
| bool hasOcclusionFromOutsideTargetSurface;
|
| @@ -560,8 +559,8 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
|
|
|
| if (it->hasContributingDelegatedRenderPasses()) {
|
| RenderPass::Id contributingRenderPassId = it->firstContributingRenderPassId();
|
| - while (frame.renderPassesById.contains(contributingRenderPassId)) {
|
| - RenderPass* renderPass = frame.renderPassesById.get(contributingRenderPassId);
|
| + while (frame.renderPassesById.find(contributingRenderPassId) != frame.renderPassesById.end()) {
|
| + RenderPass* renderPass = frame.renderPassesById[contributingRenderPassId];
|
|
|
| AppendQuadsData appendQuadsData(renderPass->id);
|
| appendQuadsForLayer(renderPass, *it, occlusionTracker, appendQuadsData);
|
| @@ -593,13 +592,14 @@ bool LayerTreeHostImpl::calculateRenderPasses(FrameData& frame)
|
| for (size_t i = 0; i < frame.renderPasses.size(); ++i) {
|
| 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));
|
| + DCHECK(frame.renderPassesById.find(frame.renderPasses[i]->id)
|
| + != frame.renderPassesById.end());
|
| }
|
| #endif
|
|
|
| if (!m_hasTransparentBackground) {
|
| - frame.renderPasses.back()->has_transparent_background = false;
|
| - appendQuadsToFillScreen(frame.renderPasses.back(), rootLayer(), m_backgroundColor, occlusionTracker);
|
| + frame.renderPasses.last()->has_transparent_background = false;
|
| + appendQuadsToFillScreen(frame.renderPasses.last(), rootLayer(), m_backgroundColor, occlusionTracker);
|
| }
|
|
|
| if (drawFrame)
|
| @@ -662,22 +662,24 @@ gfx::Size LayerTreeHostImpl::contentSize() const
|
| static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const LayerTreeHostImpl::FrameData& frame)
|
| {
|
| RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderPassId);
|
| - DCHECK(it != frame.renderPassesById.end());
|
| - return it->second;
|
| + return it != frame.renderPassesById.end() ? it->second : NULL;
|
| }
|
|
|
| static void removeRenderPassesRecursive(RenderPass::Id removeRenderPassId, LayerTreeHostImpl::FrameData& frame)
|
| {
|
| RenderPass* removeRenderPass = findRenderPassById(removeRenderPassId, frame);
|
| + // The pass was already removed by another quad - probably the original, and we are the replica.
|
| + if (!removeRenderPass)
|
| + return;
|
| RenderPassList& renderPasses = frame.renderPasses;
|
| RenderPassList::iterator toRemove = std::find(renderPasses.begin(), renderPasses.end(), removeRenderPass);
|
|
|
| - // The pass was already removed by another quad - probably the original, and we are the replica.
|
| - if (toRemove == renderPasses.end())
|
| - return;
|
| + DCHECK(toRemove != renderPasses.end());
|
|
|
| - const RenderPass* removedPass = *toRemove;
|
| - frame.renderPasses.erase(toRemove);
|
| + size_t index = toRemove - renderPasses.begin();
|
| + scoped_ptr<RenderPass> removedPass = renderPasses.take(index);
|
| + frame.renderPasses.remove(index);
|
| + frame.renderPassesById.erase(removeRenderPassId);
|
|
|
| // Now follow up for all RenderPass quads and remove their RenderPasses recursively.
|
| const QuadList& quadList = removedPass->quad_list;
|
| @@ -708,15 +710,11 @@ bool LayerTreeHostImpl::CullRenderPassesWithCachedTextures::shouldRemoveRenderPa
|
| bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(const RenderPassDrawQuad& quad, const FrameData& frame) const
|
| {
|
| const RenderPass* renderPass = findRenderPassById(quad.render_pass_id, frame);
|
| - const RenderPassList& renderPasses = frame.renderPasses;
|
| - RenderPassList::const_iterator foundPass = std::find(renderPasses.begin(), renderPasses.end(), renderPass);
|
| -
|
| - bool renderPassAlreadyRemoved = foundPass == renderPasses.end();
|
| - if (renderPassAlreadyRemoved)
|
| + if (!renderPass)
|
| return false;
|
|
|
| // If any quad or RenderPass draws into this RenderPass, then keep it.
|
| - const QuadList& quadList = (*foundPass)->quad_list;
|
| + const QuadList& quadList = renderPass->quad_list;
|
| for (QuadList::constBackToFrontIterator quadListIterator = quadList.backToFrontBegin(); quadListIterator != quadList.backToFrontEnd(); ++quadListIterator) {
|
| DrawQuad* currentQuad = *quadListIterator;
|
|
|
| @@ -724,8 +722,7 @@ bool LayerTreeHostImpl::CullRenderPassesWithNoQuads::shouldRemoveRenderPass(cons
|
| return false;
|
|
|
| const RenderPass* contributingPass = findRenderPassById(RenderPassDrawQuad::MaterialCast(currentQuad)->render_pass_id, frame);
|
| - RenderPassList::const_iterator foundContributingPass = std::find(renderPasses.begin(), renderPasses.end(), contributingPass);
|
| - if (foundContributingPass != renderPasses.end())
|
| + if (contributingPass)
|
| return false;
|
| }
|
| return true;
|
| @@ -897,7 +894,7 @@ void LayerTreeHostImpl::drawLayers(FrameData& frame)
|
| {
|
| TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers");
|
| DCHECK(canDraw());
|
| - DCHECK(!frame.renderPasses.empty());
|
| + DCHECK(!frame.renderPasses.isEmpty());
|
|
|
| // FIXME: use the frame begin time from the overall compositor scheduler.
|
| // This value is currently inaccessible because it is up in Chromium's
|
| @@ -912,11 +909,10 @@ void LayerTreeHostImpl::drawLayers(FrameData& frame)
|
| if (m_activeTree->hud_layer())
|
| m_activeTree->hud_layer()->updateHudTexture(m_resourceProvider.get());
|
|
|
| - m_renderer->drawFrame(frame.renderPasses, frame.renderPassesById);
|
| -
|
| + m_renderer->drawFrame(frame.renderPasses);
|
| // The render passes should be consumed by the renderer.
|
| - DCHECK(frame.renderPasses.empty());
|
| - DCHECK(frame.renderPassesById.empty());
|
| + DCHECK(frame.renderPasses.isEmpty());
|
| + frame.renderPassesById.clear();
|
|
|
| // 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++)
|
|
|