Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(632)

Side by Side Diff: cc/direct_renderer.cc

Issue 11420079: Allow using a larger-than-necessary texture as cached render pass backing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: win build fix - filepath literals Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « cc/direct_renderer.h ('k') | cc/gl_renderer.h » ('j') | cc/gl_renderer_pixeltest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698