| Index: Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| index 607a68216facf6a5eb479a95ecc0656f587caf7c..96b2d6c800d6ccc54b37488eb9ea737980a945c3 100644
|
| --- a/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| +++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| @@ -81,24 +81,29 @@ private:
|
| PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<blink::WebGraphicsContext3D> context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvictionManager> contextEvictionManager)
|
| {
|
| ASSERT(context);
|
| - Extensions3DUtil extensionsUtil(context.get());
|
| - bool multisampleSupported = extensionsUtil.supportsExtension("GL_CHROMIUM_framebuffer_multisample")
|
| - && extensionsUtil.supportsExtension("GL_OES_rgb8_rgba8");
|
| + OwnPtr<Extensions3DUtil> extensionsUtil = Extensions3DUtil::create(context.get());
|
| + if (!extensionsUtil) {
|
| + // This might be the first time we notice that the WebGraphicsContext3D is lost.
|
| + return nullptr;
|
| + }
|
| + bool multisampleSupported = extensionsUtil->supportsExtension("GL_CHROMIUM_framebuffer_multisample")
|
| + && extensionsUtil->supportsExtension("GL_OES_rgb8_rgba8");
|
| if (multisampleSupported) {
|
| - extensionsUtil.ensureExtensionEnabled("GL_CHROMIUM_framebuffer_multisample");
|
| - extensionsUtil.ensureExtensionEnabled("GL_OES_rgb8_rgba8");
|
| + extensionsUtil->ensureExtensionEnabled("GL_CHROMIUM_framebuffer_multisample");
|
| + extensionsUtil->ensureExtensionEnabled("GL_OES_rgb8_rgba8");
|
| }
|
| - bool packedDepthStencilSupported = extensionsUtil.supportsExtension("GL_OES_packed_depth_stencil");
|
| + bool packedDepthStencilSupported = extensionsUtil->supportsExtension("GL_OES_packed_depth_stencil");
|
| if (packedDepthStencilSupported)
|
| - extensionsUtil.ensureExtensionEnabled("GL_OES_packed_depth_stencil");
|
| + extensionsUtil->ensureExtensionEnabled("GL_OES_packed_depth_stencil");
|
|
|
| - RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, multisampleSupported, packedDepthStencilSupported, preserve, contextEvictionManager));
|
| + RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, extensionsUtil.release(), multisampleSupported, packedDepthStencilSupported, preserve, contextEvictionManager));
|
| if (!drawingBuffer->initialize(size))
|
| return PassRefPtr<DrawingBuffer>();
|
| return drawingBuffer.release();
|
| }
|
|
|
| DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context,
|
| + PassOwnPtr<Extensions3DUtil> extensionsUtil,
|
| bool multisampleExtensionSupported,
|
| bool packedDepthStencilExtensionSupported,
|
| PreserveDrawingBuffer preserve,
|
| @@ -109,6 +114,7 @@ DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context,
|
| , m_framebufferBinding(0)
|
| , m_activeTextureUnit(GL_TEXTURE0)
|
| , m_context(context)
|
| + , m_extensionsUtil(extensionsUtil)
|
| , m_size(-1, -1)
|
| , m_multisampleExtensionSupported(multisampleExtensionSupported)
|
| , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupported)
|
| @@ -281,8 +287,18 @@ PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox(unsigned
|
|
|
| bool DrawingBuffer::initialize(const IntSize& size)
|
| {
|
| + if (!m_context->makeContextCurrent()) {
|
| + // Most likely the GPU process exited and the attempt to reconnect to it failed.
|
| + // Need to try to restore the context again later.
|
| + return false;
|
| + }
|
| +
|
| + if (m_context->isContextLost()) {
|
| + // Need to try to restore the context again later.
|
| + return false;
|
| + }
|
| +
|
| m_attributes = m_context->getContextAttributes();
|
| - Extensions3DUtil extensionsUtil(m_context.get());
|
|
|
| if (m_attributes.alpha) {
|
| m_internalColorFormat = GL_RGBA;
|
| @@ -301,7 +317,7 @@ bool DrawingBuffer::initialize(const IntSize& size)
|
| if (m_attributes.antialias && m_multisampleExtensionSupported) {
|
| m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount);
|
| m_multisampleMode = ExplicitResolve;
|
| - if (extensionsUtil.supportsExtension("GL_EXT_multisampled_render_to_texture"))
|
| + if (m_extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_texture"))
|
| m_multisampleMode = ImplicitResolve;
|
| }
|
| m_sampleCount = std::min(4, maxSampleCount);
|
|
|