Source/WebCore/ChangeLog

 12021-02-12 Kimmo Kinnunen <kkinnunen@apple.com>
 2
 3 WebGL contexts do not work as source for Context2D drawImage calls in GPU process
 4 https://bugs.webkit.org/show_bug.cgi?id=221811
 5
 6 Reviewed by Darin Adler.
 7
 8 Implements rudimentary support for reading the WebGL context and transfering
 9 it to a ImageBuffer.
 10
 11 Fixes many tests that are removed from gpu-process/TestExpectations.
 12
 13 * html/OffscreenCanvas.cpp:
 14 (WebCore::OffscreenCanvas::transferToImageBitmap):
 15 * html/canvas/WebGLRenderingContextBase.cpp:
 16 (WebCore::WebGLRenderingContextBase::paintRenderingResultsToCanvas):
 17 * platform/graphics/GraphicsContextGL.h:
 18 Make paintRenderingResultsToCanvas and paintCompositedResultsToCanvas
 19 take ImageBuffer& instead of ImageBuffer*, since the buffer always
 20 exists.
 21
 22 * platform/graphics/cairo/GraphicsContextGLCairo.cpp:
 23 (WebCore::GraphicsContextGLOpenGL::paintToCanvas):
 24 * platform/graphics/cg/GraphicsContextGLCG.cpp:
 25 (WebCore::GraphicsContextGLOpenGL::paintToCanvas):
 26 Change the function signature so that it can be called from
 27 other thread and without GraphicsContextGL instance.
 28 It is not really a GraphicsContextGLOpenGL related function..
 29
 30 * platform/graphics/cocoa/GraphicsContextGLIOSurfaceSwapChain.cpp:
 31 (WebCore::GraphicsContextGLIOSurfaceSwapChain::displayBuffer const):
 32 (WebCore::GraphicsContextGLIOSurfaceSwapChain::recycleBuffer):
 33 (WebCore::GraphicsContextGLIOSurfaceSwapChain::detachClient):
 34 (WebCore::GraphicsContextGLIOSurfaceSwapChain::present):
 35 * platform/graphics/cocoa/GraphicsContextGLIOSurfaceSwapChain.h:
 36 * platform/graphics/cocoa/WebGLLayer.mm:
 37 (WebGLLayerSwapChain::present):
 38 Move the triple buffering implementation to the base class.
 39 The implementation is now also used in GPU process side,
 40 since the GPU process needs to be able to read the composited
 41 results.
 42
 43 Previously the same logic was split between Web process and GPU process.
 44
 45 * platform/graphics/opengl/GraphicsContextGLOpenGL.cpp:
 46 (WebCore::GraphicsContextGLOpenGL::paintRenderingResultsToCanvas):
 47 (WebCore::GraphicsContextGLOpenGL::paintCompositedResultsToCanvas):
 48 (WebCore::GraphicsContextGLOpenGL::paintRenderingResultsToImageData):
 49 (WebCore::GraphicsContextGLOpenGL::readRenderingResultsForPainting):
 50 (WebCore::GraphicsContextGLOpenGL::readCompositedResultsForPainting):
 51 * platform/graphics/opengl/GraphicsContextGLOpenGL.h:
 52
 53 Expose public functions to get ImageData out of drawing buffer and
 54 display buffer.
 55
1562021-02-18 Antoine Quint <graouts@webkit.org>
257
358 Page updates and rAF callbacks should run at a frequency close to 60Hz on high refresh-rate displays

Source/WebKit/ChangeLog

 12021-02-12 Kimmo Kinnunen <kkinnunen@apple.com>
 2
 3 WebGL contexts do not work as source for Context2D drawImage calls in GPU process
 4 https://bugs.webkit.org/show_bug.cgi?id=221811
 5
 6 Reviewed by Darin Adler.
 7
 8 Implements rudimentary support for reading the WebGL context and transfering
 9 it to a ImageBuffer.
 10
 11 Fixes many tests that are removed from gpu-process/TestExpectations.
 12
 13 * GPUProcess/GPUConnectionToWebProcess.cpp:
 14 (WebKit::GPUConnectionToWebProcess::createGraphicsContextGL):
 15 * GPUProcess/GPUConnectionToWebProcess.h:
 16 (WebKit::GPUConnectionToWebProcess::RemoteRenderingBackendWrapper::get const):
 17 * GPUProcess/GPUConnectionToWebProcess.messages.in:
 18 * GPUProcess/graphics/RemoteGraphicsContextGL.cpp:
 19 (WebKit::RemoteGraphicsContextGL::create):
 20 (WebKit::RemoteGraphicsContextGL::RemoteGraphicsContextGL):
 21 * WebProcess/WebCoreSupport/WebChromeClient.cpp:
 22 (WebKit::WebChromeClient::createGraphicsContextGL const):
 23 * GPUProcess/graphics/RemoteGraphicsContextGLCocoa.cpp:
 24 (WebKit::RemoteGraphicsContextGL::create):
 25 (WebKit::RemoteGraphicsContextGLCocoa::RemoteGraphicsContextGLCocoa):
 26 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
 27 (WebKit::RemoteRenderingBackendProxy::renderingBackendIdentifier const):
 28
 29 RemoteGraphicsContextGL takes a ref of the respective RemoteRenderingBackend.
 30 RemoteRenderingBackend is the one that can handle ImageBuffers.
 31
 32 (WebKit::RemoteGraphicsContextGL::paintRenderingResultsToCanvas):
 33 (WebKit::RemoteGraphicsContextGL::paintCompositedResultsToCanvas):
 34 (WebKit::RemoteGraphicsContextGL::paintImageDataToImageBuffer):
 35 * GPUProcess/graphics/RemoteGraphicsContextGL.h:
 36 * GPUProcess/graphics/RemoteGraphicsContextGL.messages.in:
 37
 38 Implement the functions by:
 39 1) Wait for the pending changes to the ImageBuffer
 40 2) Send a synchronous message from Web process to GPU process WebGL sequence
 41 3) Reading the buffer, post the task to RenderingBackend sequence
 42 4) Paint the results to the ImageBuffer
 43 5) Return the synchronous message result
 44
 45 (WebKit::RemoteGraphicsContextGLCocoa::prepareForDisplay):
 46
 47 RemoteGraphicsContextGL now retains the reference to display buffer.
 48 Before, just sent the display buffer to Web process and forgot
 49 about it.
 50
 51 * GPUProcess/graphics/RemoteRenderingBackend.cpp:
 52 (WebKit::RemoteRenderingBackend::dispatch):
 53 * GPUProcess/graphics/RemoteRenderingBackend.h:
 54
 55 Add function to dispatch work to rendering backend sequence.
 56
 57 * WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp:
 58 (WebKit::RemoteGraphicsContextGLProxy::create):
 59 (WebKit::RemoteGraphicsContextGLProxy::RemoteGraphicsContextGLProxy):
 60 (WebKit::RemoteGraphicsContextGLProxy::paintRenderingResultsToCanvas):
 61 (WebKit::RemoteGraphicsContextGLProxy::paintCompositedResultsToCanvas):
 62 * WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h:
 63
 64 Send the messages.
 65
 66 * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
 67 (WebKit::RemoteRenderingBackendProxy::connectToGPUProcess):
 68
 69 Use IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply to
 70 send CreateRenderingBackend. It must be dispatched in order compared to other
 71 messages such as CreateRemoteGraphicsContextGL.
 72
1732021-02-17 Megan Gardner <megan_gardner@apple.com>
274
375 Return correct target for App Highlight menus.

Source/WebCore/html/OffscreenCanvas.cpp

@@ExceptionOr<RefPtr<ImageBitmap>> OffscreenCanvas::transferToImageBitmap()
284284 return { RefPtr<ImageBitmap> { nullptr } };
285285
286286 auto* gc3d = webGLContext->graphicsContextGL();
287  gc3d->paintRenderingResultsToCanvas(imageBitmap->buffer());
 287 gc3d->paintRenderingResultsToCanvas(*imageBitmap->buffer());
