OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "DelegatedRendererLayerChromium.h" | 6 #include "cc/DelegatedRendererLayerChromium.h" |
7 | 7 |
8 #include "CCDelegatedRendererLayerImpl.h" | 8 #include "cc/CCDelegatedRendererLayerImpl.h" |
| 9 #include "cc/CCLayerTreeHostImpl.h" |
| 10 #include "cc/CCCheckerboardDrawQuad.h" |
| 11 #include "cc/CCDebugBorderDrawQuad.h" |
| 12 #include "cc/CCRenderPass.h" |
| 13 #include "cc/CCRenderPassDrawQuad.h" |
| 14 #include "cc/CCResourceProvider.h" |
| 15 #include "cc/CCSolidColorDrawQuad.h" |
| 16 #include "cc/CCTextureDrawQuad.h" |
| 17 #include "cc/CCTileDrawQuad.h" |
| 18 #include "cc/CCYUVVideoDrawQuad.h" |
9 | 19 |
10 namespace cc { | 20 namespace cc { |
11 | 21 |
| 22 namespace { |
| 23 |
| 24 void FixResourcesInDrawQuad(const CCDrawQuad* quad, const CCResourceProvider::Re
sourceIdMap& map, std::set<unsigned>* resources) { |
| 25 switch (quad->material()) { |
| 26 case CCDrawQuad::Invalid: |
| 27 //NOTREACHED(); |
| 28 break; |
| 29 case CCDrawQuad::Checkerboard: |
| 30 case CCDrawQuad::DebugBorder: |
| 31 case CCDrawQuad::SolidColor: |
| 32 break; |
| 33 case CCDrawQuad::IOSurfaceContent: |
| 34 // TODO(piman): convert to CCTextureDrawQuad? |
| 35 //NOTIMPLEMENTED(); |
| 36 break; |
| 37 case CCDrawQuad::RenderPass: { |
| 38 CCRenderPassDrawQuad* materialQuad = const_cast<CCRenderPassDrawQuad*>(CCR
enderPassDrawQuad::materialCast(quad)); |
| 39 unsigned newResourceId = map.get(materialQuad->maskResourceId()); |
| 40 materialQuad->setMaskResourceId(newResourceId); |
| 41 resources->insert(newResourceId); |
| 42 break; |
| 43 } |
| 44 case CCDrawQuad::TextureContent: { |
| 45 CCTextureDrawQuad* materialQuad = const_cast<CCTextureDrawQuad*>(CCTexture
DrawQuad::materialCast(quad)); |
| 46 unsigned newResourceId = map.get(materialQuad->resourceId()); |
| 47 materialQuad->setResourceId(newResourceId); |
| 48 resources->insert(newResourceId); |
| 49 break; |
| 50 } |
| 51 case CCDrawQuad::TiledContent: { |
| 52 CCTileDrawQuad* materialQuad = const_cast<CCTileDrawQuad*>(CCTileDrawQuad:
:materialCast(quad)); |
| 53 unsigned newResourceId = map.get(materialQuad->resourceId()); |
| 54 materialQuad->setResourceId(newResourceId); |
| 55 resources->insert(newResourceId); |
| 56 break; |
| 57 } |
| 58 case CCDrawQuad::YUVVideoContent: { |
| 59 // TODO |
| 60 /* |
| 61 const CCYUVVideoDrawQuad* yuvQuad = CCYUVVideoDrawQuad::materialCast(quad)
; |
| 62 resources->insert(yuvQuad->yPlane().resourceId); |
| 63 resources->insert(yuvQuad->uPlane().resourceId); |
| 64 resources->insert(yuvQuad->vPlane().resourceId); |
| 65 */ |
| 66 break; |
| 67 } |
| 68 case CCDrawQuad::StreamVideoContent: |
| 69 // TODO(piman): convert to CCTextureDrawQuad? |
| 70 //NOTIMPLEMENTED(); |
| 71 break; |
| 72 } |
| 73 } |
| 74 |
| 75 void FixResourcesInRenderPass(CCRenderPass* pass, const CCResourceProvider::Reso
urceIdMap& map, std::set<unsigned>* resources) { |
| 76 const CCQuadList& quadList = pass->quadList(); |
| 77 for (CCQuadList::const_iterator it = quadList.begin(); it != quadList.end(); +
+it) |
| 78 FixResourcesInDrawQuad(*it, map, resources); |
| 79 } |
| 80 |
| 81 } // anonymous namespace |
| 82 |
12 PassRefPtr<DelegatedRendererLayerChromium> DelegatedRendererLayerChromium::creat
e() | 83 PassRefPtr<DelegatedRendererLayerChromium> DelegatedRendererLayerChromium::creat
e() |
13 { | 84 { |
14 return adoptRef(new DelegatedRendererLayerChromium()); | 85 return adoptRef(new DelegatedRendererLayerChromium()); |
15 } | 86 } |
16 | 87 |
17 DelegatedRendererLayerChromium::DelegatedRendererLayerChromium() | 88 DelegatedRendererLayerChromium::DelegatedRendererLayerChromium() |
18 : LayerChromium() | 89 : LayerChromium() |
| 90 , m_new(false) |
19 { | 91 { |
20 setIsDrawable(true); | 92 setIsDrawable(true); |
21 setMasksToBounds(true); | 93 setMasksToBounds(true); |
| 94 m_recyclingResources.sync_point = 0; |
22 } | 95 } |
23 | 96 |
24 DelegatedRendererLayerChromium::~DelegatedRendererLayerChromium() | 97 DelegatedRendererLayerChromium::~DelegatedRendererLayerChromium() |
25 { | 98 { |
26 } | 99 } |
27 | 100 |
28 PassOwnPtr<CCLayerImpl> DelegatedRendererLayerChromium::createCCLayerImpl() | 101 PassOwnPtr<CCLayerImpl> DelegatedRendererLayerChromium::createCCLayerImpl() |
29 { | 102 { |
30 return CCDelegatedRendererLayerImpl::create(m_layerId); | 103 return CCDelegatedRendererLayerImpl::create(m_layerId); |
31 } | 104 } |
32 | 105 |
| 106 void DelegatedRendererLayerChromium::pushPropertiesTo(CCLayerImpl* layer) |
| 107 { |
| 108 LayerChromium::pushPropertiesTo(layer); |
| 109 if (m_new) { |
| 110 typedef std::set<unsigned> ResourceSet; |
| 111 CCDelegatedRendererLayerImpl* delegatedRendererLayer = static_cast<CCDel
egatedRendererLayerImpl*>(layer); |
| 112 CCResourceProvider* resourceProvider = layer->layerTreeHostImpl()->resou
rceProvider(); |
| 113 |
| 114 int childId = delegatedRendererLayer->childId(); |
| 115 if (!childId) { |
| 116 delegatedRendererLayer->createChild(); |
| 117 childId = delegatedRendererLayer->childId(); |
| 118 } |
| 119 resourceProvider->receiveFromChild(childId, m_frame.resources); |
| 120 m_frame.resources.sync_point = 0; |
| 121 m_frame.resources.resources.clear(); |
| 122 const CCResourceProvider::ResourceIdMap& map = resourceProvider->getChil
dToParentMap(childId); |
| 123 |
| 124 ResourceSet oldResources; |
| 125 oldResources.swap(m_currentResources); |
| 126 ScopedPtrVector<CCRenderPass> passes; |
| 127 for (size_t i = 0; i < m_frame.render_passes.size(); ++i) { |
| 128 scoped_ptr<CCRenderPass> pass(m_frame.render_passes[i]); |
| 129 FixResourcesInRenderPass(pass.get(), map, &m_currentResources); |
| 130 passes.append(pass.Pass()); |
| 131 } |
| 132 delegatedRendererLayer->setRenderPasses(passes); |
| 133 m_frame.render_passes.clear(); |
| 134 |
| 135 if (childId) { |
| 136 CCResourceProvider::ResourceIdArray array; |
| 137 for (ResourceSet::iterator it = oldResources.begin(); it != oldResou
rces.end(); ++it) { |
| 138 if (m_currentResources.find(*it) == m_currentResources.end()) |
| 139 array.append(*it); |
| 140 } |
| 141 cc::TransferableResourceList recycle; |
| 142 recycle.sync_point = 0; |
| 143 resourceProvider->prepareSendToChild(childId, array, &recycle); |
| 144 if (recycle.sync_point) |
| 145 m_recyclingResources.sync_point = recycle.sync_point; |
| 146 m_recyclingResources.resources.insert(m_recyclingResources.resources
.end(), recycle.resources.begin(), recycle.resources.end()); |
| 147 } |
| 148 m_new = false; |
| 149 } |
33 } | 150 } |
| 151 |
| 152 void DelegatedRendererLayerChromium::setFrameData(const CompositorFrame& frame) |
| 153 { |
| 154 m_new = true; |
| 155 m_frame = frame; |
| 156 setNeedsCommit(); |
| 157 } |
| 158 |
| 159 void DelegatedRendererLayerChromium::getRecycledResources(TransferableResourceLi
st* list) |
| 160 { |
| 161 std::swap(*list, m_recyclingResources); |
| 162 m_recyclingResources.sync_point = 0; |
| 163 m_recyclingResources.resources.clear(); |
| 164 } |
| 165 |
| 166 } |
OLD | NEW |