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

Side by Side Diff: Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp

Issue 7670046: Merge 92430 - [chromium] Implement a global resource limit for DrawingBuffer to limit the amount ... (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months 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
« no previous file with comments | « Source/WebCore/platform/graphics/gpu/DrawingBuffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 20 matching lines...) Expand all
31 #include "config.h" 31 #include "config.h"
32 32
33 #if ENABLE(ACCELERATED_2D_CANVAS) || ENABLE(WEBGL) 33 #if ENABLE(ACCELERATED_2D_CANVAS) || ENABLE(WEBGL)
34 34
35 #include "DrawingBuffer.h" 35 #include "DrawingBuffer.h"
36 36
37 #include "Extensions3D.h" 37 #include "Extensions3D.h"
38 38
39 namespace WebCore { 39 namespace WebCore {
40 40
41 // Global resource ceiling (expressed in terms of pixels) for DrawingBuffer crea tion and resize.
42 // When this limit is set, DrawingBuffer::create() and DrawingBuffer::reset() ca lls that would
43 // exceed the global cap will instead clear the buffer.
44 #if PLATFORM(CHROMIUM) // Currently, this cap only exists for chromium.
45 static int s_maximumResourceUsePixels = 16 * 1024 * 1024;
46 #else
47 static int s_maximumResourceUsePixels = 0;
48 #endif
49 static int s_currentResourceUsePixels = 0;
50
41 PassRefPtr<DrawingBuffer> DrawingBuffer::create(GraphicsContext3D* context, cons t IntSize& size) 51 PassRefPtr<DrawingBuffer> DrawingBuffer::create(GraphicsContext3D* context, cons t IntSize& size)
42 { 52 {
43 Extensions3D* extensions = context->getExtensions(); 53 Extensions3D* extensions = context->getExtensions();
44 bool multisampleSupported = extensions->supports("GL_ANGLE_framebuffer_blit" ) && extensions->supports("GL_ANGLE_framebuffer_multisample") && extensions->sup ports("GL_OES_rgb8_rgba8"); 54 bool multisampleSupported = extensions->supports("GL_ANGLE_framebuffer_blit" ) && extensions->supports("GL_ANGLE_framebuffer_multisample") && extensions->sup ports("GL_OES_rgb8_rgba8");
45 if (multisampleSupported) { 55 if (multisampleSupported) {
46 extensions->ensureEnabled("GL_ANGLE_framebuffer_blit"); 56 extensions->ensureEnabled("GL_ANGLE_framebuffer_blit");
47 extensions->ensureEnabled("GL_ANGLE_framebuffer_multisample"); 57 extensions->ensureEnabled("GL_ANGLE_framebuffer_multisample");
48 extensions->ensureEnabled("GL_OES_rgb8_rgba8"); 58 extensions->ensureEnabled("GL_OES_rgb8_rgba8");
49 } 59 }
50 bool packedDepthStencilSupported = extensions->supports("GL_OES_packed_depth _stencil"); 60 bool packedDepthStencilSupported = extensions->supports("GL_OES_packed_depth _stencil");
51 if (packedDepthStencilSupported) 61 if (packedDepthStencilSupported)
52 extensions->ensureEnabled("GL_OES_packed_depth_stencil"); 62 extensions->ensureEnabled("GL_OES_packed_depth_stencil");
53 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, si ze, multisampleSupported, packedDepthStencilSupported)); 63 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, si ze, multisampleSupported, packedDepthStencilSupported));
54 return (drawingBuffer->m_context) ? drawingBuffer.release() : 0; 64 return (drawingBuffer->m_context) ? drawingBuffer.release() : 0;
55 } 65 }
56 66
57 void DrawingBuffer::clear() 67 void DrawingBuffer::clear()
58 { 68 {
59 if (!m_context) 69 if (!m_context)
60 return; 70 return;
61 71
62 m_context->makeContextCurrent(); 72 m_context->makeContextCurrent();
73 if (!m_size.isEmpty())
74 s_currentResourceUsePixels -= m_size.width() * m_size.height();
63 75
64 if (m_colorBuffer) { 76 if (m_colorBuffer) {
65 m_context->deleteTexture(m_colorBuffer); 77 m_context->deleteTexture(m_colorBuffer);
66 m_colorBuffer = 0; 78 m_colorBuffer = 0;
67 } 79 }
68 80
69 if (m_multisampleColorBuffer) { 81 if (m_multisampleColorBuffer) {
70 m_context->deleteRenderbuffer(m_multisampleColorBuffer); 82 m_context->deleteRenderbuffer(m_multisampleColorBuffer);
71 m_multisampleColorBuffer = 0; 83 m_multisampleColorBuffer = 0;
72 } 84 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 bool DrawingBuffer::reset(const IntSize& newSize) 207 bool DrawingBuffer::reset(const IntSize& newSize)
196 { 208 {
197 if (!m_context) 209 if (!m_context)
198 return false; 210 return false;
199 211
200 m_context->makeContextCurrent(); 212 m_context->makeContextCurrent();
201 213
202 int maxTextureSize = 0; 214 int maxTextureSize = 0;
203 m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize) ; 215 m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize) ;
204 if (newSize.height() > maxTextureSize || newSize.width() > maxTextureSize) { 216 if (newSize.height() > maxTextureSize || newSize.width() > maxTextureSize) {
205 clear(); 217 clear();
206 return false; 218 return false;
207 } 219 }
208 220
221 int pixelDelta = newSize.width() * newSize.height();
222 if (!m_size.isEmpty())
223 pixelDelta -= m_size.width() * m_size.height();
224
225 if (s_maximumResourceUsePixels && (s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
226 clear();
227 return false;
228 }
229 s_currentResourceUsePixels += pixelDelta;
230
209 const GraphicsContext3D::Attributes& attributes = m_context->getContextAttri butes(); 231 const GraphicsContext3D::Attributes& attributes = m_context->getContextAttri butes();
210 232
211 if (newSize != m_size) { 233 if (newSize != m_size) {
212 m_size = newSize; 234 m_size = newSize;
213 235
214 unsigned long internalColorFormat, colorFormat, internalRenderbufferForm at; 236 unsigned long internalColorFormat, colorFormat, internalRenderbufferForm at;
215 if (attributes.alpha) { 237 if (attributes.alpha) {
216 internalColorFormat = GraphicsContext3D::RGBA; 238 internalColorFormat = GraphicsContext3D::RGBA;
217 colorFormat = GraphicsContext3D::RGBA; 239 colorFormat = GraphicsContext3D::RGBA;
218 internalRenderbufferFormat = Extensions3D::RGBA8_OES; 240 internalRenderbufferFormat = Extensions3D::RGBA8_OES;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 if (!m_context) 317 if (!m_context)
296 return; 318 return;
297 319
298 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO ? m_multisampleFBO : m_fbo); 320 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO ? m_multisampleFBO : m_fbo);
299 m_context->viewport(0, 0, m_size.width(), m_size.height()); 321 m_context->viewport(0, 0, m_size.width(), m_size.height());
300 } 322 }
301 323
302 } // namespace WebCore 324 } // namespace WebCore
303 325
304 #endif 326 #endif
OLDNEW
« no previous file with comments | « Source/WebCore/platform/graphics/gpu/DrawingBuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698