| 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 1939 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1950 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, |  1950 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, | 
|  1951                                   const YUVVideoDrawQuad* quad, |  1951                                   const YUVVideoDrawQuad* quad, | 
|  1952                                   const gfx::QuadF* clip_region) { |  1952                                   const gfx::QuadF* clip_region) { | 
|  1953   SetBlendEnabled(quad->ShouldDrawWithBlending()); |  1953   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 
|  1954  |  1954  | 
|  1955   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |  1955   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
|  1956       gl_, &highp_threshold_cache_, highp_threshold_min_, |  1956       gl_, &highp_threshold_cache_, highp_threshold_min_, | 
|  1957       quad->shared_quad_state->visible_quad_layer_rect.bottom_right()); |  1957       quad->shared_quad_state->visible_quad_layer_rect.bottom_right()); | 
|  1958  |  1958  | 
|  1959   bool use_alpha_plane = quad->a_plane_resource_id() != 0; |  1959   bool use_alpha_plane = quad->a_plane_resource_id() != 0; | 
 |  1960   bool use_nv12 = quad->v_plane_resource_id() == quad->u_plane_resource_id(); | 
 |  1961  | 
 |  1962   DCHECK(!(use_nv12 && use_alpha_plane)); | 
|  1960  |  1963  | 
|  1961   ResourceProvider::ScopedSamplerGL y_plane_lock( |  1964   ResourceProvider::ScopedSamplerGL y_plane_lock( | 
|  1962       resource_provider_, quad->y_plane_resource_id(), GL_TEXTURE1, GL_LINEAR); |  1965       resource_provider_, quad->y_plane_resource_id(), GL_TEXTURE1, GL_LINEAR); | 
|  1963   ResourceProvider::ScopedSamplerGL u_plane_lock( |  1966   ResourceProvider::ScopedSamplerGL u_plane_lock( | 
|  1964       resource_provider_, quad->u_plane_resource_id(), GL_TEXTURE2, GL_LINEAR); |  1967       resource_provider_, quad->u_plane_resource_id(), GL_TEXTURE2, GL_LINEAR); | 
|  1965   DCHECK_EQ(y_plane_lock.target(), u_plane_lock.target()); |  1968   DCHECK_EQ(y_plane_lock.target(), u_plane_lock.target()); | 
|  1966   ResourceProvider::ScopedSamplerGL v_plane_lock( |  1969   // TODO(jbauman): Use base::Optional when available. | 
|  1967       resource_provider_, quad->v_plane_resource_id(), GL_TEXTURE3, GL_LINEAR); |  1970   std::unique_ptr<ResourceProvider::ScopedSamplerGL> v_plane_lock; | 
|  1968   DCHECK_EQ(y_plane_lock.target(), v_plane_lock.target()); |  1971   if (!use_nv12) { | 
 |  1972     v_plane_lock.reset(new ResourceProvider::ScopedSamplerGL( | 
 |  1973         resource_provider_, quad->v_plane_resource_id(), GL_TEXTURE3, | 
 |  1974         GL_LINEAR)); | 
 |  1975     DCHECK_EQ(y_plane_lock.target(), v_plane_lock->target()); | 
 |  1976   } | 