288288
289289 // FIXME: The transfer algorithm requires that the canvas effectively
290290 // creates a new backing store. Since we're not doing that yet, we

Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp

@@void WebGLRenderingContextBase::paintRenderingResultsToCanvas()
12101210 auto& base = canvasBase();
12111211 base.clearCopiedImage();
12121212 m_markedCanvasDirty = false;
1213  m_context->paintCompositedResultsToCanvas(base.buffer());
 1213 m_context->paintCompositedResultsToCanvas(*base.buffer());
12141214 }
12151215 return;
12161216 }

@@void WebGLRenderingContextBase::paintRenderingResultsToCanvas()
12251225
12261226 m_markedCanvasDirty = false;
12271227
1228  m_context->paintRenderingResultsToCanvas(base.buffer());
 1228 m_context->paintRenderingResultsToCanvas(*base.buffer());
12291229}
12301230
12311231RefPtr<ImageData> WebGLRenderingContextBase::paintRenderingResultsToImageData()

Source/WebCore/platform/graphics/GraphicsContextGL.h

@@public:
12911291 // FIXME: these should be removed, they're part of drawing buffer and
12921292 // display buffer abstractions that the caller should hold separate to
12931293 // the context.
1294  virtual void paintRenderingResultsToCanvas(ImageBuffer*) = 0;
 1294 virtual void paintRenderingResultsToCanvas(ImageBuffer&) = 0;
12951295 virtual RefPtr<ImageData> paintRenderingResultsToImageData() = 0;
1296  virtual void paintCompositedResultsToCanvas(ImageBuffer*) = 0;
 1296 virtual void paintCompositedResultsToCanvas(ImageBuffer&) = 0;
12971297
12981298 // FIXME: this should be removed. The layer should be marked composited by
12991299 // preparing for display, so that canvas image buffer and the layer agree

Source/WebCore/platform/graphics/cairo/GraphicsContextGLCairo.cpp

@@bool GraphicsContextGLImageExtractor::extractImage(bool premultiplyAlpha, bool i
106106 return true;
107107}
108108
109 void GraphicsContextGLOpenGL::paintToCanvas(Ref<ImageData>&& imageData, const IntSize& canvasSize, GraphicsContext& context)
 109void GraphicsContextGLOpenGL::paintToCanvas(const GraphicsContextGLAttributes& sourceContextAttributes, Ref<ImageData>&& imageData, const IntSize& canvasSize, GraphicsContext& context)
110110{
111111 ASSERT(!imageData->size().isEmpty());
112112 if (canvasSize.isEmpty())

@@void GraphicsContextGLOpenGL::paintToCanvas(Ref<ImageData>&& imageData, const In
122122 for (size_t i = 0; i < totalBytes; i += 4)
123123 std::swap(pixels[i], pixels[i + 2]);
124124
125  if (!contextAttributes().premultipliedAlpha) {
 125 if (!sourceContextAttributes.premultipliedAlpha) {
126126 for (size_t i = 0; i < totalBytes; i += 4) {
127127 pixels[i + 0] = std::min(255, pixels[i + 0] * pixels[i + 3] / 255);
128128 pixels[i + 1] = std::min(255, pixels[i + 1] * pixels[i + 3] / 255);

Source/WebCore/platform/graphics/cg/GraphicsContextGLCG.cpp

@@static void releaseImageData(void* imageData, const void*, size_t)
511511 reinterpret_cast<ImageData*>(imageData)->deref();
512512}
513513
514 void GraphicsContextGLOpenGL::paintToCanvas(Ref<ImageData>&& imageData, const IntSize& canvasSize, GraphicsContext& context)
 514void GraphicsContextGLOpenGL::paintToCanvas(const GraphicsContextGLAttributes& sourceContextAttributes, Ref<ImageData>&& imageData, const IntSize& canvasSize, GraphicsContext& context)
515515{
516516 ASSERT(!imageData->size().isEmpty());
517517 if (canvasSize.isEmpty())
518518 return;
519  auto attrs = contextAttributes();
520519 // Input is GL_RGBA == kCGBitmapByteOrder32Big | kCGImageAlpha*Last.
521520 // GL_BGRA would be kCGBitmapByteOrder32Little | kCGImageAlpha*First.
522521 CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Big;
523  if (!attrs.alpha)
 522 if (!sourceContextAttributes.alpha)
524523 bitmapInfo |= kCGImageAlphaNoneSkipLast;
525  else if (attrs.premultipliedAlpha)
 524 else if (sourceContextAttributes.premultipliedAlpha)
526525 bitmapInfo |= kCGImageAlphaPremultipliedLast;
527526 else
528527 bitmapInfo |= kCGImageAlphaLast;

Source/WebCore/platform/graphics/cocoa/GraphicsContextGLIOSurfaceSwapChain.cpp

@@namespace WebCore {
3232
3333GraphicsContextGLIOSurfaceSwapChain::~GraphicsContextGLIOSurfaceSwapChain() = default;
3434
 35const GraphicsContextGLIOSurfaceSwapChain::Buffer& GraphicsContextGLIOSurfaceSwapChain::displayBuffer() const
 36{
 37 return m_displayBuffer;
 38}
 39
 40GraphicsContextGLIOSurfaceSwapChain::Buffer GraphicsContextGLIOSurfaceSwapChain::recycleBuffer()
 41{
 42 if (m_spareBuffer.surface) {
 43 if (m_spareBuffer.surface->isInUse())
 44 m_spareBuffer.surface.reset();
 45 return WTFMove(m_spareBuffer);
 46 }
 47 return { };
 48}
 49
 50void* GraphicsContextGLIOSurfaceSwapChain::detachClient()
 51{
 52 ASSERT(!m_spareBuffer.surface);
 53 return std::exchange(m_displayBuffer.handle, nullptr);
 54}
 55
 56void GraphicsContextGLIOSurfaceSwapChain::present(Buffer&& buffer)
 57{
 58 m_spareBuffer = std::exchange(m_displayBuffer, WTFMove(buffer));
 59}
 60
3561}
3662
3763#endif

Source/WebCore/platform/graphics/cocoa/GraphicsContextGLIOSurfaceSwapChain.h

@@public:
5858 // - Buffer with empty surface and non-empty metadata handle if the recycled buffer was available
5959 // but the surface is still in use.
6060 // - Surface and handle.
61  virtual Buffer recycleBuffer() = 0;
 61 virtual Buffer recycleBuffer();
6262
6363 // Prepares the target for display with a contents buffer.
64  virtual void present(Buffer) = 0;
 64 virtual void present(Buffer&&);
6565
6666 // Returns the most recent presented display buffer. The reference is valid until
6767 // next present, recycleBuffer or detachClient call.
68  virtual const Buffer& displayBuffer() const = 0;
 68 virtual const Buffer& displayBuffer() const;
6969
7070 // Detaches the client and returns the current contents buffer metadata handle.
7171 // The if multiple buffers have been submitted, recycleBuffer must have been called before calling
7272 // this.
73  virtual void* detachClient() = 0;
 73 virtual void* detachClient();
 74
 75protected:
 76 Buffer m_displayBuffer;
 77 Buffer m_spareBuffer;
7478};
7579
7680}

Source/WebCore/platform/graphics/cocoa/WebGLLayer.mm

@@class WebGLLayerSwapChain final : public WebCore::GraphicsContextGLIOSurfaceSwap
3838public:
3939 explicit WebGLLayerSwapChain(WebGLLayer* layer) : m_layer(layer) { };
4040 ~WebGLLayerSwapChain() override = default;
41  void present(Buffer) override;
42  const Buffer& displayBuffer() const override
43  {
44  return m_displayBuffer;
45  }
46  Buffer recycleBuffer() override
47  {
48  if (m_spareBuffer.surface) {
49  if (m_spareBuffer.surface->isInUse())
50  m_spareBuffer.surface.reset();
51  return WTFMove(m_spareBuffer);
52  }
53  return { };
54  }
55  void* detachClient() override
56  {
57  ASSERT(!m_spareBuffer.surface);
58  void* result = m_displayBuffer.handle;
59  m_displayBuffer.handle = nullptr;
60  return result;
61  }
 41 void present(Buffer&&) override;
 42
6243 WebCore::IOSurface* displaySurface() { return m_displayBuffer.surface.get(); }
6344private:
64  Buffer m_displayBuffer;
65  Buffer m_spareBuffer;
6645 WebGLLayer* const m_layer;
6746};
6847

@@private:
130109
131110@end
132111
133 void WebGLLayerSwapChain::present(Buffer buffer)
 112void WebGLLayerSwapChain::present(Buffer&& buffer)
134113{
135114 ASSERT(!m_spareBuffer.surface);
136  m_spareBuffer = WTFMove(m_displayBuffer);
137  m_displayBuffer = WTFMove(buffer);
 115 GraphicsContextGLIOSurfaceSwapChain::present(WTFMove(buffer));
138116 [m_layer prepareForDisplay];
139117}
140118

Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.cpp

@@void GraphicsContextGLOpenGL::prepareForDisplay()
196196}
197197#endif
198198
199 void GraphicsContextGLOpenGL::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer)
 199void GraphicsContextGLOpenGL::paintRenderingResultsToCanvas(ImageBuffer& imageBuffer)
