| 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 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 if (m_contentsChanged) { | 322 if (m_contentsChanged) { |
| 323 if (m_multisampleMode != None) { | 323 if (m_multisampleMode != None) { |
| 324 commit(); | 324 commit(); |
| 325 if (!m_framebufferBinding) | 325 if (!m_framebufferBinding) |
| 326 bind(); | 326 bind(); |
| 327 else | 327 else |
| 328 restoreFramebufferBinding(); | 328 restoreFramebufferBinding(); |
| 329 } | 329 } |
| 330 m_context->flush(); | 330 m_context->flush(); |
| 331 } | 331 } |
| 332 Platform3DObject sourceTexture = m_colorBuffer; | 332 |
| 333 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l
evel)) |
| 334 return false; |
| 335 |
| 336 // Contexts may be in a different share group. We must transfer the texture
through a mailbox first |
| 337 RefPtr<MailboxInfo> bufferMailbox = adoptRef(new MailboxInfo()); |
| 338 m_context->genMailboxCHROMIUM(bufferMailbox->mailbox.name); |
| 339 m_context->bindTexture(GL_TEXTURE_2D, m_colorBuffer); |
| 340 m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name
); |
| 341 m_context->flush(); |
| 342 |
| 343 bufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); |
| 333 | 344 |
| 334 if (!context->makeContextCurrent()) | 345 if (!context->makeContextCurrent()) |
| 335 return false; | 346 return false; |
| 336 | 347 |
| 337 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(internalFormat, destType, l
evel)) | 348 Platform3DObject sourceTexture = context->createTexture(); |
| 338 return false; | 349 |
| 350 // TODO(bajones): Should be able to change the texture bindings here without
reverting but |
| 351 // something else in the system is depending on it. Failing to revert causes
WebGL |
| 352 // tests to fail. We should find out why and fix it. |
| 353 GLint boundTexture = 0; |
| 354 context->getIntegerv(GL_TEXTURE_BINDING_2D, &boundTexture); |
| 355 context->bindTexture(GL_TEXTURE_2D, sourceTexture); |
| 356 context->waitSyncPoint(bufferMailbox->mailbox.syncPoint); |
| 357 context->consumeTextureCHROMIUM(GL_TEXTURE_2D, bufferMailbox->mailbox.name); |
| 339 | 358 |
| 340 bool unpackPremultiplyAlphaNeeded = false; | 359 bool unpackPremultiplyAlphaNeeded = false; |
| 341 bool unpackUnpremultiplyAlphaNeeded = false; | 360 bool unpackUnpremultiplyAlphaNeeded = false; |
| 342 if (m_attributes.alpha && m_attributes.premultipliedAlpha && !premultiplyAlp
ha) | 361 if (m_attributes.alpha && m_attributes.premultipliedAlpha && !premultiplyAlp
ha) |
| 343 unpackUnpremultiplyAlphaNeeded = true; | 362 unpackUnpremultiplyAlphaNeeded = true; |
| 344 else if (m_attributes.alpha && !m_attributes.premultipliedAlpha && premultip
lyAlpha) | 363 else if (m_attributes.alpha && !m_attributes.premultipliedAlpha && premultip
lyAlpha) |
| 345 unpackPremultiplyAlphaNeeded = true; | 364 unpackPremultiplyAlphaNeeded = true; |
| 346 | 365 |
| 347 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, unpackUnpremu
ltiplyAlphaNeeded); | 366 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, unpackUnpremu
ltiplyAlphaNeeded); |
| 348 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, unpackPremultip
lyAlphaNeeded); | 367 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, unpackPremultip
lyAlphaNeeded); |
| 349 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, flipY); | 368 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, flipY); |
| 350 context->copyTextureCHROMIUM(GL_TEXTURE_2D, sourceTexture, texture, level, i
nternalFormat, destType); | 369 context->copyTextureCHROMIUM(GL_TEXTURE_2D, sourceTexture, texture, level, i
nternalFormat, destType); |
| 351 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, false); | 370 context->pixelStorei(GC3D_UNPACK_FLIP_Y_CHROMIUM, false); |
| 352 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, false); | 371 context->pixelStorei(GC3D_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, false); |
| 353 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false); | 372 context->pixelStorei(GC3D_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, false); |
| 373 |
| 374 context->bindTexture(GL_TEXTURE_2D, boundTexture); |
| 375 context->deleteTexture(sourceTexture); |
| 376 |
| 354 context->flush(); | 377 context->flush(); |
| 378 m_context->waitSyncPoint(context->insertSyncPoint()); |
| 355 | 379 |
| 356 return true; | 380 return true; |
| 357 } | 381 } |
| 358 | 382 |
| 359 Platform3DObject DrawingBuffer::framebuffer() const | 383 Platform3DObject DrawingBuffer::framebuffer() const |
| 360 { | 384 { |
| 361 return m_fbo; | 385 return m_fbo; |
| 362 } | 386 } |
| 363 | 387 |
| 364 blink::WebLayer* DrawingBuffer::platformLayer() | 388 blink::WebLayer* DrawingBuffer::platformLayer() |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 } | 920 } |
| 897 } | 921 } |
| 898 | 922 |
| 899 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in
ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum
type, GLint unpackAlignment) | 923 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in
ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum
type, GLint unpackAlignment) |
| 900 { | 924 { |
| 901 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4
|| unpackAlignment == 8); | 925 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4
|| unpackAlignment == 8); |
| 902 m_context->texImage2D(target, level, internalformat, width, height, border,
format, type, 0); | 926 m_context->texImage2D(target, level, internalformat, width, height, border,
format, type, 0); |
| 903 } | 927 } |
| 904 | 928 |
| 905 } // namespace WebCore | 929 } // namespace WebCore |
| OLD | NEW |