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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
(...skipping 1083 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1094 skia::RefPtr<SkImage> filter_bitmap; | 1094 skia::RefPtr<SkImage> filter_bitmap; |
1095 SkScalar color_matrix[20]; | 1095 SkScalar color_matrix[20]; |
1096 bool use_color_matrix = false; | 1096 bool use_color_matrix = false; |
1097 if (!quad->filters.IsEmpty()) { | 1097 if (!quad->filters.IsEmpty()) { |
1098 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 1098 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
1099 quad->filters, contents_texture->size()); | 1099 quad->filters, contents_texture->size()); |
1100 if (filter) { | 1100 if (filter) { |
1101 skia::RefPtr<SkColorFilter> cf; | 1101 skia::RefPtr<SkColorFilter> cf; |
1102 | 1102 |
1103 { | 1103 { |
1104 SkColorFilter* colorfilter_rawptr = NULL; | 1104 SkColorFilter* colorfilter_rawptr = nullptr; |
1105 filter->asColorFilter(&colorfilter_rawptr); | 1105 filter->asColorFilter(&colorfilter_rawptr); |
1106 cf = skia::AdoptRef(colorfilter_rawptr); | 1106 cf = skia::AdoptRef(colorfilter_rawptr); |
1107 } | 1107 } |
1108 | 1108 |
1109 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { | 1109 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { |
1110 // We have a single color matrix as a filter; apply it locally | 1110 // We have a single color matrix as a filter; apply it locally |
1111 // in the compositor. | 1111 // in the compositor. |
1112 use_color_matrix = true; | 1112 use_color_matrix = true; |
1113 } else { | 1113 } else { |
1114 filter_bitmap = | 1114 filter_bitmap = |
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1923 // V - 128 : Turns unsigned V into signed V [-128,127] | 1923 // V - 128 : Turns unsigned V into signed V [-128,127] |
1924 float yuv_adjust_rec601[3] = { | 1924 float yuv_adjust_rec601[3] = { |
1925 -0.0625f, -0.5f, -0.5f, | 1925 -0.0625f, -0.5f, -0.5f, |
1926 }; | 1926 }; |
1927 | 1927 |
1928 // Same as above, but without the head and footroom. | 1928 // Same as above, but without the head and footroom. |
1929 float yuv_adjust_rec601_jpeg[3] = { | 1929 float yuv_adjust_rec601_jpeg[3] = { |
1930 0.0f, -0.5f, -0.5f, | 1930 0.0f, -0.5f, -0.5f, |
1931 }; | 1931 }; |
1932 | 1932 |
1933 float* yuv_to_rgb = NULL; | 1933 float* yuv_to_rgb = nullptr; |
1934 float* yuv_adjust = NULL; | 1934 float* yuv_adjust = nullptr; |
1935 | 1935 |
1936 switch (quad->color_space) { | 1936 switch (quad->color_space) { |
1937 case YUVVideoDrawQuad::REC_601: | 1937 case YUVVideoDrawQuad::REC_601: |
1938 yuv_to_rgb = yuv_to_rgb_rec601; | 1938 yuv_to_rgb = yuv_to_rgb_rec601; |
1939 yuv_adjust = yuv_adjust_rec601; | 1939 yuv_adjust = yuv_adjust_rec601; |
1940 break; | 1940 break; |
1941 case YUVVideoDrawQuad::REC_601_JPEG: | 1941 case YUVVideoDrawQuad::REC_601_JPEG: |
1942 yuv_to_rgb = yuv_to_rgb_rec601_jpeg; | 1942 yuv_to_rgb = yuv_to_rgb_rec601_jpeg; |
1943 yuv_adjust = yuv_adjust_rec601_jpeg; | 1943 yuv_adjust = yuv_adjust_rec601_jpeg; |
1944 break; | 1944 break; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2003 quad->texture_size, | 2003 quad->texture_size, |
2004 GL_TEXTURE_2D, | 2004 GL_TEXTURE_2D, |
2005 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, | 2005 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, |
2006 GL_CLAMP_TO_EDGE, | 2006 GL_CLAMP_TO_EDGE, |
2007 ResourceProvider::TextureHintImmutable, | 2007 ResourceProvider::TextureHintImmutable, |
2008 quad->texture_format); | 2008 quad->texture_format); |
2009 } | 2009 } |
2010 | 2010 |
2011 SkCanvas canvas(on_demand_tile_raster_bitmap_); | 2011 SkCanvas canvas(on_demand_tile_raster_bitmap_); |
2012 quad->picture_pile->RasterToBitmap( | 2012 quad->picture_pile->RasterToBitmap( |
2013 &canvas, quad->content_rect, quad->contents_scale, NULL); | 2013 &canvas, quad->content_rect, quad->contents_scale, nullptr); |
2014 | 2014 |
2015 uint8_t* bitmap_pixels = NULL; | 2015 uint8_t* bitmap_pixels = nullptr; |
2016 SkBitmap on_demand_tile_raster_bitmap_dest; | 2016 SkBitmap on_demand_tile_raster_bitmap_dest; |
2017 SkColorType colorType = ResourceFormatToSkColorType(quad->texture_format); | 2017 SkColorType colorType = ResourceFormatToSkColorType(quad->texture_format); |
2018 if (on_demand_tile_raster_bitmap_.colorType() != colorType) { | 2018 if (on_demand_tile_raster_bitmap_.colorType() != colorType) { |
2019 on_demand_tile_raster_bitmap_.copyTo(&on_demand_tile_raster_bitmap_dest, | 2019 on_demand_tile_raster_bitmap_.copyTo(&on_demand_tile_raster_bitmap_dest, |
2020 colorType); | 2020 colorType); |
2021 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the | 2021 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the |
2022 // bitmap data. This check will be removed once crbug.com/293728 is fixed. | 2022 // bitmap data. This check will be removed once crbug.com/293728 is fixed. |
2023 CHECK_EQ(0u, on_demand_tile_raster_bitmap_dest.rowBytes() % 4); | 2023 CHECK_EQ(0u, on_demand_tile_raster_bitmap_dest.rowBytes() % 4); |
2024 bitmap_pixels = reinterpret_cast<uint8_t*>( | 2024 bitmap_pixels = reinterpret_cast<uint8_t*>( |
2025 on_demand_tile_raster_bitmap_dest.getPixels()); | 2025 on_demand_tile_raster_bitmap_dest.getPixels()); |
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2579 DCHECK_EQ(static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE), | 2579 DCHECK_EQ(static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE), |
2580 gl_->CheckFramebufferStatus(GL_FRAMEBUFFER)); | 2580 gl_->CheckFramebufferStatus(GL_FRAMEBUFFER)); |
2581 } | 2581 } |
2582 | 2582 |
2583 GLuint buffer = 0; | 2583 GLuint buffer = 0; |
2584 gl_->GenBuffers(1, &buffer); | 2584 gl_->GenBuffers(1, &buffer); |
2585 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, buffer)); | 2585 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, buffer)); |
2586 GLC(gl_, | 2586 GLC(gl_, |
2587 gl_->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 2587 gl_->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
2588 4 * window_rect.size().GetArea(), | 2588 4 * window_rect.size().GetArea(), |
2589 NULL, | 2589 nullptr, |
2590 GL_STREAM_READ)); | 2590 GL_STREAM_READ)); |
2591 | 2591 |
2592 GLuint query = 0; | 2592 GLuint query = 0; |
2593 gl_->GenQueriesEXT(1, &query); | 2593 gl_->GenQueriesEXT(1, &query); |
2594 GLC(gl_, gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query)); | 2594 GLC(gl_, gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query)); |
2595 | 2595 |
2596 GLC(gl_, | 2596 GLC(gl_, |
2597 gl_->ReadPixels(window_rect.x(), | 2597 gl_->ReadPixels(window_rect.x(), |
2598 window_rect.y(), | 2598 window_rect.y(), |
2599 window_rect.width(), | 2599 window_rect.width(), |
2600 window_rect.height(), | 2600 window_rect.height(), |
2601 GL_RGBA, | 2601 GL_RGBA, |
2602 GL_UNSIGNED_BYTE, | 2602 GL_UNSIGNED_BYTE, |
2603 NULL)); | 2603 nullptr)); |
2604 | 2604 |
2605 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0)); | 2605 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0)); |
2606 | 2606 |
2607 if (do_workaround) { | 2607 if (do_workaround) { |
2608 // Clean up. | 2608 // Clean up. |
2609 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, 0)); | 2609 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, 0)); |
2610 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | 2610 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); |
2611 GLC(gl_, gl_->DeleteFramebuffers(1, &temporary_fbo)); | 2611 GLC(gl_, gl_->DeleteFramebuffers(1, &temporary_fbo)); |
2612 GLC(gl_, gl_->DeleteTextures(1, &temporary_texture)); | 2612 GLC(gl_, gl_->DeleteTextures(1, &temporary_texture)); |
2613 } | 2613 } |
(...skipping 25 matching lines...) Expand all Loading... |
2639 DCHECK(!pending_async_read_pixels_.empty()); | 2639 DCHECK(!pending_async_read_pixels_.empty()); |
2640 | 2640 |
2641 if (query != 0) { | 2641 if (query != 0) { |
2642 GLC(gl_, gl_->DeleteQueriesEXT(1, &query)); | 2642 GLC(gl_, gl_->DeleteQueriesEXT(1, &query)); |
2643 } | 2643 } |
2644 | 2644 |
2645 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); | 2645 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); |
2646 // Make sure we service the readbacks in order. | 2646 // Make sure we service the readbacks in order. |
2647 DCHECK_EQ(source_buffer, current_read->buffer); | 2647 DCHECK_EQ(source_buffer, current_read->buffer); |
2648 | 2648 |
2649 uint8* src_pixels = NULL; | 2649 uint8* src_pixels = nullptr; |
2650 scoped_ptr<SkBitmap> bitmap; | 2650 scoped_ptr<SkBitmap> bitmap; |
2651 | 2651 |
2652 if (source_buffer != 0) { | 2652 if (source_buffer != 0) { |
2653 GLC(gl_, | 2653 GLC(gl_, |
2654 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, source_buffer)); | 2654 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, source_buffer)); |
2655 src_pixels = static_cast<uint8*>(gl_->MapBufferCHROMIUM( | 2655 src_pixels = static_cast<uint8*>(gl_->MapBufferCHROMIUM( |
2656 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); | 2656 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); |
2657 | 2657 |
2658 if (src_pixels) { | 2658 if (src_pixels) { |
2659 bitmap.reset(new SkBitmap); | 2659 bitmap.reset(new SkBitmap); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2711 window_rect.width(), | 2711 window_rect.width(), |
2712 window_rect.height(), | 2712 window_rect.height(), |
2713 0)); | 2713 0)); |
2714 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | 2714 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); |
2715 } | 2715 } |
2716 | 2716 |
2717 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, | 2717 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, |
2718 const ScopedResource* texture, | 2718 const ScopedResource* texture, |
2719 const gfx::Rect& viewport_rect) { | 2719 const gfx::Rect& viewport_rect) { |
2720 DCHECK(texture->id()); | 2720 DCHECK(texture->id()); |
2721 frame->current_render_pass = NULL; | 2721 frame->current_render_pass = nullptr; |
2722 frame->current_texture = texture; | 2722 frame->current_texture = texture; |
2723 | 2723 |
2724 return BindFramebufferToTexture(frame, texture, viewport_rect); | 2724 return BindFramebufferToTexture(frame, texture, viewport_rect); |
2725 } | 2725 } |
2726 | 2726 |
2727 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 2727 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
2728 current_framebuffer_lock_ = nullptr; | 2728 current_framebuffer_lock_ = nullptr; |
2729 output_surface_->BindFramebuffer(); | 2729 output_surface_->BindFramebuffer(); |
2730 | 2730 |
2731 if (output_surface_->HasExternalStencilTest()) { | 2731 if (output_surface_->HasExternalStencilTest()) { |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3141 TRACE_EVENT0("cc", "GLRenderer::videoYUVAProgram::initialize"); | 3141 TRACE_EVENT0("cc", "GLRenderer::videoYUVAProgram::initialize"); |
3142 program->Initialize( | 3142 program->Initialize( |
3143 output_surface_->context_provider(), precision, SamplerType2D); | 3143 output_surface_->context_provider(), precision, SamplerType2D); |
3144 } | 3144 } |
3145 return program; | 3145 return program; |
3146 } | 3146 } |
3147 | 3147 |
3148 const GLRenderer::VideoStreamTextureProgram* | 3148 const GLRenderer::VideoStreamTextureProgram* |
3149 GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) { | 3149 GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) { |
3150 if (!Capabilities().using_egl_image) | 3150 if (!Capabilities().using_egl_image) |
3151 return NULL; | 3151 return nullptr; |
3152 DCHECK_GE(precision, 0); | 3152 DCHECK_GE(precision, 0); |
3153 DCHECK_LT(precision, NumTexCoordPrecisions); | 3153 DCHECK_LT(precision, NumTexCoordPrecisions); |
3154 VideoStreamTextureProgram* program = | 3154 VideoStreamTextureProgram* program = |
3155 &video_stream_texture_program_[precision]; | 3155 &video_stream_texture_program_[precision]; |
3156 if (!program->initialized()) { | 3156 if (!program->initialized()) { |
3157 TRACE_EVENT0("cc", "GLRenderer::streamTextureProgram::initialize"); | 3157 TRACE_EVENT0("cc", "GLRenderer::streamTextureProgram::initialize"); |
3158 program->Initialize( | 3158 program->Initialize( |
3159 output_surface_->context_provider(), precision, SamplerTypeExternalOES); | 3159 output_surface_->context_provider(), precision, SamplerTypeExternalOES); |
3160 } | 3160 } |
3161 return program; | 3161 return program; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3283 context_support_->ScheduleOverlayPlane( | 3283 context_support_->ScheduleOverlayPlane( |
3284 overlay.plane_z_order, | 3284 overlay.plane_z_order, |
3285 overlay.transform, | 3285 overlay.transform, |
3286 pending_overlay_resources_.back()->texture_id(), | 3286 pending_overlay_resources_.back()->texture_id(), |
3287 overlay.display_rect, | 3287 overlay.display_rect, |
3288 overlay.uv_rect); | 3288 overlay.uv_rect); |
3289 } | 3289 } |
3290 } | 3290 } |
3291 | 3291 |
3292 } // namespace cc | 3292 } // namespace cc |
OLD | NEW |