200200{
201201 if (!makeContextCurrent())
202202 return;

@@void GraphicsContextGLOpenGL::paintRenderingResultsToCanvas(ImageBuffer* imageBu
205205 auto imageData = readRenderingResults();
206206 if (!imageData)
207207 return;
208  paintToCanvas(imageData.releaseNonNull(), imageBuffer->backendSize(), imageBuffer->context());
 208 paintToCanvas(contextAttributes(), imageData.releaseNonNull(), imageBuffer.backendSize(), imageBuffer.context());
209209}
210210
211 void GraphicsContextGLOpenGL::paintCompositedResultsToCanvas(ImageBuffer* imageBuffer)
 211void GraphicsContextGLOpenGL::paintCompositedResultsToCanvas(ImageBuffer& imageBuffer)
212212{
213213 if (!makeContextCurrent())
214214 return;

@@void GraphicsContextGLOpenGL::paintCompositedResultsToCanvas(ImageBuffer* imageB
217217 auto imageData = readCompositedResults();
218218 if (!imageData)
219219 return;
220  paintToCanvas(imageData.releaseNonNull(), imageBuffer->backendSize(), imageBuffer->context());
 220 paintToCanvas(contextAttributes(), imageData.releaseNonNull(), imageBuffer.backendSize(), imageBuffer.context());
221221}
222222
223223RefPtr<ImageData> GraphicsContextGLOpenGL::paintRenderingResultsToImageData()
 224{
 225 // Reading premultiplied alpha would involve unpremultiplying, which is lossy.
 226 if (contextAttributes().premultipliedAlpha)
 227 return nullptr;
 228 return readRenderingResultsForPainting();
 229}
 230
 231RefPtr<ImageData> GraphicsContextGLOpenGL::readRenderingResultsForPainting()
224232{
225233 if (!makeContextCurrent())
226234 return nullptr;
227235 if (getInternalFramebufferSize().isEmpty())
228236 return nullptr;
229  // Reading premultiplied alpha would involve unpremultiplying, which is
230  // lossy.
231  if (contextAttributes().premultipliedAlpha)
232  return nullptr;
233237 return readRenderingResults();
234238}
235239
 240RefPtr<ImageData> GraphicsContextGLOpenGL::readCompositedResultsForPainting()
 241{
 242 if (!makeContextCurrent())
 243 return nullptr;
 244 if (getInternalFramebufferSize().isEmpty())
 245 return nullptr;
 246 return readCompositedResults();
 247}
 248
236249#if !PLATFORM(COCOA)
237250RefPtr<ImageData> GraphicsContextGLOpenGL::readCompositedResults()
238251{

Source/WebCore/platform/graphics/opengl/GraphicsContextGLOpenGL.h

@@public:
458458 void dispatchContextChangedNotification();
459459 void simulateContextChanged() final;
460460
461  void paintRenderingResultsToCanvas(ImageBuffer*) final;
 461 void paintRenderingResultsToCanvas(ImageBuffer&) final;
462462 RefPtr<ImageData> paintRenderingResultsToImageData() final;
463  void paintCompositedResultsToCanvas(ImageBuffer*) final;
 463 void paintCompositedResultsToCanvas(ImageBuffer&) final;
 464
 465 RefPtr<ImageData> readRenderingResultsForPainting();
 466 RefPtr<ImageData> readCompositedResultsForPainting();
464467
465468#if USE(OPENGL) && ENABLE(WEBGL2)
466469 void primitiveRestartIndex(GCGLuint);

@@public:
515518 static bool possibleFormatAndTypeForInternalFormat(GCGLenum internalFormat, GCGLenum& format, GCGLenum& type);
516519#endif // !USE(ANGLE)
517520
 521 static void paintToCanvas(const GraphicsContextGLAttributes&, Ref<ImageData>&&, const IntSize& canvasSize, GraphicsContext&);
 522
518523private:
519524#if PLATFORM(COCOA)
520525 GraphicsContextGLOpenGL(GraphicsContextGLAttributes, HostWindow*, GraphicsContextGLOpenGL* sharedContext = nullptr, GraphicsContextGLIOSurfaceSwapChain* = nullptr);

@@private:
542547 RefPtr<ImageData> readRenderingResults();
543548 RefPtr<ImageData> readCompositedResults();
544549 RefPtr<ImageData> readPixelsForPaintResults();
545  void paintToCanvas(Ref<ImageData>&&, const IntSize& canvasSize, GraphicsContext&);
546550
547551 bool reshapeFBOs(const IntSize&);
548552 void prepareTextureImpl();

Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp

@@GPUConnectionToWebProcess::RemoteRenderingBackendWrapper::~RemoteRenderingBacken
337337}
338338
339339#if ENABLE(WEBGL)
340 void GPUConnectionToWebProcess::createGraphicsContextGL(WebCore::GraphicsContextGLAttributes attributes, GraphicsContextGLIdentifier graphicsContextGLIdentifier)
 340void GPUConnectionToWebProcess::createGraphicsContextGL(WebCore::GraphicsContextGLAttributes attributes, GraphicsContextGLIdentifier graphicsContextGLIdentifier, RenderingBackendIdentifier renderingBackendIdentifier)
341341{
 342 auto* renderingBackend = m_remoteRenderingBackendMap.get(renderingBackendIdentifier);
 343 if (!renderingBackend)
 344 return;
 345
342346 auto addResult = m_remoteGraphicsContextGLMap.ensure(graphicsContextGLIdentifier, [&]() {
343  return RemoteGraphicsContextGL::create(attributes, *this, graphicsContextGLIdentifier);
 347 return RemoteGraphicsContextGL::create(attributes, *this, graphicsContextGLIdentifier, renderingBackend->get());
344348 });
345349 ASSERT_UNUSED(addResult, addResult.isNewEntry);
346350}

Source/WebKit/GPUProcess/GPUConnectionToWebProcess.h

@@private:
138138 void releaseRenderingBackend(RenderingBackendIdentifier);
139139
140140#if ENABLE(WEBGL)
141  void createGraphicsContextGL(WebCore::GraphicsContextGLAttributes, GraphicsContextGLIdentifier);
 141 void createGraphicsContextGL(WebCore::GraphicsContextGLAttributes, GraphicsContextGLIdentifier, RenderingBackendIdentifier);
142142 void releaseGraphicsContextGL(GraphicsContextGLIdentifier);
143143#endif
144144

@@private:
211211 public:
212212 RemoteRenderingBackendWrapper(Ref<RemoteRenderingBackend>&&);
213213 ~RemoteRenderingBackendWrapper();
214 
 214 RemoteRenderingBackend& get() const { return m_remoteRenderingBackend.get(); }
215215 private:
216216 Ref<RemoteRenderingBackend> m_remoteRenderingBackend;
217217 };

Source/WebKit/GPUProcess/GPUConnectionToWebProcess.messages.in

@@messages -> GPUConnectionToWebProcess WantsDispatchMessage {
2626 void CreateRenderingBackend(WebKit::RenderingBackendIdentifier identifier, IPC::Semaphore resumeDisplayListSemaphore)
2727 void ReleaseRenderingBackend(WebKit::RenderingBackendIdentifier renderingBackendIdentifier)
2828#if ENABLE(WEBGL)
29  void CreateGraphicsContextGL(struct WebCore::GraphicsContextGLAttributes attributes, WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier)
 29 void CreateGraphicsContextGL(struct WebCore::GraphicsContextGLAttributes attributes, WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier, WebKit::RenderingBackendIdentifier renderingBackendIdentifier)
3030 void ReleaseGraphicsContextGL(WebKit::GraphicsContextGLIdentifier graphicsContextGLIdentifier)
3131#endif
3232 void ClearNowPlayingInfo()

Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp

@@namespace WebKit {
3939using namespace WebCore;
4040
4141#if !PLATFORM(COCOA)
42 std::unique_ptr<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& gpuConnectionToWebProcess, GraphicsContextGLIdentifier graphicsContextGLIdentifier)
 42std::unique_ptr<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, RemoteRenderingBackend&)
4343{
4444 ASSERT_NOT_REACHED();
4545 return nullptr;
4646}
4747#endif
4848
49 RemoteGraphicsContextGL::RemoteGraphicsContextGL(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& gpuConnectionToWebProcess, GraphicsContextGLIdentifier graphicsContextGLIdentifier, Ref<GraphicsContextGLOpenGL> context)
 49RemoteGraphicsContextGL::RemoteGraphicsContextGL(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier, Ref<GraphicsContextGLOpenGL> context, RemoteRenderingBackend& renderingBackend)
5050 : m_context(WTFMove(context))
51  , m_gpuConnectionToWebProcess(makeWeakPtr(gpuConnectionToWebProcess))
52  , m_graphicsContextGLIdentifier(graphicsContextGLIdentifier)
 51 , m_gpuConnectionToWebProcess(makeWeakPtr(connection))
 52 , m_graphicsContextGLIdentifier(identifier)
 53 , m_renderingBackend(makeRef(renderingBackend))
5354{
5455 if (auto* gpuConnectionToWebProcess = m_gpuConnectionToWebProcess.get())
55  gpuConnectionToWebProcess->messageReceiverMap().addMessageReceiver(Messages::RemoteGraphicsContextGL::messageReceiverName(), graphicsContextGLIdentifier.toUInt64(), *this);
 56 gpuConnectionToWebProcess->messageReceiverMap().addMessageReceiver(Messages::RemoteGraphicsContextGL::messageReceiverName(), m_graphicsContextGLIdentifier.toUInt64(), *this);
5657 m_context->addClient(*this);
5758 String extensions = m_context->getString(GraphicsContextGL::EXTENSIONS);
5859 String requestableExtensions = m_context->getString(ExtensionsGL::REQUESTABLE_EXTENSIONS_ANGLE);

@@void RemoteGraphicsContextGL::notifyMarkContextChanged()
137138 m_context->markContextChanged();
138139}
139140
 141void RemoteGraphicsContextGL::paintRenderingResultsToCanvas(WebCore::RenderingResourceIdentifier imageBuffer, CompletionHandler<void()>&& completionHandler)
 142{
 143 paintImageDataToImageBuffer(m_context->readRenderingResultsForPainting(), imageBuffer, WTFMove(completionHandler));
 144}
 145
 146void RemoteGraphicsContextGL::paintCompositedResultsToCanvas(WebCore::RenderingResourceIdentifier imageBuffer, CompletionHandler<void()>&& completionHandler)
 147{
 148 paintImageDataToImageBuffer(m_context->readCompositedResultsForPainting(), imageBuffer, WTFMove(completionHandler));
 149}
 150
 151void RemoteGraphicsContextGL::paintImageDataToImageBuffer(RefPtr<WebCore::ImageData>&& imageData, WebCore::RenderingResourceIdentifier target, CompletionHandler<void()>&& completionHandler)
 152{
 153 // FIXME: We do not have functioning read/write fences in RemoteRenderingBackend. Thus this is synchronous,
 154 // as are the messages that call these.
 155 Lock mutex;
 156 Condition conditionVariable;
 157 bool isFinished = false;
 158 m_renderingBackend->dispatch([&]() mutable {
 159 if (auto imageBuffer = m_renderingBackend->remoteResourceCache().cachedImageBuffer(target)) {
 160 // Here we do not try to play back pending commands for imageBuffer. Currently this call is only made for empty
 161 // image buffers and there's no good way to add display lists.
 162 if (imageData)
 163 GraphicsContextGLOpenGL::paintToCanvas(m_context->contextAttributes(), imageData.releaseNonNull(), imageBuffer->backendSize(), imageBuffer->context());
 164 else
 165 imageBuffer->context().clearRect({ IntPoint(), imageBuffer->backendSize() });
 166 // Unfortunately "flush" implementation in RemoteRenderingBackend overloads ordering and effects.
 167 imageBuffer->flushContext();
 168 }
 169 auto locker = holdLock(mutex);
 170 isFinished = true;
 171 conditionVariable.notifyOne();
 172 });
 173 std::unique_lock<Lock> lock(mutex);
 174 conditionVariable.wait(lock, [&] {
 175 return isFinished;
 176 });
 177 completionHandler();
 178}
 179
140180} // namespace WebKit
141181
142182#endif

Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.h

