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

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

Issue 2362363002: Cancel GPU acceleration for 2D canvas when drawing very large images (Closed)
Patch Set: Created 4 years, 2 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
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 "modules/canvas2d/CanvasRenderingContext2D.h" 5 #include "modules/canvas2d/CanvasRenderingContext2D.h"
6 6
7 #include "core/dom/Document.h" 7 #include "core/dom/Document.h"
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 29 matching lines...) Expand all
40 40
41 class FakeImageSource : public CanvasImageSource { 41 class FakeImageSource : public CanvasImageSource {
42 public: 42 public:
43 FakeImageSource(IntSize, BitmapOpacity); 43 FakeImageSource(IntSize, BitmapOpacity);
44 44
45 PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, AccelerationHi nt, SnapshotReason, const FloatSize&) const override; 45 PassRefPtr<Image> getSourceImageForCanvas(SourceImageStatus*, AccelerationHi nt, SnapshotReason, const FloatSize&) const override;
46 46
47 bool wouldTaintOrigin(SecurityOrigin* destinationSecurityOrigin) const overr ide { return false; } 47 bool wouldTaintOrigin(SecurityOrigin* destinationSecurityOrigin) const overr ide { return false; }
48 FloatSize elementSize(const FloatSize&) const override { return FloatSize(m_ size); } 48 FloatSize elementSize(const FloatSize&) const override { return FloatSize(m_ size); }
49 bool isOpaque() const override { return m_isOpaque; } 49 bool isOpaque() const override { return m_isOpaque; }
50 bool isAccelerated() const { return false; }
50 int sourceWidth() override { return m_size.width(); } 51 int sourceWidth() override { return m_size.width(); }
51 int sourceHeight() override { return m_size.height(); } 52 int sourceHeight() override { return m_size.height(); }
52 53
53 ~FakeImageSource() override { } 54 ~FakeImageSource() override { }
54 55
55 private: 56 private:
56 IntSize m_size; 57 IntSize m_size;
57 RefPtr<Image> m_image; 58 RefPtr<Image> m_image;
58 bool m_isOpaque; 59 bool m_isOpaque;
59 }; 60 };
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 } else { 793 } else {
793 EXPECT_TRUE(canvasElement().buffer()->isAccelerated()); 794 EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
794 EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount()); 795 EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
795 EXPECT_EQ(720000, getGlobalGPUMemoryUsage()); 796 EXPECT_EQ(720000, getGlobalGPUMemoryUsage());
796 } 797 }
797 798
798 // Restore global state to prevent side-effects on other tests 799 // Restore global state to prevent side-effects on other tests
799 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRende ringMode); 800 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRende ringMode);
800 } 801 }
801 802
803 TEST_F(CanvasRenderingContext2DTest, LargeTextureUploadDisablesAcceleration)
804 {
xidachen 2016/09/24 01:36:34 I can see that these two tests are sharing a lot o
805 bool savedFixedRenderingMode = RuntimeEnabledFeatures::canvas2dFixedRenderin gModeEnabled();
806 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(false);
807
808 int srcDim = sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUpload SoftSizeLimit) + 1;
809 int dstDim = srcDim / sqrt(ExpensiveCanvasHeuristicParameters::DrawImageText ureUploadSoftSizeLimitScaleThreshold) - 1;
810
811 createContext(NonOpaque);
812 FakeGLES2Interface gl;
813 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider(new FakeWe bGraphicsContext3DProvider(&gl));
814 IntSize size(dstDim, dstDim);
xidachen 2016/09/24 01:36:34 Could we name this dstSize?
815 RefPtr<Canvas2DLayerBridge> bridge = makeBridge(std::move(contextProvider), size, Canvas2DLayerBridge::EnableAcceleration);
816 std::unique_ptr<Canvas2DImageBufferSurface> surface(new Canvas2DImageBufferS urface(bridge, size));
817 canvasElement().createImageBufferUsingSurfaceForTesting(std::move(surface));
818
819 EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
820 EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
821 EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
xidachen 2016/09/24 01:36:34 I don't quite understand why is this *8? My impres
822 sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(srcDim, srcDim);
823 RefPtr<StaticBitmapImage> bigBitmap = StaticBitmapImage::create(skSurface->m akeImageSnapshot());
824 ImageBitmap* bigImage = ImageBitmap::create(std::move(bigBitmap));
825 NonThrowableExceptionState exceptionState;
826 context2d()->drawImage(nullptr, bigImage, 0, 0, srcDim, srcDim, 0, 0, dstDim , dstDim, exceptionState);
827 EXPECT_FALSE(exceptionState.hadException());
828
829 EXPECT_TRUE(!canvasElement().buffer()->isAccelerated());
xidachen 2016/09/24 01:36:34 Maybe change to EXPECT_FALSE(canvasElement().buffe
830 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount());
831 EXPECT_EQ(0, getGlobalGPUMemoryUsage());
832
833 // Restore global state to prevent side-effects on other tests
834 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRende ringMode);
835 }
836
837 TEST_F(CanvasRenderingContext2DTest, SmallTextureUploadDoesNotDisableAcceleratio n)
838 {
839 bool savedFixedRenderingMode = RuntimeEnabledFeatures::canvas2dFixedRenderin gModeEnabled();
840 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(false);
841
842 int srcDim = sqrt(ExpensiveCanvasHeuristicParameters::DrawImageTextureUpload SoftSizeLimit) - 1;
843 int dstDim = srcDim / sqrt(ExpensiveCanvasHeuristicParameters::DrawImageText ureUploadSoftSizeLimitScaleThreshold) + 1;
844
845 createContext(NonOpaque);
846 FakeGLES2Interface gl;
847 std::unique_ptr<FakeWebGraphicsContext3DProvider> contextProvider(new FakeWe bGraphicsContext3DProvider(&gl));
848 IntSize size(dstDim, dstDim);
xidachen 2016/09/24 01:36:34 dstSize?
849 RefPtr<Canvas2DLayerBridge> bridge = makeBridge(std::move(contextProvider), size, Canvas2DLayerBridge::EnableAcceleration);
850 std::unique_ptr<Canvas2DImageBufferSurface> surface(new Canvas2DImageBufferS urface(bridge, size));
851 canvasElement().createImageBufferUsingSurfaceForTesting(std::move(surface));
852
853 EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
854 EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
855 EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
856 sk_sp<SkSurface> skSurface = SkSurface::MakeRasterN32Premul(srcDim, srcDim);
857 RefPtr<StaticBitmapImage> bigBitmap = StaticBitmapImage::create(skSurface->m akeImageSnapshot());
858 ImageBitmap* bigImage = ImageBitmap::create(std::move(bigBitmap));
859 NonThrowableExceptionState exceptionState;
860 context2d()->drawImage(nullptr, bigImage, 0, 0, srcDim, srcDim, 0, 0, dstDim , dstDim, exceptionState);
861 EXPECT_FALSE(exceptionState.hadException());
862
863 EXPECT_TRUE(canvasElement().buffer()->isAccelerated());
864 EXPECT_EQ(1u, getGlobalAcceleratedImageBufferCount());
865 EXPECT_EQ(8*dstDim*dstDim, getGlobalGPUMemoryUsage());
866
867 // Restore global state to prevent side-effects on other tests
868 RuntimeEnabledFeatures::setCanvas2dFixedRenderingModeEnabled(savedFixedRende ringMode);
869 }
870
802 TEST_F(CanvasRenderingContext2DTest, IsAccelerationOptimalForCanvasContentHeuris tic) 871 TEST_F(CanvasRenderingContext2DTest, IsAccelerationOptimalForCanvasContentHeuris tic)
803 { 872 {
804 createContext(NonOpaque); 873 createContext(NonOpaque);
805 874
806 std::unique_ptr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateS urface = wrapUnique(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpaque)); 875 std::unique_ptr<FakeAcceleratedImageBufferSurfaceForTesting> fakeAccelerateS urface = wrapUnique(new FakeAcceleratedImageBufferSurfaceForTesting(IntSize(10, 10), NonOpaque));
807 canvasElement().createImageBufferUsingSurfaceForTesting(std::move(fakeAccele rateSurface)); 876 canvasElement().createImageBufferUsingSurfaceForTesting(std::move(fakeAccele rateSurface));
808 877
809 NonThrowableExceptionState exceptionState; 878 NonThrowableExceptionState exceptionState;
810 879
811 CanvasRenderingContext2D* context = context2d(); 880 CanvasRenderingContext2D* context = context2d();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 EXPECT_FALSE(canvasElement().buffer()->isAccelerated()); 921 EXPECT_FALSE(canvasElement().buffer()->isAccelerated());
853 922
854 context->fillRect(10, 10, 100, 100); 923 context->fillRect(10, 10, 100, 100);
855 924
856 EXPECT_EQ(0, getCurrentGPUMemoryUsage()); 925 EXPECT_EQ(0, getCurrentGPUMemoryUsage());
857 EXPECT_EQ(0, getGlobalGPUMemoryUsage()); 926 EXPECT_EQ(0, getGlobalGPUMemoryUsage());
858 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount()); 927 EXPECT_EQ(0u, getGlobalAcceleratedImageBufferCount());
859 } 928 }
860 929
861 } // namespace blink 930 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698