Chromium Code Reviews

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp

Issue 1914233006: Implement offscreenCanvas.getContext('webgl') on a worker thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: should work Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index 26f07ba35e335d19dcc1d2cb2c91b643b4066e83..e8e2c5e90a02d806603bcafe9fb1634de3cd467c 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -66,7 +66,6 @@
#include "modules/webgl/WebGLCompressedTexturePVRTC.h"
#include "modules/webgl/WebGLCompressedTextureS3TC.h"
#include "modules/webgl/WebGLContextAttributeHelpers.h"
-#include "modules/webgl/WebGLContextAttributes.h"
#include "modules/webgl/WebGLContextEvent.h"
#include "modules/webgl/WebGLContextGroup.h"
#include "modules/webgl/WebGLDebugRendererInfo.h"
@@ -79,19 +78,18 @@
#include "modules/webgl/WebGLRenderbuffer.h"
#include "modules/webgl/WebGLShader.h"
#include "modules/webgl/WebGLShaderPrecisionFormat.h"
-#include "modules/webgl/WebGLTexture.h"
#include "modules/webgl/WebGLUniformLocation.h"
#include "modules/webgl/WebGLVertexArrayObject.h"
#include "modules/webgl/WebGLVertexArrayObjectOES.h"
#include "platform/CheckedInt.h"
#include "platform/RuntimeEnabledFeatures.h"
+#include "platform/ThreadSafeFunctional.h"
+#include "platform/WaitableEvent.h"
#include "platform/geometry/IntSize.h"
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/UnacceleratedImageBufferSurface.h"
#include "platform/graphics/gpu/AcceleratedImageBufferSurface.h"
-#include "platform/graphics/gpu/DrawingBuffer.h"
#include "public/platform/Platform.h"
-#include "public/platform/WebGraphicsContext3DProvider.h"
#include "public/platform/functional/WebFunction.h"
#include "wtf/Functional.h"
#include "wtf/PassOwnPtr.h"
@@ -502,7 +500,17 @@ static String extractWebGLContextCreationError(const Platform::GraphicsInfo& inf
return statusMessage;
}
-static PassOwnPtr<WebGraphicsContext3DProvider> createWebGraphicsContext3DProviderInternal(HTMLCanvasElement* canvas, ScriptState* scriptState, WebGLContextAttributes attributes, unsigned webGLVersion)
+void WebGLRenderingContextBase::createWebGraphicsContext3DProviderMainThread(WebGLRenderingContextBase::createWebGraphicsContext3DProviderUtils* createUtils, WaitableEvent* waitableEvent)
Justin Novosad 2016/05/04 18:34:03 "OnMainThread"
+{
+ ASSERT(isMainThread());
+ Platform::GraphicsInfo glInfo = createUtils->glInfo();
+ OwnPtr<WebGraphicsContext3DProvider> provider = adoptPtr(Platform::current()->createOffscreenGraphicsContext3DProvider(
+ createUtils->contextAttributes(), createUtils->scriptState()->getExecutionContext()->url(), 0, &glInfo));
+ createUtils->setContextProvider(provider.release());
+ waitableEvent->signal();
+}
+
+PassOwnPtr<WebGraphicsContext3DProvider> WebGLRenderingContextBase::createWebGraphicsContext3DProviderInternal(HTMLCanvasElement* canvas, ScriptState* scriptState, WebGLContextAttributes attributes, unsigned webGLVersion)
{
Platform::ContextAttributes contextAttributes = toPlatformContextAttributes(attributes, webGLVersion);
Platform::GraphicsInfo glInfo;
@@ -511,8 +519,18 @@ static PassOwnPtr<WebGraphicsContext3DProvider> createWebGraphicsContext3DProvid
contextProvider = adoptPtr(Platform::current()->createOffscreenGraphicsContext3DProvider(
contextAttributes, canvas->document().topDocument().url(), 0, &glInfo));
} else {
- contextProvider = adoptPtr(Platform::current()->createOffscreenGraphicsContext3DProvider(
- contextAttributes, scriptState->getExecutionContext()->url(), 0, &glInfo));
+ if (isMainThread()) {
+ contextProvider = adoptPtr(Platform::current()->createOffscreenGraphicsContext3DProvider(
+ contextAttributes, scriptState->getExecutionContext()->url(), 0, &glInfo));
+ } else {
+ WaitableEvent waitableEvent;
+ WebTaskRunner* taskRunner = Platform::current()->mainThread()->getWebTaskRunner();
+ OwnPtr<WebGLRenderingContextBase::createWebGraphicsContext3DProviderUtils> createUtils = adoptPtr(new WebGLRenderingContextBase::createWebGraphicsContext3DProviderUtils(contextAttributes, glInfo, scriptState));
+ taskRunner->postTask(BLINK_FROM_HERE, threadSafeBind(&createWebGraphicsContext3DProviderMainThread, AllowCrossThreadAccess(createUtils.get()), AllowCrossThreadAccess(&waitableEvent)));
+ waitableEvent.wait();
+ contextProvider = createUtils->releaseContextProvider();
+ contextProvider->DetachFromThread();
+ }
}
if (!contextProvider || shouldFailContextCreationForTesting) {
shouldFailContextCreationForTesting = false;
@@ -526,7 +544,6 @@ static PassOwnPtr<WebGraphicsContext3DProvider> createWebGraphicsContext3DProvid
canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcontextcreationerror, false, true, "OES_packed_depth_stencil support is required."));
return nullptr;
}
-
return contextProvider.release();
}

Powered by Google App Engine