3131#include "GraphicsContextGLIdentifier.h"
3232#include "MessageReceiver.h"
3333#include "MessageSender.h"
34 
 34#include "RemoteRenderingBackend.h"
3535#include <WebCore/ExtensionsGL.h>
3636#include <WebCore/GraphicsContextGLOpenGL.h>
3737#include <WebCore/NotImplemented.h>

@@class RemoteGraphicsContextGL
5858 : public IPC::MessageSender
5959 , private IPC::MessageReceiver
6060 , private WebCore::GraphicsContextGL::Client {
 61 WTF_MAKE_FAST_ALLOCATED;
6162public:
62  static std::unique_ptr<RemoteGraphicsContextGL> create(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier);
 63 static std::unique_ptr<RemoteGraphicsContextGL> create(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, RemoteRenderingBackend&);
6364 ~RemoteGraphicsContextGL() override;
6465
6566 GPUConnectionToWebProcess* gpuConnectionToWebProcess() const;
6667
6768protected:
68  RemoteGraphicsContextGL(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, Ref<WebCore::GraphicsContextGLOpenGL>);
 69 RemoteGraphicsContextGL(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, Ref<WebCore::GraphicsContextGLOpenGL>, RemoteRenderingBackend&);
6970
7071 // IPC::MessageSender overrides.
7172 IPC::Connection* messageSenderConnection() const final;

@@protected:
9293#endif
9394 void getError(CompletionHandler<void(uint32_t)>&&);
9495 void synthesizeGLError(uint32_t error);
 96 void paintRenderingResultsToCanvas(WebCore::RenderingResourceIdentifier, CompletionHandler<void()>&&);
 97 void paintCompositedResultsToCanvas(WebCore::RenderingResourceIdentifier, CompletionHandler<void()>&&);
9598
9699#include "RemoteGraphicsContextGLFunctionsGenerated.h" // NOLINT
97100
 101 void paintImageDataToImageBuffer(RefPtr<WebCore::ImageData>&&, WebCore::RenderingResourceIdentifier, CompletionHandler<void()>&&);
 102
98103 Ref<WebCore::GraphicsContextGLOpenGL> m_context;
99104 WeakPtr<GPUConnectionToWebProcess> m_gpuConnectionToWebProcess;
100105 GraphicsContextGLIdentifier m_graphicsContextGLIdentifier;
 106 Ref<RemoteRenderingBackend> m_renderingBackend;
101107};
102108
103109} // namespace WebKit

Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.messages.in

