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

Side by Side Diff: Source/platform/graphics/gpu/DrawingBuffer.cpp

Issue 274833002: Enable WebGL rendering into ImageCHROMIUM, backed by a scanout buffer to enable overlay suppor… (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Comments Created 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "config.h" 31 #include "config.h"
32 32
33 #include "platform/graphics/gpu/DrawingBuffer.h" 33 #include "platform/graphics/gpu/DrawingBuffer.h"
34 34
35 #include "RuntimeEnabledFeatures.h"
35 #include <algorithm> 36 #include <algorithm>
36 #include "platform/TraceEvent.h" 37 #include "platform/TraceEvent.h"
37 #include "platform/graphics/GraphicsLayer.h" 38 #include "platform/graphics/GraphicsLayer.h"
38 #include "platform/graphics/gpu/Extensions3DUtil.h" 39 #include "platform/graphics/gpu/Extensions3DUtil.h"
39 #include "public/platform/Platform.h" 40 #include "public/platform/Platform.h"
40 #include "public/platform/WebCompositorSupport.h" 41 #include "public/platform/WebCompositorSupport.h"
41 #include "public/platform/WebExternalBitmap.h" 42 #include "public/platform/WebExternalBitmap.h"
42 #include "public/platform/WebExternalTextureLayer.h" 43 #include "public/platform/WebExternalTextureLayer.h"
43 #include "public/platform/WebGraphicsContext3D.h" 44 #include "public/platform/WebGraphicsContext3D.h"
44 #include "public/platform/WebGraphicsContext3DProvider.h" 45 #include "public/platform/WebGraphicsContext3DProvider.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 , m_scissorEnabled(false) 123 , m_scissorEnabled(false)
123 , m_texture2DBinding(0) 124 , m_texture2DBinding(0)
124 , m_framebufferBinding(0) 125 , m_framebufferBinding(0)
125 , m_activeTextureUnit(GL_TEXTURE0) 126 , m_activeTextureUnit(GL_TEXTURE0)
126 , m_context(context) 127 , m_context(context)
127 , m_extensionsUtil(extensionsUtil) 128 , m_extensionsUtil(extensionsUtil)
128 , m_size(-1, -1) 129 , m_size(-1, -1)
129 , m_multisampleExtensionSupported(multisampleExtensionSupported) 130 , m_multisampleExtensionSupported(multisampleExtensionSupported)
130 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d) 131 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d)
131 , m_fbo(0) 132 , m_fbo(0)
132 , m_colorBuffer(0)
133 , m_frontColorBuffer(0)
134 , m_depthStencilBuffer(0) 133 , m_depthStencilBuffer(0)
135 , m_depthBuffer(0) 134 , m_depthBuffer(0)
136 , m_stencilBuffer(0) 135 , m_stencilBuffer(0)
137 , m_multisampleFBO(0) 136 , m_multisampleFBO(0)
138 , m_multisampleColorBuffer(0) 137 , m_multisampleColorBuffer(0)
139 , m_contentsChanged(true) 138 , m_contentsChanged(true)
140 , m_contentsChangeCommitted(false) 139 , m_contentsChangeCommitted(false)
141 , m_layerComposited(false) 140 , m_layerComposited(false)
142 , m_multisampleMode(None) 141 , m_multisampleMode(None)
143 , m_internalColorFormat(0) 142 , m_internalColorFormat(0)
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 220
222 // We must restore the texture binding since creating new textures, 221 // We must restore the texture binding since creating new textures,
223 // consuming and producing mailboxes changes it. 222 // consuming and producing mailboxes changes it.
224 ScopedTextureUnit0BindingRestorer restorer(m_context.get(), m_activeTextureU nit, m_texture2DBinding); 223 ScopedTextureUnit0BindingRestorer restorer(m_context.get(), m_activeTextureU nit, m_texture2DBinding);
225 224
226 // First try to recycle an old buffer. 225 // First try to recycle an old buffer.
227 RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox(); 226 RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox();
228 227
229 // No buffer available to recycle, create a new one. 228 // No buffer available to recycle, create a new one.
230 if (!frontColorBufferMailbox) { 229 if (!frontColorBufferMailbox) {
231 unsigned newColorBuffer = createColorTexture(m_size); 230 TextureInfo newTexture;
231 newTexture.textureId = createColorTexture();
232 allocateTextureMemory(&newTexture, m_size);
232 // Bad things happened, abandon ship. 233 // Bad things happened, abandon ship.
233 if (!newColorBuffer) 234 if (!newTexture.textureId)
234 return false; 235 return false;
235 236
236 frontColorBufferMailbox = createNewMailbox(newColorBuffer); 237 frontColorBufferMailbox = createNewMailbox(newTexture);
237 } 238 }
238 239
239 if (m_preserveDrawingBuffer == Discard) { 240 if (m_preserveDrawingBuffer == Discard) {
240 swap(frontColorBufferMailbox->textureId, m_colorBuffer); 241 swap(frontColorBufferMailbox->textureInfo, m_colorBuffer);
241 // It appears safe to overwrite the context's framebuffer binding in the Discard case since there will always be a 242 // It appears safe to overwrite the context's framebuffer binding in the Discard case since there will always be a
242 // WebGLRenderingContext::clearIfComposited() call made before the next draw call which restores the framebuffer binding. 243 // WebGLRenderingContext::clearIfComposited() call made before the next draw call which restores the framebuffer binding.
243 // If this stops being true at some point, we should track the current f ramebuffer binding in the DrawingBuffer and restore 244 // If this stops being true at some point, we should track the current f ramebuffer binding in the DrawingBuffer and restore
244 // it after attaching the new back buffer here. 245 // it after attaching the new back buffer here.
245 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 246 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
246 if (m_multisampleMode == ImplicitResolve) 247 if (m_multisampleMode == ImplicitResolve)
247 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COL OR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer, 0, m_sampleCount); 248 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COL OR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount);
248 else 249 else
249 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 , GL_TEXTURE_2D, m_colorBuffer, 0); 250 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 , GL_TEXTURE_2D, m_colorBuffer.textureId, 0);
250 } else { 251 } else {
251 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer, frontColorB ufferMailbox->textureId, 0, GL_RGBA, GL_UNSIGNED_BYTE); 252 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer.textureId, f rontColorBufferMailbox->textureInfo.textureId, 0, GL_RGBA, GL_UNSIGNED_BYTE);
252 } 253 }
253 254
254 if (m_multisampleMode != None && !m_framebufferBinding) 255 if (m_multisampleMode != None && !m_framebufferBinding)
255 bind(); 256 bind();
256 else 257 else
257 restoreFramebufferBinding(); 258 restoreFramebufferBinding();
258 259
259 m_contentsChanged = false; 260 m_contentsChanged = false;
260 261
261 m_context->bindTexture(GL_TEXTURE_2D, frontColorBufferMailbox->textureId); 262 m_context->bindTexture(GL_TEXTURE_2D, frontColorBufferMailbox->textureInfo.t extureId);
262 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, frontColorBufferMailbox->ma ilbox.name); 263 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, frontColorBufferMailbox->ma ilbox.name);
263 m_context->flush(); 264 m_context->flush();
264 frontColorBufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); 265 frontColorBufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint();
266 frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->tex tureInfo.imageId != 0;
265 markLayerComposited(); 267 markLayerComposited();
266 268
267 // set m_parentDrawingBuffer to make sure 'this' stays alive as long as it h as live mailboxes 269 // set m_parentDrawingBuffer to make sure 'this' stays alive as long as it h as live mailboxes
268 ASSERT(!frontColorBufferMailbox->m_parentDrawingBuffer); 270 ASSERT(!frontColorBufferMailbox->m_parentDrawingBuffer);
269 frontColorBufferMailbox->m_parentDrawingBuffer = this; 271 frontColorBufferMailbox->m_parentDrawingBuffer = this;
270 *outMailbox = frontColorBufferMailbox->mailbox; 272 *outMailbox = frontColorBufferMailbox->mailbox;
271 m_frontColorBuffer = frontColorBufferMailbox->textureId; 273 m_frontColorBuffer = frontColorBufferMailbox->textureInfo;
272 return true; 274 return true;
273 } 275 }
274 276
275 void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mail box) 277 void DrawingBuffer::mailboxReleased(const blink::WebExternalTextureMailbox& mail box)
276 { 278 {
277 if (m_destructionInProgress) { 279 if (m_destructionInProgress) {
278 mailboxReleasedWhileDestructionInProgress(mailbox); 280 mailboxReleasedWhileDestructionInProgress(mailbox);
279 return; 281 return;
280 } 282 }
281 283
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 } 317 }
316 } 318 }
317 ASSERT(mailboxInfo); 319 ASSERT(mailboxInfo);
318 320
319 if (mailboxInfo->mailbox.syncPoint) { 321 if (mailboxInfo->mailbox.syncPoint) {
320 m_context->waitSyncPoint(mailboxInfo->mailbox.syncPoint); 322 m_context->waitSyncPoint(mailboxInfo->mailbox.syncPoint);
321 mailboxInfo->mailbox.syncPoint = 0; 323 mailboxInfo->mailbox.syncPoint = 0;
322 } 324 }
323 325
324 if (mailboxInfo->size != m_size) { 326 if (mailboxInfo->size != m_size) {
325 m_context->bindTexture(GL_TEXTURE_2D, mailboxInfo->textureId); 327 m_context->bindTexture(GL_TEXTURE_2D, mailboxInfo->textureInfo.textureId );
326 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, m_size.w idth(), m_size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE); 328 allocateTextureMemory(&mailboxInfo->textureInfo, m_size);
327 mailboxInfo->size = m_size; 329 mailboxInfo->size = m_size;
328 } 330 }
329 331
330 return mailboxInfo.release(); 332 return mailboxInfo.release();
331 } 333 }
332 334
333 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox(unsigned textureId) 335 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox(const Tex tureInfo& info)
334 { 336 {
335 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo()); 337 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo());
336 m_context->genMailboxCHROMIUM(returnMailbox->mailbox.name); 338 m_context->genMailboxCHROMIUM(returnMailbox->mailbox.name);
337 returnMailbox->textureId = textureId; 339 returnMailbox->textureInfo = info;
338 returnMailbox->size = m_size; 340 returnMailbox->size = m_size;
339 m_textureMailboxes.append(returnMailbox); 341 m_textureMailboxes.append(returnMailbox);
340 return returnMailbox.release(); 342 return returnMailbox.release();
341 } 343 }
342 344
343 void DrawingBuffer::deleteMailbox(const blink::WebExternalTextureMailbox& mailbo x) 345 void DrawingBuffer::deleteMailbox(const blink::WebExternalTextureMailbox& mailbo x)
344 { 346 {
345 for (size_t i = 0; i < m_textureMailboxes.size(); i++) { 347 for (size_t i = 0; i < m_textureMailboxes.size(); i++) {
346 if (nameEquals(m_textureMailboxes[i]->mailbox, mailbox)) { 348 if (nameEquals(m_textureMailboxes[i]->mailbox, mailbox)) {
347 if (mailbox.syncPoint) 349 if (mailbox.syncPoint)
348 m_context->waitSyncPoint(mailbox.syncPoint); 350 m_context->waitSyncPoint(mailbox.syncPoint);
349 m_context->deleteTexture(m_textureMailboxes[i]->textureId); 351
352 deleteChromiumImageForTexture(m_textureMailboxes[i]->textureInfo);
353
354 m_context->deleteTexture(m_textureMailboxes[i]->textureInfo.textureI d);
350 m_textureMailboxes.remove(i); 355 m_textureMailboxes.remove(i);
351 return; 356 return;
352 } 357 }
353 } 358 }
354 ASSERT_NOT_REACHED(); 359 ASSERT_NOT_REACHED();
355 } 360 }
356 361
357 bool DrawingBuffer::initialize(const IntSize& size) 362 bool DrawingBuffer::initialize(const IntSize& size)
358 { 363 {
359 if (!m_context->makeContextCurrent()) { 364 if (!m_context->makeContextCurrent()) {
(...skipping 27 matching lines...) Expand all
387 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount); 392 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount);
388 m_multisampleMode = ExplicitResolve; 393 m_multisampleMode = ExplicitResolve;
389 if (m_extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_t exture")) 394 if (m_extensionsUtil->supportsExtension("GL_EXT_multisampled_render_to_t exture"))
390 m_multisampleMode = ImplicitResolve; 395 m_multisampleMode = ImplicitResolve;
391 } 396 }
392 m_sampleCount = std::min(4, maxSampleCount); 397 m_sampleCount = std::min(4, maxSampleCount);
393 398
394 m_fbo = m_context->createFramebuffer(); 399 m_fbo = m_context->createFramebuffer();
395 400
396 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 401 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
397 m_colorBuffer = createColorTexture(); 402 m_colorBuffer.textureId = createColorTexture();
398 if (m_multisampleMode == ImplicitResolve) 403 if (m_multisampleMode == ImplicitResolve)
399 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer, 0, m_sampleCount); 404 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount);
400 else 405 else
401 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, m_colorBuffer, 0); 406 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, m_colorBuffer.textureId, 0);
402 createSecondaryBuffers(); 407 createSecondaryBuffers();
403 return reset(size); 408 return reset(size);
404 } 409 }
405 410
406 bool DrawingBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, b ool premultiplyAlpha, bool flipY) 411 bool DrawingBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, b ool premultiplyAlpha, bool flipY)
407 { 412 {
408 if (!m_context->makeContextCurrent()) 413 if (!m_context->makeContextCurrent())
409 return false; 414 return false;
410 if (m_contentsChanged) { 415 if (m_contentsChanged) {
411 if (m_multisampleMode != None) { 416 if (m_multisampleMode != None) {
412 commit(); 417 commit();
413 if (!m_framebufferBinding) 418 if (!m_framebufferBinding)
414 bind(); 419 bind();
415 else 420 else
416 restoreFramebufferBinding(); 421 restoreFramebufferBinding();
417 } 422 }
418 m_context->flush(); 423 m_context->flush();
419 } 424 }
420 425
421 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l evel)) 426 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l evel))
422 return false; 427 return false;
423 428
424 // Contexts may be in a different share group. We must transfer the texture through a mailbox first 429 // Contexts may be in a different share group. We must transfer the texture through a mailbox first
425 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo()); 430 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo());
426 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name); 431 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name);
427 m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer); 432 m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer.textureId);
428 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name ); 433 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name );
429 m_context->flush(); 434 m_context->flush();
430 435
431 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); 436 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint();
432 437
433 if (!context->makeContextCurrent()) 438 if (!context->makeContextCurrent())
434 return false; 439 return false;
435 440
436 Platform3DObject sourceTexture = context->createTexture(); 441 Platform3DObject sourceTexture = context->createTexture();
437 442
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 { 496 {
492 if (!m_context->makeContextCurrent() || m_context->getGraphicsResetStatusARB () != GL_NO_ERROR) 497 if (!m_context->makeContextCurrent() || m_context->getGraphicsResetStatusARB () != GL_NO_ERROR)
493 return; 498 return;
494 499
495 if (!imageBuffer) 500 if (!imageBuffer)
496 return; 501 return;
497 Platform3DObject tex = imageBuffer->getBackingTexture(); 502 Platform3DObject tex = imageBuffer->getBackingTexture();
498 if (tex) { 503 if (tex) {
499 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo()); 504 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo());
500 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name); 505 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name);
501 m_context->bindTexture(GL_TEXTURE_2D, m_frontColorBuffer); 506 m_context->bindTexture(GL_TEXTURE_2D, m_frontColorBuffer.textureId);
502 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox. name); 507 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox. name);
503 m_context->flush(); 508 m_context->flush();
504 509
505 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); 510 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint();
506 OwnPtr<blink::WebGraphicsContext3DProvider> provider = 511 OwnPtr<blink::WebGraphicsContext3DProvider> provider =
507 adoptPtr(blink::Platform::current()->createSharedOffscreenGraphicsCo ntext3DProvider()); 512 adoptPtr(blink::Platform::current()->createSharedOffscreenGraphicsCo ntext3DProvider());
508 if (!provider) 513 if (!provider)
509 return; 514 return;
510 blink::WebGraphicsContext3D* context = provider->context3d(); 515 blink::WebGraphicsContext3D* context = provider->context3d();
511 if (!context || !context->makeContextCurrent()) 516 if (!context || !context->makeContextCurrent())
(...skipping 11 matching lines...) Expand all
523 context->deleteTexture(sourceTexture); 528 context->deleteTexture(sourceTexture);
524 context->flush(); 529 context->flush();
525 m_context->waitSyncPoint(context->insertSyncPoint()); 530 m_context->waitSyncPoint(context->insertSyncPoint());
526 return; 531 return;
527 } 532 }
528 533
529 // Since the m_frontColorBuffer was produced and sent to the compositor, it cannot be bound to an fbo. 534 // Since the m_frontColorBuffer was produced and sent to the compositor, it cannot be bound to an fbo.
530 // We have to make a copy of it here and bind that copy instead. 535 // We have to make a copy of it here and bind that copy instead.
531 // FIXME: That's not true any more, provided we don't change texture 536 // FIXME: That's not true any more, provided we don't change texture
532 // parameters. 537 // parameters.
533 unsigned sourceTexture = createColorTexture(m_size); 538 unsigned sourceTexture = createColorTexture();
534 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_frontColorBuffer, sourceText ure, 0, GL_RGBA, GL_UNSIGNED_BYTE); 539 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, m_size.width (), m_size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE);
540 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_frontColorBuffer.textureId, sourceTexture, 0, GL_RGBA, GL_UNSIGNED_BYTE);
535 541
536 // Since we're using the same context as WebGL, we have to restore any state we change (in this case, just the framebuffer binding). 542 // Since we're using the same context as WebGL, we have to restore any state we change (in this case, just the framebuffer binding).
537 // FIXME: The WebGLRenderingContext tracks the current framebuffer binding, it would be slightly more efficient to use this value 543 // FIXME: The WebGLRenderingContext tracks the current framebuffer binding, it would be slightly more efficient to use this value
538 // rather than querying it off of the context. 544 // rather than querying it off of the context.
539 GLint previousFramebuffer = 0; 545 GLint previousFramebuffer = 0;
540 m_context->getIntegerv(GL_FRAMEBUFFER_BINDING, &previousFramebuffer); 546 m_context->getIntegerv(GL_FRAMEBUFFER_BINDING, &previousFramebuffer);
541 547
542 Platform3DObject framebuffer = m_context->createFramebuffer(); 548 Platform3DObject framebuffer = m_context->createFramebuffer();
543 m_context->bindFramebuffer(GL_FRAMEBUFFER, framebuffer); 549 m_context->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
544 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEX TURE_2D, sourceTexture, 0); 550 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEX TURE_2D, sourceTexture, 0);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 587
582 if (m_depthStencilBuffer) 588 if (m_depthStencilBuffer)
583 m_context->deleteRenderbuffer(m_depthStencilBuffer); 589 m_context->deleteRenderbuffer(m_depthStencilBuffer);
584 590
585 if (m_depthBuffer) 591 if (m_depthBuffer)
586 m_context->deleteRenderbuffer(m_depthBuffer); 592 m_context->deleteRenderbuffer(m_depthBuffer);
587 593
588 if (m_stencilBuffer) 594 if (m_stencilBuffer)
589 m_context->deleteRenderbuffer(m_stencilBuffer); 595 m_context->deleteRenderbuffer(m_stencilBuffer);
590 596
591 if (m_colorBuffer) 597 if (m_colorBuffer.textureId) {
592 m_context->deleteTexture(m_colorBuffer); 598 deleteChromiumImageForTexture(m_colorBuffer);
599 m_context->deleteTexture(m_colorBuffer.textureId);
600 }
593 601
594 setSize(IntSize()); 602 setSize(IntSize());
595 603
596 m_colorBuffer = 0; 604 m_colorBuffer = TextureInfo();
597 m_frontColorBuffer = 0; 605 m_frontColorBuffer = TextureInfo();
598 m_multisampleColorBuffer = 0; 606 m_multisampleColorBuffer = 0;
599 m_depthStencilBuffer = 0; 607 m_depthStencilBuffer = 0;
600 m_depthBuffer = 0; 608 m_depthBuffer = 0;
601 m_stencilBuffer = 0; 609 m_stencilBuffer = 0;
602 m_multisampleFBO = 0; 610 m_multisampleFBO = 0;
603 m_fbo = 0; 611 m_fbo = 0;
604 m_contextEvictionManager.clear(); 612 m_contextEvictionManager.clear();
605 613
606 if (m_layer) 614 if (m_layer)
607 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); 615 GraphicsLayer::unregisterContentsLayer(m_layer->layer());
608 } 616 }
609 617
610 unsigned DrawingBuffer::createColorTexture(const IntSize& size) 618 unsigned DrawingBuffer::createColorTexture()
611 { 619 {
612 unsigned offscreenColorTexture = m_context->createTexture(); 620 unsigned offscreenColorTexture = m_context->createTexture();
613 if (!offscreenColorTexture) 621 if (!offscreenColorTexture)
614 return 0; 622 return 0;
615 623
616 m_context->bindTexture(GL_TEXTURE_2D, offscreenColorTexture); 624 m_context->bindTexture(GL_TEXTURE_2D, offscreenColorTexture);
617 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 625 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
618 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 626 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
619 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ; 627 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ;
620 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) ; 628 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) ;
621 if (!size.isEmpty())
622 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, size.wid th(), size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE);
623 629
624 return offscreenColorTexture; 630 return offscreenColorTexture;
625 } 631 }
626 632
627 void DrawingBuffer::createSecondaryBuffers() 633 void DrawingBuffer::createSecondaryBuffers()
628 { 634 {
629 // create a multisample FBO 635 // create a multisample FBO
630 if (m_multisampleMode == ExplicitResolve) { 636 if (m_multisampleMode == ExplicitResolve) {
631 m_multisampleFBO = m_context->createFramebuffer(); 637 m_multisampleFBO = m_context->createFramebuffer();
632 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); 638 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO);
633 m_multisampleColorBuffer = m_context->createRenderbuffer(); 639 m_multisampleColorBuffer = m_context->createRenderbuffer();
634 } 640 }
635 } 641 }
636 642
637 bool DrawingBuffer::resizeFramebuffer(const IntSize& size) 643 bool DrawingBuffer::resizeFramebuffer(const IntSize& size)
638 { 644 {
639 // resize regular FBO 645 // resize regular FBO
640 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 646 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
641 647
642 m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer); 648 m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer.textureId);
643 649
644 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, size.width() , size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE); 650 allocateTextureMemory(&m_colorBuffer, size);
645 651
646 if (m_multisampleMode == ImplicitResolve) 652 if (m_multisampleMode == ImplicitResolve)
647 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer, 0, m_sampleCount); 653 m_context->framebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_COLOR_A TTACHMENT0, GL_TEXTURE_2D, m_colorBuffer.textureId, 0, m_sampleCount);
648 else 654 else
649 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, m_colorBuffer, 0); 655 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, m_colorBuffer.textureId, 0);
650 656
651 m_context->bindTexture(GL_TEXTURE_2D, 0); 657 m_context->bindTexture(GL_TEXTURE_2D, 0);
652 658
653 if (m_multisampleMode != ExplicitResolve) 659 if (m_multisampleMode != ExplicitResolve)
654 resizeDepthStencil(size); 660 resizeDepthStencil(size);
655 if (m_context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMP LETE) 661 if (m_context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMP LETE)
656 return false; 662 return false;
657 663
658 return true; 664 return true;
659 } 665 }
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 memcpy(rowA, scanline, rowBytes); 1019 memcpy(rowA, scanline, rowBytes);
1014 } 1020 }
1015 } 1021 }
1016 1022
1017 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint unpackAlignment) 1023 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint unpackAlignment)
1018 { 1024 {
1019 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4 || unpackAlignment == 8); 1025 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4 || unpackAlignment == 8);
1020 m_context->texImage2D(target, level, internalformat, width, height, border, format, type, 0); 1026 m_context->texImage2D(target, level, internalformat, width, height, border, format, type, 0);
1021 } 1027 }
1022 1028
1029 void DrawingBuffer::allocateTextureMemory(TextureInfo* info, const IntSize& size )
1030 {
1031 if (RuntimeEnabledFeatures::webGLImageChromiumEnabled()) {
1032 deleteChromiumImageForTexture(*info);
1033
1034 info->imageId = m_context->createImageCHROMIUM(size.width(), size.height (), GL_RGBA8_OES, GC3D_IMAGE_SCANOUT_CHROMIUM);
1035 if (info->imageId) {
1036 m_context->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId);
1037 return;
1038 }
1039 }
1040
1041 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, size.width() , size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE);
1042 }
1043
1044 void DrawingBuffer::deleteChromiumImageForTexture(const TextureInfo& info)
1045 {
1046 if (info.imageId) {
1047 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info.imageId);
1048 m_context->destroyImageCHROMIUM(info.imageId);
Ken Russell (switch to Gerrit) 2014/05/20 00:25:12 It might be clearer if this took a non-const Textu
1049 }
1050 }
1051
1023 } // namespace WebCore 1052 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/platform/graphics/gpu/DrawingBuffer.h ('k') | Source/platform/graphics/gpu/DrawingBufferTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698