| Index: Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp
|
| ===================================================================
|
| --- Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp (revision 93251)
|
| +++ Source/WebCore/platform/graphics/gpu/DrawingBuffer.cpp (working copy)
|
| @@ -38,6 +38,16 @@
|
|
|
| namespace WebCore {
|
|
|
| +// Global resource ceiling (expressed in terms of pixels) for DrawingBuffer creation and resize.
|
| +// When this limit is set, DrawingBuffer::create() and DrawingBuffer::reset() calls that would
|
| +// exceed the global cap will instead clear the buffer.
|
| +#if PLATFORM(CHROMIUM) // Currently, this cap only exists for chromium.
|
| +static int s_maximumResourceUsePixels = 16 * 1024 * 1024;
|
| +#else
|
| +static int s_maximumResourceUsePixels = 0;
|
| +#endif
|
| +static int s_currentResourceUsePixels = 0;
|
| +
|
| PassRefPtr<DrawingBuffer> DrawingBuffer::create(GraphicsContext3D* context, const IntSize& size)
|
| {
|
| Extensions3D* extensions = context->getExtensions();
|
| @@ -60,6 +70,8 @@
|
| return;
|
|
|
| m_context->makeContextCurrent();
|
| + if (!m_size.isEmpty())
|
| + s_currentResourceUsePixels -= m_size.width() * m_size.height();
|
|
|
| if (m_colorBuffer) {
|
| m_context->deleteTexture(m_colorBuffer);
|
| @@ -202,10 +214,20 @@
|
| int maxTextureSize = 0;
|
| m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize);
|
| if (newSize.height() > maxTextureSize || newSize.width() > maxTextureSize) {
|
| - clear();
|
| - return false;
|
| + clear();
|
| + return false;
|
| }
|
|
|
| + int pixelDelta = newSize.width() * newSize.height();
|
| + if (!m_size.isEmpty())
|
| + pixelDelta -= m_size.width() * m_size.height();
|
| +
|
| + if (s_maximumResourceUsePixels && (s_currentResourceUsePixels + pixelDelta) > s_maximumResourceUsePixels) {
|
| + clear();
|
| + return false;
|
| + }
|
| + s_currentResourceUsePixels += pixelDelta;
|
| +
|
| const GraphicsContext3D::Attributes& attributes = m_context->getContextAttributes();
|
|
|
| if (newSize != m_size) {
|
|
|