@@messages -> RemoteGraphicsContextGL NotRefCounted {
3636 void NotifyMarkContextChanged()
3737 void SynthesizeGLError(uint32_t error)
3838 void GetError() -> (uint32_t returnValue) Synchronous
 39 void PaintRenderingResultsToCanvas(WebCore::RenderingResourceIdentifier identifier) -> () Synchronous
 40 void PaintCompositedResultsToCanvas(WebCore::RenderingResourceIdentifier identifier) -> () Synchronous
 41
3942
4043 void SetFailNextGPUStatusCheck()
4144 void MoveErrorsToSyntheticErrorList() -> (bool returnValue) Synchronous

@@messages -> RemoteGraphicsContextGL NotRefCounted {
292295}
293296
294297#endif
295 

Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGLCocoa.cpp

@@using namespace WebCore;
3737
3838namespace {
3939
40 class RemoteGraphicsContextGLCocoa final : public RemoteGraphicsContextGL, private WebCore::GraphicsContextGLIOSurfaceSwapChain {
 40class RemoteGraphicsContextGLCocoa final : public RemoteGraphicsContextGL {
4141public:
42  RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier);
 42 RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier, RemoteRenderingBackend&);
4343 ~RemoteGraphicsContextGLCocoa() final = default;
4444
4545 // RemoteGraphicsContextGL overrides.
4646 void prepareForDisplay(CompletionHandler<void(WTF::MachSendRight&&)>&&) final;
47 
48  // GraphicsContextGLIOSurfaceSwapChain overrides.
49  Buffer recycleBuffer() final;
50  void present(Buffer) final;
51  const Buffer& displayBuffer() const final;
52  void* detachClient() final;
5347private:
54  GraphicsContextGLIOSurfaceSwapChain::Buffer m_displayBuffer;
 48 WebCore::GraphicsContextGLIOSurfaceSwapChain m_swapChain;
5549};
5650
5751}
5852
59 std::unique_ptr<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& gpuConnectionToWebProcess, GraphicsContextGLIdentifier graphicsContextGLIdentifier)
60 {
61  return std::unique_ptr<RemoteGraphicsContextGL>(new RemoteGraphicsContextGLCocoa(attributes, gpuConnectionToWebProcess, graphicsContextGLIdentifier));
62 }
63 
64 RemoteGraphicsContextGLCocoa::RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier)
65  : RemoteGraphicsContextGL(attributes, connection, identifier, GraphicsContextGLOpenGL::createForGPUProcess(attributes, this))
66 {
67 }
68 
69 GraphicsContextGLIOSurfaceSwapChain::Buffer RemoteGraphicsContextGLCocoa::recycleBuffer()
70 {
71  return WTFMove(m_displayBuffer);
72 }
73 
74 void RemoteGraphicsContextGLCocoa::present(Buffer buffer)
75 {
76  ASSERT(!m_displayBuffer.surface);
77  m_displayBuffer = WTFMove(buffer);
78 }
79 
80 const GraphicsContextGLIOSurfaceSwapChain::Buffer& RemoteGraphicsContextGLCocoa::displayBuffer() const
 53std::unique_ptr<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier, RemoteRenderingBackend& renderingBackend)
8154{
82  return m_displayBuffer;
 55 return makeUnique<RemoteGraphicsContextGLCocoa>(attributes, gpuConnection, identifier, renderingBackend);
8356}
8457
85 void* RemoteGraphicsContextGLCocoa::detachClient()
 58RemoteGraphicsContextGLCocoa::RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier, RemoteRenderingBackend& renderingBackend)
 59 : RemoteGraphicsContextGL(attributes, connection, identifier, GraphicsContextGLOpenGL::createForGPUProcess(attributes, &m_swapChain), renderingBackend)
8660{
87  return std::exchange(m_displayBuffer.handle, nullptr);
8861}
8962
9063void RemoteGraphicsContextGLCocoa::prepareForDisplay(CompletionHandler<void(WTF::MachSendRight&&)>&& completionHandler)
9164{
9265 m_context->prepareForDisplay();
93  auto displayBuffer = WTFMove(m_displayBuffer.surface);
9466 MachSendRight sendRight;
95  if (displayBuffer)
96  sendRight = displayBuffer->createSendRight();
 67 if (auto* surface = m_swapChain.displayBuffer().surface.get())
 68 sendRight = surface->createSendRight();
9769 completionHandler(WTFMove(sendRight));
9870}
9971

Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp

@@void RemoteRenderingBackend::disconnect()
9292 m_gpuConnectionToWebProcess->connection().removeWorkQueueMessageReceiver(Messages::RemoteRenderingBackend::messageReceiverName(), m_renderingBackendIdentifier.toUInt64());
9393}
9494
 95void RemoteRenderingBackend::dispatch(Function<void()>&& task)
 96{
 97 m_workQueue->dispatch(WTFMove(task));
 98}
 99