|  1969   std::unique_ptr<ResourceProvider::ScopedSamplerGL> a_plane_lock; |  1977   std::unique_ptr<ResourceProvider::ScopedSamplerGL> a_plane_lock; | 
|  1970   if (use_alpha_plane) { |  1978   if (use_alpha_plane) { | 
|  1971     a_plane_lock.reset(new ResourceProvider::ScopedSamplerGL( |  1979     a_plane_lock.reset(new ResourceProvider::ScopedSamplerGL( | 
|  1972         resource_provider_, quad->a_plane_resource_id(), GL_TEXTURE4, |  1980         resource_provider_, quad->a_plane_resource_id(), GL_TEXTURE4, | 
|  1973         GL_LINEAR)); |  1981         GL_LINEAR)); | 
|  1974     DCHECK_EQ(y_plane_lock.target(), a_plane_lock->target()); |  1982     DCHECK_EQ(y_plane_lock.target(), a_plane_lock->target()); | 
|  1975   } |  1983   } | 
|  1976  |  1984  | 
|  1977   // All planes must have the same sampler type. |  1985   // All planes must have the same sampler type. | 
|  1978   SamplerType sampler = SamplerTypeFromTextureTarget(y_plane_lock.target()); |  1986   SamplerType sampler = SamplerTypeFromTextureTarget(y_plane_lock.target()); | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|  2005     u_texture_location = program->fragment_shader().u_texture_location(); |  2013     u_texture_location = program->fragment_shader().u_texture_location(); | 
|  2006     v_texture_location = program->fragment_shader().v_texture_location(); |  2014     v_texture_location = program->fragment_shader().v_texture_location(); | 
|  2007     a_texture_location = program->fragment_shader().a_texture_location(); |  2015     a_texture_location = program->fragment_shader().a_texture_location(); | 
|  2008     yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); |  2016     yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); | 
|  2009     yuv_adj_location = program->fragment_shader().yuv_adj_location(); |  2017     yuv_adj_location = program->fragment_shader().yuv_adj_location(); | 
|  2010     ya_clamp_rect_location = |  2018     ya_clamp_rect_location = | 
|  2011         program->fragment_shader().ya_clamp_rect_location(); |  2019         program->fragment_shader().ya_clamp_rect_location(); | 
|  2012     uv_clamp_rect_location = |  2020     uv_clamp_rect_location = | 
|  2013         program->fragment_shader().uv_clamp_rect_location(); |  2021         program->fragment_shader().uv_clamp_rect_location(); | 
|  2014     alpha_location = program->fragment_shader().alpha_location(); |  2022     alpha_location = program->fragment_shader().alpha_location(); | 
|  2015   } else { |  2023   } else if (!use_nv12) { | 
|  2016     const VideoYUVProgram* program = |  2024     const VideoYUVProgram* program = | 
|  2017         GetVideoYUVProgram(tex_coord_precision, sampler); |  2025         GetVideoYUVProgram(tex_coord_precision, sampler); | 
|  2018     DCHECK(program && (program->initialized() || IsContextLost())); |  2026     DCHECK(program && (program->initialized() || IsContextLost())); | 
|  2019     SetUseProgram(program->program()); |  2027     SetUseProgram(program->program()); | 
|  2020     matrix_location = program->vertex_shader().matrix_location(); |  2028     matrix_location = program->vertex_shader().matrix_location(); | 
|  2021     ya_tex_scale_location = program->vertex_shader().ya_tex_scale_location(); |  2029     ya_tex_scale_location = program->vertex_shader().ya_tex_scale_location(); | 
|  2022     ya_tex_offset_location = program->vertex_shader().ya_tex_offset_location(); |  2030     ya_tex_offset_location = program->vertex_shader().ya_tex_offset_location(); | 
|  2023     uv_tex_scale_location = program->vertex_shader().uv_tex_scale_location(); |  2031     uv_tex_scale_location = program->vertex_shader().uv_tex_scale_location(); | 
|  2024     uv_tex_offset_location = program->vertex_shader().uv_tex_offset_location(); |  2032     uv_tex_offset_location = program->vertex_shader().uv_tex_offset_location(); | 
|  2025     y_texture_location = program->fragment_shader().y_texture_location(); |  2033     y_texture_location = program->fragment_shader().y_texture_location(); | 
|  2026     u_texture_location = program->fragment_shader().u_texture_location(); |  2034     u_texture_location = program->fragment_shader().u_texture_location(); | 
|  2027     v_texture_location = program->fragment_shader().v_texture_location(); |  2035     v_texture_location = program->fragment_shader().v_texture_location(); | 
|  2028     yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); |  2036     yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); | 
|  2029     yuv_adj_location = program->fragment_shader().yuv_adj_location(); |  2037     yuv_adj_location = program->fragment_shader().yuv_adj_location(); | 
|  2030     ya_clamp_rect_location = |  2038     ya_clamp_rect_location = | 
|  2031         program->fragment_shader().ya_clamp_rect_location(); |  2039         program->fragment_shader().ya_clamp_rect_location(); | 
|  2032     uv_clamp_rect_location = |  2040     uv_clamp_rect_location = | 
|  2033         program->fragment_shader().uv_clamp_rect_location(); |  2041         program->fragment_shader().uv_clamp_rect_location(); | 
|  2034     alpha_location = program->fragment_shader().alpha_location(); |  2042     alpha_location = program->fragment_shader().alpha_location(); | 
 |  2043   } else { | 
 |  2044     const VideoNV12Program* program = | 
 |  2045         GetVideoNV12Program(tex_coord_precision, sampler); | 
 |  2046     DCHECK(program && (program->initialized() || IsContextLost())); | 
 |  2047     SetUseProgram(program->program()); | 
 |  2048     matrix_location = program->vertex_shader().matrix_location(); | 
 |  2049     ya_tex_scale_location = program->vertex_shader().ya_tex_scale_location(); | 
 |  2050     ya_tex_offset_location = program->vertex_shader().ya_tex_offset_location(); | 
 |  2051     uv_tex_scale_location = program->vertex_shader().uv_tex_scale_location(); | 
 |  2052     uv_tex_offset_location = program->vertex_shader().uv_tex_offset_location(); | 
 |  2053     y_texture_location = program->fragment_shader().y_texture_location(); | 
 |  2054     u_texture_location = program->fragment_shader().uv_texture_location(); | 
 |  2055     yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); | 
 |  2056     yuv_adj_location = program->fragment_shader().yuv_adj_location(); | 
 |  2057     ya_clamp_rect_location = | 
 |  2058         program->fragment_shader().ya_clamp_rect_location(); | 
 |  2059     uv_clamp_rect_location = | 
 |  2060         program->fragment_shader().uv_clamp_rect_location(); | 
 |  2061     alpha_location = program->fragment_shader().alpha_location(); | 
