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 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 401 | 401 |
| 402 m_frontColorBuffer = {mailboxInfo->mailbox, syncToken, | 402 m_frontColorBuffer = {mailboxInfo->mailbox, syncToken, |
| 403 mailboxInfo->textureInfo}; | 403 mailboxInfo->textureInfo}; |
| 404 setBufferClearNeeded(true); | 404 setBufferClearNeeded(true); |
| 405 return true; | 405 return true; |
| 406 } | 406 } |
| 407 | 407 |
| 408 void DrawingBuffer::gpuMailboxReleased(const gpu::Mailbox& mailbox, | 408 void DrawingBuffer::gpuMailboxReleased(const gpu::Mailbox& mailbox, |
| 409 const gpu::SyncToken& syncToken, | 409 const gpu::SyncToken& syncToken, |
| 410 bool lostResource) { | 410 bool lostResource) { |
| 411 if (m_destructionInProgress || | 411 // Creation of image backed mailboxes is very expensive, so be less |
| 412 // aggressive about pruning them. | |
| 413 size_t cacheLimit = 1; | |
| 414 if (shouldUseChromiumImage()) | |
| 415 cacheLimit = 4; | |
| 416 | |
| 417 if (m_destructionInProgress || m_recycledMailboxQueue.size() >= cacheLimit || | |
| 412 m_gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR || lostResource || | 418 m_gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR || lostResource || |
| 413 m_isHidden) { | 419 m_isHidden) { |
| 414 deleteMailbox(mailbox, syncToken); | 420 deleteMailbox(mailbox, syncToken); |
| 415 return; | 421 return; |
| 416 } | 422 } |
| 417 | 423 |
| 424 RefPtr<MailboxInfo> mailboxInfo; | |
| 418 for (size_t i = 0; i < m_textureMailboxes.size(); i++) { | 425 for (size_t i = 0; i < m_textureMailboxes.size(); i++) { |
| 419 RefPtr<MailboxInfo> mailboxInfo = m_textureMailboxes[i]; | 426 if (m_textureMailboxes[i]->mailbox == mailbox) { |
| 420 if (mailboxInfo->mailbox == mailbox) { | 427 mailboxInfo = m_textureMailboxes[i]; |
| 421 m_recycledMailboxQueue.prepend( | 428 break; |
| 422 adoptRef(new RecycledMailbox(mailbox, syncToken))); | |
| 423 return; | |
| 424 } | 429 } |
| 425 } | 430 } |
| 426 ASSERT_NOT_REACHED(); | 431 DCHECK(mailboxInfo); |
| 432 if (mailboxInfo->size != m_size) { | |
| 433 deleteMailbox(mailbox, syncToken); | |
| 434 return; | |
| 435 } | |
| 436 | |
| 437 m_recycledMailboxQueue.prepend( | |
| 438 adoptRef(new RecycledMailbox(mailbox, syncToken))); | |
| 427 } | 439 } |
| 428 | 440 |
| 429 void DrawingBuffer::softwareMailboxReleased( | 441 void DrawingBuffer::softwareMailboxReleased( |
| 430 std::unique_ptr<cc::SharedBitmap> bitmap, | 442 std::unique_ptr<cc::SharedBitmap> bitmap, |
| 431 const IntSize& size, | 443 const IntSize& size, |
| 432 const gpu::SyncToken& syncToken, | 444 const gpu::SyncToken& syncToken, |
| 433 bool lostResource) { | 445 bool lostResource) { |
| 434 DCHECK(!syncToken.HasData()); // No sync tokens for software resources. | 446 DCHECK(!syncToken.HasData()); // No sync tokens for software resources. |
| 435 if (m_destructionInProgress || lostResource || m_isHidden || size != m_size) | 447 if (m_destructionInProgress || lostResource || m_isHidden || size != m_size) |
| 436 return; // Just delete the bitmap. | 448 return; // Just delete the bitmap. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 563 parameters.internalColorFormat = format; | 575 parameters.internalColorFormat = format; |
| 564 parameters.colorFormat = format; | 576 parameters.colorFormat = format; |
| 565 } | 577 } |
| 566 return parameters; | 578 return parameters; |
| 567 } | 579 } |
| 568 | 580 |
| 569 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::takeRecycledMailbox() { | 581 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::takeRecycledMailbox() { |
| 570 if (m_recycledMailboxQueue.isEmpty()) | 582 if (m_recycledMailboxQueue.isEmpty()) |
| 571 return nullptr; | 583 return nullptr; |
| 572 | 584 |
| 573 // Creation of image backed mailboxes is very expensive, so be less | 585 RefPtr<RecycledMailbox> recycled = m_recycledMailboxQueue.takeLast(); |
| 574 // aggressive about pruning them. | |
| 575 size_t cacheLimit = 1; | |
| 576 if (shouldUseChromiumImage()) | |
| 577 cacheLimit = 4; | |
| 578 | |
| 579 RefPtr<RecycledMailbox> recycled; | |
| 580 while (m_recycledMailboxQueue.size() > cacheLimit) { | |
| 581 recycled = m_recycledMailboxQueue.takeLast(); | |
| 582 deleteMailbox(recycled->mailbox, recycled->syncToken); | |
| 583 } | |
| 584 recycled = m_recycledMailboxQueue.takeLast(); | |
| 585 | |
| 586 if (recycled->syncToken.HasData()) | 586 if (recycled->syncToken.HasData()) |
| 587 m_gl->WaitSyncTokenCHROMIUM(recycled->syncToken.GetData()); | 587 m_gl->WaitSyncTokenCHROMIUM(recycled->syncToken.GetData()); |
| 588 | 588 |
| 589 RefPtr<MailboxInfo> mailboxInfo; | 589 RefPtr<MailboxInfo> mailboxInfo; |
| 590 for (size_t i = 0; i < m_textureMailboxes.size(); i++) { | 590 for (size_t i = 0; i < m_textureMailboxes.size(); i++) { |
| 591 if (m_textureMailboxes[i]->mailbox == recycled->mailbox) { | 591 if (m_textureMailboxes[i]->mailbox == recycled->mailbox) { |
| 592 mailboxInfo = m_textureMailboxes[i]; | 592 mailboxInfo = m_textureMailboxes[i]; |
| 593 break; | 593 break; |
| 594 } | 594 } |
| 595 } | 595 } |
| 596 ASSERT(mailboxInfo); | 596 DCHECK(mailboxInfo); |
| 597 | 597 DCHECK(mailboxInfo->size == m_size); |
|
Ken Russell (switch to Gerrit)
2016/10/06 03:47:52
Am I understanding correctly that this invariant i
ccameron
2016/10/06 08:34:24
Yes, exactly.
| |
| 598 if (mailboxInfo->size != m_size) { | |
| 599 resizeTextureMemory(&mailboxInfo->textureInfo, m_size); | |
| 600 mailboxInfo->size = m_size; | |
| 601 } | |
| 602 | |
| 603 return mailboxInfo.release(); | 598 return mailboxInfo.release(); |
| 604 } | 599 } |
| 605 | 600 |
| 606 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox( | 601 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox( |
| 607 const TextureInfo& info) { | 602 const TextureInfo& info) { |
| 608 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo); | 603 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo); |
| 609 m_gl->GenMailboxCHROMIUM(returnMailbox->mailbox.name); | 604 m_gl->GenMailboxCHROMIUM(returnMailbox->mailbox.name); |
| 610 returnMailbox->textureInfo = info; | 605 returnMailbox->textureInfo = info; |
| 611 returnMailbox->size = m_size; | 606 returnMailbox->size = m_size; |
| 612 m_textureMailboxes.append(returnMailbox); | 607 m_textureMailboxes.append(returnMailbox); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 798 m_gl->DeleteRenderbuffers(1, &m_multisampleRenderbuffer); | 793 m_gl->DeleteRenderbuffers(1, &m_multisampleRenderbuffer); |
| 799 | 794 |
| 800 if (m_depthStencilBuffer) | 795 if (m_depthStencilBuffer) |
| 801 m_gl->DeleteRenderbuffers(1, &m_depthStencilBuffer); | 796 m_gl->DeleteRenderbuffers(1, &m_depthStencilBuffer); |
| 802 | 797 |
| 803 if (m_colorBuffer.textureId) { | 798 if (m_colorBuffer.textureId) { |
| 804 deleteChromiumImageForTexture(&m_colorBuffer); | 799 deleteChromiumImageForTexture(&m_colorBuffer); |
| 805 m_gl->DeleteTextures(1, &m_colorBuffer.textureId); | 800 m_gl->DeleteTextures(1, &m_colorBuffer.textureId); |
| 806 } | 801 } |
| 807 | 802 |
| 808 setSize(IntSize()); | 803 m_size = IntSize(); |
| 809 | 804 |
| 810 m_colorBuffer = TextureInfo(); | 805 m_colorBuffer = TextureInfo(); |
| 811 m_frontColorBuffer = FrontBufferInfo(); | 806 m_frontColorBuffer = FrontBufferInfo(); |
| 812 m_multisampleRenderbuffer = 0; | 807 m_multisampleRenderbuffer = 0; |
| 813 m_depthStencilBuffer = 0; | 808 m_depthStencilBuffer = 0; |
| 814 m_multisampleFBO = 0; | 809 m_multisampleFBO = 0; |
| 815 m_fbo = 0; | 810 m_fbo = 0; |
| 816 | 811 |
| 817 if (m_layer) | 812 if (m_layer) |
| 818 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); | 813 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); |
| 819 } | 814 } |
| 820 | 815 |
| 821 GLuint DrawingBuffer::createColorTexture(const TextureParameters& parameters) { | 816 GLuint DrawingBuffer::createColorTexture(const TextureParameters& parameters) { |
| 822 GLuint offscreenColorTexture; | 817 GLuint offscreenColorTexture; |
| 823 m_gl->GenTextures(1, &offscreenColorTexture); | 818 m_gl->GenTextures(1, &offscreenColorTexture); |
| 824 m_gl->BindTexture(parameters.target, offscreenColorTexture); | 819 m_gl->BindTexture(parameters.target, offscreenColorTexture); |
| 825 m_gl->TexParameteri(parameters.target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 820 m_gl->TexParameteri(parameters.target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| 826 m_gl->TexParameteri(parameters.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 821 m_gl->TexParameteri(parameters.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| 827 m_gl->TexParameteri(parameters.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 822 m_gl->TexParameteri(parameters.target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 828 m_gl->TexParameteri(parameters.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 823 m_gl->TexParameteri(parameters.target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 829 return offscreenColorTexture; | 824 return offscreenColorTexture; |
| 830 } | 825 } |
| 831 | 826 |
| 832 bool DrawingBuffer::resizeMultisampleFramebuffer(const IntSize& size) { | |
| 833 DCHECK(wantExplicitResolve()); | |
| 834 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); | |
| 835 m_gl->BindRenderbuffer(GL_RENDERBUFFER, m_multisampleRenderbuffer); | |
| 836 m_gl->RenderbufferStorageMultisampleCHROMIUM( | |
| 837 GL_RENDERBUFFER, m_sampleCount, getMultisampledRenderbufferFormat(), | |
| 838 size.width(), size.height()); | |
| 839 | |
| 840 if (m_gl->GetError() == GL_OUT_OF_MEMORY) | |
| 841 return false; | |
| 842 | |
| 843 m_gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
| 844 GL_RENDERBUFFER, m_multisampleRenderbuffer); | |
| 845 | |
| 846 return true; | |
| 847 } | |
| 848 | |
| 849 void DrawingBuffer::resizeDepthStencil(const IntSize& size) { | |
| 850 m_gl->BindFramebuffer(GL_FRAMEBUFFER, | |
| 851 m_multisampleFBO ? m_multisampleFBO : m_fbo); | |
| 852 if (!m_depthStencilBuffer) | |
| 853 m_gl->GenRenderbuffers(1, &m_depthStencilBuffer); | |
| 854 m_gl->BindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer); | |
| 855 if (m_antiAliasingMode == MSAAImplicitResolve) | |
| 856 m_gl->RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, m_sampleCount, | |
| 857 GL_DEPTH24_STENCIL8_OES, | |
| 858 size.width(), size.height()); | |
| 859 else if (m_antiAliasingMode == MSAAExplicitResolve) | |
| 860 m_gl->RenderbufferStorageMultisampleCHROMIUM(GL_RENDERBUFFER, m_sampleCount, | |
| 861 GL_DEPTH24_STENCIL8_OES, | |
| 862 size.width(), size.height()); | |
| 863 else | |
| 864 m_gl->RenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, | |
| 865 size.width(), size.height()); | |
| 866 // For ES 2.0 contexts DEPTH_STENCIL is not available natively, so we emulate | |
| 867 // it at the command buffer level for WebGL contexts. | |
| 868 m_gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, | |
| 869 GL_RENDERBUFFER, m_depthStencilBuffer); | |
| 870 m_gl->BindRenderbuffer(GL_RENDERBUFFER, 0); | |
| 871 } | |
| 872 | |
| 873 bool DrawingBuffer::resizeDefaultFramebuffer(const IntSize& size) { | 827 bool DrawingBuffer::resizeDefaultFramebuffer(const IntSize& size) { |
| 874 // Resize or create m_colorBuffer. | 828 // Resize or create m_colorBuffer. |
| 875 if (m_colorBuffer.textureId) { | 829 if (m_colorBuffer.textureId) { |
| 876 resizeTextureMemory(&m_colorBuffer, size); | 830 deleteChromiumImageForTexture(&m_colorBuffer); |
| 877 } else { | 831 m_gl->DeleteTextures(1, &m_colorBuffer.textureId); |
| 878 m_colorBuffer = createTextureAndAllocateMemory(size); | |
| 879 } | 832 } |
| 833 m_colorBuffer = createTextureAndAllocateMemory(size); | |
| 880 | 834 |
| 881 attachColorBufferToReadFramebuffer(); | 835 attachColorBufferToReadFramebuffer(); |
| 882 | 836 |
| 883 if (wantExplicitResolve()) { | 837 if (wantExplicitResolve()) { |
| 884 if (!resizeMultisampleFramebuffer(size)) | 838 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); |
| 839 m_gl->BindRenderbuffer(GL_RENDERBUFFER, m_multisampleRenderbuffer); | |
| 840 m_gl->RenderbufferStorageMultisampleCHROMIUM( | |
| 841 GL_RENDERBUFFER, m_sampleCount, getMultisampledRenderbufferFormat(), | |
| 842 size.width(), size.height()); | |
| 843 | |
| 844 if (m_gl->GetError() == GL_OUT_OF_MEMORY) | |
| 885 return false; | 845 return false; |
| 846 | |
| 847 m_gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
| 848 GL_RENDERBUFFER, m_multisampleRenderbuffer); | |
| 886 } | 849 } |
| 887 | 850 |
| 888 if (wantDepthOrStencil()) | 851 if (wantDepthOrStencil()) { |
| 889 resizeDepthStencil(size); | 852 m_gl->BindFramebuffer(GL_FRAMEBUFFER, |
| 853 m_multisampleFBO ? m_multisampleFBO : m_fbo); | |
| 854 if (!m_depthStencilBuffer) | |
| 855 m_gl->GenRenderbuffers(1, &m_depthStencilBuffer); | |
| 856 m_gl->BindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer); | |
| 857 if (m_antiAliasingMode == MSAAImplicitResolve) { | |
| 858 m_gl->RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, m_sampleCount, | |
| 859 GL_DEPTH24_STENCIL8_OES, | |
| 860 size.width(), size.height()); | |
| 861 } else if (m_antiAliasingMode == MSAAExplicitResolve) { | |
| 862 m_gl->RenderbufferStorageMultisampleCHROMIUM( | |
| 863 GL_RENDERBUFFER, m_sampleCount, GL_DEPTH24_STENCIL8_OES, size.width(), | |
| 864 size.height()); | |
| 865 } else { | |
| 866 m_gl->RenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, | |
| 867 size.width(), size.height()); | |
| 868 } | |
| 869 // For ES 2.0 contexts DEPTH_STENCIL is not available natively, so we | |
| 870 // emulate | |
| 871 // it at the command buffer level for WebGL contexts. | |
| 872 m_gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, | |
| 873 GL_RENDERBUFFER, m_depthStencilBuffer); | |
| 874 m_gl->BindRenderbuffer(GL_RENDERBUFFER, 0); | |
| 875 } | |
| 890 | 876 |
| 891 if (wantExplicitResolve()) { | 877 if (wantExplicitResolve()) { |
| 892 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); | 878 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO); |
| 893 if (m_gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) | 879 if (m_gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) |
| 894 return false; | 880 return false; |
| 895 } | 881 } |
| 896 | 882 |
| 897 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); | 883 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); |
| 898 return m_gl->CheckFramebufferStatus(GL_FRAMEBUFFER) == | 884 return m_gl->CheckFramebufferStatus(GL_FRAMEBUFFER) == |
| 899 GL_FRAMEBUFFER_COMPLETE; | 885 GL_FRAMEBUFFER_COMPLETE; |
| 900 } | 886 } |
| 901 | 887 |
| 902 void DrawingBuffer::clearFramebuffers(GLbitfield clearMask) { | 888 void DrawingBuffer::clearFramebuffers(GLbitfield clearMask) { |
| 903 // We will clear the multisample FBO, but we also need to clear the | 889 // We will clear the multisample FBO, but we also need to clear the |
| 904 // non-multisampled buffer. | 890 // non-multisampled buffer. |
| 905 if (m_multisampleFBO) { | 891 if (m_multisampleFBO) { |
| 906 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); | 892 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); |
| 907 m_gl->Clear(GL_COLOR_BUFFER_BIT); | 893 m_gl->Clear(GL_COLOR_BUFFER_BIT); |
| 908 } | 894 } |
| 909 | 895 |
| 910 m_gl->BindFramebuffer(GL_FRAMEBUFFER, | 896 m_gl->BindFramebuffer(GL_FRAMEBUFFER, |
| 911 m_multisampleFBO ? m_multisampleFBO : m_fbo); | 897 m_multisampleFBO ? m_multisampleFBO : m_fbo); |
| 912 m_gl->Clear(clearMask); | 898 m_gl->Clear(clearMask); |
| 913 } | 899 } |
| 914 | 900 |
| 915 void DrawingBuffer::setSize(const IntSize& size) { | |
| 916 if (m_size == size) | |
| 917 return; | |
| 918 | |
| 919 m_size = size; | |
| 920 } | |
| 921 | |
| 922 IntSize DrawingBuffer::adjustSize(const IntSize& desiredSize, | 901 IntSize DrawingBuffer::adjustSize(const IntSize& desiredSize, |
| 923 const IntSize& curSize, | 902 const IntSize& curSize, |
| 924 int maxTextureSize) { | 903 int maxTextureSize) { |
| 925 IntSize adjustedSize = desiredSize; | 904 IntSize adjustedSize = desiredSize; |
| 926 | 905 |
| 927 // Clamp if the desired size is greater than the maximum texture size for the | 906 // Clamp if the desired size is greater than the maximum texture size for the |
| 928 // device. | 907 // device. |
| 929 if (adjustedSize.height() > maxTextureSize) | 908 if (adjustedSize.height() > maxTextureSize) |
| 930 adjustedSize.setHeight(maxTextureSize); | 909 adjustedSize.setHeight(maxTextureSize); |
| 931 | 910 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 943 | 922 |
| 944 if (adjustedSize != m_size) { | 923 if (adjustedSize != m_size) { |
| 945 do { | 924 do { |
| 946 if (!resizeDefaultFramebuffer(adjustedSize)) { | 925 if (!resizeDefaultFramebuffer(adjustedSize)) { |
| 947 adjustedSize.scale(s_resourceAdjustedRatio); | 926 adjustedSize.scale(s_resourceAdjustedRatio); |
| 948 continue; | 927 continue; |
| 949 } | 928 } |
| 950 break; | 929 break; |
| 951 } while (!adjustedSize.isEmpty()); | 930 } while (!adjustedSize.isEmpty()); |
| 952 | 931 |
| 953 setSize(adjustedSize); | 932 m_size = adjustedSize; |
| 954 | 933 |
| 955 if (adjustedSize.isEmpty()) | 934 if (adjustedSize.isEmpty()) |
| 956 return false; | 935 return false; |
| 957 } | 936 } |
| 958 | 937 |
| 959 m_gl->Disable(GL_SCISSOR_TEST); | 938 m_gl->Disable(GL_SCISSOR_TEST); |
| 960 m_gl->ClearColor(0, 0, 0, | 939 m_gl->ClearColor(0, 0, 0, |
| 961 defaultBufferRequiresAlphaChannelToBePreserved() ? 1 : 0); | 940 defaultBufferRequiresAlphaChannelToBePreserved() ? 1 : 0); |
| 962 m_gl->ColorMask(true, true, true, true); | 941 m_gl->ColorMask(true, true, true, true); |
| 963 | 942 |
| 964 GLbitfield clearMask = GL_COLOR_BUFFER_BIT; | 943 GLbitfield clearMask = GL_COLOR_BUFFER_BIT; |
| 965 if (!!m_depthStencilBuffer) { | 944 if (!!m_depthStencilBuffer) { |
| 966 m_gl->ClearDepthf(1.0f); | 945 m_gl->ClearDepthf(1.0f); |
| 967 clearMask |= GL_DEPTH_BUFFER_BIT; | 946 clearMask |= GL_DEPTH_BUFFER_BIT; |
| 968 m_gl->DepthMask(true); | 947 m_gl->DepthMask(true); |
| 969 } | 948 } |
| 970 if (!!m_depthStencilBuffer) { | 949 if (!!m_depthStencilBuffer) { |
| 971 m_gl->ClearStencil(0); | 950 m_gl->ClearStencil(0); |
| 972 clearMask |= GL_STENCIL_BUFFER_BIT; | 951 clearMask |= GL_STENCIL_BUFFER_BIT; |
| 973 m_gl->StencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); | 952 m_gl->StencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); |
| 974 } | 953 } |
| 975 | 954 |
| 976 clearFramebuffers(clearMask); | 955 clearFramebuffers(clearMask); |
| 956 freeRecycledMailboxes(); | |
| 977 return true; | 957 return true; |
| 978 } | 958 } |
| 979 | 959 |
| 980 void DrawingBuffer::commit() { | 960 void DrawingBuffer::commit() { |
| 981 if (wantExplicitResolve() && !m_contentsChangeCommitted) { | 961 if (wantExplicitResolve() && !m_contentsChangeCommitted) { |
| 982 m_gl->BindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, m_multisampleFBO); | 962 m_gl->BindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, m_multisampleFBO); |
| 983 m_gl->BindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, m_fbo); | 963 m_gl->BindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, m_fbo); |
| 984 | 964 |
| 985 if (m_scissorEnabled) | 965 if (m_scissorEnabled) |
| 986 m_gl->Disable(GL_SCISSOR_TEST); | 966 m_gl->Disable(GL_SCISSOR_TEST); |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1241 | 1221 |
| 1242 DrawingBuffer::TextureInfo DrawingBuffer::createDefaultTextureAndAllocateMemory( | 1222 DrawingBuffer::TextureInfo DrawingBuffer::createDefaultTextureAndAllocateMemory( |
| 1243 const IntSize& size) { | 1223 const IntSize& size) { |
| 1244 DrawingBuffer::TextureInfo info; | 1224 DrawingBuffer::TextureInfo info; |
| 1245 TextureParameters parameters = defaultTextureParameters(); | 1225 TextureParameters parameters = defaultTextureParameters(); |
| 1246 info.parameters = parameters; | 1226 info.parameters = parameters; |
| 1247 info.textureId = createColorTexture(parameters); | 1227 info.textureId = createColorTexture(parameters); |
| 1248 allocateConditionallyImmutableTexture( | 1228 allocateConditionallyImmutableTexture( |
| 1249 parameters.target, parameters.creationInternalColorFormat, size.width(), | 1229 parameters.target, parameters.creationInternalColorFormat, size.width(), |
| 1250 size.height(), 0, parameters.colorFormat, GL_UNSIGNED_BYTE); | 1230 size.height(), 0, parameters.colorFormat, GL_UNSIGNED_BYTE); |
| 1251 info.immutable = m_storageTextureSupported; | |
| 1252 return info; | 1231 return info; |
| 1253 } | 1232 } |
| 1254 | 1233 |
| 1255 void DrawingBuffer::resizeTextureMemory(TextureInfo* info, | |
| 1256 const IntSize& size) { | |
| 1257 ASSERT(info->textureId); | |
| 1258 if (!shouldUseChromiumImage()) { | |
| 1259 if (info->immutable) { | |
| 1260 DCHECK(m_storageTextureSupported); | |
| 1261 m_gl->DeleteTextures(1, &info->textureId); | |
| 1262 info->textureId = createColorTexture(info->parameters); | |
| 1263 } | |
| 1264 m_gl->BindTexture(info->parameters.target, info->textureId); | |
| 1265 allocateConditionallyImmutableTexture( | |
| 1266 info->parameters.target, info->parameters.creationInternalColorFormat, | |
| 1267 size.width(), size.height(), 0, info->parameters.colorFormat, | |
| 1268 GL_UNSIGNED_BYTE); | |
| 1269 info->immutable = m_storageTextureSupported; | |
| 1270 return; | |
| 1271 } | |
| 1272 | |
| 1273 DCHECK(!info->immutable); | |
| 1274 deleteChromiumImageForTexture(info); | |
| 1275 info->imageId = m_gl->CreateGpuMemoryBufferImageCHROMIUM( | |
| 1276 size.width(), size.height(), info->parameters.creationInternalColorFormat, | |
| 1277 GC3D_SCANOUT_CHROMIUM); | |
| 1278 if (info->imageId) { | |
| 1279 m_gl->BindTexture(info->parameters.target, info->textureId); | |
| 1280 m_gl->BindTexImage2DCHROMIUM(info->parameters.target, info->imageId); | |
| 1281 clearChromiumImageAlpha(*info); | |
| 1282 } else { | |
| 1283 // At this point, the texture still exists, but has no allocated | |
| 1284 // storage. This is intentional, and mimics the behavior of a texImage2D | |
| 1285 // failure. | |
| 1286 } | |
| 1287 } | |
| 1288 | |
| 1289 void DrawingBuffer::attachColorBufferToReadFramebuffer() { | 1234 void DrawingBuffer::attachColorBufferToReadFramebuffer() { |
| 1290 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); | 1235 m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo); |
| 1291 | 1236 |
| 1292 GLenum target = m_colorBuffer.parameters.target; | 1237 GLenum target = m_colorBuffer.parameters.target; |
| 1293 GLenum id = m_colorBuffer.textureId; | 1238 GLenum id = m_colorBuffer.textureId; |
| 1294 | 1239 |
| 1295 m_gl->BindTexture(target, id); | 1240 m_gl->BindTexture(target, id); |
| 1296 | 1241 |
| 1297 if (m_antiAliasingMode == MSAAImplicitResolve) | 1242 if (m_antiAliasingMode == MSAAImplicitResolve) |
| 1298 m_gl->FramebufferTexture2DMultisampleEXT( | 1243 m_gl->FramebufferTexture2DMultisampleEXT( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE. | 1278 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE. |
| 1334 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding); | 1279 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding); |
| 1335 } | 1280 } |
| 1336 | 1281 |
| 1337 bool DrawingBuffer::shouldUseChromiumImage() { | 1282 bool DrawingBuffer::shouldUseChromiumImage() { |
| 1338 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && | 1283 return RuntimeEnabledFeatures::webGLImageChromiumEnabled() && |
| 1339 m_chromiumImageUsage == AllowChromiumImage; | 1284 m_chromiumImageUsage == AllowChromiumImage; |
| 1340 } | 1285 } |
| 1341 | 1286 |
| 1342 } // namespace blink | 1287 } // namespace blink |
| OLD | NEW |