95100IPC::Connection* RemoteRenderingBackend::messageSenderConnection() const
96101{
97102 return &m_gpuConnectionToWebProcess->connection();

Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h

@@public:
8080
8181 void disconnect();
8282
 83 // Runs Function in RemoteRenderingBackend task queue.
 84 void dispatch(Function<void()>&&);
 85
8386private:
8487 RemoteRenderingBackend(GPUConnectionToWebProcess&, RenderingBackendIdentifier, IPC::Semaphore&&);
8588

Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.cpp

3333#include "RemoteGraphicsContextGLMessages.h"
3434#include "RemoteGraphicsContextGLProxyMessages.h"
3535#include "WebProcess.h"
 36#include <WebCore/ImageBuffer.h>
3637
3738#if PLATFORM(COCOA)
3839#include <WebCore/GraphicsContextCG.h>

@@namespace WebKit {
4344
4445using namespace WebCore;
4546
46 RefPtr<RemoteGraphicsContextGLProxy> RemoteGraphicsContextGLProxy::create(const GraphicsContextGLAttributes& attributes)
 47RefPtr<RemoteGraphicsContextGLProxy> RemoteGraphicsContextGLProxy::create(const GraphicsContextGLAttributes& attributes, RenderingBackendIdentifier renderingBackend)
4748{
48  return adoptRef(new RemoteGraphicsContextGLProxy(WebProcess::singleton().ensureGPUProcessConnection(), attributes));
 49 return adoptRef(new RemoteGraphicsContextGLProxy(WebProcess::singleton().ensureGPUProcessConnection(), attributes, renderingBackend));
4950}
5051
51 RemoteGraphicsContextGLProxy::RemoteGraphicsContextGLProxy(GPUProcessConnection& gpuProcessConnection, const GraphicsContextGLAttributes& attrs)
52  : RemoteGraphicsContextGLProxyBase(attrs)
53  , m_gpuProcessConnection(&gpuProcessConnection)
 52RemoteGraphicsContextGLProxy::RemoteGraphicsContextGLProxy(GPUProcessConnection& connection, const GraphicsContextGLAttributes& attributes, RenderingBackendIdentifier renderingBackend)
 53 : RemoteGraphicsContextGLProxyBase(attributes)
 54 , m_gpuProcessConnection(&connection)
5455{
5556 gpuProcessConnection.addClient(*this);
5657 gpuProcessConnection.messageReceiverMap().addMessageReceiver(Messages::RemoteGraphicsContextGLProxy::messageReceiverName(), m_graphicsContextGLIdentifier.toUInt64(), *this);
57  connection().send(Messages::GPUConnectionToWebProcess::CreateGraphicsContextGL(attrs, m_graphicsContextGLIdentifier), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
 58 connection().send(Messages::GPUConnectionToWebProcess::CreateGraphicsContextGL(attributes, m_graphicsContextGLIdentifier, renderingBackend), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
5859}
5960
6061RemoteGraphicsContextGLProxy::~RemoteGraphicsContextGLProxy()

@@void RemoteGraphicsContextGLProxy::simulateContextChanged()
130131 notImplemented();
131132}
132133
133 void RemoteGraphicsContextGLProxy::paintRenderingResultsToCanvas(ImageBuffer*)
 134void RemoteGraphicsContextGLProxy::paintRenderingResultsToCanvas(ImageBuffer& buffer)
134135{
135  notImplemented();
 136 // FIXME: the buffer is "relatively empty" always, but for consistency, we need to ensure
 137 // no pending operations are targeted for the `buffer`.
 138 buffer.flushDrawingContext();
 139
 140 // FIXME: We cannot synchronize so that we would know no pending operations are using the `buffer`.
 141
 142 // FIXME: Currently RemoteImageBufferProxy::getImageData et al do not wait for the flushes of the images
 143 // inside the display lists. Rather, it assumes that processing its sequence (e.g. the display list) will equal to read flush being
 144 // fulfilled. For below, we cannot create a new flush id since we go through different sequence (RemoteGraphicsContextGL sequence)
 145
 146 // FIXME: Maybe implement IPC::Fence or something similar.
 147 auto sendResult = sendSync(Messages::RemoteGraphicsContextGL::PaintRenderingResultsToCanvas(buffer.renderingResourceIdentifier()), Messages::RemoteGraphicsContextGL::PaintRenderingResultsToCanvas::Reply());
 148 if (!sendResult) {
 149 markContextLost();
 150 return;
 151 }
136152}
137153
138 void RemoteGraphicsContextGLProxy::paintCompositedResultsToCanvas(ImageBuffer*)
 154void RemoteGraphicsContextGLProxy::paintCompositedResultsToCanvas(ImageBuffer& buffer)
139155{
140  notImplemented();
 156 buffer.flushDrawingContext();
 157 auto sendResult = sendSync(Messages::RemoteGraphicsContextGL::PaintCompositedResultsToCanvas(buffer.renderingResourceIdentifier()), Messages::RemoteGraphicsContextGL::PaintCompositedResultsToCanvas::Reply());
 158 if (!sendResult) {
 159 markContextLost();
 160 return;
 161 }
141162}
142163
143164void RemoteGraphicsContextGLProxy::synthesizeGLError(GCGLenum error)

Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextGLProxy.h

3333#include "MessageSender.h"
3434#include "RemoteGraphicsContextGLMessages.h"
3535#include "RemoteResourceCacheProxy.h"
 36#include "RenderingBackendIdentifier.h"
3637#include "WebCoreArgumentCoders.h"
3738#include <WebCore/NotImplemented.h>
3839#include <WebCore/RemoteGraphicsContextGLProxyBase.h>

@@class RemoteGraphicsContextGLProxy final
5051 , private GPUProcessConnection::Client
5152 , public WebCore::RemoteGraphicsContextGLProxyBase {
5253public:
53  static RefPtr<RemoteGraphicsContextGLProxy> create(const WebCore::GraphicsContextGLAttributes&);
 54 static RefPtr<RemoteGraphicsContextGLProxy> create(const WebCore::GraphicsContextGLAttributes&, RenderingBackendIdentifier);
5455 ~RemoteGraphicsContextGLProxy() final;
5556
5657 // IPC::MessageReceiver overrides.

@@public:
6364 void ensureExtensionEnabled(const String& extension) final;
6465 void notifyMarkContextChanged() final;
6566 void simulateContextChanged() final;
66  void paintRenderingResultsToCanvas(WebCore::ImageBuffer*) final;
67  void paintCompositedResultsToCanvas(WebCore::ImageBuffer*) final;
 67 void paintRenderingResultsToCanvas(WebCore::ImageBuffer&) final;
 68 void paintCompositedResultsToCanvas(WebCore::ImageBuffer&) final;
6869 void synthesizeGLError(GCGLenum error) final;
6970 GCGLenum getError() final;
7071

@@private:
356357 void disconnectGpuProcessIfNeeded();
357358 void abandonGpuProcess();
358359
359  RemoteGraphicsContextGLProxy(GPUProcessConnection&, const WebCore::GraphicsContextGLAttributes&);
 360 RemoteGraphicsContextGLProxy(GPUProcessConnection&, const WebCore::GraphicsContextGLAttributes&, RenderingBackendIdentifier);
360361 GPUProcessConnection* m_gpuProcessConnection;
361362 bool m_didInitialize { false };
362363 GCGLenum m_errorWhenContextIsLost = NO_ERROR;

Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp

@@void RemoteRenderingBackendProxy::connectToGPUProcess()
6565 auto& connection = WebProcess::singleton().ensureGPUProcessConnection();
6666 connection.addClient(*this);
6767 connection.messageReceiverMap().addMessageReceiver(Messages::RemoteRenderingBackendProxy::messageReceiverName(), m_renderingBackendIdentifier.toUInt64(), *this);
68  send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_renderingBackendIdentifier, m_resumeDisplayListSemaphore), 0);
 68 send(Messages::GPUConnectionToWebProcess::CreateRenderingBackend(m_renderingBackendIdentifier, m_resumeDisplayListSemaphore), 0, IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply);
6969}
7070
7171void RemoteRenderingBackendProxy::reestablishGPUProcessConnection()

Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h

@@public:
9898 DidReceiveBackendCreationResult waitForDidCreateImageBufferBackend();
9999 bool waitForDidFlush();
100100
 101 RenderingBackendIdentifier renderingBackendIdentifier() const { return m_renderingBackendIdentifier; }
101102private:
102103 RemoteRenderingBackendProxy();
103104

Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp

@@RefPtr<GraphicsContextGL> WebChromeClient::createGraphicsContextGL(const Graphic
929929 return nullptr;
930930 UNUSED_VARIABLE(hostWindowDisplayID);
931931#if PLATFORM(COCOA)
932  return RemoteGraphicsContextGLProxy::create(attributes);
 932 return RemoteGraphicsContextGLProxy::create(attributes, m_page.ensureRemoteRenderingBackendProxy().renderingBackendIdentifier());
933933#else
934934 return nullptr;
935935#endif

Tools/ChangeLog

 12021-02-12 Kimmo Kinnunen <kkinnunen@apple.com>
 2
 3 WebGL contexts do not work as source for Context2D drawImage calls in GPU process
 4 https://bugs.webkit.org/show_bug.cgi?id=221811
 5
 6 Reviewed by Darin Adler.
 7
 8 Update two signatures for manually implemented messages.
 9
 10 * Scripts/generate-gpup-webgl:
 11
1122021-02-18 Antoine Quint <graouts@webkit.org>
213
314 Page updates and rAF callbacks should run at a frequency close to 60Hz on high refresh-rate displays

Tools/Scripts/generate-gpup-webgl

@@messages -> RemoteGraphicsContextGL NotRefCounted {{
101101 void NotifyMarkContextChanged()
102102 void SynthesizeGLError(uint32_t error)
103103 void GetError() -> (uint32_t returnValue) Synchronous
 104 void PaintRenderingResultsToCanvas(WebCore::RenderingResourceIdentifier imageBuffer) -> () Synchronous
 105 void PaintCompositedResultsToCanvas(WebCore::RenderingResourceIdentifier imageBuffer) -> () Synchronous
 106
104107{}
105108}}
106109

LayoutTests/ChangeLog

 12021-02-12 Kimmo Kinnunen <kkinnunen@apple.com>
 2
 3 WebGL contexts do not work as source for Context2D drawImage calls in GPU process
 4 https://bugs.webkit.org/show_bug.cgi?id=221811
 5
 6 Reviewed by Darin Adler.
 7
 8 Remove now passing tests from the expectations.
 9
 10 * gpu-process/TestExpectations:
 11
1122021-02-17 Tyler Wilcock <twilco.o@protonmail.com>
213
314 Import CSS @counter-style WPTs

LayoutTests/gpu-process/TestExpectations

@@fast/canvas/canvas-large-dimensions.html [ Failure ]
1919fast/canvas/canvas-render-layer.html [ Failure ]
2020fast/canvas/hidpi-repaint-on-retina-leaves-bits-behind.html [ ImageOnlyFailure ]
2121fast/canvas/webgl/canvas-2d-webgl-texture.html [ Failure ]
22 fast/canvas/webgl/canvas-test.html [ Failure ]
2322fast/canvas/webgl/context-update-on-display-configuration.html [ Timeout ]
24 fast/canvas/webgl/gl-pixelstorei.html [ Failure ]
25 fast/canvas/webgl/lose-context-on-status-failure.html [ Failure ]
26 fast/canvas/webgl/premultiplyalpha-test.html [ Failure ]
2723fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565.html [ Failure ]
2824fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444.html [ Failure ]
2925fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551.html [ Failure ]

@@imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interfa
220216imported/w3c/web-platform-tests/webaudio/the-audio-api/the-destinationnode-interface/destination.html [ Failure ]
221217imported/w3c/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/no-cors.https.html [ Failure ]
222218
223 webgl/1.0.3/conformance/canvas/canvas-test.html [ Failure ]
224 webgl/1.0.3/conformance/canvas/draw-static-webgl-to-multiple-canvas-test.html [ Failure ]
225 webgl/1.0.3/conformance/canvas/draw-webgl-to-canvas-test.html [ Failure ]
226 webgl/1.0.3/conformance/canvas/to-data-url-test.html [ Failure ]
227 webgl/1.0.3/conformance/context/context-attribute-preserve-drawing-buffer.html [ Failure ]
228 webgl/1.0.3/conformance/context/premultiplyalpha-test.html [ Failure ]
229219webgl/1.0.3/conformance/extensions/oes-texture-float-with-canvas.html [ Failure ]
230220webgl/1.0.3/conformance/extensions/oes-texture-float-with-video.html [ Failure ]
231221webgl/1.0.3/conformance/extensions/oes-texture-half-float-with-canvas.html [ Failure ]
232222webgl/1.0.3/conformance/extensions/oes-texture-half-float-with-video.html [ Failure ]
233223webgl/1.0.3/conformance/rendering/many-draw-calls.html [ Timeout ]
234224webgl/1.0.3/conformance/state/gl-object-get-calls.html [ Timeout ]
235 webgl/1.0.3/conformance/textures/gl-pixelstorei.html [ Failure ]
236225webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgb565.html [ Failure ]
237226webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba4444.html [ Failure ]
238227webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-canvas-rgba5551.html [ Failure ]

@@webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-video-rgb565.ht
241230webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba4444.html [ Failure ]
242231webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-video-rgba5551.html [ Failure ]
243232webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-video.html [ Failure ]
244 webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-webgl-canvas-rgb565.html [ Failure ]
245 webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-webgl-canvas-rgba4444.html [ Failure ]
246 webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-webgl-canvas-rgba5551.html [ Failure ]
247 webgl/1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-webgl-canvas.html [ Failure ]
248233webgl/1.0.3/conformance/textures/tex-image-webgl.html [ Failure ]
249234webgl/1.0.3/conformance/textures/texparameter-test.html [ Failure ]
250235webgl/1.0.3/conformance/textures/texture-active-bind-2.html [ Failure ]
251236webgl/1.0.3/conformance/textures/texture-active-bind.html [ Failure ]
252237webgl/1.0.3/conformance/uniforms/uniform-samplers-test.html [ Timeout ]
253 webgl/2.0.0/conformance/canvas/canvas-test.html [ Failure ]
254 webgl/2.0.0/conformance/canvas/draw-static-webgl-to-multiple-canvas-test.html [ Failure ]
255 webgl/2.0.0/conformance/canvas/draw-webgl-to-canvas-test.html [ Failure ]
256 webgl/2.0.0/conformance/canvas/to-data-url-test.html [ Failure ]
257 webgl/2.0.0/conformance/context/context-attribute-preserve-drawing-buffer.html [ Failure ]
258 webgl/2.0.0/conformance/context/premultiplyalpha-test.html [ Failure ]
259238webgl/2.0.0/conformance/extensions/oes-texture-float-with-canvas.html [ Failure ]
260239webgl/2.0.0/conformance/extensions/oes-texture-float-with-video.html [ Failure ]
261240webgl/2.0.0/conformance/extensions/oes-texture-half-float-with-canvas.html [ Failure ]

@@webgl/2.0.0/conformance/textures/image_bitmap_from_image_bitmap/tex-2d-rgb-rgb-u
273252webgl/2.0.0/conformance/textures/image_bitmap_from_image_bitmap/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ]
274253webgl/2.0.0/conformance/textures/image_bitmap_from_image_bitmap/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ]
275254webgl/2.0.0/conformance/textures/image_bitmap_from_image_bitmap/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ]
276 webgl/2.0.0/conformance/textures/misc/gl-pixelstorei.html [ Failure ]
277255webgl/2.0.0/conformance/textures/misc/tex-image-webgl.html [ Failure ]
278256webgl/2.0.0/conformance/textures/misc/texture-active-bind-2.html [ Failure ]
279257webgl/2.0.0/conformance/textures/misc/texture-active-bind.html [ Failure ]

