| OLD | NEW | 
|---|
| 1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 | 9 | 
| 10 #include <algorithm> | 10 #include <algorithm> | 
| (...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 826     const gfx::Rect& bounding_rect) { | 826     const gfx::Rect& bounding_rect) { | 
| 827   std::unique_ptr<ScopedResource> device_background_texture = | 827   std::unique_ptr<ScopedResource> device_background_texture = | 
| 828       ScopedResource::Create(resource_provider_); | 828       ScopedResource::Create(resource_provider_); | 
| 829   // CopyTexImage2D fails when called on a texture having immutable storage. | 829   // CopyTexImage2D fails when called on a texture having immutable storage. | 
| 830   device_background_texture->Allocate( | 830   device_background_texture->Allocate( | 
| 831       bounding_rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT, | 831       bounding_rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT, | 
| 832       resource_provider_->best_texture_format()); | 832       resource_provider_->best_texture_format()); | 
| 833   { | 833   { | 
| 834     ResourceProvider::ScopedWriteLockGL lock(resource_provider_, | 834     ResourceProvider::ScopedWriteLockGL lock(resource_provider_, | 
| 835                                              device_background_texture->id()); | 835                                              device_background_texture->id()); | 
| 836     GetFramebufferTexture(lock.texture_id(), RGBA_8888, bounding_rect); | 836     GetFramebufferTexture(lock.texture_id(), bounding_rect); | 
| 837   } | 837   } | 
| 838   return device_background_texture; | 838   return device_background_texture; | 
| 839 } | 839 } | 
| 840 | 840 | 
| 841 sk_sp<SkImage> GLRenderer::ApplyBackgroundFilters( | 841 sk_sp<SkImage> GLRenderer::ApplyBackgroundFilters( | 
| 842     DrawingFrame* frame, | 842     DrawingFrame* frame, | 
| 843     const RenderPassDrawQuad* quad, | 843     const RenderPassDrawQuad* quad, | 
| 844     ScopedResource* background_texture, | 844     ScopedResource* background_texture, | 
| 845     const gfx::RectF& rect) { | 845     const gfx::RectF& rect) { | 
| 846   DCHECK(ShouldApplyBackgroundFilters(quad)); | 846   DCHECK(ShouldApplyBackgroundFilters(quad)); | 
| (...skipping 2015 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2862                 request->texture_mailbox().target()); | 2862                 request->texture_mailbox().target()); | 
| 2863       DCHECK(!mailbox.IsZero()); | 2863       DCHECK(!mailbox.IsZero()); | 
| 2864       const gpu::SyncToken& incoming_sync_token = | 2864       const gpu::SyncToken& incoming_sync_token = | 
| 2865           request->texture_mailbox().sync_token(); | 2865           request->texture_mailbox().sync_token(); | 
| 2866       if (incoming_sync_token.HasData()) | 2866       if (incoming_sync_token.HasData()) | 
| 2867         gl_->WaitSyncTokenCHROMIUM(incoming_sync_token.GetConstData()); | 2867         gl_->WaitSyncTokenCHROMIUM(incoming_sync_token.GetConstData()); | 
| 2868 | 2868 | 
| 2869       texture_id = | 2869       texture_id = | 
| 2870           gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | 2870           gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | 
| 2871     } | 2871     } | 
| 2872     GetFramebufferTexture(texture_id, RGBA_8888, window_rect); | 2872     GetFramebufferTexture(texture_id, window_rect); | 
| 2873 | 2873 | 
| 2874     const GLuint64 fence_sync = gl_->InsertFenceSyncCHROMIUM(); | 2874     const GLuint64 fence_sync = gl_->InsertFenceSyncCHROMIUM(); | 
| 2875     gl_->ShallowFlushCHROMIUM(); | 2875     gl_->ShallowFlushCHROMIUM(); | 
| 2876 | 2876 | 
| 2877     gpu::SyncToken sync_token; | 2877     gpu::SyncToken sync_token; | 
| 2878     gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 2878     gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); | 
| 2879 | 2879 | 
| 2880     TextureMailbox texture_mailbox(mailbox, sync_token, GL_TEXTURE_2D); | 2880     TextureMailbox texture_mailbox(mailbox, sync_token, GL_TEXTURE_2D); | 
| 2881 | 2881 | 
| 2882     std::unique_ptr<SingleReleaseCallback> release_callback; | 2882     std::unique_ptr<SingleReleaseCallback> release_callback; | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3002     current_read->copy_request->SendBitmapResult(std::move(bitmap)); | 3002     current_read->copy_request->SendBitmapResult(std::move(bitmap)); | 
| 3003 | 3003 | 
| 3004   // Conversion from reverse iterator to iterator: | 3004   // Conversion from reverse iterator to iterator: | 
| 3005   // Iterator |iter.base() - 1| points to the same element with reverse iterator | 3005   // Iterator |iter.base() - 1| points to the same element with reverse iterator | 
| 3006   // |iter|. The difference |-1| is due to the fact of correspondence of end() | 3006   // |iter|. The difference |-1| is due to the fact of correspondence of end() | 
| 3007   // with rbegin(). | 3007   // with rbegin(). | 
| 3008   pending_async_read_pixels_.erase(iter.base() - 1); | 3008   pending_async_read_pixels_.erase(iter.base() - 1); | 
| 3009 } | 3009 } | 
| 3010 | 3010 | 
| 3011 void GLRenderer::GetFramebufferTexture(unsigned texture_id, | 3011 void GLRenderer::GetFramebufferTexture(unsigned texture_id, | 
| 3012                                        ResourceFormat texture_format, |  | 
| 3013                                        const gfx::Rect& window_rect) { | 3012                                        const gfx::Rect& window_rect) { | 
| 3014   DCHECK(texture_id); | 3013   DCHECK(texture_id); | 
| 3015   DCHECK_GE(window_rect.x(), 0); | 3014   DCHECK_GE(window_rect.x(), 0); | 
| 3016   DCHECK_GE(window_rect.y(), 0); | 3015   DCHECK_GE(window_rect.y(), 0); | 
| 3017   DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 3016   DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 
| 3018   DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 3017   DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 
| 3019 | 3018 | 
|  | 3019   // If copying a non-root renderpass then use the format of the bound | 
|  | 3020   // texture. Otherwise, we use the format of the default framebuffer. | 
|  | 3021   GLenum format = current_framebuffer_lock_ | 
|  | 3022                       ? GLCopyTextureInternalFormat(current_framebuffer_format_) | 
|  | 3023                       : output_surface_->GetFramebufferCopyTextureFormat(); | 
|  | 3024   // Verify the format is valid for GLES2's glCopyTexImage2D. | 
|  | 3025   DCHECK(format == GL_ALPHA || format == GL_LUMINANCE || | 
|  | 3026          format == GL_LUMINANCE_ALPHA || format == GL_RGB || format == GL_RGBA) | 
|  | 3027       << format; | 
|  | 3028 | 
| 3020   gl_->BindTexture(GL_TEXTURE_2D, texture_id); | 3029   gl_->BindTexture(GL_TEXTURE_2D, texture_id); | 
| 3021   gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, GLDataFormat(texture_format), | 3030   gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, format, window_rect.x(), | 
| 3022                       window_rect.x(), window_rect.y(), window_rect.width(), | 3031                       window_rect.y(), window_rect.width(), | 
| 3023                       window_rect.height(), 0); | 3032                       window_rect.height(), 0); | 
| 3024   gl_->BindTexture(GL_TEXTURE_2D, 0); | 3033   gl_->BindTexture(GL_TEXTURE_2D, 0); | 
| 3025 } | 3034 } | 
| 3026 | 3035 | 
| 3027 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 3036 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 
| 3028   current_framebuffer_lock_ = nullptr; | 3037   current_framebuffer_lock_ = nullptr; | 
| 3029   output_surface_->BindFramebuffer(); | 3038   output_surface_->BindFramebuffer(); | 
| 3030 | 3039 | 
| 3031   if (output_surface_->HasExternalStencilTest()) { | 3040   if (output_surface_->HasExternalStencilTest()) { | 
| 3032     output_surface_->ApplyExternalStencil(); | 3041     output_surface_->ApplyExternalStencil(); | 
| 3033     SetStencilEnabled(true); | 3042     SetStencilEnabled(true); | 
| 3034   } else { | 3043   } else { | 
| 3035     SetStencilEnabled(false); | 3044     SetStencilEnabled(false); | 
| 3036   } | 3045   } | 
| 3037 } | 3046 } | 
| 3038 | 3047 | 
| 3039 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, | 3048 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, | 
| 3040                                           const ScopedResource* texture) { | 3049                                           const ScopedResource* texture) { | 
| 3041   DCHECK(texture->id()); | 3050   DCHECK(texture->id()); | 
| 3042 | 3051 | 
| 3043   // Explicitly release lock, otherwise we can crash when try to lock | 3052   // Explicitly release lock, otherwise we can crash when try to lock | 
| 3044   // same texture again. | 3053   // same texture again. | 
| 3045   current_framebuffer_lock_ = nullptr; | 3054   current_framebuffer_lock_ = nullptr; | 
| 3046 | 3055 | 
| 3047   SetStencilEnabled(false); | 3056   SetStencilEnabled(false); | 
| 3048   gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_); | 3057   gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_); | 
| 3049   current_framebuffer_lock_ = | 3058   current_framebuffer_lock_ = | 
| 3050       base::WrapUnique(new ResourceProvider::ScopedWriteLockGL( | 3059       base::WrapUnique(new ResourceProvider::ScopedWriteLockGL( | 
| 3051           resource_provider_, texture->id())); | 3060           resource_provider_, texture->id())); | 
|  | 3061   current_framebuffer_format_ = texture->format(); | 
| 3052   unsigned texture_id = current_framebuffer_lock_->texture_id(); | 3062   unsigned texture_id = current_framebuffer_lock_->texture_id(); | 
| 3053   gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | 3063   gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | 
| 3054                             texture_id, 0); | 3064                             texture_id, 0); | 
| 3055 | 3065 | 
| 3056   DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == | 3066   DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == | 
| 3057              GL_FRAMEBUFFER_COMPLETE || | 3067              GL_FRAMEBUFFER_COMPLETE || | 
| 3058          IsContextLost()); | 3068          IsContextLost()); | 
| 3059   return true; | 3069   return true; | 
| 3060 } | 3070 } | 
| 3061 | 3071 | 
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3669       texture_id = pending_overlay_resources_.back()->texture_id(); | 3679       texture_id = pending_overlay_resources_.back()->texture_id(); | 
| 3670     } | 3680     } | 
| 3671 | 3681 | 
| 3672     context_support_->ScheduleOverlayPlane( | 3682     context_support_->ScheduleOverlayPlane( | 
| 3673         overlay.plane_z_order, overlay.transform, texture_id, | 3683         overlay.plane_z_order, overlay.transform, texture_id, | 
| 3674         ToNearestRect(overlay.display_rect), overlay.uv_rect); | 3684         ToNearestRect(overlay.display_rect), overlay.uv_rect); | 
| 3675   } | 3685   } | 
| 3676 } | 3686 } | 
| 3677 | 3687 | 
| 3678 }  // namespace cc | 3688 }  // namespace cc | 
| OLD | NEW | 
|---|