Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3330)

Unified Diff: cc/output/gl_renderer.cc

Issue 12157002: Adding YUVA support for enabling Alpha Playback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase and calming down the try bots Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 4da3aab24144f9ce96547ccfd964bdbb93eb26a4..e04c63738ad921cb422aa4cf0241147d556acb70 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -1386,8 +1386,7 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame,
context_, &highp_threshold_cache_, highp_threshold_min_,
quad->shared_quad_state->visible_content_rect.bottom_right());
- const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision);
- DCHECK(program && (program->initialized() || IsContextLost()));
+ bool use_alpha_plane = quad->a_plane_resource_id != 0;
GLC(Context(), Context()->activeTexture(GL_TEXTURE1));
ResourceProvider::ScopedSamplerGL y_plane_lock(
@@ -1398,19 +1397,61 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame,
GLC(Context(), Context()->activeTexture(GL_TEXTURE3));
ResourceProvider::ScopedSamplerGL v_plane_lock(
resource_provider_, quad->v_plane_resource_id, GL_TEXTURE_2D, GL_LINEAR);
+ scoped_ptr<ResourceProvider::ScopedSamplerGL> a_plane_lock;
+ if (use_alpha_plane) {
+ GLC(Context(), Context()->activeTexture(GL_TEXTURE4));
+ a_plane_lock.reset(new ResourceProvider::ScopedSamplerGL(
+ resource_provider_,
+ quad->a_plane_resource_id,
+ GL_TEXTURE_2D,
+ GL_LINEAR));
+ }
- SetUseProgram(program->program());
+ int tex_scale_location = -1;
+ int matrix_location = -1;
+ int y_texture_location = -1;
+ int u_texture_location = -1;
+ int v_texture_location = -1;
+ int a_texture_location = -1;
+ int yuv_matrix_location = -1;
+ int yuv_adj_location = -1;
+ int alpha_location = -1;
+ if (use_alpha_plane) {
+ const VideoYUVAProgram* program = GetVideoYUVAProgram(tex_coord_precision);
+ DCHECK(program && (program->initialized() || IsContextLost()));
+ SetUseProgram(program->program());
+ tex_scale_location = program->vertex_shader().tex_scale_location();
+ matrix_location = program->vertex_shader().matrix_location();
+ y_texture_location = program->fragment_shader().y_texture_location();
+ u_texture_location = program->fragment_shader().u_texture_location();
+ v_texture_location = program->fragment_shader().v_texture_location();
+ a_texture_location = program->fragment_shader().a_texture_location();
+ yuv_matrix_location = program->fragment_shader().yuv_matrix_location();
+ yuv_adj_location = program->fragment_shader().yuv_adj_location();
+ alpha_location = program->fragment_shader().alpha_location();
+ } else {
+ const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision);
+ DCHECK(program && (program->initialized() || IsContextLost()));
+ SetUseProgram(program->program());
+ tex_scale_location = program->vertex_shader().tex_scale_location();
+ matrix_location = program->vertex_shader().matrix_location();
+ y_texture_location = program->fragment_shader().y_texture_location();
+ u_texture_location = program->fragment_shader().u_texture_location();
+ v_texture_location = program->fragment_shader().v_texture_location();
+ yuv_matrix_location = program->fragment_shader().yuv_matrix_location();
+ yuv_adj_location = program->fragment_shader().yuv_adj_location();
+ alpha_location = program->fragment_shader().alpha_location();
+ }
GLC(Context(),
- Context()->uniform2f(program->vertex_shader().tex_scale_location(),
+ Context()->uniform2f(tex_scale_location,
quad->tex_scale.width(),
quad->tex_scale.height()));
- GLC(Context(),
- Context()->uniform1i(program->fragment_shader().y_texture_location(), 1));
- GLC(Context(),
- Context()->uniform1i(program->fragment_shader().u_texture_location(), 2));
- GLC(Context(),
- Context()->uniform1i(program->fragment_shader().v_texture_location(), 3));
+ GLC(Context(), Context()->uniform1i(y_texture_location, 1));
+ GLC(Context(), Context()->uniform1i(u_texture_location, 2));
+ GLC(Context(), Context()->uniform1i(v_texture_location, 3));
+ if (use_alpha_plane)
+ GLC(Context(), Context()->uniform1i(a_texture_location, 4));
// These values are magic numbers that are used in the transformation from YUV
// to RGB color values. They are taken from the following webpage:
@@ -1421,8 +1462,7 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame,
1.596f, -.813f, 0.0f,
};
GLC(Context(),
- Context()->uniformMatrix3fv(
- program->fragment_shader().yuv_matrix_location(), 1, 0, yuv_to_rgb));
+ Context()->uniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb));
// These values map to 16, 128, and 128 respectively, and are computed
// as a fraction over 256 (e.g. 16 / 256 = 0.0625).
@@ -1431,16 +1471,11 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame,
// U - 128 : Turns unsigned U into signed U [-128,127]
// V - 128 : Turns unsigned V into signed V [-128,127]
float yuv_adjust[3] = { -0.0625f, -0.5f, -0.5f, };
- GLC(Context(),
- Context()->uniform3fv(
- program->fragment_shader().yuv_adj_location(), 1, yuv_adjust));
+ GLC(Context(), Context()->uniform3fv(yuv_adj_location, 1, yuv_adjust));
- SetShaderOpacity(quad->opacity(),
- program->fragment_shader().alpha_location());
- DrawQuadGeometry(frame,
- quad->quadTransform(),
- quad->rect,
- program->vertex_shader().matrix_location());
+
+ SetShaderOpacity(quad->opacity(), alpha_location);
+ DrawQuadGeometry(frame, quad->quadTransform(), quad->rect, matrix_location);
// Reset active texture back to texture 0.
GLC(Context(), Context()->activeTexture(GL_TEXTURE0));
@@ -2737,6 +2772,20 @@ const GLRenderer::VideoYUVProgram* GLRenderer::GetVideoYUVProgram(
return program.get();
}
+const GLRenderer::VideoYUVAProgram* GLRenderer::GetVideoYUVAProgram(
+ TexCoordPrecision precision) {
+ scoped_ptr<VideoYUVAProgram>& program =
+ (precision == TexCoordPrecisionHigh) ? video_yuva_program_highp_
+ : video_yuva_program_;
+ if (!program)
+ program = make_scoped_ptr(new VideoYUVAProgram(context_, precision));
+ if (!program->initialized()) {
+ TRACE_EVENT0("cc", "GLRenderer::videoYUVAProgram::initialize");
+ program->Initialize(context_, is_using_bind_uniform_);
+ }
+ return program.get();
+}
+
const GLRenderer::VideoStreamTextureProgram*
GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) {
if (!Capabilities().using_egl_image)
@@ -2837,11 +2886,15 @@ void GLRenderer::CleanupSharedObjects() {
if (video_yuv_program_)
video_yuv_program_->Cleanup(context_);
+ if (video_yuva_program_)
+ video_yuva_program_->Cleanup(context_);
if (video_stream_texture_program_)
video_stream_texture_program_->Cleanup(context_);
if (video_yuv_program_highp_)
video_yuv_program_highp_->Cleanup(context_);
+ if (video_yuva_program_highp_)
+ video_yuva_program_highp_->Cleanup(context_);
if (video_stream_texture_program_highp_)
video_stream_texture_program_highp_->Cleanup(context_);

Powered by Google App Engine
This is Rietveld 408576698