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

Side by Side Diff: cc/output/gl_renderer.cc

Issue 2121043002: 16 bpp video stream capture, render and WebGL usage - Realsense R200 & SR300 support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: scoping Y8 out. Created 4 years, 2 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 unified diff | Download patch
OLDNEW
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 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 EnqueueTextureQuad(frame, TextureDrawQuad::MaterialCast(quad), 592 EnqueueTextureQuad(frame, TextureDrawQuad::MaterialCast(quad),
593 clip_region); 593 clip_region);
594 break; 594 break;
595 case DrawQuad::TILED_CONTENT: 595 case DrawQuad::TILED_CONTENT:
596 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad), clip_region); 596 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad), clip_region);
597 break; 597 break;
598 case DrawQuad::YUV_VIDEO_CONTENT: 598 case DrawQuad::YUV_VIDEO_CONTENT:
599 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad), 599 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad),
600 clip_region); 600 clip_region);
601 break; 601 break;
602 case DrawQuad::Y_VIDEO_CONTENT:
603 DrawYVideoQuad(frame, YVideoDrawQuad::MaterialCast(quad), clip_region);
604 break;
602 } 605 }
603 } 606 }
604 607
605 // This function does not handle 3D sorting right now, since the debug border 608 // This function does not handle 3D sorting right now, since the debug border
606 // quads are just drawn as their original quads and not in split pieces. This 609 // quads are just drawn as their original quads and not in split pieces. This
607 // results in some debug border quads drawing over foreground quads. 610 // results in some debug border quads drawing over foreground quads.
608 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, 611 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
609 const DebugBorderDrawQuad* quad) { 612 const DebugBorderDrawQuad* quad) {
610 SetBlendEnabled(quad->ShouldDrawWithBlending()); 613 SetBlendEnabled(quad->ShouldDrawWithBlending());
611 614
(...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after
2436 GetScaledUVs(quad->visible_rect, clip_region, uvs); 2439 GetScaledUVs(quad->visible_rect, clip_region, uvs);
2437 gfx::QuadF region_quad = *clip_region; 2440 gfx::QuadF region_quad = *clip_region;
2438 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); 2441 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height());
2439 region_quad -= gfx::Vector2dF(0.5f, 0.5f); 2442 region_quad -= gfx::Vector2dF(0.5f, 0.5f);
2440 DrawQuadGeometryClippedByQuadF( 2443 DrawQuadGeometryClippedByQuadF(
2441 frame, quad->shared_quad_state->quad_to_target_transform, tile_rect, 2444 frame, quad->shared_quad_state->quad_to_target_transform, tile_rect,
2442 region_quad, matrix_location, uvs); 2445 region_quad, matrix_location, uvs);
2443 } 2446 }
2444 } 2447 }
2445 2448
2449 void GLRenderer::DrawYVideoQuad(const DrawingFrame* frame,
2450 const YVideoDrawQuad* quad,
2451 const gfx::QuadF* clip_region) {
2452 SetBlendEnabled(quad->ShouldDrawWithBlending());
2453 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
2454 gl_, &highp_threshold_cache_, highp_threshold_min_,
2455 quad->shared_quad_state->visible_quad_layer_rect.bottom_right());
2456
2457 ResourceProvider::ScopedReadLockGL lock(resource_provider_,
2458 quad->resource_id());
2459 const SamplerType sampler = SamplerTypeFromTextureTarget(lock.target());
2460 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
2461 gl_->BindTexture(lock.target(), lock.texture_id());
2462
2463 const VideoYProgram* program = GetVideoYProgram(tex_coord_precision, sampler);
2464 DCHECK(program && (program->initialized() || IsContextLost()));
2465 SetUseProgram(program->program());
2466
2467 // Set the uv-transform.
2468 Float4 uv_transform = {{0.0f, 0.0f, 1.0f, 1.0f}};
2469 if (!clip_region) {
2470 gfx::PointF uv0 = quad->uv_top_left;
2471 gfx::PointF uv1 = quad->uv_bottom_right;
2472 uv_transform = {{uv0.x(), uv0.y(), uv1.x() - uv0.x(), uv1.y() - uv0.y()}};
2473 }
2474 gfx::Size texture_size = lock.size();
2475 if (sampler == SAMPLER_TYPE_2D_RECT) {
2476 // Un-normalize the texture coordiantes for rectangle targets.
2477 uv_transform.data[0] *= texture_size.width();
2478 uv_transform.data[2] *= texture_size.width();
2479 uv_transform.data[1] *= texture_size.height();
2480 uv_transform.data[3] *= texture_size.height();
2481 }
2482 gl_->Uniform4fv(program->vertex_shader().tex_transform_location(), 1,
2483 uv_transform.data);
2484 gl_->Uniform1i(program->fragment_shader().sampler_location(), 0);
2485 gl_->Uniform1f(program->fragment_shader().x_derivative_location(),
2486 1.f / (float)texture_size.width());
2487 gl_->Uniform1f(program->fragment_shader().y_derivative_location(),
2488 1.f / (float)texture_size.height());
2489
2490 if (!clip_region) {
2491 DrawQuadGeometry(frame->projection_matrix,
2492 quad->shared_quad_state->quad_to_target_transform,
2493 gfx::RectF(quad->rect),
2494 program->vertex_shader().matrix_location());
2495 } else {
2496 gfx::QuadF region_quad(*clip_region);
2497 region_quad.Scale(1.0f / quad->rect.width(), 1.0f / quad->rect.height());
2498 region_quad -= gfx::Vector2dF(0.5f, 0.5f);
2499 float uvs[8] = {0};
2500 GetScaledUVs(quad->visible_rect, clip_region, uvs);
2501 DrawQuadGeometryClippedByQuadF(
2502 frame, quad->shared_quad_state->quad_to_target_transform,
2503 gfx::RectF(quad->rect), region_quad,
2504 program->vertex_shader().matrix_location(), uvs);
2505 }
2506 }
2507
2446 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, 2508 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame,
2447 const StreamVideoDrawQuad* quad, 2509 const StreamVideoDrawQuad* quad,
2448 const gfx::QuadF* clip_region) { 2510 const gfx::QuadF* clip_region) {
2449 SetBlendEnabled(quad->ShouldDrawWithBlending()); 2511 SetBlendEnabled(quad->ShouldDrawWithBlending());
2450 2512
2451 static float gl_matrix[16]; 2513 static float gl_matrix[16];
2452 2514
2453 DCHECK(output_surface_->context_provider() 2515 DCHECK(output_surface_->context_provider()
2454 ->ContextCapabilities() 2516 ->ContextCapabilities()
2455 .egl_image_external); 2517 .egl_image_external);
(...skipping 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3636 if (!program->initialized()) { 3698 if (!program->initialized()) {
3637 TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize"); 3699 TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize");
3638 program->mutable_fragment_shader()->SetFeatures(use_alpha_plane, use_nv12, 3700 program->mutable_fragment_shader()->SetFeatures(use_alpha_plane, use_nv12,
3639 use_color_lut); 3701 use_color_lut);
3640 program->Initialize(output_surface_->context_provider(), precision, 3702 program->Initialize(output_surface_->context_provider(), precision,
3641 sampler); 3703 sampler);
3642 } 3704 }
3643 return program; 3705 return program;
3644 } 3706 }
3645 3707
3708 const GLRenderer::VideoYProgram* GLRenderer::GetVideoYProgram(
3709 TexCoordPrecision precision,
3710 SamplerType sampler) {
3711 DCHECK_GE(precision, 0);
3712 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
3713 DCHECK_GE(sampler, 0);
3714 DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
3715 VideoYProgram* program = &video_y_program_[precision][sampler];
3716 if (!program->initialized()) {
3717 TRACE_EVENT0("cc", "GLRenderer::videoYProgram::initialize");
3718 program->Initialize(output_surface_->context_provider(), precision,
3719 sampler);
3720 }
3721 return program;
3722 }
3723
3646 const GLRenderer::VideoStreamTextureProgram* 3724 const GLRenderer::VideoStreamTextureProgram*
3647 GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) { 3725 GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) {
3648 DCHECK_GE(precision, 0); 3726 DCHECK_GE(precision, 0);
3649 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); 3727 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
3650 VideoStreamTextureProgram* program = 3728 VideoStreamTextureProgram* program =
3651 &video_stream_texture_program_[precision]; 3729 &video_stream_texture_program_[precision];
3652 if (!program->initialized()) { 3730 if (!program->initialized()) {
3653 TRACE_EVENT0("cc", "GLRenderer::streamTextureProgram::initialize"); 3731 TRACE_EVENT0("cc", "GLRenderer::streamTextureProgram::initialize");
3654 program->Initialize(output_surface_->context_provider(), precision, 3732 program->Initialize(output_surface_->context_provider(), precision,
3655 SAMPLER_TYPE_EXTERNAL_OES); 3733 SAMPLER_TYPE_EXTERNAL_OES);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3691 render_pass_program_aa_[i][j].Cleanup(gl_); 3769 render_pass_program_aa_[i][j].Cleanup(gl_);
3692 render_pass_color_matrix_program_[i][j].Cleanup(gl_); 3770 render_pass_color_matrix_program_[i][j].Cleanup(gl_);
3693 render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_); 3771 render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_);
3694 } 3772 }
3695 3773
3696 for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) { 3774 for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) {
3697 texture_program_[i][j].Cleanup(gl_); 3775 texture_program_[i][j].Cleanup(gl_);
3698 nonpremultiplied_texture_program_[i][j].Cleanup(gl_); 3776 nonpremultiplied_texture_program_[i][j].Cleanup(gl_);
3699 texture_background_program_[i][j].Cleanup(gl_); 3777 texture_background_program_[i][j].Cleanup(gl_);
3700 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_); 3778 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_);
3779 video_y_program_[i][j].Cleanup(gl_);
3701 } 3780 }
3702 3781
3703 video_stream_texture_program_[i].Cleanup(gl_); 3782 video_stream_texture_program_[i].Cleanup(gl_);
3704 } 3783 }
3705 3784
3706 debug_border_program_.Cleanup(gl_); 3785 debug_border_program_.Cleanup(gl_);
3707 solid_color_program_.Cleanup(gl_); 3786 solid_color_program_.Cleanup(gl_);
3708 solid_color_program_aa_.Cleanup(gl_); 3787 solid_color_program_aa_.Cleanup(gl_);
3709 3788
3710 if (offscreen_framebuffer_id_) 3789 if (offscreen_framebuffer_id_)
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
4035 4114
4036 gl_->ScheduleCALayerSharedStateCHROMIUM( 4115 gl_->ScheduleCALayerSharedStateCHROMIUM(
4037 ca_layer_overlay->shared_state->opacity, is_clipped, clip_rect, 4116 ca_layer_overlay->shared_state->opacity, is_clipped, clip_rect,
4038 sorting_context_id, gl_transform); 4117 sorting_context_id, gl_transform);
4039 gl_->ScheduleCALayerCHROMIUM( 4118 gl_->ScheduleCALayerCHROMIUM(
4040 texture_id, contents_rect, ca_layer_overlay->background_color, 4119 texture_id, contents_rect, ca_layer_overlay->background_color,
4041 ca_layer_overlay->edge_aa_mask, bounds_rect, filter); 4120 ca_layer_overlay->edge_aa_mask, bounds_rect, filter);
4042 } 4121 }
4043 4122
4044 } // namespace cc 4123 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698