Chromium Code Reviews| 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 |