Index: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
index c27bd0b4bda46877646770f62154060f5f5926d0..569b10bfd7a50193c0d6244057592bcb7e289eb6 100644 |
--- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp |
@@ -79,12 +79,17 @@ ImageBuffer::ImageBuffer(PassOwnPtr<ImageBufferSurface> surface) |
: m_snapshotState(InitialSnapshotState) |
, m_surface(surface) |
, m_client(0) |
+ , m_gpuMemoryUsage(0) |
{ |
m_surface->setImageBuffer(this); |
+ updateGPUMemoryUsage(); |
} |
+intptr_t ImageBuffer::s_globalGPUMemoryUsage = 0; |
+ |
ImageBuffer::~ImageBuffer() |
{ |
+ ImageBuffer::s_globalGPUMemoryUsage -= m_gpuMemoryUsage; |
} |
SkCanvas* ImageBuffer::canvas() const |
@@ -343,6 +348,28 @@ void ImageBuffer::putByteArray(Multiply multiplied, const unsigned char* source, |
m_surface->writePixels(info, srcAddr, srcBytesPerRow, destX, destY); |
} |
+void ImageBuffer::updateGPUMemoryUsage() const |
+{ |
+ if (this->isAccelerated()) { |
+ // If image buffer is accelerated, we should keep track of GPU memory usage. |
+ int gpuBufferCount = 2; |
+ Checked<intptr_t, RecordOverflow> checkedGPUUsage = 4 * gpuBufferCount; |
+ checkedGPUUsage *= this->size().width(); |
+ checkedGPUUsage *= this->size().height(); |
+ intptr_t gpuMemoryUsage; |
+ if (checkedGPUUsage.safeGet(gpuMemoryUsage) == CheckedState::DidOverflow) |
+ gpuMemoryUsage = std::numeric_limits<intptr_t>::max(); |
+ |
+ s_globalGPUMemoryUsage += (gpuMemoryUsage - m_gpuMemoryUsage); |
+ m_gpuMemoryUsage = gpuMemoryUsage; |
+ } else if (m_gpuMemoryUsage > 0) { |
+ // In case of switching from accelerated to non-accelerated mode, |
+ // the GPU memory usage needs to be updated too. |
+ s_globalGPUMemoryUsage -= m_gpuMemoryUsage; |
+ m_gpuMemoryUsage = 0; |
+ } |
+} |
+ |
bool ImageDataBuffer::encodeImage(const String& mimeType, const double& quality, Vector<unsigned char>* encodedImage) const |
{ |
if (mimeType == "image/jpeg") { |