Chromium Code Reviews| 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 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 DrawingBuffer::DrawingBuffer(PassOwnPtr<WebGraphicsContext3D> context, | 128 DrawingBuffer::DrawingBuffer(PassOwnPtr<WebGraphicsContext3D> context, |
| 129 PassOwnPtr<Extensions3DUtil> extensionsUtil, | 129 PassOwnPtr<Extensions3DUtil> extensionsUtil, |
| 130 bool multisampleExtensionSupported, | 130 bool multisampleExtensionSupported, |
| 131 bool packedDepthStencilExtensionSupported, | 131 bool packedDepthStencilExtensionSupported, |
| 132 bool discardFramebufferSupported, | 132 bool discardFramebufferSupported, |
| 133 PreserveDrawingBuffer preserve, | 133 PreserveDrawingBuffer preserve, |
| 134 WebGraphicsContext3D::Attributes requestedAttributes) | 134 WebGraphicsContext3D::Attributes requestedAttributes) |
| 135 : m_preserveDrawingBuffer(preserve) | 135 : m_preserveDrawingBuffer(preserve) |
| 136 , m_scissorEnabled(false) | 136 , m_scissorEnabled(false) |
| 137 , m_texture2DBinding(0) | 137 , m_texture2DBinding(0) |
| 138 , m_framebufferBinding(0) | 138 , m_drawFramebufferBinding(0) |
| 139 , m_readFramebufferBinding(0) | |
| 139 , m_activeTextureUnit(GL_TEXTURE0) | 140 , m_activeTextureUnit(GL_TEXTURE0) |
| 140 , m_context(context) | 141 , m_context(context) |
| 141 , m_extensionsUtil(extensionsUtil) | 142 , m_extensionsUtil(extensionsUtil) |
| 142 , m_size(-1, -1) | 143 , m_size(-1, -1) |
| 143 , m_requestedAttributes(requestedAttributes) | 144 , m_requestedAttributes(requestedAttributes) |
| 144 , m_multisampleExtensionSupported(multisampleExtensionSupported) | 145 , m_multisampleExtensionSupported(multisampleExtensionSupported) |
| 145 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d) | 146 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d) |
| 146 , m_discardFramebufferSupported(discardFramebufferSupported) | 147 , m_discardFramebufferSupported(discardFramebufferSupported) |
| 147 , m_fbo(0) | 148 , m_fbo(0) |
| 148 , m_depthStencilBuffer(0) | 149 , m_depthStencilBuffer(0) |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 | 295 |
| 295 if (m_discardFramebufferSupported) { | 296 if (m_discardFramebufferSupported) { |
| 296 // Explicitly discard framebuffer to save GPU memory bandwidth for t ile-based GPU arch. | 297 // Explicitly discard framebuffer to save GPU memory bandwidth for t ile-based GPU arch. |
| 297 const WGC3Denum attachments[3] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_AT TACHMENT, GL_STENCIL_ATTACHMENT}; | 298 const WGC3Denum attachments[3] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_AT TACHMENT, GL_STENCIL_ATTACHMENT}; |
| 298 m_context->discardFramebufferEXT(GL_FRAMEBUFFER, 3, attachments); | 299 m_context->discardFramebufferEXT(GL_FRAMEBUFFER, 3, attachments); |
| 299 } | 300 } |
| 300 } else { | 301 } else { |
| 301 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer.textureId, f rontColorBufferMailbox->textureInfo.textureId, GL_RGBA, GL_UNSIGNED_BYTE); | 302 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_colorBuffer.textureId, f rontColorBufferMailbox->textureInfo.textureId, GL_RGBA, GL_UNSIGNED_BYTE); |
| 302 } | 303 } |
| 303 | 304 |
| 304 restoreFramebufferBinding(); | 305 restoreFramebufferBindings(); |
| 305 m_contentsChanged = false; | 306 m_contentsChanged = false; |
| 306 | 307 |
| 307 m_context->produceTextureDirectCHROMIUM(frontColorBufferMailbox->textureInfo .textureId, GL_TEXTURE_2D, frontColorBufferMailbox->mailbox.name); | 308 m_context->produceTextureDirectCHROMIUM(frontColorBufferMailbox->textureInfo .textureId, GL_TEXTURE_2D, frontColorBufferMailbox->mailbox.name); |
| 308 m_context->flush(); | 309 m_context->flush(); |
| 309 frontColorBufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); | 310 frontColorBufferMailbox->mailbox.syncPoint = m_context->insertSyncPoint(); |
| 310 frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->tex tureInfo.imageId != 0; | 311 frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->tex tureInfo.imageId != 0; |
| 311 setBufferClearNeeded(true); | 312 setBufferClearNeeded(true); |
| 312 | 313 |
| 313 // set m_parentDrawingBuffer to make sure 'this' stays alive as long as it h as live mailboxes | 314 // set m_parentDrawingBuffer to make sure 'this' stays alive as long as it h as live mailboxes |
| 314 ASSERT(!frontColorBufferMailbox->m_parentDrawingBuffer); | 315 ASSERT(!frontColorBufferMailbox->m_parentDrawingBuffer); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 470 m_actualAttributes.antialias = multisample(); | 471 m_actualAttributes.antialias = multisample(); |
| 471 return true; | 472 return true; |
| 472 } | 473 } |
| 473 | 474 |
| 474 bool DrawingBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platfor m3DObject texture, GLenum internalFormat, | 475 bool DrawingBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platfor m3DObject texture, GLenum internalFormat, |
| 475 GLenum destType, GLint level, bool premultiplyAlpha, bool flipY, SourceDrawi ngBuffer sourceBuffer) | 476 GLenum destType, GLint level, bool premultiplyAlpha, bool flipY, SourceDrawi ngBuffer sourceBuffer) |
| 476 { | 477 { |
| 477 if (m_contentsChanged) { | 478 if (m_contentsChanged) { |
| 478 if (m_multisampleMode != None) { | 479 if (m_multisampleMode != None) { |
| 479 commit(); | 480 commit(); |
| 480 restoreFramebufferBinding(); | 481 restoreFramebufferBindings(); |
| 481 } | 482 } |
| 482 m_context->flush(); | 483 m_context->flush(); |
| 483 } | 484 } |
| 484 | 485 |
| 485 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(GL_TEXTURE_2D, internalForm at, destType, level)) | 486 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(GL_TEXTURE_2D, internalForm at, destType, level)) |
| 486 return false; | 487 return false; |
| 487 | 488 |
| 488 // Contexts may be in a different share group. We must transfer the texture through a mailbox first | 489 // Contexts may be in a different share group. We must transfer the texture through a mailbox first |
| 489 WebExternalTextureMailbox mailbox; | 490 WebExternalTextureMailbox mailbox; |
| 490 GLint textureId = 0; | 491 GLint textureId = 0; |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 | 807 |
| 807 int width = m_size.width(); | 808 int width = m_size.width(); |
| 808 int height = m_size.height(); | 809 int height = m_size.height(); |
| 809 // Use NEAREST, because there is no scale performed during the blit. | 810 // Use NEAREST, because there is no scale performed during the blit. |
| 810 m_context->blitFramebufferCHROMIUM(0, 0, width, height, 0, 0, width, hei ght, GL_COLOR_BUFFER_BIT, GL_NEAREST); | 811 m_context->blitFramebufferCHROMIUM(0, 0, width, height, 0, 0, width, hei ght, GL_COLOR_BUFFER_BIT, GL_NEAREST); |
| 811 | 812 |
| 812 if (m_scissorEnabled) | 813 if (m_scissorEnabled) |
| 813 m_context->enable(GL_SCISSOR_TEST); | 814 m_context->enable(GL_SCISSOR_TEST); |
| 814 } | 815 } |
| 815 | 816 |
| 816 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); | 817 restoreFramebufferBindings(); |
| 817 m_contentsChangeCommitted = true; | 818 m_contentsChangeCommitted = true; |
| 818 } | 819 } |
| 819 | 820 |
| 820 void DrawingBuffer::restoreFramebufferBinding() | 821 void DrawingBuffer::restoreFramebufferBindings() |
| 821 { | 822 { |
| 822 if (!m_framebufferBinding) { | 823 if (m_drawFramebufferBinding && m_readFramebufferBinding) { |
| 823 bind(); | 824 if (m_drawFramebufferBinding == m_readFramebufferBinding) { |
| 825 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_readFramebufferBinding) ; | |
| 826 } else { | |
| 827 m_context->bindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebufferBin ding); | |
| 828 m_context->bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_drawFramebufferBin ding); | |
| 829 } | |
| 824 return; | 830 return; |
| 825 } | 831 } |
| 826 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding); | 832 if (!m_drawFramebufferBinding && !m_readFramebufferBinding) { |
| 833 bind(GL_FRAMEBUFFER); | |
| 834 return; | |
| 835 } | |
| 836 if (!m_drawFramebufferBinding) { | |
| 837 bind(GL_DRAW_FRAMEBUFFER); | |
| 838 m_context->bindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebufferBinding ); | |
| 839 } else { | |
| 840 bind(GL_READ_FRAMEBUFFER); | |
|
Zhenyao Mo
2015/06/09 20:29:51
As I explained below, this is unnecessary.
Zhenyao Mo
2015/06/10 05:01:46
I take it back. Your code is correct.
| |
| 841 m_context->bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_drawFramebufferBinding ); | |
| 842 } | |
| 827 } | 843 } |
| 828 | 844 |
| 829 bool DrawingBuffer::multisample() const | 845 bool DrawingBuffer::multisample() const |
| 830 { | 846 { |
| 831 return m_multisampleMode != None; | 847 return m_multisampleMode != None; |
| 832 } | 848 } |
| 833 | 849 |
| 834 void DrawingBuffer::bind(GLenum target) | 850 void DrawingBuffer::bind(GLenum target) |
| 835 { | 851 { |
| 836 m_context->bindFramebuffer(target, m_multisampleFBO ? m_multisampleFBO : m_f bo); | 852 if (target != GL_READ_FRAMEBUFFER) |
|
Zhenyao Mo
2015/06/09 20:29:51
I think you misunderstood the situation here.
I t
Zhenyao Mo
2015/06/10 05:01:46
Never mind. Your code is correct.
| |
| 853 m_context->bindFramebuffer(target, m_multisampleFBO ? m_multisampleFBO : m_fbo); | |
| 854 else | |
| 855 m_context->bindFramebuffer(target, m_fbo); | |
| 837 } | 856 } |
| 838 | 857 |
| 839 void DrawingBuffer::setPackAlignment(GLint param) | 858 void DrawingBuffer::setPackAlignment(GLint param) |
| 840 { | 859 { |
| 841 m_packAlignment = param; | 860 m_packAlignment = param; |
| 842 } | 861 } |
| 843 | 862 |
| 844 void DrawingBuffer::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer) | 863 void DrawingBuffer::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer) |
| 845 { | 864 { |
| 846 paintFramebufferToCanvas(framebuffer(), size().width(), size().height(), !m_ actualAttributes.premultipliedAlpha, imageBuffer); | 865 paintFramebufferToCanvas(framebuffer(), size().width(), size().height(), !m_ actualAttributes.premultipliedAlpha, imageBuffer); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 870 } | 889 } |
| 871 | 890 |
| 872 readBackFramebuffer(static_cast<unsigned char*>(pixels.data()), width, heigh t, ReadbackRGBA, WebGLImageConversion::AlphaDoNothing); | 891 readBackFramebuffer(static_cast<unsigned char*>(pixels.data()), width, heigh t, ReadbackRGBA, WebGLImageConversion::AlphaDoNothing); |
| 873 flipVertically(static_cast<uint8_t*>(pixels.data()), width, height); | 892 flipVertically(static_cast<uint8_t*>(pixels.data()), width, height); |
| 874 | 893 |
| 875 if (fbo) { | 894 if (fbo) { |
| 876 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, 0, 0); | 895 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL _TEXTURE_2D, 0, 0); |
| 877 m_context->deleteFramebuffer(fbo); | 896 m_context->deleteFramebuffer(fbo); |
| 878 } | 897 } |
| 879 | 898 |
| 880 restoreFramebufferBinding(); | 899 restoreFramebufferBindings(); |
| 881 | 900 |
| 882 pixels.transfer(contents); | 901 pixels.transfer(contents); |
| 883 return true; | 902 return true; |
| 884 } | 903 } |
| 885 | 904 |
| 886 void DrawingBuffer::paintFramebufferToCanvas(int framebuffer, int width, int hei ght, bool premultiplyAlpha, ImageBuffer* imageBuffer) | 905 void DrawingBuffer::paintFramebufferToCanvas(int framebuffer, int width, int hei ght, bool premultiplyAlpha, ImageBuffer* imageBuffer) |
| 887 { | 906 { |
| 888 unsigned char* pixels = 0; | 907 unsigned char* pixels = 0; |
| 889 | 908 |
| 890 const SkBitmap& canvasBitmap = imageBuffer->bitmap(); | 909 const SkBitmap& canvasBitmap = imageBuffer->bitmap(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 994 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) | 1013 void DrawingBuffer::deleteChromiumImageForTexture(TextureInfo* info) |
| 995 { | 1014 { |
| 996 if (info->imageId) { | 1015 if (info->imageId) { |
| 997 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); | 1016 m_context->releaseTexImage2DCHROMIUM(GL_TEXTURE_2D, info->imageId); |
| 998 m_context->destroyImageCHROMIUM(info->imageId); | 1017 m_context->destroyImageCHROMIUM(info->imageId); |
| 999 info->imageId = 0; | 1018 info->imageId = 0; |
| 1000 } | 1019 } |
| 1001 } | 1020 } |
| 1002 | 1021 |
| 1003 } // namespace blink | 1022 } // namespace blink |
| OLD | NEW |