PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<WebGraphicsContext3DProvider> contextProvider, const IntSize& size, bool premultipliedAlpha, bool wantAlphaChannel, bool wantDepthBuffer, bool wantStencilBuffer, bool wantAntialiasing, PreserveDrawingBuffer preserve) { ASSERT(contextProvider); if (shouldFailDrawingBufferCreationForTesting) { shouldFailDrawingBufferCreationForTesting = false; return nullptr; } OwnPtr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create(contextProvider->contextGL()); if (!extensionsUtil->isValid()) { // This might be the first time we notice that the GL context is lost. return nullptr; } ASSERT(extensionsUtil->supportsExtension("GL_OES_packed_depth_stencil")); extensionsUtil->ensureExtensionEnabled("GL_OES_packed_depth_stencil"); bool multisampleSupported = wantAntialiasing && (extensionsUtil->supportsExtension("GL_CHROMIUM_framebuffer_multisample") || extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_texture")) && extensionsUtil->supportsExtension("GL_OES_rgb8_rgba8"); if (multisampleSupported) { extensionsUtil->ensureExtensionEnabled("GL_OES_rgb8_rgba8"); if (extensionsUtil->supportsExtension("GL_CHROMIUM_framebuffer_multisample")) extensionsUtil->ensureExtensionEnabled("GL_CHROMIUM_framebuffer_multisample"); else extensionsUtil->ensureExtensionEnabled("GL_EXT_multisampled_render_to_texture"); } bool discardFramebufferSupported = extensionsUtil->supportsExtension("GL_EXT_discard_framebuffer"); if (discardFramebufferSupported) extensionsUtil->ensureExtensionEnabled("GL_EXT_discard_framebuffer"); RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(std::move(contextProvider), extensionsUtil.release(), discardFramebufferSupported, wantAlphaChannel, premultipliedAlpha, preserve, wantDepthBuffer, wantStencilBuffer)); if (!drawingBuffer->initialize(size, multisampleSupported)) { drawingBuffer->beginDestruction(); return PassRefPtr<DrawingBuffer>(); } return drawingBuffer.release(); }