|  2035   } |  2062   } | 
|  2036  |  2063  | 
|  2037   gfx::SizeF ya_tex_scale(1.0f, 1.0f); |  2064   gfx::SizeF ya_tex_scale(1.0f, 1.0f); | 
|  2038   gfx::SizeF uv_tex_scale(1.0f, 1.0f); |  2065   gfx::SizeF uv_tex_scale(1.0f, 1.0f); | 
|  2039   if (sampler != SAMPLER_TYPE_2D_RECT) { |  2066   if (sampler != SAMPLER_TYPE_2D_RECT) { | 
|  2040     DCHECK(!quad->ya_tex_size.IsEmpty()); |  2067     DCHECK(!quad->ya_tex_size.IsEmpty()); | 
|  2041     DCHECK(!quad->uv_tex_size.IsEmpty()); |  2068     DCHECK(!quad->uv_tex_size.IsEmpty()); | 
|  2042     ya_tex_scale = gfx::SizeF(1.0f / quad->ya_tex_size.width(), |  2069     ya_tex_scale = gfx::SizeF(1.0f / quad->ya_tex_size.width(), | 
|  2043                               1.0f / quad->ya_tex_size.height()); |  2070                               1.0f / quad->ya_tex_size.height()); | 
|  2044     uv_tex_scale = gfx::SizeF(1.0f / quad->uv_tex_size.width(), |  2071     uv_tex_scale = gfx::SizeF(1.0f / quad->uv_tex_size.width(), | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2080                            uv_vertex_tex_scale_x, uv_vertex_tex_scale_y); |  2107                            uv_vertex_tex_scale_x, uv_vertex_tex_scale_y); | 
|  2081   uv_clamp_rect.Inset(0.5f * uv_tex_scale.width(), |  2108   uv_clamp_rect.Inset(0.5f * uv_tex_scale.width(), | 
|  2082                       0.5f * uv_tex_scale.height()); |  2109                       0.5f * uv_tex_scale.height()); | 
|  2083   gl_->Uniform4f(ya_clamp_rect_location, ya_clamp_rect.x(), ya_clamp_rect.y(), |  2110   gl_->Uniform4f(ya_clamp_rect_location, ya_clamp_rect.x(), ya_clamp_rect.y(), | 
|  2084                  ya_clamp_rect.right(), ya_clamp_rect.bottom()); |  2111                  ya_clamp_rect.right(), ya_clamp_rect.bottom()); | 
|  2085   gl_->Uniform4f(uv_clamp_rect_location, uv_clamp_rect.x(), uv_clamp_rect.y(), |  2112   gl_->Uniform4f(uv_clamp_rect_location, uv_clamp_rect.x(), uv_clamp_rect.y(), | 
|  2086                  uv_clamp_rect.right(), uv_clamp_rect.bottom()); |  2113                  uv_clamp_rect.right(), uv_clamp_rect.bottom()); | 
|  2087  |  2114  | 
|  2088   gl_->Uniform1i(y_texture_location, 1); |  2115   gl_->Uniform1i(y_texture_location, 1); | 
|  2089   gl_->Uniform1i(u_texture_location, 2); |  2116   gl_->Uniform1i(u_texture_location, 2); | 
|  2090   gl_->Uniform1i(v_texture_location, 3); |  2117   if (!use_nv12) | 
 |  2118     gl_->Uniform1i(v_texture_location, 3); | 
|  2091   if (use_alpha_plane) |  2119   if (use_alpha_plane) | 
|  2092     gl_->Uniform1i(a_texture_location, 4); |  2120     gl_->Uniform1i(a_texture_location, 4); | 
|  2093  |  2121  | 
|  2094   // These values are magic numbers that are used in the transformation from YUV |  2122   // These values are magic numbers that are used in the transformation from YUV | 
|  2095   // to RGB color values.  They are taken from the following webpage: |  2123   // to RGB color values.  They are taken from the following webpage: | 
|  2096   // http://www.fourcc.org/fccyvrgb.php |  2124   // http://www.fourcc.org/fccyvrgb.php | 
|  2097   float yuv_to_rgb_rec601[9] = { |  2125   float yuv_to_rgb_rec601[9] = { | 
|  2098       1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f, |  2126       1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f, | 
|  2099   }; |  2127   }; | 
|  2100   float yuv_to_rgb_jpeg[9] = { |  2128   float yuv_to_rgb_jpeg[9] = { | 
| (...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3393   DCHECK_LE(sampler, LAST_SAMPLER_TYPE); |  3421   DCHECK_LE(sampler, LAST_SAMPLER_TYPE); | 
|  3394   VideoYUVProgram* program = &video_yuv_program_[precision][sampler]; |  3422   VideoYUVProgram* program = &video_yuv_program_[precision][sampler]; | 
|  3395   if (!program->initialized()) { |  3423   if (!program->initialized()) { | 
|  3396     TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize"); |  3424     TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize"); | 
|  3397     program->Initialize(output_surface_->context_provider(), precision, |  3425     program->Initialize(output_surface_->context_provider(), precision, | 
|  3398                         sampler); |  3426                         sampler); | 
|  3399   } |  3427   } | 
|  3400   return program; |  3428   return program; | 
|  3401 } |  3429 } | 
|  3402  |  3430  | 
 |  3431 const GLRenderer::VideoNV12Program* GLRenderer::GetVideoNV12Program( | 
 |  3432     TexCoordPrecision precision, | 
 |  3433     SamplerType sampler) { | 
 |  3434   DCHECK_GE(precision, 0); | 
 |  3435   DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); | 
 |  3436   DCHECK_GE(sampler, 0); | 
 |  3437   DCHECK_LE(sampler, LAST_SAMPLER_TYPE); | 
 |  3438   VideoNV12Program* program = &video_nv12_program_[precision][sampler]; | 
 |  3439   if (!program->initialized()) { | 
 |  3440     TRACE_EVENT0("cc", "GLRenderer::videoNV12Program::initialize"); | 
 |  3441     program->Initialize(output_surface_->context_provider(), precision, | 
 |  3442                         sampler); | 
 |  3443   } | 
 |  3444   return program; | 
 |  3445 } | 
 |  3446  | 
|  3403 const GLRenderer::VideoYUVAProgram* GLRenderer::GetVideoYUVAProgram( |  3447 const GLRenderer::VideoYUVAProgram* GLRenderer::GetVideoYUVAProgram( | 
|  3404     TexCoordPrecision precision, |  3448     TexCoordPrecision precision, | 
|  3405     SamplerType sampler) { |  3449     SamplerType sampler) { | 
|  3406   DCHECK_GE(precision, 0); |  3450   DCHECK_GE(precision, 0); | 
|  3407   DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |  3451   DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); | 
|  3408   DCHECK_GE(sampler, 0); |  3452   DCHECK_GE(sampler, 0); | 
|  3409   DCHECK_LE(sampler, LAST_SAMPLER_TYPE); |  3453   DCHECK_LE(sampler, LAST_SAMPLER_TYPE); | 
|  3410   VideoYUVAProgram* program = &video_yuva_program_[precision][sampler]; |  3454   VideoYUVAProgram* program = &video_yuva_program_[precision][sampler]; | 
|  3411   if (!program->initialized()) { |  3455   if (!program->initialized()) { | 
|  3412     TRACE_EVENT0("cc", "GLRenderer::videoYUVAProgram::initialize"); |  3456     TRACE_EVENT0("cc", "GLRenderer::videoYUVAProgram::initialize"); | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3446         for (int l = 0; l <= LAST_MASK_VALUE; ++l) { |  3490         for (int l = 0; l <= LAST_MASK_VALUE; ++l) { | 
|  3447           render_pass_mask_program_[i][j][k][l].Cleanup(gl_); |  3491           render_pass_mask_program_[i][j][k][l].Cleanup(gl_); | 
|  3448           render_pass_mask_program_aa_[i][j][k][l].Cleanup(gl_); |  3492           render_pass_mask_program_aa_[i][j][k][l].Cleanup(gl_); | 
|  3449           render_pass_mask_color_matrix_program_aa_[i][j][k][l].Cleanup(gl_); |  3493           render_pass_mask_color_matrix_program_aa_[i][j][k][l].Cleanup(gl_); | 
|  3450           render_pass_mask_color_matrix_program_[i][j][k][l].Cleanup(gl_); |  3494           render_pass_mask_color_matrix_program_[i][j][k][l].Cleanup(gl_); | 
|  3451         } |  3495         } | 
|  3452       } |  3496       } | 
|  3453  |  3497  | 
|  3454       video_yuv_program_[i][j].Cleanup(gl_); |  3498       video_yuv_program_[i][j].Cleanup(gl_); | 
|  3455       video_yuva_program_[i][j].Cleanup(gl_); |  3499       video_yuva_program_[i][j].Cleanup(gl_); | 
 |  3500       video_nv12_program_[i][j].Cleanup(gl_); | 
|  3456     } |  3501     } | 
|  3457     for (int j = 0; j <= LAST_BLEND_MODE; j++) { |  3502     for (int j = 0; j <= LAST_BLEND_MODE; j++) { | 
|  3458       render_pass_program_[i][j].Cleanup(gl_); |  3503       render_pass_program_[i][j].Cleanup(gl_); | 
|  3459       render_pass_program_aa_[i][j].Cleanup(gl_); |  3504       render_pass_program_aa_[i][j].Cleanup(gl_); | 
|  3460       render_pass_color_matrix_program_[i][j].Cleanup(gl_); |  3505       render_pass_color_matrix_program_[i][j].Cleanup(gl_); | 
|  3461       render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_); |  3506       render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_); | 
|  3462     } |  3507     } | 
|  3463  |  3508  | 
|  3464     for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) { |  3509     for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) { | 
|  3465       texture_program_[i][j].Cleanup(gl_); |  3510       texture_program_[i][j].Cleanup(gl_); | 
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3592       texture_id = pending_overlay_resources_.back()->texture_id(); |  3637       texture_id = pending_overlay_resources_.back()->texture_id(); | 
|  3593     } |  3638     } | 
|  3594  |  3639  | 
|  3595     context_support_->ScheduleOverlayPlane( |  3640     context_support_->ScheduleOverlayPlane( | 
|  3596         overlay.plane_z_order, overlay.transform, texture_id, |  3641         overlay.plane_z_order, overlay.transform, texture_id, | 
|  3597         ToNearestRect(overlay.display_rect), overlay.uv_rect); |  3642         ToNearestRect(overlay.display_rect), overlay.uv_rect); | 
|  3598   } |  3643   } | 
|  3599 } |  3644 } | 
|  3600  |  3645  | 
|  3601 }  // namespace cc |  3646 }  // namespace cc | 
| OLD | NEW |