@@webgl/2.0.0/conformance/textures/video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html
282260webgl/2.0.0/conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ]
283261webgl/2.0.0/conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ]
284262webgl/2.0.0/conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ]
285 webgl/2.0.0/conformance/textures/webgl_canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ]
286 webgl/2.0.0/conformance/textures/webgl_canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ]
287 webgl/2.0.0/conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ]
288 webgl/2.0.0/conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ]
289 webgl/2.0.0/conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ]
290263webgl/2.0.0/conformance/uniforms/uniform-samplers-test.html [ Timeout ]
291264webgl/2.0.0/conformance2/reading/read-pixels-pack-parameters.html [ Failure ]
292265webgl/2.0.0/conformance2/state/gl-object-get-calls.html [ Timeout ]

@@webgl/2.0.0/conformance2/textures/canvas/tex-3d-rgba8-rgba-unsigned_byte.html [
352325webgl/2.0.0/conformance2/textures/canvas/tex-3d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
353326webgl/2.0.0/conformance2/textures/canvas/tex-3d-srgb8-rgb-unsigned_byte.html [ Failure ]
354327webgl/2.0.0/conformance2/textures/canvas/tex-3d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
355 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r11f_g11f_b10f-rgb-float.html [ Failure ]
356 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r11f_g11f_b10f-rgb-half_float.html [ Failure ]
357 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ Failure ]
358 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r16f-red-float.html [ Failure ]
359 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r16f-red-half_float.html [ Failure ]
360 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r32f-red-float.html [ Failure ]
361 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r8-red-unsigned_byte.html [ Failure ]
362 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ]
363 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rg16f-rg-float.html [ Failure ]
364 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rg16f-rg-half_float.html [ Failure ]
365 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rg32f-rg-float.html [ Failure ]
366 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rg8-rg-unsigned_byte.html [ Failure ]
367 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rg8ui-rg_integer-unsigned_byte.html [ Failure ]
368 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb16f-rgb-float.html [ Failure ]
369 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb16f-rgb-half_float.html [ Failure ]
370 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb32f-rgb-float.html [ Failure ]
371 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb565-rgb-unsigned_byte.html [ Failure ]
372 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb565-rgb-unsigned_short_5_6_5.html [ Failure ]
373 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ]
374 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html [ Failure ]
375 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb8-rgb-unsigned_byte.html [ Failure ]
376 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb8ui-rgb_integer-unsigned_byte.html [ Failure ]
377 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-float.html [ Failure ]
378 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-half_float.html [ Failure ]
379 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba16f-rgba-float.html [ Failure ]
380 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba16f-rgba-half_float.html [ Failure ]
381 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba32f-rgba-float.html [ Failure ]
382 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba4-rgba-unsigned_byte.html [ Failure ]
383 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html [ Failure ]
384 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba8-rgba-unsigned_byte.html [ Failure ]
385 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
386 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-srgb8-rgb-unsigned_byte.html [ Failure ]
387 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
388 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r11f_g11f_b10f-rgb-float.html [ Failure ]
389 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r11f_g11f_b10f-rgb-half_float.html [ Failure ]
390 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ Failure ]
391 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r16f-red-float.html [ Failure ]
392 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r16f-red-half_float.html [ Failure ]
393 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r32f-red-float.html [ Failure ]
394 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r8-red-unsigned_byte.html [ Failure ]
395 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-r8ui-red_integer-unsigned_byte.html [ Failure ]
396 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rg16f-rg-float.html [ Failure ]
397 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rg16f-rg-half_float.html [ Failure ]
398 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rg32f-rg-float.html [ Failure ]
399 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rg8-rg-unsigned_byte.html [ Failure ]
400 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rg8ui-rg_integer-unsigned_byte.html [ Failure ]
401 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb16f-rgb-float.html [ Failure ]
402 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb16f-rgb-half_float.html [ Failure ]
403 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb32f-rgb-float.html [ Failure ]
404 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb565-rgb-unsigned_byte.html [ Failure ]
405 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb565-rgb-unsigned_short_5_6_5.html [ Failure ]
406 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb5_a1-rgba-unsigned_byte.html [ Failure ]
407 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html [ Failure ]
408 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb8-rgb-unsigned_byte.html [ Failure ]
409 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb8ui-rgb_integer-unsigned_byte.html [ Failure ]
410 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb9_e5-rgb-float.html [ Failure ]
411 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgb9_e5-rgb-half_float.html [ Failure ]
412 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba16f-rgba-float.html [ Failure ]
413 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba16f-rgba-half_float.html [ Failure ]
414 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba32f-rgba-float.html [ Failure ]
415 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba4-rgba-unsigned_byte.html [ Failure ]
416 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html [ Failure ]
417 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba8-rgba-unsigned_byte.html [ Failure ]
418 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
419 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-srgb8-rgb-unsigned_byte.html [ Failure ]
420 webgl/2.0.0/conformance2/textures/canvas_sub_rectangle/tex-3d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
421328webgl/2.0.0/conformance2/textures/image_bitmap_from_image_bitmap/tex-2d-r11f_g11f_b10f-rgb-float.html [ Failure ]
422329webgl/2.0.0/conformance2/textures/image_bitmap_from_image_bitmap/tex-2d-r11f_g11f_b10f-rgb-half_float.html [ Failure ]
423330webgl/2.0.0/conformance2/textures/image_bitmap_from_image_bitmap/tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ Failure ]

