OLD | NEW |
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 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 } | 448 } |
449 m_context->flush(); | 449 m_context->flush(); |
450 } | 450 } |
451 | 451 |
452 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l
evel)) | 452 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l
evel)) |
453 return false; | 453 return false; |
454 | 454 |
455 // Contexts may be in a different share group. We must transfer the texture
through a mailbox first | 455 // Contexts may be in a different share group. We must transfer the texture
through a mailbox first |
456 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo()); | 456 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo()); |
457 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name); | 457 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name); |
458 m_context->bindTexture(GL_TEXTURE_2D, textureId); | 458 m_context->produceTextureDirectCHROMIUM(textureId, GL_TEXTURE_2D, bufferMail
box->mailbox.name); |
459 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name
); | |
460 m_context->flush(); | 459 m_context->flush(); |
461 | 460 |
462 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); | 461 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); |
463 | 462 |
464 if (!context->makeContextCurrent()) | 463 if (!context->makeContextCurrent()) |
465 return false; | 464 return false; |
466 | 465 |
467 Platform3DObject sourceTexture = context->createTexture(); | |
468 | |
469 // TODO(bajones): Should be able to change the texture bindings here without
reverting but | |
470 // something else in the system is depending on it. Failing to revert causes
WebGL | |
471 // tests to fail. We should find out why and fix it. | |
472 GLint boundTexture = 0; | |
473 context->getIntegerv(GL_TEXTURE_BINDING_2D, &boundTexture); | |
474 context->bindTexture(GL_TEXTURE_2D, sourceTexture); | |
475 context->waitSyncPoint(bufferMailbox->mailbox.syncPoint); | 466 context->waitSyncPoint(bufferMailbox->mailbox.syncPoint); |
476 context->consumeTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name); | 467 Platform3DObject sourceTexture = context->createAndConsumeTextureCHROMIUM(GL
_TEXTURE_2D, bufferMailbox->mailbox.name); |
477 | 468 |
478 bool unpackPremultiplyAlphaNeeded = false; | 469 bool unpackPremultiplyAlphaNeeded = false; |
479 bool unpackUnpremultiplyAlphaNeeded = false; | 470 bool unpackUnpremultiplyAlphaNeeded = false; |
480 if (m_actualAttributes.alpha && m_actualAttributes.premultipliedAlpha && !pr
emultiplyAlpha) | 471 if (m_actualAttributes.alpha && m_actualAttributes.premultipliedAlpha && !pr
emultiplyAlpha) |
481 unpackUnpremultiplyAlphaNeeded = true; | 472 unpackUnpremultiplyAlphaNeeded = true; |
482 else if (m_actualAttributes.alpha && !m_actualAttributes.premultipliedAlpha
&& premultiplyAlpha) | 473 else if (m_actualAttributes.alpha && !m_actualAttributes.premultipliedAlpha
&& premultiplyAlpha) |
483 unpackPremultiplyAlphaNeeded = true; | 474 unpackPremultiplyAlphaNeeded = true; |
484 | 475 |
485 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, unpackUnpremu
ltiplyAlphaNeeded); | 476 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, unpackUnpremu
ltiplyAlphaNeeded); |
486 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, unpackPremultip
lyAlphaNeeded); | 477 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, unpackPremultip
lyAlphaNeeded); |
487 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, flipY); | 478 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, flipY); |
488 context->copyTextureCHROMIUM(GL_TEXTURE_2D, sourceTexture, texture, level, i
nternalFormat, destType); | 479 context->copyTextureCHROMIUM(GL_TEXTURE_2D, sourceTexture, texture, level, i
nternalFormat, destType); |
489 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, false); | 480 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, false); |
490 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, false); | 481 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, false); |
491 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false); | 482 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false); |
492 | 483 |
493 context->bindTexture(GL_TEXTURE_2D, boundTexture); | |
494 context->deleteTexture(sourceTexture); | 484 context->deleteTexture(sourceTexture); |
495 | 485 |
496 context->flush(); | 486 context->flush(); |
497 m_context->waitSyncPoint(context->insertSyncPoint()); | 487 m_context->waitSyncPoint(context->insertSyncPoint()); |
498 | 488 |
499 return true; | 489 return true; |
500 } | 490 } |
501 | 491 |
502 Platform3DObject DrawingBuffer::framebuffer() const | 492 Platform3DObject DrawingBuffer::framebuffer() const |
503 { | 493 { |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1073 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) | 1063 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) |
1074 { | 1064 { |
1075 if (info->imageId) { | 1065 if (info->imageId) { |
1076 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); | 1066 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); |
1077 m_context->destroyImageCHROMIUM(info->imageId); | 1067 m_context->destroyImageCHROMIUM(info->imageId); |
1078 info->imageId = 0; | 1068 info->imageId = 0; |
1079 } | 1069 } |
1080 } | 1070 } |
1081 | 1071 |
1082 } // namespace WebCore | 1072 } // namespace WebCore |
OLD | NEW |