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