OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 return document().getSecurityOrigin(); | 753 return document().getSecurityOrigin(); |
754 } | 754 } |
755 | 755 |
756 bool HTMLCanvasElement::originClean() const | 756 bool HTMLCanvasElement::originClean() const |
757 { | 757 { |
758 if (document().settings() && document().settings()->disableReadingFromCanvas
()) | 758 if (document().settings() && document().settings()->disableReadingFromCanvas
()) |
759 return false; | 759 return false; |
760 return m_originClean; | 760 return m_originClean; |
761 } | 761 } |
762 | 762 |
763 bool HTMLCanvasElement::shouldAccelerate(const IntSize& size) const | 763 bool HTMLCanvasElement::shouldAccelerate(const IntSize& size, const WebGraphicsC
ontext3DProvider* sharedMainThreadContextProvider) const |
764 { | 764 { |
765 if (m_context && !m_context->is2d()) | 765 if (m_context && !m_context->is2d()) |
766 return false; | 766 return false; |
767 | 767 |
768 if (RuntimeEnabledFeatures::forceDisplayList2dCanvasEnabled()) | 768 if (RuntimeEnabledFeatures::forceDisplayList2dCanvasEnabled()) |
769 return false; | 769 return false; |
770 | 770 |
771 if (!RuntimeEnabledFeatures::accelerated2dCanvasEnabled()) | 771 if (!RuntimeEnabledFeatures::accelerated2dCanvasEnabled()) |
772 return false; | 772 return false; |
773 | 773 |
774 // The following is necessary for handling the special case of canvases in t
he | 774 // The following is necessary for handling the special case of canvases in t
he |
775 // dev tools overlay, which run in a process that supports accelerated 2d ca
nvas | 775 // dev tools overlay, which run in a process that supports accelerated 2d ca
nvas |
776 // but in a special compositing context that does not. | 776 // but in a special compositing context that does not. |
777 if (layoutBox() && !layoutBox()->hasAcceleratedCompositing()) | 777 if (layoutBox() && !layoutBox()->hasAcceleratedCompositing()) |
778 return false; | 778 return false; |
779 | 779 |
780 int canvasPixelCount = size.width() * size.height(); | 780 CheckedNumeric<int> checkedCanvasPixelCount = size.width(); |
| 781 checkedCanvasPixelCount *= size.height(); |
| 782 if (!checkedCanvasPixelCount.IsValid()) |
| 783 return false; |
| 784 int canvasPixelCount = checkedCanvasPixelCount.ValueOrDie(); |
781 | 785 |
782 if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) { | 786 if (RuntimeEnabledFeatures::displayList2dCanvasEnabled()) { |
783 #if 0 | 787 #if 0 |
784 // TODO(junov): re-enable this code once we solve the problem of recordi
ng | 788 // TODO(junov): re-enable this code once we solve the problem of recordi
ng |
785 // GPU-backed images to an SkPicture for cross-context rendering crbug.c
om/490328 | 789 // GPU-backed images to an SkPicture for cross-context rendering crbug.c
om/490328 |
786 | 790 |
787 // If the compositor provides GPU acceleration to display list canvases,
we | 791 // If the compositor provides GPU acceleration to display list canvases,
we |
788 // prefer that over direct acceleration. | 792 // prefer that over direct acceleration. |
789 if (document().viewportDescription().matchesHeuristicsForGpuRasterizatio
n()) | 793 if (document().viewportDescription().matchesHeuristicsForGpuRasterizatio
n()) |
790 return false; | 794 return false; |
791 #endif | 795 #endif |
792 // If the GPU resources would be very expensive, prefer a display list. | 796 // If the GPU resources would be very expensive, prefer a display list. |
793 if (canvasPixelCount > ExpensiveCanvasHeuristicParameters::PreferDisplay
ListOverGpuSizeThreshold) | 797 if (canvasPixelCount > ExpensiveCanvasHeuristicParameters::PreferDisplay
ListOverGpuSizeThreshold) |
794 return false; | 798 return false; |
795 } | 799 } |
796 | 800 |
797 // Do not use acceleration for small canvas. | 801 // Do not use acceleration for small canvas. |
798 Settings* settings = document().settings(); | 802 Settings* settings = document().settings(); |
799 if (!settings || canvasPixelCount < settings->minimumAccelerated2dCanvasSize
()) | 803 if (!settings || canvasPixelCount < settings->minimumAccelerated2dCanvasSize
()) |
800 return false; | 804 return false; |
801 | 805 |
802 if (!Platform::current()->canAccelerate2dCanvas()) | 806 if (sharedMainThreadContextProvider->isSoftwareRendering()) |
803 return false; | 807 return false; |
804 | 808 |
805 // When GPU allocated memory runs low (due to having created too many | 809 // When GPU allocated memory runs low (due to having created too many |
806 // accelerated canvases), the compositor starves and browser becomes laggy. | 810 // accelerated canvases), the compositor starves and browser becomes laggy. |
807 // Thus, we should stop allocating more GPU memory to new canvases created | 811 // Thus, we should stop allocating more GPU memory to new canvases created |
808 // when the current memory usage exceeds the threshold. | 812 // when the current memory usage exceeds the threshold. |
809 if (ImageBuffer::getGlobalGPUMemoryUsage() >= MaxGlobalGPUMemoryUsage) | 813 if (ImageBuffer::getGlobalGPUMemoryUsage() >= MaxGlobalGPUMemoryUsage) |
810 return false; | 814 return false; |
811 | 815 |
812 // Allocating too many GPU resources can makes us run into the driver's | 816 // Allocating too many GPU resources can makes us run into the driver's |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque :
Opaque; | 848 OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque :
Opaque; |
845 | 849 |
846 *msaaSampleCount = 0; | 850 *msaaSampleCount = 0; |
847 if (is3D()) { | 851 if (is3D()) { |
848 // If 3d, but the use of the canvas will be for non-accelerated content | 852 // If 3d, but the use of the canvas will be for non-accelerated content |
849 // then make a non-accelerated ImageBuffer. This means copying the inter
nal | 853 // then make a non-accelerated ImageBuffer. This means copying the inter
nal |
850 // Image will require a pixel readback, but that is unavoidable in this
case. | 854 // Image will require a pixel readback, but that is unavoidable in this
case. |
851 return wrapUnique(new AcceleratedImageBufferSurface(deviceSize, opacityM
ode)); | 855 return wrapUnique(new AcceleratedImageBufferSurface(deviceSize, opacityM
ode)); |
852 } | 856 } |
853 | 857 |
854 if (shouldAccelerate(deviceSize)) { | 858 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider = wrapUnique(P
latform::current()->createSharedOffscreenGraphicsContext3DProvider()); |
| 859 if (!contextProvider) { |
| 860 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::Accelerated2DCanva
sGPUContextLost); |
| 861 } else if (shouldAccelerate(deviceSize, contextProvider.get())) { |
855 if (document().settings()) | 862 if (document().settings()) |
856 *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASam
pleCount(); | 863 *msaaSampleCount = document().settings()->accelerated2dCanvasMSAASam
pleCount(); |
857 std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Canvas2DIma
geBufferSurface(deviceSize, *msaaSampleCount, opacityMode, Canvas2DLayerBridge::
EnableAcceleration)); | 864 std::unique_ptr<ImageBufferSurface> surface = wrapUnique(new Canvas2DIma
geBufferSurface(std::move(contextProvider), deviceSize, *msaaSampleCount, opacit
yMode, Canvas2DLayerBridge::EnableAcceleration)); |
858 if (surface->isValid()) { | 865 if (surface->isValid()) { |
859 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated
2DCanvasImageBufferCreated); | 866 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated
2DCanvasImageBufferCreated); |
860 return surface; | 867 return surface; |
861 } | 868 } |
862 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated2DCa
nvasImageBufferCreationFailed); | 869 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated2DCa
nvasImageBufferCreationFailed); |
863 } | 870 } |
864 | 871 |
865 std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory =
wrapUnique(new UnacceleratedSurfaceFactory()); | 872 std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory =
wrapUnique(new UnacceleratedSurfaceFactory()); |
866 | 873 |
867 if (shouldUseDisplayList(deviceSize)) { | 874 if (shouldUseDisplayList(deviceSize)) { |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1236 | 1243 |
1237 bool HTMLCanvasElement::createSurfaceLayer() | 1244 bool HTMLCanvasElement::createSurfaceLayer() |
1238 { | 1245 { |
1239 DCHECK(!m_surfaceLayerBridge); | 1246 DCHECK(!m_surfaceLayerBridge); |
1240 std::unique_ptr<CanvasSurfaceLayerBridgeClient> bridgeClient = wrapUnique(ne
w CanvasSurfaceLayerBridgeClientImpl()); | 1247 std::unique_ptr<CanvasSurfaceLayerBridgeClient> bridgeClient = wrapUnique(ne
w CanvasSurfaceLayerBridgeClientImpl()); |
1241 m_surfaceLayerBridge = wrapUnique(new CanvasSurfaceLayerBridge(std::move(bri
dgeClient))); | 1248 m_surfaceLayerBridge = wrapUnique(new CanvasSurfaceLayerBridge(std::move(bri
dgeClient))); |
1242 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), this->height(
)); | 1249 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), this->height(
)); |
1243 } | 1250 } |
1244 | 1251 |
1245 } // namespace blink | 1252 } // namespace blink |
OLD | NEW |