OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |