| 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 "cc/direct_renderer.h" | 5 #include "cc/direct_renderer.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) | 106 DirectRenderer::DirectRenderer(RendererClient* client, ResourceProvider* resourc
eProvider) |
| 107 : Renderer(client) | 107 : Renderer(client) |
| 108 , m_resourceProvider(resourceProvider) | 108 , m_resourceProvider(resourceProvider) |
| 109 { | 109 { |
| 110 } | 110 } |
| 111 | 111 |
| 112 DirectRenderer::~DirectRenderer() | 112 DirectRenderer::~DirectRenderer() |
| 113 { | 113 { |
| 114 } | 114 } |
| 115 | 115 |
| 116 void DirectRenderer::setEnlargePassTextureAmountForTesting(gfx::Vector2d amount) |
| 117 { |
| 118 m_enlargePassTextureAmount = amount; |
| 119 } |
| 120 |
| 116 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) | 121 void DirectRenderer::decideRenderPassAllocationsForFrame(const RenderPassList& r
enderPassesInDrawOrder) |
| 117 { | 122 { |
| 118 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; | 123 base::hash_map<RenderPass::Id, const RenderPass*> renderPassesInFrame; |
| 119 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) | 124 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) |
| 120 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id, renderPassesInDrawOrder[i])); | 125 renderPassesInFrame.insert(std::pair<RenderPass::Id, const RenderPass*>(
renderPassesInDrawOrder[i]->id, renderPassesInDrawOrder[i])); |
| 121 | 126 |
| 122 std::vector<RenderPass::Id> passesToDelete; | 127 std::vector<RenderPass::Id> passesToDelete; |
| 123 ScopedPtrHashMap<RenderPass::Id, CachedResource>::const_iterator passIterato
r; | 128 ScopedPtrHashMap<RenderPass::Id, CachedResource>::const_iterator passIterato
r; |
| 124 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { | 129 for (passIterator = m_renderPassTextures.begin(); passIterator != m_renderPa
ssTextures.end(); ++passIterator) { |
| 125 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); | 130 base::hash_map<RenderPass::Id, const RenderPass*>::const_iterator it = r
enderPassesInFrame.find(passIterator->first); |
| 126 if (it == renderPassesInFrame.end()) { | 131 if (it == renderPassesInFrame.end()) { |
| 127 passesToDelete.push_back(passIterator->first); | 132 passesToDelete.push_back(passIterator->first); |
| 128 continue; | 133 continue; |
| 129 } | 134 } |
| 130 | 135 |
| 131 const RenderPass* renderPassInFrame = it->second; | 136 const RenderPass* renderPassInFrame = it->second; |
| 132 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; | 137 const gfx::Size& requiredSize = renderPassTextureSize(renderPassInFrame)
; |
| 133 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); | 138 GLenum requiredFormat = renderPassTextureFormat(renderPassInFrame); |
| 134 CachedResource* texture = passIterator->second; | 139 CachedResource* texture = passIterator->second; |
| 135 DCHECK(texture); | 140 DCHECK(texture); |
| 136 | 141 |
| 137 if (texture->id() && (texture->size() != requiredSize || texture->format
() != requiredFormat)) | 142 bool sizeAppropriate = texture->size().width() >= requiredSize.width() &
& |
| 143 texture->size().height() >= requiredSize.height()
; |
| 144 if (texture->id() && (!sizeAppropriate || texture->format() != requiredF
ormat)) |
| 138 texture->Free(); | 145 texture->Free(); |
| 139 } | 146 } |
| 140 | 147 |
| 141 // Delete RenderPass textures from the previous frame that will not be used
again. | 148 // Delete RenderPass textures from the previous frame that will not be used
again. |
| 142 for (size_t i = 0; i < passesToDelete.size(); ++i) | 149 for (size_t i = 0; i < passesToDelete.size(); ++i) |
| 143 m_renderPassTextures.erase(passesToDelete[i]); | 150 m_renderPassTextures.erase(passesToDelete[i]); |
| 144 | 151 |
| 145 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { | 152 for (size_t i = 0; i < renderPassesInDrawOrder.size(); ++i) { |
| 146 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id)) { | 153 if (!m_renderPassTextures.contains(renderPassesInDrawOrder[i]->id)) { |
| 147 scoped_ptr<CachedResource> texture = CachedResource::create(m_resource
Provider); | 154 scoped_ptr<CachedResource> texture = CachedResource::create(m_resource
Provider); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 267 |
| 261 if (renderPass == frame.rootRenderPass) { | 268 if (renderPass == frame.rootRenderPass) { |
| 262 bindFramebufferToOutputSurface(frame); | 269 bindFramebufferToOutputSurface(frame); |
| 263 initializeMatrices(frame, renderPass->output_rect, flippedFramebuffer())
; | 270 initializeMatrices(frame, renderPass->output_rect, flippedFramebuffer())
; |
| 264 setDrawViewportSize(renderPass->output_rect.size()); | 271 setDrawViewportSize(renderPass->output_rect.size()); |
| 265 return true; | 272 return true; |
| 266 } | 273 } |
| 267 | 274 |
| 268 CachedResource* texture = m_renderPassTextures.get(renderPass->id); | 275 CachedResource* texture = m_renderPassTextures.get(renderPass->id); |
| 269 DCHECK(texture); | 276 DCHECK(texture); |
| 270 if (!texture->id() && !texture->Allocate(Renderer::ImplPool, renderPassTextu
reSize(renderPass), renderPassTextureFormat(renderPass), ResourceProvider::Textu
reUsageFramebuffer)) | 277 |
| 278 gfx::Size size = renderPassTextureSize(renderPass); |
| 279 size.Enlarge(m_enlargePassTextureAmount.x(), m_enlargePassTextureAmount.y())
; |
| 280 if (!texture->id() && !texture->Allocate(Renderer::ImplPool, size, renderPas
sTextureFormat(renderPass), ResourceProvider::TextureUsageFramebuffer)) |
| 271 return false; | 281 return false; |
| 272 | 282 |
| 273 return bindFramebufferToTexture(frame, texture, renderPass->output_rect); | 283 return bindFramebufferToTexture(frame, texture, renderPass->output_rect); |
| 274 } | 284 } |
| 275 | 285 |
| 276 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const | 286 bool DirectRenderer::haveCachedResourcesForRenderPassId(RenderPass::Id id) const |
| 277 { | 287 { |
| 278 CachedResource* texture = m_renderPassTextures.get(id); | 288 CachedResource* texture = m_renderPassTextures.get(id); |
| 279 return texture && texture->id() && texture->isComplete(); | 289 return texture && texture->id() && texture->isComplete(); |
| 280 } | 290 } |
| 281 | 291 |
| 282 // static | 292 // static |
| 283 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) | 293 gfx::Size DirectRenderer::renderPassTextureSize(const RenderPass* pass) |
| 284 { | 294 { |
| 285 return pass->output_rect.size(); | 295 return pass->output_rect.size(); |
| 286 } | 296 } |
| 287 | 297 |
| 288 // static | 298 // static |
| 289 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) | 299 GLenum DirectRenderer::renderPassTextureFormat(const RenderPass*) |
| 290 { | 300 { |
| 291 return GL_RGBA; | 301 return GL_RGBA; |
| 292 } | 302 } |
| 293 | 303 |
| 294 } // namespace cc | 304 } // namespace cc |
| OLD | NEW |