| 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") {
|
|
|