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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DTest.cpp

Issue 1482363004: Fixing laggy chrome on a multitude of accelerated canvases (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: m_imageBuffer nullibility check to ensure other unrelated unit tests on layerbridge not fail Created 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "config.h" 5 #include "config.h"
6 #include "modules/canvas2d/CanvasRenderingContext2D.h" 6 #include "modules/canvas2d/CanvasRenderingContext2D.h"
7 7
8 #include "core/fetch/MemoryCache.h" 8 #include "core/fetch/MemoryCache.h"
9 #include "core/frame/FrameView.h" 9 #include "core/frame/FrameView.h"
10 #include "core/frame/ImageBitmap.h" 10 #include "core/frame/ImageBitmap.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 72
73 class CanvasRenderingContext2DTest : public ::testing::Test { 73 class CanvasRenderingContext2DTest : public ::testing::Test {
74 protected: 74 protected:
75 CanvasRenderingContext2DTest(); 75 CanvasRenderingContext2DTest();
76 void SetUp() override; 76 void SetUp() override;
77 77
78 DummyPageHolder& page() const { return *m_dummyPageHolder; } 78 DummyPageHolder& page() const { return *m_dummyPageHolder; }
79 HTMLDocument& document() const { return *m_document; } 79 HTMLDocument& document() const { return *m_document; }
80 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; } 80 HTMLCanvasElement& canvasElement() const { return *m_canvasElement; }
81 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende ringContext2D*>(canvasElement().renderingContext()); } 81 CanvasRenderingContext2D* context2d() const { return static_cast<CanvasRende ringContext2D*>(canvasElement().renderingContext()); }
82 intptr_t getGlobalGPUMemoryUsage() const { return ImageBuffer::getGlobalGPUM emoryUsage(); }
83 intptr_t getCurrentGPUMemoryUsage() const { return canvasElement().buffer()- >getGPUMemoryUsage(); }
82 84
83 void createContext(OpacityMode); 85 void createContext(OpacityMode);
84 void TearDown(); 86 void TearDown();
85 87
86 private: 88 private:
87 OwnPtr<DummyPageHolder> m_dummyPageHolder; 89 OwnPtr<DummyPageHolder> m_dummyPageHolder;
88 RefPtrWillBePersistent<HTMLDocument> m_document; 90 RefPtrWillBePersistent<HTMLDocument> m_document;
89 RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement; 91 RefPtrWillBePersistent<HTMLCanvasElement> m_canvasElement;
90 Persistent<MemoryCache> m_globalMemoryCache; 92 Persistent<MemoryCache> m_globalMemoryCache;
91 93
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } 169 }
168 170
169 void CanvasRenderingContext2DTest::TearDown() 171 void CanvasRenderingContext2DTest::TearDown()
170 { 172 {
171 Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, B linkGC::ForcedGC); 173 Heap::collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, B linkGC::ForcedGC);
172 replaceMemoryCacheForTesting(m_globalMemoryCache.release()); 174 replaceMemoryCacheForTesting(m_globalMemoryCache.release());
173 } 175 }
174 176
175 //============================================================================ 177 //============================================================================
176 178
179 class FakeAcceleratedImageBufferSurfaceForTesting : public UnacceleratedImageBuf ferSurface {
180 public:
181 FakeAcceleratedImageBufferSurfaceForTesting(const IntSize& size, OpacityMode mode)
182 : UnacceleratedImageBufferSurface(size, mode)
183 , m_isAccelerated(true) { }
184 ~FakeAcceleratedImageBufferSurfaceForTesting() override { }
185 bool isAccelerated() const override { return m_isAccelerated; }
186 void setIsAccelerated(bool isAccelerated)
187 {
188 if (isAccelerated != m_isAccelerated)
189 m_isAccelerated = isAccelerated;
190 }
191
192 private:
193 bool m_isAccelerated;
194 };
195
196 //============================================================================
197
177 class MockImageBufferSurfaceForOverwriteTesting : public UnacceleratedImageBuffe rSurface { 198 class MockImageBufferSurfaceForOverwriteTesting : public UnacceleratedImageBuffe rSurface {
178 public: 199 public:
179 MockImageBufferSurfaceForOverwriteTesting(const IntSize& size, OpacityMode m ode) : UnacceleratedImageBufferSurface(size, mode) { } 200 MockImageBufferSurfaceForOverwriteTesting(const IntSize& size, OpacityMode m ode) : UnacceleratedImageBufferSurface(size, mode) { }
180 ~MockImageBufferSurfaceForOverwriteTesting() override { } 201 ~MockImageBufferSurfaceForOverwriteTesting() override { }
181 bool isRecording() const override { return true; } // otherwise overwrites a re not tracked 202 bool isRecording() const override { return true; } // otherwise overwrites a re not tracked
182 203
183 MOCK_METHOD0(willOverwriteCanvas, void()); 204 MOCK_METHOD0(willOverwriteCanvas, void());
184 }; 205 };
185 206
186 //============================================================================ 207 //============================================================================
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In tRect(0, 0, 20, 20)); 643 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In tRect(0, 0, 20, 20));
623 } 644 }
624 CanvasContextCreationAttributes attributes; 645 CanvasContextCreationAttributes attributes;
625 CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(c anvasElement->getCanvasRenderingContext("2d", attributes)); 646 CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(c anvasElement->getCanvasRenderingContext("2d", attributes));
626 TrackExceptionState exceptionState; 647 TrackExceptionState exceptionState;
627 CanvasImageSourceUnion imageSource; 648 CanvasImageSourceUnion imageSource;
628 imageSource.setImageBitmap(imageBitmapDerived); 649 imageSource.setImageBitmap(imageBitmapDerived);
629 context->drawImage(imageSource, 0, 0, exceptionState); 650 context->drawImage(imageSource, 0, 0, exceptionState);
630 } 651 }
631 652
653 TEST_F(CanvasRenderingContext2DTest, GPUMemoryUpdateForAcceleratedCanvas)
654 {
655 createContext(NonOpaque);
656
657 OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface = adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpa que));
658 FakeAcceleratedImageBufferSurfaceForTesting* fakeAccelerateSurfacePtr = fake AccelerateSurface.get();
659 canvasElement().createImageBufferUsingSurfaceForTesting(fakeAccelerateSurfac e.release());
660 // 800 = 10 * 10 * 4 * 2 where 10*10 is canvas size, 4 is num of bytes per p ixel per buffer,
661 // and 2 is an estimate of num of gpu buffers required
662 EXPECT_EQ(800, getCurrentGPUMemoryUsage());
663 EXPECT_EQ(800, getGlobalGPUMemoryUsage());
664
665 // Switching accelerated mode to non-accelerated mode
666 fakeAccelerateSurfacePtr->setIsAccelerated(false);
667 canvasElement().buffer()->updateGPUMemoryUsage();
668 EXPECT_EQ(0, getCurrentGPUMemoryUsage());
669 EXPECT_EQ(0, getGlobalGPUMemoryUsage());
670
671 // Switching non-accelerated mode to accelerated mode
672 fakeAccelerateSurfacePtr->setIsAccelerated(true);
673 canvasElement().buffer()->updateGPUMemoryUsage();
674 EXPECT_EQ(800, getCurrentGPUMemoryUsage());
675 EXPECT_EQ(800, getGlobalGPUMemoryUsage());
676
677 // Creating a different accelerated image buffer
678 OwnPtr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateSurface2 = adoptPtr(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 5), NonOpa que));
679 OwnPtr<ImageBuffer> imageBuffer2 = ImageBuffer::create(fakeAccelerateSurface 2.release());
680 EXPECT_EQ(800, getCurrentGPUMemoryUsage());
681 EXPECT_EQ(1200, getGlobalGPUMemoryUsage());
682
683 // Tear down the first image buffer that resides in current canvas element
684 canvasElement().setSize(IntSize(20, 20));
685 Mock::VerifyAndClearExpectations(fakeAccelerateSurfacePtr);
686 EXPECT_EQ(400, getGlobalGPUMemoryUsage());
687
688 // Tear down the second image buffer
689 imageBuffer2.clear();
690 EXPECT_EQ(0, getGlobalGPUMemoryUsage());
691 }
692
632 } // namespace blink 693 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698