| Index: Source/platform/graphics/gpu/DrawingBuffer.cpp
 | 
| diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp
 | 
| index 007c41bbc667e6ebc322b765ccb90b5195a5beb0..db38a9e5e27a53186642fac4cc624e268a771cbc 100644
 | 
| --- a/Source/platform/graphics/gpu/DrawingBuffer.cpp
 | 
| +++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp
 | 
| @@ -105,6 +105,11 @@ PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<WebGraphicsContext3D>
 | 
|          extensionsUtil->ensureExtensionEnabled("GL_EXT_discard_framebuffer");
 | 
|  
 | 
|      RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, extensionsUtil.release(), multisampleSupported, packedDepthStencilSupported, discardFramebufferSupported, preserve, requestedAttributes));
 | 
| +    Platform::current()->getGPUBlackList(&drawingBuffer->m_gpuBlackList);
 | 
| +    // determineRGBTextureSupport() if GL_RGB not supported
 | 
| +    if (!drawingBuffer->gpuBlackList().IsRGBTextureSupported())
 | 
| +        drawingBuffer->determineRGBTextureSupport();
 | 
| +
 | 
|      if (!drawingBuffer->initialize(size)) {
 | 
|          drawingBuffer->beginDestruction();
 | 
|          return PassRefPtr<DrawingBuffer>();
 | 
| @@ -150,6 +155,7 @@ DrawingBuffer::DrawingBuffer(PassOwnPtr<WebGraphicsContext3D> context,
 | 
|      , m_destructionInProgress(false)
 | 
|      , m_isHidden(false)
 | 
|      , m_filterQuality(kLow_SkFilterQuality)
 | 
| +    , m_RGBTextureSupported(true)
 | 
|  {
 | 
|      // Used by browser tests to detect the use of a DrawingBuffer.
 | 
|      TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation", TRACE_EVENT_SCOPE_GLOBAL);
 | 
| @@ -403,7 +409,7 @@ bool DrawingBuffer::initialize(const IntSize& size)
 | 
|          return false;
 | 
|      }
 | 
|  
 | 
| -    if (m_requestedAttributes.alpha) {
 | 
| +    if (m_requestedAttributes.alpha || !isRGBTextureSupported()) {
 | 
|          m_internalColorFormat = GL_RGBA;
 | 
|          m_colorFormat = GL_RGBA;
 | 
|          m_internalRenderbufferFormat = GL_RGBA8_OES;
 | 
| @@ -715,6 +721,9 @@ void DrawingBuffer::clearFramebuffers(GLbitfield clearMask)
 | 
|  
 | 
|      m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleFBO : m_fbo);
 | 
|      m_context->clear(clearMask);
 | 
| +
 | 
| +    if (!m_requestedAttributes.alpha && !isRGBTextureSupported())
 | 
| +        m_context->colorMask(true, true, true, false);
 | 
|  }
 | 
|  
 | 
|  void DrawingBuffer::setSize(const IntSize& size)
 | 
| @@ -987,4 +996,26 @@ void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info)
 | 
|      }
 | 
|  }
 | 
|  
 | 
| +void DrawingBuffer::determineRGBTextureSupport()
 | 
| +{
 | 
| +    // One time validation is required for GL_RGB texture
 | 
| +    // so that DrawingBuffer can choose format for the backbuffer correctly.
 | 
| +    // DrawingBuffer tries to allocate GL_RGB texture in case of alpha attribute false
 | 
| +    // and fails because GL_RGB not supported on specific GPU's (e.g Mali- 2/3/400 family).
 | 
| +    Platform3DObject fbo = m_context->createFramebuffer();
 | 
| +    m_context->bindFramebuffer(GL_FRAMEBUFFER, fbo);
 | 
| +    unsigned offscreenRGBTexture = createColorTexture();
 | 
| +    m_context->texImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
 | 
| +    m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, offscreenRGBTexture, 0);
 | 
| +    m_RGBTextureSupported = m_context->checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE;
 | 
| +
 | 
| +    if (fbo) {
 | 
| +        m_context->deleteFramebuffer(fbo);
 | 
| +        m_context->bindFramebuffer(GL_FRAMEBUFFER, 0);
 | 
| +    }
 | 
| +
 | 
| +    if (offscreenRGBTexture)
 | 
| +        m_context->deleteTexture(offscreenRGBTexture);
 | 
| +}
 | 
| +
 | 
|  } // namespace blink
 | 
| 
 |