Index: trunk/Source/platform/graphics/gpu/DrawingBuffer.cpp |
=================================================================== |
--- trunk/Source/platform/graphics/gpu/DrawingBuffer.cpp (revision 168480) |
+++ trunk/Source/platform/graphics/gpu/DrawingBuffer.cpp (working copy) |
@@ -77,10 +77,9 @@ |
Platform3DObject m_oldTextureUnitZeroId; |
}; |
-PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<blink::WebGraphicsContext3D> context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvictionManager> contextEvictionManager) |
+PassRefPtr<DrawingBuffer> DrawingBuffer::create(blink::WebGraphicsContext3D* context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvictionManager> contextEvictionManager) |
{ |
- ASSERT(context); |
- Extensions3DUtil extensionsUtil(context.get()); |
+ Extensions3DUtil extensionsUtil(context); |
bool multisampleSupported = extensionsUtil.supportsExtension("GL_CHROMIUM_framebuffer_multisample") |
&& extensionsUtil.supportsExtension("GL_OES_rgb8_rgba8"); |
if (multisampleSupported) { |
@@ -91,13 +90,12 @@ |
if (packedDepthStencilSupported) |
extensionsUtil.ensureExtensionEnabled("GL_OES_packed_depth_stencil"); |
- RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, multisampleSupported, packedDepthStencilSupported, preserve, contextEvictionManager)); |
- if (!drawingBuffer->initialize(size)) |
- return PassRefPtr<DrawingBuffer>(); |
+ RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, size, multisampleSupported, packedDepthStencilSupported, preserve, contextEvictionManager)); |
return drawingBuffer.release(); |
} |
-DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context, |
+DrawingBuffer::DrawingBuffer(blink::WebGraphicsContext3D* context, |
+ const IntSize& size, |
bool multisampleExtensionSupported, |
bool packedDepthStencilExtensionSupported, |
PreserveDrawingBuffer preserve, |
@@ -126,12 +124,12 @@ |
, m_colorFormat(0) |
, m_internalRenderbufferFormat(0) |
, m_maxTextureSize(0) |
- , m_sampleCount(0) |
, m_packAlignment(4) |
, m_contextEvictionManager(contextEvictionManager) |
{ |
// Used by browser tests to detect the use of a DrawingBuffer. |
TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation"); |
+ initialize(size); |
} |
DrawingBuffer::~DrawingBuffer() |
@@ -158,12 +156,12 @@ |
blink::WebGraphicsContext3D* DrawingBuffer::context() |
{ |
- return m_context.get(); |
+ return m_context; |
} |
bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap) |
{ |
- if (!m_contentsChanged) |
+ if (!m_context || !m_contentsChanged) |
return false; |
m_context->makeContextCurrent(); |
@@ -184,7 +182,7 @@ |
// We must restore the texture binding since creating new textures, |
// consuming and producing mailboxes changes it. |
- ScopedTextureUnit0BindingRestorer restorer(m_context.get(), m_activeTextureUnit, m_texture2DBinding); |
+ ScopedTextureUnit0BindingRestorer restorer(m_context, m_activeTextureUnit, m_texture2DBinding); |
// First try to recycle an old buffer. |
RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox(); |
@@ -247,7 +245,7 @@ |
PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::recycledMailbox() |
{ |
- if (m_recycledMailboxes.isEmpty()) |
+ if (!m_context || m_recycledMailboxes.isEmpty()) |
return PassRefPtr<MailboxInfo>(); |
RefPtr<MailboxInfo> mailboxInfo = m_recycledMailboxes.last().release(); |
@@ -277,10 +275,11 @@ |
return returnMailbox.release(); |
} |
-bool DrawingBuffer::initialize(const IntSize& size) |
+void DrawingBuffer::initialize(const IntSize& size) |
{ |
+ ASSERT(m_context); |
m_attributes = m_context->getContextAttributes(); |
- Extensions3DUtil extensionsUtil(m_context.get()); |
+ Extensions3DUtil extensionsUtil(m_context); |
if (m_attributes.alpha) { |
m_internalColorFormat = GL_RGBA; |
@@ -313,12 +312,12 @@ |
else |
m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer, 0); |
createSecondaryBuffers(); |
- return reset(size); |
+ reset(size); |
} |
bool DrawingBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, bool premultiplyAlpha, bool flipY) |
{ |
- if (!m_context->makeContextCurrent()) |
+ if (!m_context || !m_context->makeContextCurrent()) |
return false; |
if (m_contentsChanged) { |
if (m_multisampleMode != None) { |
@@ -364,6 +363,9 @@ |
blink::WebLayer* DrawingBuffer::platformLayer() |
{ |
+ if (!m_context) |
+ return 0; |
+ |
if (!m_layer) { |
m_layer = adoptPtr(blink::Platform::current()->compositorSupport()->createExternalTextureLayer(this)); |
@@ -378,7 +380,7 @@ |
void DrawingBuffer::paintCompositedResultsToCanvas(ImageBuffer* imageBuffer) |
{ |
- if (!m_context->makeContextCurrent() || m_context->getGraphicsResetStatusARB() != GL_NO_ERROR) |
+ if (!m_context || !m_context->makeContextCurrent() || m_context->getGraphicsResetStatusARB() != GL_NO_ERROR) |
return; |
if (!imageBuffer) |
@@ -419,37 +421,40 @@ |
if (m_layer) |
m_layer->clearTexture(); |
- m_context->flush(); |
+ if (m_context) |
+ m_context->flush(); |
} |
void DrawingBuffer::releaseResources() |
{ |
- m_context->makeContextCurrent(); |
+ if (m_context) { |
+ m_context->makeContextCurrent(); |
- clearPlatformLayer(); |
+ clearPlatformLayer(); |
- for (size_t i = 0; i < m_textureMailboxes.size(); i++) |
- m_context->deleteTexture(m_textureMailboxes[i]->textureId); |
+ for (size_t i = 0; i < m_textureMailboxes.size(); i++) |
+ m_context->deleteTexture(m_textureMailboxes[i]->textureId); |
- if (m_multisampleColorBuffer) |
- m_context->deleteRenderbuffer(m_multisampleColorBuffer); |
+ if (m_multisampleColorBuffer) |
+ m_context->deleteRenderbuffer(m_multisampleColorBuffer); |
- if (m_depthStencilBuffer) |
- m_context->deleteRenderbuffer(m_depthStencilBuffer); |
+ if (m_depthStencilBuffer) |
+ m_context->deleteRenderbuffer(m_depthStencilBuffer); |
- if (m_depthBuffer) |
- m_context->deleteRenderbuffer(m_depthBuffer); |
+ if (m_depthBuffer) |
+ m_context->deleteRenderbuffer(m_depthBuffer); |
- if (m_stencilBuffer) |
- m_context->deleteRenderbuffer(m_stencilBuffer); |
+ if (m_stencilBuffer) |
+ m_context->deleteRenderbuffer(m_stencilBuffer); |
- if (m_multisampleFBO) |
- m_context->deleteFramebuffer(m_multisampleFBO); |
+ if (m_multisampleFBO) |
+ m_context->deleteFramebuffer(m_multisampleFBO); |
- if (m_fbo) |
- m_context->deleteFramebuffer(m_fbo); |
+ if (m_fbo) |
+ m_context->deleteFramebuffer(m_fbo); |
- m_context.clear(); |
+ m_context = 0; |
+ } |
setSize(IntSize()); |
@@ -474,6 +479,9 @@ |
unsigned DrawingBuffer::createColorTexture(const IntSize& size) |
{ |
+ if (!m_context) |
+ return 0; |
+ |
unsigned offscreenColorTexture = m_context->createTexture(); |
if (!offscreenColorTexture) |
return 0; |
@@ -590,6 +598,9 @@ |
void DrawingBuffer::clearFramebuffers(GLbitfield clearMask) |
{ |
+ if (!m_context) |
+ return; |
+ |
// We will clear the multisample FBO, but we also need to clear the non-multisampled buffer. |
if (m_multisampleFBO) { |
m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); |
@@ -657,9 +668,11 @@ |
return adjustedSize; |
} |
-bool DrawingBuffer::reset(const IntSize& newSize) |
+void DrawingBuffer::reset(const IntSize& newSize) |
{ |
- ASSERT(!newSize.isEmpty()); |
+ if (!m_context) |
+ return; |
+ |
IntSize adjustedSize; |
bool evictContext = false; |
bool isNewContext = m_size.isEmpty(); |
@@ -669,7 +682,7 @@ |
adjustedSize = adjustSize(newSize); |
if (adjustedSize.isEmpty()) |
- return false; |
+ return; |
if (evictContext) |
m_contextEvictionManager->forciblyLoseOldestContext("WARNING: WebGL contexts have exceeded the maximum allowed backbuffer area. Oldest context will be lost."); |
@@ -687,7 +700,7 @@ |
setSize(adjustedSize); |
if (adjustedSize.isEmpty()) |
- return false; |
+ return; |
} |
m_context->disable(GL_SCISSOR_TEST); |
@@ -707,11 +720,13 @@ |
} |
clearFramebuffers(clearMask); |
- return true; |
} |
void DrawingBuffer::commit(long x, long y, long width, long height) |
{ |
+ if (!m_context) |
+ return; |
+ |
if (width < 0) |
width = m_size.width(); |
if (height < 0) |
@@ -739,7 +754,7 @@ |
void DrawingBuffer::restoreFramebufferBinding() |
{ |
- if (!m_framebufferBinding) |
+ if (!m_context || !m_framebufferBinding) |
return; |
m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding); |
@@ -752,6 +767,9 @@ |
void DrawingBuffer::bind() |
{ |
+ if (!m_context) |
+ return; |
+ |
m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleFBO : m_fbo); |
} |