Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1596)

Unified Diff: Source/platform/graphics/gpu/DrawingBuffer.cpp

Issue 1160493002: Determine WebGL back-buffer on Mali-400 GPU Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/platform/graphics/gpu/DrawingBuffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/platform/graphics/gpu/DrawingBuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698