Index: Source/platform/graphics/gpu/DrawingBuffer.cpp |
diff --git a/Source/platform/graphics/gpu/DrawingBuffer.cpp b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
index aa528a3b761c82c8ed8dd9b4e8eaa86145009398..73fe9ee0feaf9f0c15b55bf5aef078177b982527 100644 |
--- a/Source/platform/graphics/gpu/DrawingBuffer.cpp |
+++ b/Source/platform/graphics/gpu/DrawingBuffer.cpp |
@@ -105,6 +105,7 @@ 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)); |
+ drawingBuffer->validateBackbuffer(); |
if (!drawingBuffer->initialize(size)) { |
drawingBuffer->beginDestruction(); |
return PassRefPtr<DrawingBuffer>(); |
@@ -403,7 +404,9 @@ bool DrawingBuffer::initialize(const IntSize& size) |
return false; |
} |
- if (m_requestedAttributes.alpha) { |
+ // Type of color format should be selected based on |
+ // alpha attribute & texture format supported on GPU's |
+ if (m_requestedAttributes.alpha || !isRGBTextureSupported()) { |
m_internalColorFormat = GL_RGBA; |
m_colorFormat = GL_RGBA; |
m_internalRenderbufferFormat = GL_RGBA8_OES; |
@@ -763,8 +766,18 @@ bool DrawingBuffer::reset(const IntSize& newSize) |
} |
m_context->disable(GL_SCISSOR_TEST); |
- m_context->clearColor(0, 0, 0, 0); |
- m_context->colorMask(true, true, true, true); |
+ |
+ if (!m_requestedAttributes.alpha && !isRGBTextureSupported()) { |
+ // This case signifies that requested alpha attribute is false, even though |
+ // DrawingBuffer choosen backbuffer as GL_RGBA format (due to GPU limitations). |
+ // 1. So ensure alpha channel should be cleared to 1.0 |
+ // 2. colormask should be disabled (Turn off rendering to alpha) |
+ m_context->clearColor(0, 0, 0, 1); |
+ m_context->colorMask(true, true, true, false); |
Ken Russell (switch to Gerrit)
2015/04/06 21:43:18
This won't work -- the color mask applies to clear
|
+ } else { |
+ m_context->clearColor(0, 0, 0, 0); |
+ m_context->colorMask(true, true, true, true); |
+ } |
GLbitfield clearMask = GL_COLOR_BUFFER_BIT; |
if (m_actualAttributes.depth) { |
@@ -987,4 +1000,24 @@ void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) |
} |
} |
+void DrawingBuffer::validateBackbuffer() |
+{ |
+ // One time validation is required for GL_RGB texture |
Ken Russell (switch to Gerrit)
2015/04/06 21:43:18
I'm sorry, but I'm not comfortable doing this code
Ken Russell (switch to Gerrit)
2015/04/06 21:44:54
Also -- on request from another engineer on Blink,
|
+ // 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) |
Ken Russell (switch to Gerrit)
2015/04/06 21:43:18
Also m_context_>bindFramebuffer(GL_FRAMEBUFFER, 0)
|
+ m_context->deleteFramebuffer(fbo); |
+ |
+ if (offscreenRGBTexture) |
+ m_context->deleteTexture(offscreenRGBTexture); |
+} |
+ |
} // namespace blink |