| 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 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 const gfx::QuadF* clip_region) { | 511 const gfx::QuadF* clip_region) { |
| 512 DCHECK(quad->rect.Contains(quad->visible_rect)); | 512 DCHECK(quad->rect.Contains(quad->visible_rect)); |
| 513 if (quad->material != DrawQuad::TEXTURE_CONTENT) { | 513 if (quad->material != DrawQuad::TEXTURE_CONTENT) { |
| 514 FlushTextureQuadCache(SHARED_BINDING); | 514 FlushTextureQuadCache(SHARED_BINDING); |
| 515 } | 515 } |
| 516 | 516 |
| 517 switch (quad->material) { | 517 switch (quad->material) { |
| 518 case DrawQuad::INVALID: | 518 case DrawQuad::INVALID: |
| 519 NOTREACHED(); | 519 NOTREACHED(); |
| 520 break; | 520 break; |
| 521 case DrawQuad::CHECKERBOARD: | |
| 522 DrawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad), | |
| 523 clip_region); | |
| 524 break; | |
| 525 case DrawQuad::DEBUG_BORDER: | 521 case DrawQuad::DEBUG_BORDER: |
| 526 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); | 522 DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); |
| 527 break; | 523 break; |
| 528 case DrawQuad::IO_SURFACE_CONTENT: | 524 case DrawQuad::IO_SURFACE_CONTENT: |
| 529 DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad), | 525 DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad), |
| 530 clip_region); | 526 clip_region); |
| 531 break; | 527 break; |
| 532 case DrawQuad::PICTURE_CONTENT: | 528 case DrawQuad::PICTURE_CONTENT: |
| 533 // PictureDrawQuad should only be used for resourceless software draws. | 529 // PictureDrawQuad should only be used for resourceless software draws. |
| 534 NOTREACHED(); | 530 NOTREACHED(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 557 case DrawQuad::TILED_CONTENT: | 553 case DrawQuad::TILED_CONTENT: |
| 558 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad), clip_region); | 554 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad), clip_region); |
| 559 break; | 555 break; |
| 560 case DrawQuad::YUV_VIDEO_CONTENT: | 556 case DrawQuad::YUV_VIDEO_CONTENT: |
| 561 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad), | 557 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad), |
| 562 clip_region); | 558 clip_region); |
| 563 break; | 559 break; |
| 564 } | 560 } |
| 565 } | 561 } |
| 566 | 562 |
| 567 void GLRenderer::DrawCheckerboardQuad(const DrawingFrame* frame, | |
| 568 const CheckerboardDrawQuad* quad, | |
| 569 const gfx::QuadF* clip_region) { | |
| 570 // TODO(enne) For now since checkerboards shouldn't be part of a 3D | |
| 571 // context, clipping regions aren't supported so we skip drawing them | |
| 572 // if this becomes the case. | |
| 573 if (clip_region) { | |
| 574 return; | |
| 575 } | |
| 576 SetBlendEnabled(quad->ShouldDrawWithBlending()); | |
| 577 | |
| 578 const TileCheckerboardProgram* program = GetTileCheckerboardProgram(); | |
| 579 DCHECK(program && (program->initialized() || IsContextLost())); | |
| 580 SetUseProgram(program->program()); | |
| 581 | |
| 582 SkColor color = quad->color; | |
| 583 gl_->Uniform4f(program->fragment_shader().color_location(), | |
| 584 SkColorGetR(color) * (1.0f / 255.0f), | |
| 585 SkColorGetG(color) * (1.0f / 255.0f), | |
| 586 SkColorGetB(color) * (1.0f / 255.0f), 1); | |
| 587 | |
| 588 const int kCheckerboardWidth = 16; | |
| 589 float frequency = 1.0f / kCheckerboardWidth; | |
| 590 | |
| 591 gfx::Rect tile_rect = quad->rect; | |
| 592 float tex_offset_x = | |
| 593 static_cast<int>(tile_rect.x() / quad->scale) % kCheckerboardWidth; | |
| 594 float tex_offset_y = | |
| 595 static_cast<int>(tile_rect.y() / quad->scale) % kCheckerboardWidth; | |
| 596 float tex_scale_x = tile_rect.width() / quad->scale; | |
| 597 float tex_scale_y = tile_rect.height() / quad->scale; | |
| 598 gl_->Uniform4f(program->fragment_shader().tex_transform_location(), | |
| 599 tex_offset_x, tex_offset_y, tex_scale_x, tex_scale_y); | |
| 600 | |
| 601 gl_->Uniform1f(program->fragment_shader().frequency_location(), frequency); | |
| 602 | |
| 603 SetShaderOpacity(quad->shared_quad_state->opacity, | |
| 604 program->fragment_shader().alpha_location()); | |
| 605 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | |
| 606 quad->rect, program->vertex_shader().matrix_location()); | |
| 607 } | |
| 608 | |
| 609 // This function does not handle 3D sorting right now, since the debug border | 563 // This function does not handle 3D sorting right now, since the debug border |
| 610 // quads are just drawn as their original quads and not in split pieces. This | 564 // quads are just drawn as their original quads and not in split pieces. This |
| 611 // results in some debug border quads drawing over foreground quads. | 565 // results in some debug border quads drawing over foreground quads. |
| 612 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, | 566 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, |
| 613 const DebugBorderDrawQuad* quad) { | 567 const DebugBorderDrawQuad* quad) { |
| 614 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 568 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
| 615 | 569 |
| 616 static float gl_matrix[16]; | 570 static float gl_matrix[16]; |
| 617 const DebugBorderProgram* program = GetDebugBorderProgram(); | 571 const DebugBorderProgram* program = GetDebugBorderProgram(); |
| 618 DCHECK(program && (program->initialized() || IsContextLost())); | 572 DCHECK(program && (program->initialized() || IsContextLost())); |
| (...skipping 2401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3020 break; | 2974 break; |
| 3021 case CLIPPED_BINDING: | 2975 case CLIPPED_BINDING: |
| 3022 clipped_geometry_->PrepareForDraw(); | 2976 clipped_geometry_->PrepareForDraw(); |
| 3023 break; | 2977 break; |
| 3024 case NO_BINDING: | 2978 case NO_BINDING: |
| 3025 break; | 2979 break; |
| 3026 } | 2980 } |
| 3027 bound_geometry_ = binding; | 2981 bound_geometry_ = binding; |
| 3028 } | 2982 } |
| 3029 | 2983 |
| 3030 const GLRenderer::TileCheckerboardProgram* | |
| 3031 GLRenderer::GetTileCheckerboardProgram() { | |
| 3032 if (!tile_checkerboard_program_.initialized()) { | |
| 3033 TRACE_EVENT0("cc", "GLRenderer::checkerboardProgram::initalize"); | |
| 3034 tile_checkerboard_program_.Initialize(output_surface_->context_provider(), | |
| 3035 TEX_COORD_PRECISION_NA, | |
| 3036 SAMPLER_TYPE_NA); | |
| 3037 } | |
| 3038 return &tile_checkerboard_program_; | |
| 3039 } | |
| 3040 | |
| 3041 const GLRenderer::DebugBorderProgram* GLRenderer::GetDebugBorderProgram() { | 2984 const GLRenderer::DebugBorderProgram* GLRenderer::GetDebugBorderProgram() { |
| 3042 if (!debug_border_program_.initialized()) { | 2985 if (!debug_border_program_.initialized()) { |
| 3043 TRACE_EVENT0("cc", "GLRenderer::debugBorderProgram::initialize"); | 2986 TRACE_EVENT0("cc", "GLRenderer::debugBorderProgram::initialize"); |
| 3044 debug_border_program_.Initialize(output_surface_->context_provider(), | 2987 debug_border_program_.Initialize(output_surface_->context_provider(), |
| 3045 TEX_COORD_PRECISION_NA, SAMPLER_TYPE_NA); | 2988 TEX_COORD_PRECISION_NA, SAMPLER_TYPE_NA); |
| 3046 } | 2989 } |
| 3047 return &debug_border_program_; | 2990 return &debug_border_program_; |
| 3048 } | 2991 } |
| 3049 | 2992 |
| 3050 const GLRenderer::SolidColorProgram* GLRenderer::GetSolidColorProgram() { | 2993 const GLRenderer::SolidColorProgram* GLRenderer::GetSolidColorProgram() { |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3492 texture_program_[i][j].Cleanup(gl_); | 3435 texture_program_[i][j].Cleanup(gl_); |
| 3493 nonpremultiplied_texture_program_[i][j].Cleanup(gl_); | 3436 nonpremultiplied_texture_program_[i][j].Cleanup(gl_); |
| 3494 texture_background_program_[i][j].Cleanup(gl_); | 3437 texture_background_program_[i][j].Cleanup(gl_); |
| 3495 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_); | 3438 nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_); |
| 3496 } | 3439 } |
| 3497 texture_io_surface_program_[i].Cleanup(gl_); | 3440 texture_io_surface_program_[i].Cleanup(gl_); |
| 3498 | 3441 |
| 3499 video_stream_texture_program_[i].Cleanup(gl_); | 3442 video_stream_texture_program_[i].Cleanup(gl_); |
| 3500 } | 3443 } |
| 3501 | 3444 |
| 3502 tile_checkerboard_program_.Cleanup(gl_); | |
| 3503 | |
| 3504 debug_border_program_.Cleanup(gl_); | 3445 debug_border_program_.Cleanup(gl_); |
| 3505 solid_color_program_.Cleanup(gl_); | 3446 solid_color_program_.Cleanup(gl_); |
| 3506 solid_color_program_aa_.Cleanup(gl_); | 3447 solid_color_program_aa_.Cleanup(gl_); |
| 3507 | 3448 |
| 3508 if (offscreen_framebuffer_id_) | 3449 if (offscreen_framebuffer_id_) |
| 3509 gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); | 3450 gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); |
| 3510 | 3451 |
| 3511 if (on_demand_tile_raster_resource_id_) | 3452 if (on_demand_tile_raster_resource_id_) |
| 3512 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 3453 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); |
| 3513 | 3454 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3588 context_support_->ScheduleOverlayPlane( | 3529 context_support_->ScheduleOverlayPlane( |
| 3589 overlay.plane_z_order, | 3530 overlay.plane_z_order, |
| 3590 overlay.transform, | 3531 overlay.transform, |
| 3591 pending_overlay_resources_.back()->texture_id(), | 3532 pending_overlay_resources_.back()->texture_id(), |
| 3592 ToNearestRect(overlay.display_rect), | 3533 ToNearestRect(overlay.display_rect), |
| 3593 overlay.uv_rect); | 3534 overlay.uv_rect); |
| 3594 } | 3535 } |
| 3595 } | 3536 } |
| 3596 | 3537 |
| 3597 } // namespace cc | 3538 } // namespace cc |
| OLD | NEW |