@@webgl/2.0.0/conformance2/textures/video/tex-3d-rgba8-rgba-unsigned_byte.html [ F
550457webgl/2.0.0/conformance2/textures/video/tex-3d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
551458webgl/2.0.0/conformance2/textures/video/tex-3d-srgb8-rgb-unsigned_byte.html [ Failure ]
552459webgl/2.0.0/conformance2/textures/video/tex-3d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
553 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r11f_g11f_b10f-rgb-float.html [ Failure ]
554 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r11f_g11f_b10f-rgb-half_float.html [ Failure ]
555 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ Failure ]
556 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r16f-red-float.html [ Failure ]
557 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r16f-red-half_float.html [ Failure ]
558 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r32f-red-float.html [ Failure ]
559 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r8-red-unsigned_byte.html [ Failure ]
560 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-r8ui-red_integer-unsigned_byte.html [ Failure ]
561 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rg16f-rg-float.html [ Failure ]
562 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rg16f-rg-half_float.html [ Failure ]
563 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rg32f-rg-float.html [ Failure ]
564 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rg8-rg-unsigned_byte.html [ Failure ]
565 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rg8ui-rg_integer-unsigned_byte.html [ Failure ]
566 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb16f-rgb-float.html [ Failure ]
567 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb16f-rgb-half_float.html [ Failure ]
568 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb32f-rgb-float.html [ Failure ]
569 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb565-rgb-unsigned_byte.html [ Failure ]
570 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb565-rgb-unsigned_short_5_6_5.html [ Failure ]
571 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ]
572 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html [ Failure ]
573 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb8-rgb-unsigned_byte.html [ Failure ]
574 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgb8ui-rgb_integer-unsigned_byte.html [ Failure ]
575 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba16f-rgba-float.html [ Failure ]
576 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba16f-rgba-half_float.html [ Failure ]
577 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba32f-rgba-float.html [ Failure ]
578 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba4-rgba-unsigned_byte.html [ Failure ]
579 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba4-rgba-unsigned_short_4_4_4_4.html [ Failure ]
580 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba8-rgba-unsigned_byte.html [ Failure ]
581 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
582 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-srgb8-rgb-unsigned_byte.html [ Failure ]
583 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
584 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r11f_g11f_b10f-rgb-float.html [ Failure ]
585 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r11f_g11f_b10f-rgb-half_float.html [ Failure ]
586 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ Failure ]
587 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r16f-red-float.html [ Failure ]
588 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r16f-red-half_float.html [ Failure ]
589 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r32f-red-float.html [ Failure ]
590 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r8-red-unsigned_byte.html [ Failure ]
591 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-r8ui-red_integer-unsigned_byte.html [ Failure ]
592 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rg16f-rg-float.html [ Failure ]
593 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rg16f-rg-half_float.html [ Failure ]
594 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rg32f-rg-float.html [ Failure ]
595 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rg8-rg-unsigned_byte.html [ Failure ]
596 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rg8ui-rg_integer-unsigned_byte.html [ Failure ]
597 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb16f-rgb-float.html [ Failure ]
598 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb16f-rgb-half_float.html [ Failure ]
599 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb32f-rgb-float.html [ Failure ]
600 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb565-rgb-unsigned_byte.html [ Failure ]
601 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb565-rgb-unsigned_short_5_6_5.html [ Failure ]
602 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb5_a1-rgba-unsigned_byte.html [ Failure ]
603 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb5_a1-rgba-unsigned_short_5_5_5_1.html [ Failure ]
604 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb8-rgb-unsigned_byte.html [ Failure ]
605 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgb8ui-rgb_integer-unsigned_byte.html [ Failure ]
606 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba16f-rgba-float.html [ Failure ]
607 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba16f-rgba-half_float.html [ Failure ]
608 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba32f-rgba-float.html [ Failure ]
609 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba4-rgba-unsigned_byte.html [ Failure ]
610 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba4-rgba-unsigned_short_4_4_4_4.html [ Failure ]
611 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba8-rgba-unsigned_byte.html [ Failure ]
612 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-rgba8ui-rgba_integer-unsigned_byte.html [ Failure ]
613 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-srgb8-rgb-unsigned_byte.html [ Failure ]
614 webgl/2.0.0/conformance2/textures/webgl_canvas/tex-3d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ]
615460webgl/many-contexts-access-after-loss.html [ Failure ]
616461webgl/max-active-contexts-console-warning.html [ Failure ]
617462webgl/max-active-contexts-gc.html [ Failure ]