| 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 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 FlushTextureQuadCache(SHARED_BINDING); | 519 FlushTextureQuadCache(SHARED_BINDING); |
| 520 } | 520 } |
| 521 | 521 |
| 522 switch (quad->material) { | 522 switch (quad->material) { |
| 523 case DrawQuad::INVALID: | 523 case DrawQuad::INVALID: |
| 524 NOTREACHED(); | 524 NOTREACHED(); |
| 525 break; | 525 break; |
| 526 case DrawQuad::DEBUG_BORDER: | 526 case DrawQuad::DEBUG_BORDER: |
| 527 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); | 527 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); |
| 528 break; | 528 break; |
| 529 case DrawQuad::IO_SURFACE_CONTENT: | |
| 530 DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad), | |
| 531 clip_region); | |
| 532 break; | |
| 533 case DrawQuad::PICTURE_CONTENT: | 529 case DrawQuad::PICTURE_CONTENT: |
| 534 // PictureDrawQuad should only be used for resourceless software draws. | 530 // PictureDrawQuad should only be used for resourceless software draws. |
| 535 NOTREACHED(); | 531 NOTREACHED(); |
| 536 break; | 532 break; |
| 537 case DrawQuad::RENDER_PASS: | 533 case DrawQuad::RENDER_PASS: |
| 538 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad), | 534 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad), |
| 539 clip_region); | 535 clip_region); |
| 540 break; | 536 break; |
| 541 case DrawQuad::SOLID_COLOR: | 537 case DrawQuad::SOLID_COLOR: |
| 542 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad), | 538 DrawSolidColorQuad(frame, SolidColorDrawQuad::MaterialCast(quad), |
| (...skipping 1930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2473 uv[4] = scaled_region.p3().x() + 0.5f; | 2469 uv[4] = scaled_region.p3().x() + 0.5f; |
| 2474 uv[5] = scaled_region.p3().y() + 0.5f; | 2470 uv[5] = scaled_region.p3().y() + 0.5f; |
| 2475 uv[6] = scaled_region.p4().x() + 0.5f; | 2471 uv[6] = scaled_region.p4().x() + 0.5f; |
| 2476 uv[7] = scaled_region.p4().y() + 0.5f; | 2472 uv[7] = scaled_region.p4().y() + 0.5f; |
| 2477 PrepareGeometry(CLIPPED_BINDING); | 2473 PrepareGeometry(CLIPPED_BINDING); |
| 2478 clipped_geometry_->InitializeCustomQuadWithUVs(scaled_region, uv); | 2474 clipped_geometry_->InitializeCustomQuadWithUVs(scaled_region, uv); |
| 2479 FlushTextureQuadCache(CLIPPED_BINDING); | 2475 FlushTextureQuadCache(CLIPPED_BINDING); |
| 2480 } | 2476 } |
| 2481 } | 2477 } |
| 2482 | 2478 |
| 2483 void GLRenderer::DrawIOSurfaceQuad(const DrawingFrame* frame, | |
| 2484 const IOSurfaceDrawQuad* quad, | |
| 2485 const gfx::QuadF* clip_region) { | |
| 2486 SetBlendEnabled(quad->ShouldDrawWithBlending()); | |
| 2487 | |
| 2488 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | |
| 2489 gl_, &highp_threshold_cache_, highp_threshold_min_, | |
| 2490 quad->shared_quad_state->visible_quad_layer_rect.bottom_right()); | |
| 2491 | |
| 2492 TexTransformTextureProgramBinding binding; | |
| 2493 binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision)); | |
| 2494 | |
| 2495 SetUseProgram(binding.program_id); | |
| 2496 gl_->Uniform1i(binding.sampler_location, 0); | |
| 2497 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { | |
| 2498 gl_->Uniform4f( | |
| 2499 binding.tex_transform_location, 0, quad->io_surface_size.height(), | |
| 2500 quad->io_surface_size.width(), quad->io_surface_size.height() * -1.0f); | |
| 2501 } else { | |
| 2502 gl_->Uniform4f(binding.tex_transform_location, 0, 0, | |
| 2503 quad->io_surface_size.width(), | |
| 2504 quad->io_surface_size.height()); | |
| 2505 } | |
| 2506 | |
| 2507 const float vertex_opacity[] = {quad->shared_quad_state->opacity, | |
| 2508 quad->shared_quad_state->opacity, | |
| 2509 quad->shared_quad_state->opacity, | |
| 2510 quad->shared_quad_state->opacity}; | |
| 2511 gl_->Uniform1fv(binding.vertex_opacity_location, 4, vertex_opacity); | |
| 2512 | |
| 2513 ResourceProvider::ScopedReadLockGL lock(resource_provider_, | |
| 2514 quad->io_surface_resource_id()); | |
| 2515 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | |
| 2516 gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, lock.texture_id()); | |
| 2517 | |
| 2518 if (!clip_region) { | |
| 2519 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | |
| 2520 gfx::RectF(quad->rect), binding.matrix_location); | |
| 2521 } else { | |
| 2522 float uvs[8] = {0}; | |
| 2523 GetScaledUVs(quad->visible_rect, clip_region, uvs); | |
| 2524 DrawQuadGeometryClippedByQuadF( | |
| 2525 frame, quad->shared_quad_state->quad_to_target_transform, | |
| 2526 gfx::RectF(quad->rect), *clip_region, binding.matrix_location, uvs); | |
| 2527 } | |
| 2528 | |
| 2529 gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); | |
| 2530 } | |
| 2531 | |
| 2532 void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 2479 void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
| 2533 if (use_sync_query_) { | 2480 if (use_sync_query_) { |
| 2534 DCHECK(current_sync_query_); | 2481 DCHECK(current_sync_query_); |
| 2535 current_sync_query_->End(); | 2482 current_sync_query_->End(); |
| 2536 pending_sync_queries_.push_back(std::move(current_sync_query_)); | 2483 pending_sync_queries_.push_back(std::move(current_sync_query_)); |
| 2537 } | 2484 } |
| 2538 | 2485 |
| 2539 current_framebuffer_lock_ = nullptr; | 2486 current_framebuffer_lock_ = nullptr; |
| 2540 swap_buffer_rect_.Union(frame->root_damage_rect); | 2487 swap_buffer_rect_.Union(frame->root_damage_rect); |
| 2541 | 2488 |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3405 &nonpremultiplied_texture_background_program_[precision][sampler]; | 3352 &nonpremultiplied_texture_background_program_[precision][sampler]; |
| 3406 if (!program->initialized()) { | 3353 if (!program->initialized()) { |
| 3407 TRACE_EVENT0("cc", | 3354 TRACE_EVENT0("cc", |
| 3408 "GLRenderer::NonPremultipliedTextureProgram::Initialize"); | 3355 "GLRenderer::NonPremultipliedTextureProgram::Initialize"); |
| 3409 program->Initialize(output_surface_->context_provider(), precision, | 3356 program->Initialize(output_surface_->context_provider(), precision, |
| 3410 sampler); | 3357 sampler); |
| 3411 } | 3358 } |
| 3412 return program; | 3359 return program; |
| 3413 } | 3360 } |
| 3414 | 3361 |
| 3415 const GLRenderer::TextureProgram* GLRenderer::GetTextureIOSurfaceProgram( | |
| 3416 TexCoordPrecision precision) { | |
| 3417 DCHECK_GE(precision, 0); | |
| 3418 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); | |
| 3419 TextureProgram* program = &texture_io_surface_program_[precision]; | |
| 3420 if (!program->initialized()) { | |
| 3421 TRACE_EVENT0("cc", "GLRenderer::textureIOSurfaceProgram::initialize"); | |
| 3422 program->Initialize(output_surface_->context_provider(), precision, | |
| 3423 SAMPLER_TYPE_2D_RECT); | |
| 3424 } | |
| 3425 return program; | |
| 3426 } | |
| 3427 | |
| 3428 const GLRenderer::VideoYUVProgram* GLRenderer::GetVideoYUVProgram( | 3362 const GLRenderer::VideoYUVProgram* GLRenderer::GetVideoYUVProgram( |
| 3429 TexCoordPrecision precision, | 3363 TexCoordPrecision precision, |
| 3430 SamplerType sampler) { | 3364 SamplerType sampler) { |
| 3431 DCHECK_GE(precision, 0); | 3365 DCHECK_GE(precision, 0); |
| 3432 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); | 3366 DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |
| 3433 DCHECK_GE(sampler, 0); | 3367 DCHECK_GE(sampler, 0); |
| 3434 DCHECK_LE(sampler, LAST_SAMPLER_TYPE); | 3368 DCHECK_LE(sampler, LAST_SAMPLER_TYPE); |
| 3435 VideoYUVProgram* program = &video_yuv_program_[precision][sampler]; | 3369 VideoYUVProgram* program = &video_yuv_program_[precision][sampler]; |
| 3436 if (!program->initialized()) { | 3370 if (!program->initialized()) { |
| 3437 TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize"); | 3371 TRACE_EVENT0("cc", "GLRenderer::videoYUVProgram::initialize"); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3518 render_pass_color_matrix_program_[i][j].Cleanup(gl_); | 3452 render_pass_color_matrix_program_[i][j].Cleanup(gl_); |
| 3519 render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_); | 3453 render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_); |
| 3520 } | 3454 } |
| 3521 | 3455 |
| 3522 for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) { | 3456 for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) { |
| 3523 texture_program_[i][j].Cleanup(gl_); | 3457 texture_program_[i][j].Cleanup(gl_); |
| 3524 nonpremultiplied_texture_program_[i][j].Cleanup(gl_); | 3458 nonpremultiplied_texture_program_[i][j].Cleanup(gl_); |
| 3525 texture_background_program_[i][j].Cleanup(gl_); | 3459 texture_background_program_[i][j].Cleanup(gl_); |
| 3526 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_); | 3460 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_); |
| 3527 } | 3461 } |
| 3528 texture_io_surface_program_[i].Cleanup(gl_); | |
| 3529 | 3462 |
| 3530 video_stream_texture_program_[i].Cleanup(gl_); | 3463 video_stream_texture_program_[i].Cleanup(gl_); |
| 3531 } | 3464 } |
| 3532 | 3465 |
| 3533 debug_border_program_.Cleanup(gl_); | 3466 debug_border_program_.Cleanup(gl_); |
| 3534 solid_color_program_.Cleanup(gl_); | 3467 solid_color_program_.Cleanup(gl_); |
| 3535 solid_color_program_aa_.Cleanup(gl_); | 3468 solid_color_program_aa_.Cleanup(gl_); |
| 3536 | 3469 |
| 3537 if (offscreen_framebuffer_id_) | 3470 if (offscreen_framebuffer_id_) |
| 3538 gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); | 3471 gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3652 texture_id = pending_overlay_resources_.back()->texture_id(); | 3585 texture_id = pending_overlay_resources_.back()->texture_id(); |
| 3653 } | 3586 } |
| 3654 | 3587 |
| 3655 context_support_->ScheduleOverlayPlane( | 3588 context_support_->ScheduleOverlayPlane( |
| 3656 overlay.plane_z_order, overlay.transform, texture_id, | 3589 overlay.plane_z_order, overlay.transform, texture_id, |
| 3657 ToNearestRect(overlay.display_rect), overlay.uv_rect); | 3590 ToNearestRect(overlay.display_rect), overlay.uv_rect); |
| 3658 } | 3591 } |
| 3659 } | 3592 } |
| 3660 | 3593 |
| 3661 } // namespace cc | 3594 } // namespace cc |
| OLD | NEW |