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

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 2698573002: Support offscreen contexts which own their backing surface (Closed)
Patch Set: Rebase and retry again Created 3 years, 10 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 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * 12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "modules/webgl/WebGLRenderingContextBase.h" 26 #include "modules/webgl/WebGLRenderingContextBase.h"
27 27
28 #include <memory>
28 #include "bindings/core/v8/ExceptionMessages.h" 29 #include "bindings/core/v8/ExceptionMessages.h"
29 #include "bindings/core/v8/ExceptionState.h" 30 #include "bindings/core/v8/ExceptionState.h"
30 #include "bindings/core/v8/ScriptWrappableVisitor.h" 31 #include "bindings/core/v8/ScriptWrappableVisitor.h"
31 #include "bindings/core/v8/V8BindingMacros.h" 32 #include "bindings/core/v8/V8BindingMacros.h"
32 #include "bindings/modules/v8/HTMLCanvasElementOrOffscreenCanvas.h" 33 #include "bindings/modules/v8/HTMLCanvasElementOrOffscreenCanvas.h"
33 #include "bindings/modules/v8/WebGLAny.h" 34 #include "bindings/modules/v8/WebGLAny.h"
34 #include "core/dom/DOMArrayBuffer.h" 35 #include "core/dom/DOMArrayBuffer.h"
35 #include "core/dom/DOMTypedArray.h" 36 #include "core/dom/DOMTypedArray.h"
36 #include "core/dom/FlexibleArrayBufferView.h" 37 #include "core/dom/FlexibleArrayBufferView.h"
37 #include "core/dom/TaskRunnerHelper.h" 38 #include "core/dom/TaskRunnerHelper.h"
38 #include "core/frame/ImageBitmap.h" 39 #include "core/frame/ImageBitmap.h"
39 #include "core/frame/LocalFrame.h" 40 #include "core/frame/LocalFrame.h"
40 #include "core/frame/Settings.h" 41 #include "core/frame/Settings.h"
41 #include "core/html/HTMLCanvasElement.h" 42 #include "core/html/HTMLCanvasElement.h"
42 #include "core/html/HTMLImageElement.h" 43 #include "core/html/HTMLImageElement.h"
43 #include "core/html/HTMLVideoElement.h" 44 #include "core/html/HTMLVideoElement.h"
44 #include "core/html/ImageData.h" 45 #include "core/html/ImageData.h"
45 #include "core/inspector/ConsoleMessage.h" 46 #include "core/inspector/ConsoleMessage.h"
46 #include "core/inspector/InspectorInstrumentation.h" 47 #include "core/inspector/InspectorInstrumentation.h"
47 #include "core/layout/LayoutBox.h" 48 #include "core/layout/LayoutBox.h"
48 #include "core/loader/FrameLoader.h" 49 #include "core/loader/FrameLoader.h"
49 #include "core/loader/FrameLoaderClient.h" 50 #include "core/loader/FrameLoaderClient.h"
51 #include "core/origin_trials/OriginTrials.h"
50 #include "gpu/command_buffer/client/gles2_interface.h" 52 #include "gpu/command_buffer/client/gles2_interface.h"
51 #include "modules/webgl/ANGLEInstancedArrays.h" 53 #include "modules/webgl/ANGLEInstancedArrays.h"
52 #include "modules/webgl/EXTBlendMinMax.h" 54 #include "modules/webgl/EXTBlendMinMax.h"
53 #include "modules/webgl/EXTFragDepth.h" 55 #include "modules/webgl/EXTFragDepth.h"
54 #include "modules/webgl/EXTShaderTextureLOD.h" 56 #include "modules/webgl/EXTShaderTextureLOD.h"
55 #include "modules/webgl/EXTTextureFilterAnisotropic.h" 57 #include "modules/webgl/EXTTextureFilterAnisotropic.h"
56 #include "modules/webgl/GLStringQuery.h" 58 #include "modules/webgl/GLStringQuery.h"
57 #include "modules/webgl/OESElementIndexUint.h" 59 #include "modules/webgl/OESElementIndexUint.h"
58 #include "modules/webgl/OESStandardDerivatives.h" 60 #include "modules/webgl/OESStandardDerivatives.h"
59 #include "modules/webgl/OESTextureFloat.h" 61 #include "modules/webgl/OESTextureFloat.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h" 97 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
96 #include "platform/graphics/gpu/SharedGpuContext.h" 98 #include "platform/graphics/gpu/SharedGpuContext.h"
97 #include "public/platform/Platform.h" 99 #include "public/platform/Platform.h"
98 #include "skia/ext/texture_handle.h" 100 #include "skia/ext/texture_handle.h"
99 #include "wtf/CheckedNumeric.h" 101 #include "wtf/CheckedNumeric.h"
100 #include "wtf/Functional.h" 102 #include "wtf/Functional.h"
101 #include "wtf/PtrUtil.h" 103 #include "wtf/PtrUtil.h"
102 #include "wtf/text/StringBuilder.h" 104 #include "wtf/text/StringBuilder.h"
103 #include "wtf/text/StringUTF8Adaptor.h" 105 #include "wtf/text/StringUTF8Adaptor.h"
104 #include "wtf/typed_arrays/ArrayBufferContents.h" 106 #include "wtf/typed_arrays/ArrayBufferContents.h"
105 #include <memory>
106 107
107 namespace blink { 108 namespace blink {
108 109
109 namespace { 110 namespace {
110 111
111 const double secondsBetweenRestoreAttempts = 1.0; 112 const double secondsBetweenRestoreAttempts = 1.0;
112 const int maxGLErrorsAllowedToConsole = 256; 113 const int maxGLErrorsAllowedToConsole = 256;
113 const unsigned maxGLActiveContexts = 16; 114 const unsigned maxGLActiveContexts = 16;
114 const unsigned maxGLActiveContextsOnWorker = 4; 115 const unsigned maxGLActiveContextsOnWorker = 4;
115 116
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 RefPtr<WebTaskRunner> taskRunner = 605 RefPtr<WebTaskRunner> taskRunner =
605 Platform::current()->mainThread()->getWebTaskRunner(); 606 Platform::current()->mainThread()->getWebTaskRunner();
606 taskRunner->postTask(BLINK_FROM_HERE, 607 taskRunner->postTask(BLINK_FROM_HERE,
607 crossThreadBind(&createContextProviderOnMainThread, 608 crossThreadBind(&createContextProviderOnMainThread,
608 crossThreadUnretained(&creationInfo), 609 crossThreadUnretained(&creationInfo),
609 crossThreadUnretained(&waitableEvent))); 610 crossThreadUnretained(&waitableEvent)));
610 waitableEvent.wait(); 611 waitableEvent.wait();
611 return std::move(creationInfo.createdContextProvider); 612 return std::move(creationInfo.createdContextProvider);
612 } 613 }
613 614
615 bool WebGLRenderingContextBase::supportOwnOffscreenSurface(
616 ExecutionContext* executionContext) {
617 // If there's a possibility this context may be used with WebVR make sure it
618 // is created with an offscreen surface that can be swapped out for a
619 // VR-specific surface if needed.
620 //
621 // At this time, treat this as an experimental rendering optimization
622 // that needs a separate opt-in. See crbug.com/691102 for details.
623 if (RuntimeEnabledFeatures::webVRExperimentalRenderingEnabled()) {
624 if (RuntimeEnabledFeatures::webVREnabled() ||
625 OriginTrials::webVREnabled(executionContext)) {
626 DVLOG(1) << "Requesting supportOwnOffscreenSurface";
627 return true;
628 }
629 }
630 return false;
631 }
632
614 std::unique_ptr<WebGraphicsContext3DProvider> 633 std::unique_ptr<WebGraphicsContext3DProvider>
615 WebGLRenderingContextBase::createContextProviderInternal( 634 WebGLRenderingContextBase::createContextProviderInternal(
616 HTMLCanvasElement* canvas, 635 HTMLCanvasElement* canvas,
617 ScriptState* scriptState, 636 ScriptState* scriptState,
618 const CanvasContextCreationAttributes& attributes, 637 const CanvasContextCreationAttributes& attributes,
619 unsigned webGLVersion) { 638 unsigned webGLVersion) {
620 // Exactly one of these must be provided. 639 // Exactly one of these must be provided.
621 DCHECK_EQ(!canvas, !!scriptState); 640 DCHECK_EQ(!canvas, !!scriptState);
622 // The canvas is only given on the main thread. 641 // The canvas is only given on the main thread.
623 DCHECK(!canvas || isMainThread()); 642 DCHECK(!canvas || isMainThread());
624 643
625 Platform::ContextAttributes contextAttributes = 644 auto executionContext = canvas ? canvas->document().getExecutionContext()
626 toPlatformContextAttributes(attributes, webGLVersion); 645 : scriptState->getExecutionContext();
646 Platform::ContextAttributes contextAttributes = toPlatformContextAttributes(
647 attributes, webGLVersion, supportOwnOffscreenSurface(executionContext));
648
627 Platform::GraphicsInfo glInfo; 649 Platform::GraphicsInfo glInfo;
628 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; 650 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
629 const auto& url = canvas ? canvas->document().topDocument().url() 651 const auto& url = canvas ? canvas->document().topDocument().url()
630 : scriptState->getExecutionContext()->url(); 652 : scriptState->getExecutionContext()->url();
631 if (isMainThread()) { 653 if (isMainThread()) {
632 contextProvider = WTF::wrapUnique( 654 contextProvider = WTF::wrapUnique(
633 Platform::current()->createOffscreenGraphicsContext3DProvider( 655 Platform::current()->createOffscreenGraphicsContext3DProvider(
634 contextAttributes, url, 0, &glInfo)); 656 contextAttributes, url, 0, &glInfo));
635 } else { 657 } else {
636 contextProvider = 658 contextProvider =
(...skipping 6814 matching lines...) Expand 10 before | Expand all | Expand 10 after
7451 } 7473 }
7452 7474
7453 // If the context was lost due to RealLostContext, we need to destroy the old 7475 // If the context was lost due to RealLostContext, we need to destroy the old
7454 // DrawingBuffer before creating new DrawingBuffer to ensure resource budget 7476 // DrawingBuffer before creating new DrawingBuffer to ensure resource budget
7455 // enough. 7477 // enough.
7456 if (drawingBuffer()) { 7478 if (drawingBuffer()) {
7457 m_drawingBuffer->beginDestruction(); 7479 m_drawingBuffer->beginDestruction();
7458 m_drawingBuffer.clear(); 7480 m_drawingBuffer.clear();
7459 } 7481 }
7460 7482
7483 auto executionContext = canvas() ? canvas()->document().getExecutionContext()
7484 : offscreenCanvas()->getExecutionContext();
7461 Platform::ContextAttributes attributes = 7485 Platform::ContextAttributes attributes =
7462 toPlatformContextAttributes(creationAttributes(), version()); 7486 toPlatformContextAttributes(creationAttributes(), version(),
7487 supportOwnOffscreenSurface(executionContext));
7463 Platform::GraphicsInfo glInfo; 7488 Platform::GraphicsInfo glInfo;
7464 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider; 7489 std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
7465 const auto& url = canvas() ? canvas()->document().topDocument().url() 7490 const auto& url = canvas() ? canvas()->document().topDocument().url()
7466 : offscreenCanvas()->getExecutionContext()->url(); 7491 : offscreenCanvas()->getExecutionContext()->url();
7467 if (isMainThread()) { 7492 if (isMainThread()) {
7468 contextProvider = WTF::wrapUnique( 7493 contextProvider = WTF::wrapUnique(
7469 Platform::current()->createOffscreenGraphicsContext3DProvider( 7494 Platform::current()->createOffscreenGraphicsContext3DProvider(
7470 attributes, url, 0, &glInfo)); 7495 attributes, url, 0, &glInfo));
7471 } else { 7496 } else {
7472 contextProvider = 7497 contextProvider =
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
7804 7829
7805 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( 7830 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas(
7806 HTMLCanvasElementOrOffscreenCanvas& result) const { 7831 HTMLCanvasElementOrOffscreenCanvas& result) const {
7807 if (canvas()) 7832 if (canvas())
7808 result.setHTMLCanvasElement(canvas()); 7833 result.setHTMLCanvasElement(canvas());
7809 else 7834 else
7810 result.setOffscreenCanvas(offscreenCanvas()); 7835 result.setOffscreenCanvas(offscreenCanvas());
7811 } 7836 }
7812 7837
7813 } // namespace blink 7838 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698