| 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 | 6 |
| 7 #include "cc/direct_renderer.h" | 7 #include "cc/direct_renderer.h" |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 { | 115 { |
| 116 } | 116 } |
| 117 | 117 |
| 118 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) | 118 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) |
| 119 { | 119 { |
| 120 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; | 120 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; |
| 121 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 121 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 122 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); | 122 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id(), renderPassesInDrawOrder[i])); |
| 123 | 123 |
| 124 std::vector<RenderPass::Id> passesToDelete; | 124 std::vector<RenderPass::Id> passesToDelete; |
| 125 ScopedPtrHashMap<RenderPass::Id, CachedTexture>::const_iterator passIterator
; | 125 ScopedPtrHashMap<RenderPass::Id, CachedResource>::const_iterator passIterato
r; |
| 126 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { | 126 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { |
| 127 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); | 127 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); |
| 128 if (it == renderPassesInFrame.end()) { | 128 if (it == renderPassesInFrame.end()) { |
| 129 passesToDelete.push_back(passIterator->first); | 129 passesToDelete.push_back(passIterator->first); |
| 130 continue; | 130 continue; |
| 131 } | 131 } |
| 132 | 132 |
| 133 const RenderPass* renderPassInFrame = it->second; | 133 const RenderPass* renderPassInFrame = it->second; |
| 134 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; | 134 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; |
| 135 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); | 135 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); |
| 136 CachedTexture* texture = passIterator->second; | 136 CachedResource* texture = passIterator->second; |
| 137 DCHECK(texture); | 137 DCHECK(texture); |
| 138 | 138 |
| 139 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) | 139 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) |
| 140 texture->free(); | 140 texture->free(); |
| 141 } | 141 } |
| 142 | 142 |
| 143 // Delete RenderPass textures from the previous frame that will not be used
again. | 143 // Delete RenderPass textures from the previous frame that will not be used
again. |
| 144 for (size_t i = 0; i < passesToDelete.size(); ++i) | 144 for (size_t i = 0; i < passesToDelete.size(); ++i) |
| 145 m_renderPassTextures.erase(passesToDelete[i]); | 145 m_renderPassTextures.erase(passesToDelete[i]); |
| 146 | 146 |
| 147 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { | 147 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { |
| 148 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id())) { | 148 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id())) { |
| 149 scoped_ptr<CachedTexture> texture = CachedTexture::create(m_resourcePr
ovider); | 149 scoped_ptr<CachedResource> texture = CachedResource::create(m_resource
Provider); |
| 150 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id(), texture.P
ass()); | 150 m_renderPassTextures.set(renderPassesInDrawOrder[i]->id(), texture.P
ass()); |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 } | 153 } |
| 154 | 154 |
| 155 void DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) | 155 void DirectRenderer::drawFrame(const RenderPassList& renderPassesInDrawOrder, co
nst RenderPassIdHashMap& renderPassesById) |
| 156 { | 156 { |
| 157 const RenderPass* rootRenderPass = renderPassesInDrawOrder.back(); | 157 const RenderPass* rootRenderPass = renderPassesInDrawOrder.back(); |
| 158 DCHECK(rootRenderPass); | 158 DCHECK(rootRenderPass); |
| 159 | 159 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 186 | 186 |
| 187 const QuadList& quadList = renderPass->quadList(); | 187 const QuadList& quadList = renderPass->quadList(); |
| 188 for (QuadList::constBackToFrontIterator it = quadList.backToFrontBegin(); it
!= quadList.backToFrontEnd(); ++it) { | 188 for (QuadList::constBackToFrontIterator it = quadList.backToFrontBegin(); it
!= quadList.backToFrontEnd(); ++it) { |
| 189 gfx::RectF quadScissorRect = gfx::IntersectRects(frame.scissorRectInRend
erPassSpace, (*it)->clippedRectInTarget()); | 189 gfx::RectF quadScissorRect = gfx::IntersectRects(frame.scissorRectInRend
erPassSpace, (*it)->clippedRectInTarget()); |
| 190 if (!quadScissorRect.IsEmpty()) { | 190 if (!quadScissorRect.IsEmpty()) { |
| 191 setScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRect))
; | 191 setScissorTestRect(moveScissorToWindowSpace(frame, quadScissorRect))
; |
| 192 drawQuad(frame, *it); | 192 drawQuad(frame, *it); |
| 193 } | 193 } |
| 194 } | 194 } |
| 195 | 195 |
| 196 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); | 196 CachedResource* texture = m_renderPassTextures.get(renderPass->id()); |
| 197 if (texture) | 197 if (texture) |
| 198 texture->setIsComplete(!renderPass->hasOcclusionFromOutsideTargetSurface
()); | 198 texture->setIsComplete(!renderPass->hasOcclusionFromOutsideTargetSurface
()); |
| 199 } | 199 } |
| 200 | 200 |
| 201 bool DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) | 201 bool DirectRenderer::useRenderPass(DrawingFrame& frame, const RenderPass* render
Pass) |
| 202 { | 202 { |
| 203 frame.currentRenderPass = renderPass; | 203 frame.currentRenderPass = renderPass; |
| 204 frame.currentTexture = 0; | 204 frame.currentTexture = 0; |
| 205 | 205 |
| 206 if (renderPass == frame.rootRenderPass) { | 206 if (renderPass == frame.rootRenderPass) { |
| 207 bindFramebufferToOutputSurface(frame); | 207 bindFramebufferToOutputSurface(frame); |
| 208 initializeMatrices(frame, renderPass->outputRect(), flippedFramebuffer()
); | 208 initializeMatrices(frame, renderPass->outputRect(), flippedFramebuffer()
); |
| 209 setDrawViewportSize(renderPass->outputRect().size()); | 209 setDrawViewportSize(renderPass->outputRect().size()); |
| 210 return true; | 210 return true; |
| 211 } | 211 } |
| 212 | 212 |
| 213 CachedTexture* texture = m_renderPassTextures.get(renderPass->id()); | 213 CachedResource* texture = m_renderPassTextures.get(renderPass->id()); |
| 214 DCHECK(texture); | 214 DCHECK(texture); |
| 215 if (!texture->id() && !texture->allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) | 215 if (!texture->id() && !texture->allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) |
| 216 return false; | 216 return false; |
| 217 | 217 |
| 218 return bindFramebufferToTexture(frame, texture, renderPass->outputRect()); | 218 return bindFramebufferToTexture(frame, texture, renderPass->outputRect()); |
| 219 } | 219 } |
| 220 | 220 |
| 221 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const | 221 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const |
| 222 { | 222 { |
| 223 CachedTexture* texture = m_renderPassTextures.get(id); | 223 CachedResource* texture = m_renderPassTextures.get(id); |
| 224 return texture && texture->id() && texture->isComplete(); | 224 return texture && texture->id() && texture->isComplete(); |
| 225 } | 225 } |
| 226 | 226 |
| 227 // static | 227 // static |
| 228 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) | 228 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) |
| 229 { | 229 { |
| 230 return pass->outputRect().size(); | 230 return pass->outputRect().size(); |
| 231 } | 231 } |
| 232 | 232 |
| 233 // static | 233 // static |
| 234 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) | 234 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) |
| 235 { | 235 { |
| 236 return GL_RGBA; | 236 return GL_RGBA; |
| 237 } | 237 } |
| 238 | 238 |
| 239 } // namespace cc | 239 } // namespace cc |
| OLD | NEW |