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

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

Issue 2490443002: Make OffscreenCanvas an EventTarget (Closed)
Patch Set: pass API layout tests Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasModules.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 6a68b1659cd48b1b932d67291b0ab8663a738304..226d98eeccf9e0992e0509c186e254523ba35c44 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -547,7 +547,7 @@ struct ContextProviderCreationInfo {
// Inputs.
Platform::ContextAttributes contextAttributes;
Platform::GraphicsInfo* glInfo;
- ScriptState* scriptState;
+ KURL url;
// Outputs.
std::unique_ptr<WebGraphicsContext3DProvider> createdContextProvider;
};
@@ -558,8 +558,7 @@ static void createContextProviderOnMainThread(
ASSERT(isMainThread());
creationInfo->createdContextProvider =
wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider(
- creationInfo->contextAttributes,
- creationInfo->scriptState->getExecutionContext()->url(), 0,
+ creationInfo->contextAttributes, creationInfo->url, 0,
creationInfo->glInfo));
waitableEvent->signal();
}
@@ -568,12 +567,12 @@ static std::unique_ptr<WebGraphicsContext3DProvider>
createContextProviderOnWorkerThread(
Platform::ContextAttributes contextAttributes,
Platform::GraphicsInfo* glInfo,
- ScriptState* scriptState) {
+ const KURL& url) {
WaitableEvent waitableEvent;
ContextProviderCreationInfo creationInfo;
creationInfo.contextAttributes = contextAttributes;
creationInfo.glInfo = glInfo;
- creationInfo.scriptState = scriptState;
+ creationInfo.url = url;
WebTaskRunner* taskRunner =
Platform::current()->mainThread()->getWebTaskRunner();
taskRunner->postTask(BLINK_FROM_HERE,
@@ -599,15 +598,15 @@ WebGLRenderingContextBase::createContextProviderInternal(
toPlatformContextAttributes(attributes, webGLVersion);
Platform::GraphicsInfo glInfo;
std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
+ const auto& url = canvas ? canvas->document().topDocument().url()
+ : scriptState->getExecutionContext()->url();
if (isMainThread()) {
- const auto& url = canvas ? canvas->document().topDocument().url()
- : scriptState->getExecutionContext()->url();
contextProvider = wrapUnique(
Platform::current()->createOffscreenGraphicsContext3DProvider(
contextAttributes, url, 0, &glInfo));
} else {
- contextProvider = createContextProviderOnWorkerThread(contextAttributes,
- &glInfo, scriptState);
+ contextProvider =
+ createContextProviderOnWorkerThread(contextAttributes, &glInfo, url);
}
if (contextProvider && !contextProvider->bindToCurrentThread()) {
contextProvider = nullptr;
@@ -1034,6 +1033,14 @@ WebGLRenderingContextBase::WebGLRenderingContextBase(
m_maxViewportDims);
RefPtr<DrawingBuffer> buffer;
+ // On Mac OS, DrawingBuffer is using an IOSurface as its backing storage, this
+ // allows WebGL-rendered canvases to be composited by the OS rather than
+ // Chrome.
+ // IOSurfaces are only compatible with the GL_TEXTURE_RECTANGLE_ARB binding
+ // target. So to avoid the knowledge of GL_TEXTURE_RECTANGLE_ARB type textures
+ // being introduced into more areas of the code, we use the code path of
+ // non-WebGLImageChromium for OffscreenCanvas.
+ // See detailed discussion in crbug.com/649668.
if (passedOffscreenCanvas)
buffer = createDrawingBuffer(std::move(contextProvider),
DrawingBuffer::DisallowChromiumImage);
@@ -7289,7 +7296,10 @@ bool WebGLRenderingContextBase::validateDrawElements(const char* functionName,
void WebGLRenderingContextBase::dispatchContextLostEvent(TimerBase*) {
WebGLContextEvent* event = WebGLContextEvent::create(
EventTypeNames::webglcontextlost, false, true, "");
- canvas()->dispatchEvent(event);
+ if (getOffscreenCanvas())
+ getOffscreenCanvas()->dispatchEvent(event);
+ else
+ canvas()->dispatchEvent(event);
m_restoreAllowed = event->defaultPrevented();
if (m_restoreAllowed && !m_isHidden) {
if (m_autoRecoveryMethod == Auto)
@@ -7309,15 +7319,17 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
if (!m_restoreAllowed)
return;
- LocalFrame* frame = canvas()->document().frame();
- if (!frame)
- return;
+ if (canvas()) {
+ LocalFrame* frame = canvas()->document().frame();
+ if (!frame)
+ return;
- Settings* settings = frame->settings();
+ Settings* settings = frame->settings();
- if (!frame->loader().client()->allowWebGL(settings &&
- settings->webGLEnabled()))
- return;
+ if (!frame->loader().client()->allowWebGL(settings &&
+ settings->webGLEnabled()))
+ return;
+ }
// If the context was lost due to RealLostContext, we need to destroy the old
// DrawingBuffer before creating new DrawingBuffer to ensure resource budget
@@ -7330,16 +7342,29 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
Platform::ContextAttributes attributes =
toPlatformContextAttributes(creationAttributes(), version());
Platform::GraphicsInfo glInfo;
- std::unique_ptr<WebGraphicsContext3DProvider> contextProvider =
- wrapUnique(Platform::current()->createOffscreenGraphicsContext3DProvider(
- attributes, canvas()->document().topDocument().url(), 0, &glInfo));
+ std::unique_ptr<WebGraphicsContext3DProvider> contextProvider;
+ const auto& url = canvas()
+ ? canvas()->document().topDocument().url()
+ : getOffscreenCanvas()->getExecutionContext()->url();
+ if (isMainThread()) {
+ contextProvider = wrapUnique(
+ Platform::current()->createOffscreenGraphicsContext3DProvider(
+ attributes, url, 0, &glInfo));
+ } else {
+ contextProvider =
+ createContextProviderOnWorkerThread(attributes, &glInfo, url);
+ }
RefPtr<DrawingBuffer> buffer;
if (contextProvider && contextProvider->bindToCurrentThread()) {
// Construct a new drawing buffer with the new GL context.
- // TODO(xidachen): make sure that the second parameter is correct for
- // OffscreenCanvas.
- buffer = createDrawingBuffer(std::move(contextProvider),
- DrawingBuffer::AllowChromiumImage);
+ if (canvas()) {
+ buffer = createDrawingBuffer(std::move(contextProvider),
+ DrawingBuffer::AllowChromiumImage);
+ } else {
+ // Please refer to comment at Line 1040 in this file.
+ buffer = createDrawingBuffer(std::move(contextProvider),
+ DrawingBuffer::DisallowChromiumImage);
+ }
// If DrawingBuffer::create() fails to allocate a fbo, |drawingBuffer| is
// set to null.
}
@@ -7370,8 +7395,12 @@ void WebGLRenderingContextBase::maybeRestoreContext(TimerBase*) {
setupFlags();
initializeNewContext();
markContextChanged(CanvasContextChanged);
- canvas()->dispatchEvent(WebGLContextEvent::create(
- EventTypeNames::webglcontextrestored, false, true, ""));
+ WebGLContextEvent* event = WebGLContextEvent::create(
+ EventTypeNames::webglcontextrestored, false, true, "");
+ if (canvas())
+ canvas()->dispatchEvent(event);
+ else
+ getOffscreenCanvas()->dispatchEvent(event);
}
String WebGLRenderingContextBase::ensureNotNull(const String& text) const {
« no previous file with comments | « third_party/WebKit/Source/modules/offscreencanvas/OffscreenCanvasModules.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698