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 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 | 375 |
376 in_use_overlay_resources_.clear(); | 376 in_use_overlay_resources_.clear(); |
377 | 377 |
378 CleanupSharedObjects(); | 378 CleanupSharedObjects(); |
379 } | 379 } |
380 | 380 |
381 const RendererCapabilitiesImpl& GLRenderer::Capabilities() const { | 381 const RendererCapabilitiesImpl& GLRenderer::Capabilities() const { |
382 return capabilities_; | 382 return capabilities_; |
383 } | 383 } |
384 | 384 |
385 void GLRenderer::DebugGLCall(GLES2Interface* gl, | |
386 const char* command, | |
387 const char* file, | |
388 int line) { | |
389 GLuint error = gl->GetError(); | |
390 if (error != GL_NO_ERROR) | |
391 LOG(ERROR) << "GL command failed: File: " << file << "\n\tLine " << line | |
392 << "\n\tcommand: " << command << ", error " | |
393 << static_cast<int>(error) << "\n"; | |
394 } | |
395 | |
396 void GLRenderer::DidChangeVisibility() { | 385 void GLRenderer::DidChangeVisibility() { |
397 EnforceMemoryPolicy(); | 386 EnforceMemoryPolicy(); |
398 | 387 |
399 context_support_->SetSurfaceVisible(visible()); | 388 context_support_->SetSurfaceVisible(visible()); |
400 } | 389 } |
401 | 390 |
402 void GLRenderer::ReleaseRenderPassTextures() { render_pass_textures_.clear(); } | 391 void GLRenderer::ReleaseRenderPassTextures() { render_pass_textures_.clear(); } |
403 | 392 |
404 void GLRenderer::DiscardPixels() { | 393 void GLRenderer::DiscardPixels() { |
405 if (!capabilities_.using_discard_framebuffer) | 394 if (!capabilities_.using_discard_framebuffer) |
(...skipping 26 matching lines...) Expand all Loading... |
432 SetScissorTestRect(render_pass_scissor); | 421 SetScissorTestRect(render_pass_scissor); |
433 ClearFramebuffer(frame); | 422 ClearFramebuffer(frame); |
434 break; | 423 break; |
435 } | 424 } |
436 } | 425 } |
437 | 426 |
438 void GLRenderer::ClearFramebuffer(DrawingFrame* frame) { | 427 void GLRenderer::ClearFramebuffer(DrawingFrame* frame) { |
439 // On DEBUG builds, opaque render passes are cleared to blue to easily see | 428 // On DEBUG builds, opaque render passes are cleared to blue to easily see |
440 // regions that were not drawn on the screen. | 429 // regions that were not drawn on the screen. |
441 if (frame->current_render_pass->has_transparent_background) | 430 if (frame->current_render_pass->has_transparent_background) |
442 GLC(gl_, gl_->ClearColor(0, 0, 0, 0)); | 431 gl_->ClearColor(0, 0, 0, 0); |
443 else | 432 else |
444 GLC(gl_, gl_->ClearColor(0, 0, 1, 1)); | 433 gl_->ClearColor(0, 0, 1, 1); |
445 | 434 |
446 bool always_clear = false; | 435 bool always_clear = false; |
447 #ifndef NDEBUG | 436 #ifndef NDEBUG |
448 always_clear = true; | 437 always_clear = true; |
449 #endif | 438 #endif |
450 if (always_clear || frame->current_render_pass->has_transparent_background) { | 439 if (always_clear || frame->current_render_pass->has_transparent_background) { |
451 GLbitfield clear_bits = GL_COLOR_BUFFER_BIT; | 440 GLbitfield clear_bits = GL_COLOR_BUFFER_BIT; |
452 if (always_clear) | 441 if (always_clear) |
453 clear_bits |= GL_STENCIL_BUFFER_BIT; | 442 clear_bits |= GL_STENCIL_BUFFER_BIT; |
454 gl_->Clear(clear_bits); | 443 gl_->Clear(clear_bits); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 for (const auto& pass : *frame->render_passes_in_draw_order) { | 491 for (const auto& pass : *frame->render_passes_in_draw_order) { |
503 for (const auto& quad : pass->quad_list) | 492 for (const auto& quad : pass->quad_list) |
504 quad->IterateResources(wait_on_resource_syncpoints_callback); | 493 quad->IterateResources(wait_on_resource_syncpoints_callback); |
505 } | 494 } |
506 | 495 |
507 // TODO(enne): Do we need to reinitialize all of this state per frame? | 496 // TODO(enne): Do we need to reinitialize all of this state per frame? |
508 ReinitializeGLState(); | 497 ReinitializeGLState(); |
509 } | 498 } |
510 | 499 |
511 void GLRenderer::DoNoOp() { | 500 void GLRenderer::DoNoOp() { |
512 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, 0)); | 501 gl_->BindFramebuffer(GL_FRAMEBUFFER, 0); |
513 GLC(gl_, gl_->Flush()); | 502 gl_->Flush(); |
514 } | 503 } |
515 | 504 |
516 void GLRenderer::DoDrawQuad(DrawingFrame* frame, | 505 void GLRenderer::DoDrawQuad(DrawingFrame* frame, |
517 const DrawQuad* quad, | 506 const DrawQuad* quad, |
518 const gfx::QuadF* clip_region) { | 507 const gfx::QuadF* clip_region) { |
519 DCHECK(quad->rect.Contains(quad->visible_rect)); | 508 DCHECK(quad->rect.Contains(quad->visible_rect)); |
520 if (quad->material != DrawQuad::TEXTURE_CONTENT) { | 509 if (quad->material != DrawQuad::TEXTURE_CONTENT) { |
521 FlushTextureQuadCache(SHARED_BINDING); | 510 FlushTextureQuadCache(SHARED_BINDING); |
522 } | 511 } |
523 | 512 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 if (clip_region) { | 569 if (clip_region) { |
581 return; | 570 return; |
582 } | 571 } |
583 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 572 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
584 | 573 |
585 const TileCheckerboardProgram* program = GetTileCheckerboardProgram(); | 574 const TileCheckerboardProgram* program = GetTileCheckerboardProgram(); |
586 DCHECK(program && (program->initialized() || IsContextLost())); | 575 DCHECK(program && (program->initialized() || IsContextLost())); |
587 SetUseProgram(program->program()); | 576 SetUseProgram(program->program()); |
588 | 577 |
589 SkColor color = quad->color; | 578 SkColor color = quad->color; |
590 GLC(gl_, | 579 gl_->Uniform4f(program->fragment_shader().color_location(), |
591 gl_->Uniform4f(program->fragment_shader().color_location(), | 580 SkColorGetR(color) * (1.0f / 255.0f), |
592 SkColorGetR(color) * (1.0f / 255.0f), | 581 SkColorGetG(color) * (1.0f / 255.0f), |
593 SkColorGetG(color) * (1.0f / 255.0f), | 582 SkColorGetB(color) * (1.0f / 255.0f), 1); |
594 SkColorGetB(color) * (1.0f / 255.0f), | |
595 1)); | |
596 | 583 |
597 const int kCheckerboardWidth = 16; | 584 const int kCheckerboardWidth = 16; |
598 float frequency = 1.0f / kCheckerboardWidth; | 585 float frequency = 1.0f / kCheckerboardWidth; |
599 | 586 |
600 gfx::Rect tile_rect = quad->rect; | 587 gfx::Rect tile_rect = quad->rect; |
601 float tex_offset_x = | 588 float tex_offset_x = |
602 static_cast<int>(tile_rect.x() / quad->scale) % kCheckerboardWidth; | 589 static_cast<int>(tile_rect.x() / quad->scale) % kCheckerboardWidth; |
603 float tex_offset_y = | 590 float tex_offset_y = |
604 static_cast<int>(tile_rect.y() / quad->scale) % kCheckerboardWidth; | 591 static_cast<int>(tile_rect.y() / quad->scale) % kCheckerboardWidth; |
605 float tex_scale_x = tile_rect.width() / quad->scale; | 592 float tex_scale_x = tile_rect.width() / quad->scale; |
606 float tex_scale_y = tile_rect.height() / quad->scale; | 593 float tex_scale_y = tile_rect.height() / quad->scale; |
607 GLC(gl_, | 594 gl_->Uniform4f(program->fragment_shader().tex_transform_location(), |
608 gl_->Uniform4f(program->fragment_shader().tex_transform_location(), | 595 tex_offset_x, tex_offset_y, tex_scale_x, tex_scale_y); |
609 tex_offset_x, | |
610 tex_offset_y, | |
611 tex_scale_x, | |
612 tex_scale_y)); | |
613 | 596 |
614 GLC(gl_, | 597 gl_->Uniform1f(program->fragment_shader().frequency_location(), frequency); |
615 gl_->Uniform1f(program->fragment_shader().frequency_location(), | |
616 frequency)); | |
617 | 598 |
618 SetShaderOpacity(quad->opacity(), | 599 SetShaderOpacity(quad->opacity(), |
619 program->fragment_shader().alpha_location()); | 600 program->fragment_shader().alpha_location()); |
620 DrawQuadGeometry(frame, | 601 DrawQuadGeometry(frame, |
621 quad->quadTransform(), | 602 quad->quadTransform(), |
622 quad->rect, | 603 quad->rect, |
623 program->vertex_shader().matrix_location()); | 604 program->vertex_shader().matrix_location()); |
624 } | 605 } |
625 | 606 |
626 // This function does not handle 3D sorting right now, since the debug border | 607 // This function does not handle 3D sorting right now, since the debug border |
627 // quads are just drawn as their original quads and not in split pieces. This | 608 // quads are just drawn as their original quads and not in split pieces. This |
628 // results in some debug border quads drawing over foreground quads. | 609 // results in some debug border quads drawing over foreground quads. |
629 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, | 610 void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, |
630 const DebugBorderDrawQuad* quad) { | 611 const DebugBorderDrawQuad* quad) { |
631 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 612 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
632 | 613 |
633 static float gl_matrix[16]; | 614 static float gl_matrix[16]; |
634 const DebugBorderProgram* program = GetDebugBorderProgram(); | 615 const DebugBorderProgram* program = GetDebugBorderProgram(); |
635 DCHECK(program && (program->initialized() || IsContextLost())); | 616 DCHECK(program && (program->initialized() || IsContextLost())); |
636 SetUseProgram(program->program()); | 617 SetUseProgram(program->program()); |
637 | 618 |
638 // Use the full quad_rect for debug quads to not move the edges based on | 619 // Use the full quad_rect for debug quads to not move the edges based on |
639 // partial swaps. | 620 // partial swaps. |
640 gfx::Rect layer_rect = quad->rect; | 621 gfx::Rect layer_rect = quad->rect; |
641 gfx::Transform render_matrix; | 622 gfx::Transform render_matrix; |
642 QuadRectTransform(&render_matrix, quad->quadTransform(), layer_rect); | 623 QuadRectTransform(&render_matrix, quad->quadTransform(), layer_rect); |
643 GLRenderer::ToGLMatrix(&gl_matrix[0], | 624 GLRenderer::ToGLMatrix(&gl_matrix[0], |
644 frame->projection_matrix * render_matrix); | 625 frame->projection_matrix * render_matrix); |
645 GLC(gl_, | 626 gl_->UniformMatrix4fv(program->vertex_shader().matrix_location(), 1, false, |
646 gl_->UniformMatrix4fv( | 627 &gl_matrix[0]); |
647 program->vertex_shader().matrix_location(), 1, false, &gl_matrix[0])); | |
648 | 628 |
649 SkColor color = quad->color; | 629 SkColor color = quad->color; |
650 float alpha = SkColorGetA(color) * (1.0f / 255.0f); | 630 float alpha = SkColorGetA(color) * (1.0f / 255.0f); |
651 | 631 |
652 GLC(gl_, | 632 gl_->Uniform4f(program->fragment_shader().color_location(), |
653 gl_->Uniform4f(program->fragment_shader().color_location(), | 633 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, |
654 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, | 634 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, |
655 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, | 635 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, alpha); |
656 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, | |
657 alpha)); | |
658 | 636 |
659 GLC(gl_, gl_->LineWidth(quad->width)); | 637 gl_->LineWidth(quad->width); |
660 | 638 |
661 // The indices for the line are stored in the same array as the triangle | 639 // The indices for the line are stored in the same array as the triangle |
662 // indices. | 640 // indices. |
663 GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); | 641 gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0); |
664 } | 642 } |
665 | 643 |
666 static skia::RefPtr<SkImage> ApplyImageFilter( | 644 static skia::RefPtr<SkImage> ApplyImageFilter( |
667 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, | 645 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
668 ResourceProvider* resource_provider, | 646 ResourceProvider* resource_provider, |
669 const gfx::Rect& rect, | 647 const gfx::Rect& rect, |
670 const gfx::Vector2dF& scale, | 648 const gfx::Vector2dF& scale, |
671 SkImageFilter* filter, | 649 SkImageFilter* filter, |
672 ScopedResource* source_texture_resource) { | 650 ScopedResource* source_texture_resource) { |
673 if (!filter) | 651 if (!filter) |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
813 case SkXfermode::kColor_Mode: | 791 case SkXfermode::kColor_Mode: |
814 equation = GL_HSL_COLOR_KHR; | 792 equation = GL_HSL_COLOR_KHR; |
815 break; | 793 break; |
816 case SkXfermode::kLuminosity_Mode: | 794 case SkXfermode::kLuminosity_Mode: |
817 equation = GL_HSL_LUMINOSITY_KHR; | 795 equation = GL_HSL_LUMINOSITY_KHR; |
818 break; | 796 break; |
819 default: | 797 default: |
820 return; | 798 return; |
821 } | 799 } |
822 | 800 |
823 GLC(gl_, gl_->BlendEquation(equation)); | 801 gl_->BlendEquation(equation); |
824 } else { | 802 } else { |
825 if (blend_mode == SkXfermode::kScreen_Mode) { | 803 if (blend_mode == SkXfermode::kScreen_Mode) { |
826 GLC(gl_, gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)); | 804 gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE); |
827 } | 805 } |
828 } | 806 } |
829 } | 807 } |
830 | 808 |
831 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { | 809 void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { |
832 if (blend_mode == SkXfermode::kSrcOver_Mode) | 810 if (blend_mode == SkXfermode::kSrcOver_Mode) |
833 return; | 811 return; |
834 | 812 |
835 if (use_blend_equation_advanced_) { | 813 if (use_blend_equation_advanced_) { |
836 GLC(gl_, gl_->BlendEquation(GL_FUNC_ADD)); | 814 gl_->BlendEquation(GL_FUNC_ADD); |
837 } else { | 815 } else { |
838 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 816 gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); |
839 } | 817 } |
840 } | 818 } |
841 | 819 |
842 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame, | 820 bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame, |
843 const RenderPassDrawQuad* quad) { | 821 const RenderPassDrawQuad* quad) { |
844 if (quad->background_filters.IsEmpty()) | 822 if (quad->background_filters.IsEmpty()) |
845 return false; | 823 return false; |
846 | 824 |
847 // TODO(danakj): We only allow background filters on an opaque render surface | 825 // TODO(danakj): We only allow background filters on an opaque render surface |
848 // because other surfaces may contain translucent pixels, and the contents | 826 // because other surfaces may contain translucent pixels, and the contents |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 } else { | 1064 } else { |
1087 contents_resource_lock = | 1065 contents_resource_lock = |
1088 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( | 1066 make_scoped_ptr(new ResourceProvider::ScopedSamplerGL( |
1089 resource_provider_, contents_texture->id(), GL_LINEAR)); | 1067 resource_provider_, contents_texture->id(), GL_LINEAR)); |
1090 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1068 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
1091 contents_resource_lock->target()); | 1069 contents_resource_lock->target()); |
1092 } | 1070 } |
1093 | 1071 |
1094 if (!use_shaders_for_blending) { | 1072 if (!use_shaders_for_blending) { |
1095 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) | 1073 if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_) |
1096 GLC(gl_, gl_->BlendBarrierKHR()); | 1074 gl_->BlendBarrierKHR(); |
1097 | 1075 |
1098 ApplyBlendModeUsingBlendFunc(blend_mode); | 1076 ApplyBlendModeUsingBlendFunc(blend_mode); |
1099 } | 1077 } |
1100 | 1078 |
1101 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1079 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
1102 gl_, | 1080 gl_, |
1103 &highp_threshold_cache_, | 1081 &highp_threshold_cache_, |
1104 highp_threshold_min_, | 1082 highp_threshold_min_, |
1105 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1083 quad->shared_quad_state->visible_content_rect.bottom_right()); |
1106 | 1084 |
1107 ShaderLocations locations; | 1085 ShaderLocations locations; |
1108 | 1086 |
1109 DCHECK_EQ(background_texture || background_image, use_shaders_for_blending); | 1087 DCHECK_EQ(background_texture || background_image, use_shaders_for_blending); |
1110 BlendMode shader_blend_mode = use_shaders_for_blending | 1088 BlendMode shader_blend_mode = use_shaders_for_blending |
1111 ? BlendModeFromSkXfermode(blend_mode) | 1089 ? BlendModeFromSkXfermode(blend_mode) |
1112 : BLEND_MODE_NONE; | 1090 : BLEND_MODE_NONE; |
1113 | 1091 |
1114 if (use_aa && mask_texture_id && !use_color_matrix) { | 1092 if (use_aa && mask_texture_id && !use_color_matrix) { |
1115 const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA( | 1093 const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA( |
1116 tex_coord_precision, mask_sampler, | 1094 tex_coord_precision, mask_sampler, |
1117 shader_blend_mode, mask_for_background); | 1095 shader_blend_mode, mask_for_background); |
1118 SetUseProgram(program->program()); | 1096 SetUseProgram(program->program()); |
1119 program->vertex_shader().FillLocations(&locations); | 1097 program->vertex_shader().FillLocations(&locations); |
1120 program->fragment_shader().FillLocations(&locations); | 1098 program->fragment_shader().FillLocations(&locations); |
1121 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1099 gl_->Uniform1i(locations.sampler, 0); |
1122 } else if (!use_aa && mask_texture_id && !use_color_matrix) { | 1100 } else if (!use_aa && mask_texture_id && !use_color_matrix) { |
1123 const RenderPassMaskProgram* program = GetRenderPassMaskProgram( | 1101 const RenderPassMaskProgram* program = GetRenderPassMaskProgram( |
1124 tex_coord_precision, mask_sampler, | 1102 tex_coord_precision, mask_sampler, |
1125 shader_blend_mode, mask_for_background); | 1103 shader_blend_mode, mask_for_background); |
1126 SetUseProgram(program->program()); | 1104 SetUseProgram(program->program()); |
1127 program->vertex_shader().FillLocations(&locations); | 1105 program->vertex_shader().FillLocations(&locations); |
1128 program->fragment_shader().FillLocations(&locations); | 1106 program->fragment_shader().FillLocations(&locations); |
1129 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1107 gl_->Uniform1i(locations.sampler, 0); |
1130 } else if (use_aa && !mask_texture_id && !use_color_matrix) { | 1108 } else if (use_aa && !mask_texture_id && !use_color_matrix) { |
1131 const RenderPassProgramAA* program = | 1109 const RenderPassProgramAA* program = |
1132 GetRenderPassProgramAA(tex_coord_precision, shader_blend_mode); | 1110 GetRenderPassProgramAA(tex_coord_precision, shader_blend_mode); |
1133 SetUseProgram(program->program()); | 1111 SetUseProgram(program->program()); |
1134 program->vertex_shader().FillLocations(&locations); | 1112 program->vertex_shader().FillLocations(&locations); |
1135 program->fragment_shader().FillLocations(&locations); | 1113 program->fragment_shader().FillLocations(&locations); |
1136 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1114 gl_->Uniform1i(locations.sampler, 0); |
1137 } else if (use_aa && mask_texture_id && use_color_matrix) { | 1115 } else if (use_aa && mask_texture_id && use_color_matrix) { |
1138 const RenderPassMaskColorMatrixProgramAA* program = | 1116 const RenderPassMaskColorMatrixProgramAA* program = |
1139 GetRenderPassMaskColorMatrixProgramAA( | 1117 GetRenderPassMaskColorMatrixProgramAA( |
1140 tex_coord_precision, mask_sampler, | 1118 tex_coord_precision, mask_sampler, |
1141 shader_blend_mode, mask_for_background); | 1119 shader_blend_mode, mask_for_background); |
1142 SetUseProgram(program->program()); | 1120 SetUseProgram(program->program()); |
1143 program->vertex_shader().FillLocations(&locations); | 1121 program->vertex_shader().FillLocations(&locations); |
1144 program->fragment_shader().FillLocations(&locations); | 1122 program->fragment_shader().FillLocations(&locations); |
1145 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1123 gl_->Uniform1i(locations.sampler, 0); |
1146 } else if (use_aa && !mask_texture_id && use_color_matrix) { | 1124 } else if (use_aa && !mask_texture_id && use_color_matrix) { |
1147 const RenderPassColorMatrixProgramAA* program = | 1125 const RenderPassColorMatrixProgramAA* program = |
1148 GetRenderPassColorMatrixProgramAA(tex_coord_precision, | 1126 GetRenderPassColorMatrixProgramAA(tex_coord_precision, |
1149 shader_blend_mode); | 1127 shader_blend_mode); |
1150 SetUseProgram(program->program()); | 1128 SetUseProgram(program->program()); |
1151 program->vertex_shader().FillLocations(&locations); | 1129 program->vertex_shader().FillLocations(&locations); |
1152 program->fragment_shader().FillLocations(&locations); | 1130 program->fragment_shader().FillLocations(&locations); |
1153 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1131 gl_->Uniform1i(locations.sampler, 0); |
1154 } else if (!use_aa && mask_texture_id && use_color_matrix) { | 1132 } else if (!use_aa && mask_texture_id && use_color_matrix) { |
1155 const RenderPassMaskColorMatrixProgram* program = | 1133 const RenderPassMaskColorMatrixProgram* program = |
1156 GetRenderPassMaskColorMatrixProgram( | 1134 GetRenderPassMaskColorMatrixProgram( |
1157 tex_coord_precision, mask_sampler, | 1135 tex_coord_precision, mask_sampler, |
1158 shader_blend_mode, mask_for_background); | 1136 shader_blend_mode, mask_for_background); |
1159 SetUseProgram(program->program()); | 1137 SetUseProgram(program->program()); |
1160 program->vertex_shader().FillLocations(&locations); | 1138 program->vertex_shader().FillLocations(&locations); |
1161 program->fragment_shader().FillLocations(&locations); | 1139 program->fragment_shader().FillLocations(&locations); |
1162 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1140 gl_->Uniform1i(locations.sampler, 0); |
1163 } else if (!use_aa && !mask_texture_id && use_color_matrix) { | 1141 } else if (!use_aa && !mask_texture_id && use_color_matrix) { |
1164 const RenderPassColorMatrixProgram* program = | 1142 const RenderPassColorMatrixProgram* program = |
1165 GetRenderPassColorMatrixProgram(tex_coord_precision, shader_blend_mode); | 1143 GetRenderPassColorMatrixProgram(tex_coord_precision, shader_blend_mode); |
1166 SetUseProgram(program->program()); | 1144 SetUseProgram(program->program()); |
1167 program->vertex_shader().FillLocations(&locations); | 1145 program->vertex_shader().FillLocations(&locations); |
1168 program->fragment_shader().FillLocations(&locations); | 1146 program->fragment_shader().FillLocations(&locations); |
1169 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1147 gl_->Uniform1i(locations.sampler, 0); |
1170 } else { | 1148 } else { |
1171 const RenderPassProgram* program = | 1149 const RenderPassProgram* program = |
1172 GetRenderPassProgram(tex_coord_precision, shader_blend_mode); | 1150 GetRenderPassProgram(tex_coord_precision, shader_blend_mode); |
1173 SetUseProgram(program->program()); | 1151 SetUseProgram(program->program()); |
1174 program->vertex_shader().FillLocations(&locations); | 1152 program->vertex_shader().FillLocations(&locations); |
1175 program->fragment_shader().FillLocations(&locations); | 1153 program->fragment_shader().FillLocations(&locations); |
1176 GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); | 1154 gl_->Uniform1i(locations.sampler, 0); |
1177 } | 1155 } |
1178 float tex_scale_x = | 1156 float tex_scale_x = |
1179 quad->rect.width() / static_cast<float>(contents_texture->size().width()); | 1157 quad->rect.width() / static_cast<float>(contents_texture->size().width()); |
1180 float tex_scale_y = quad->rect.height() / | 1158 float tex_scale_y = quad->rect.height() / |
1181 static_cast<float>(contents_texture->size().height()); | 1159 static_cast<float>(contents_texture->size().height()); |
1182 DCHECK_LE(tex_scale_x, 1.0f); | 1160 DCHECK_LE(tex_scale_x, 1.0f); |
1183 DCHECK_LE(tex_scale_y, 1.0f); | 1161 DCHECK_LE(tex_scale_y, 1.0f); |
1184 | 1162 |
1185 DCHECK(locations.tex_transform != -1 || IsContextLost()); | 1163 DCHECK(locations.tex_transform != -1 || IsContextLost()); |
1186 // Flip the content vertically in the shader, as the RenderPass input | 1164 // Flip the content vertically in the shader, as the RenderPass input |
1187 // texture is already oriented the same way as the framebuffer, but the | 1165 // texture is already oriented the same way as the framebuffer, but the |
1188 // projection transform does a flip. | 1166 // projection transform does a flip. |
1189 GLC(gl_, | 1167 gl_->Uniform4f(locations.tex_transform, 0.0f, tex_scale_y, tex_scale_x, |
1190 gl_->Uniform4f(locations.tex_transform, | 1168 -tex_scale_y); |
1191 0.0f, | |
1192 tex_scale_y, | |
1193 tex_scale_x, | |
1194 -tex_scale_y)); | |
1195 | 1169 |
1196 GLint last_texture_unit = 0; | 1170 GLint last_texture_unit = 0; |
1197 if (locations.mask_sampler != -1) { | 1171 if (locations.mask_sampler != -1) { |
1198 DCHECK_NE(locations.mask_tex_coord_scale, 1); | 1172 DCHECK_NE(locations.mask_tex_coord_scale, 1); |
1199 DCHECK_NE(locations.mask_tex_coord_offset, 1); | 1173 DCHECK_NE(locations.mask_tex_coord_offset, 1); |
1200 GLC(gl_, gl_->Uniform1i(locations.mask_sampler, 1)); | 1174 gl_->Uniform1i(locations.mask_sampler, 1); |
1201 | 1175 |
1202 gfx::RectF mask_uv_rect = quad->MaskUVRect(); | 1176 gfx::RectF mask_uv_rect = quad->MaskUVRect(); |
1203 if (mask_sampler != SAMPLER_TYPE_2D) { | 1177 if (mask_sampler != SAMPLER_TYPE_2D) { |
1204 mask_uv_rect.Scale(quad->mask_texture_size.width(), | 1178 mask_uv_rect.Scale(quad->mask_texture_size.width(), |
1205 quad->mask_texture_size.height()); | 1179 quad->mask_texture_size.height()); |
1206 } | 1180 } |
1207 | 1181 |
1208 // Mask textures are oriented vertically flipped relative to the framebuffer | 1182 // Mask textures are oriented vertically flipped relative to the framebuffer |
1209 // and the RenderPass contents texture, so we flip the tex coords from the | 1183 // and the RenderPass contents texture, so we flip the tex coords from the |
1210 // RenderPass texture to find the mask texture coords. | 1184 // RenderPass texture to find the mask texture coords. |
1211 GLC(gl_, | 1185 gl_->Uniform2f(locations.mask_tex_coord_offset, mask_uv_rect.x(), |
1212 gl_->Uniform2f(locations.mask_tex_coord_offset, | 1186 mask_uv_rect.bottom()); |
1213 mask_uv_rect.x(), | 1187 gl_->Uniform2f(locations.mask_tex_coord_scale, |
1214 mask_uv_rect.bottom())); | 1188 mask_uv_rect.width() / tex_scale_x, |
1215 GLC(gl_, | 1189 -mask_uv_rect.height() / tex_scale_y); |
1216 gl_->Uniform2f(locations.mask_tex_coord_scale, | |
1217 mask_uv_rect.width() / tex_scale_x, | |
1218 -mask_uv_rect.height() / tex_scale_y)); | |
1219 | 1190 |
1220 last_texture_unit = 1; | 1191 last_texture_unit = 1; |
1221 } | 1192 } |
1222 | 1193 |
1223 if (locations.edge != -1) | 1194 if (locations.edge != -1) |
1224 GLC(gl_, gl_->Uniform3fv(locations.edge, 8, edge)); | 1195 gl_->Uniform3fv(locations.edge, 8, edge); |
1225 | 1196 |
1226 if (locations.viewport != -1) { | 1197 if (locations.viewport != -1) { |
1227 float viewport[4] = { | 1198 float viewport[4] = { |
1228 static_cast<float>(current_window_space_viewport_.x()), | 1199 static_cast<float>(current_window_space_viewport_.x()), |
1229 static_cast<float>(current_window_space_viewport_.y()), | 1200 static_cast<float>(current_window_space_viewport_.y()), |
1230 static_cast<float>(current_window_space_viewport_.width()), | 1201 static_cast<float>(current_window_space_viewport_.width()), |
1231 static_cast<float>(current_window_space_viewport_.height()), | 1202 static_cast<float>(current_window_space_viewport_.height()), |
1232 }; | 1203 }; |
1233 GLC(gl_, gl_->Uniform4fv(locations.viewport, 1, viewport)); | 1204 gl_->Uniform4fv(locations.viewport, 1, viewport); |
1234 } | 1205 } |
1235 | 1206 |
1236 if (locations.color_matrix != -1) { | 1207 if (locations.color_matrix != -1) { |
1237 float matrix[16]; | 1208 float matrix[16]; |
1238 for (int i = 0; i < 4; ++i) { | 1209 for (int i = 0; i < 4; ++i) { |
1239 for (int j = 0; j < 4; ++j) | 1210 for (int j = 0; j < 4; ++j) |
1240 matrix[i * 4 + j] = SkScalarToFloat(color_matrix[j * 5 + i]); | 1211 matrix[i * 4 + j] = SkScalarToFloat(color_matrix[j * 5 + i]); |
1241 } | 1212 } |
1242 GLC(gl_, | 1213 gl_->UniformMatrix4fv(locations.color_matrix, 1, false, matrix); |
1243 gl_->UniformMatrix4fv(locations.color_matrix, 1, false, matrix)); | |
1244 } | 1214 } |
1245 static const float kScale = 1.0f / 255.0f; | 1215 static const float kScale = 1.0f / 255.0f; |
1246 if (locations.color_offset != -1) { | 1216 if (locations.color_offset != -1) { |
1247 float offset[4]; | 1217 float offset[4]; |
1248 for (int i = 0; i < 4; ++i) | 1218 for (int i = 0; i < 4; ++i) |
1249 offset[i] = SkScalarToFloat(color_matrix[i * 5 + 4]) * kScale; | 1219 offset[i] = SkScalarToFloat(color_matrix[i * 5 + 4]) * kScale; |
1250 | 1220 |
1251 GLC(gl_, gl_->Uniform4fv(locations.color_offset, 1, offset)); | 1221 gl_->Uniform4fv(locations.color_offset, 1, offset); |
1252 } | 1222 } |
1253 | 1223 |
1254 scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_background_sampler_lock; | 1224 scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_background_sampler_lock; |
1255 if (locations.backdrop != -1) { | 1225 if (locations.backdrop != -1) { |
1256 DCHECK(background_texture || background_image); | 1226 DCHECK(background_texture || background_image); |
1257 DCHECK_NE(locations.backdrop, 0); | 1227 DCHECK_NE(locations.backdrop, 0); |
1258 DCHECK_NE(locations.backdrop_rect, 0); | 1228 DCHECK_NE(locations.backdrop_rect, 0); |
1259 | 1229 |
1260 GLC(gl_, gl_->Uniform1i(locations.backdrop, ++last_texture_unit)); | 1230 gl_->Uniform1i(locations.backdrop, ++last_texture_unit); |
1261 | 1231 |
1262 GLC(gl_, | 1232 gl_->Uniform4f(locations.backdrop_rect, background_rect.x(), |
1263 gl_->Uniform4f(locations.backdrop_rect, | 1233 background_rect.y(), background_rect.width(), |
1264 background_rect.x(), | 1234 background_rect.height()); |
1265 background_rect.y(), | |
1266 background_rect.width(), | |
1267 background_rect.height())); | |
1268 | 1235 |
1269 if (background_image) { | 1236 if (background_image) { |
1270 GrTexture* texture = background_image->getTexture(); | 1237 GrTexture* texture = background_image->getTexture(); |
1271 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit)); | 1238 gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit); |
1272 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 1239 gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
1273 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); | 1240 gl_->ActiveTexture(GL_TEXTURE0); |
1274 if (mask_for_background) | 1241 if (mask_for_background) |
1275 GLC(gl_, gl_->Uniform1i(locations.original_backdrop, | 1242 gl_->Uniform1i(locations.original_backdrop, ++last_texture_unit); |
1276 ++last_texture_unit)); | |
1277 } | 1243 } |
1278 if (background_texture) { | 1244 if (background_texture) { |
1279 shader_background_sampler_lock = make_scoped_ptr( | 1245 shader_background_sampler_lock = make_scoped_ptr( |
1280 new ResourceProvider::ScopedSamplerGL(resource_provider_, | 1246 new ResourceProvider::ScopedSamplerGL(resource_provider_, |
1281 background_texture->id(), | 1247 background_texture->id(), |
1282 GL_TEXTURE0 + last_texture_unit, | 1248 GL_TEXTURE0 + last_texture_unit, |
1283 GL_LINEAR)); | 1249 GL_LINEAR)); |
1284 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1250 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
1285 shader_background_sampler_lock->target()); | 1251 shader_background_sampler_lock->target()); |
1286 } | 1252 } |
1287 } | 1253 } |
1288 | 1254 |
1289 SetShaderOpacity(quad->opacity(), locations.alpha); | 1255 SetShaderOpacity(quad->opacity(), locations.alpha); |
1290 SetShaderQuadF(surface_quad, locations.quad); | 1256 SetShaderQuadF(surface_quad, locations.quad); |
1291 DrawQuadGeometry( | 1257 DrawQuadGeometry( |
1292 frame, quad->quadTransform(), quad->rect, locations.matrix); | 1258 frame, quad->quadTransform(), quad->rect, locations.matrix); |
1293 | 1259 |
1294 // Flush the compositor context before the filter bitmap goes out of | 1260 // Flush the compositor context before the filter bitmap goes out of |
1295 // scope, so the draw gets processed before the filter texture gets deleted. | 1261 // scope, so the draw gets processed before the filter texture gets deleted. |
1296 if (filter_image) | 1262 if (filter_image) |
1297 GLC(gl_, gl_->Flush()); | 1263 gl_->Flush(); |
1298 | 1264 |
1299 if (!use_shaders_for_blending) | 1265 if (!use_shaders_for_blending) |
1300 RestoreBlendFuncToDefault(blend_mode); | 1266 RestoreBlendFuncToDefault(blend_mode); |
1301 } | 1267 } |
1302 | 1268 |
1303 struct SolidColorProgramUniforms { | 1269 struct SolidColorProgramUniforms { |
1304 unsigned program; | 1270 unsigned program; |
1305 unsigned matrix_location; | 1271 unsigned matrix_location; |
1306 unsigned viewport_location; | 1272 unsigned viewport_location; |
1307 unsigned quad_location; | 1273 unsigned quad_location; |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 clip_region, &local_quad, edge); | 1566 clip_region, &local_quad, edge); |
1601 | 1567 |
1602 SolidColorProgramUniforms uniforms; | 1568 SolidColorProgramUniforms uniforms; |
1603 if (use_aa) { | 1569 if (use_aa) { |
1604 SolidColorUniformLocation(GetSolidColorProgramAA(), &uniforms); | 1570 SolidColorUniformLocation(GetSolidColorProgramAA(), &uniforms); |
1605 } else { | 1571 } else { |
1606 SolidColorUniformLocation(GetSolidColorProgram(), &uniforms); | 1572 SolidColorUniformLocation(GetSolidColorProgram(), &uniforms); |
1607 } | 1573 } |
1608 SetUseProgram(uniforms.program); | 1574 SetUseProgram(uniforms.program); |
1609 | 1575 |
1610 GLC(gl_, | 1576 gl_->Uniform4f(uniforms.color_location, |
1611 gl_->Uniform4f(uniforms.color_location, | 1577 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, |
1612 (SkColorGetR(color) * (1.0f / 255.0f)) * alpha, | 1578 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, |
1613 (SkColorGetG(color) * (1.0f / 255.0f)) * alpha, | 1579 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, alpha); |
1614 (SkColorGetB(color) * (1.0f / 255.0f)) * alpha, | |
1615 alpha)); | |
1616 if (use_aa) { | 1580 if (use_aa) { |
1617 float viewport[4] = { | 1581 float viewport[4] = { |
1618 static_cast<float>(current_window_space_viewport_.x()), | 1582 static_cast<float>(current_window_space_viewport_.x()), |
1619 static_cast<float>(current_window_space_viewport_.y()), | 1583 static_cast<float>(current_window_space_viewport_.y()), |
1620 static_cast<float>(current_window_space_viewport_.width()), | 1584 static_cast<float>(current_window_space_viewport_.width()), |
1621 static_cast<float>(current_window_space_viewport_.height()), | 1585 static_cast<float>(current_window_space_viewport_.height()), |
1622 }; | 1586 }; |
1623 GLC(gl_, gl_->Uniform4fv(uniforms.viewport_location, 1, viewport)); | 1587 gl_->Uniform4fv(uniforms.viewport_location, 1, viewport); |
1624 GLC(gl_, gl_->Uniform3fv(uniforms.edge_location, 8, edge)); | 1588 gl_->Uniform3fv(uniforms.edge_location, 8, edge); |
1625 } | 1589 } |
1626 | 1590 |
1627 // Enable blending when the quad properties require it or if we decided | 1591 // Enable blending when the quad properties require it or if we decided |
1628 // to use antialiasing. | 1592 // to use antialiasing. |
1629 SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa); | 1593 SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa); |
1630 | 1594 |
1631 // Normalize to tile_rect. | 1595 // Normalize to tile_rect. |
1632 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | 1596 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); |
1633 | 1597 |
1634 SetShaderQuadF(local_quad, uniforms.quad_location); | 1598 SetShaderQuadF(local_quad, uniforms.quad_location); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 TileProgramUniforms uniforms; | 1737 TileProgramUniforms uniforms; |
1774 if (quad->swizzle_contents) { | 1738 if (quad->swizzle_contents) { |
1775 TileUniformLocation(GetTileProgramSwizzleAA(tex_coord_precision, sampler), | 1739 TileUniformLocation(GetTileProgramSwizzleAA(tex_coord_precision, sampler), |
1776 &uniforms); | 1740 &uniforms); |
1777 } else { | 1741 } else { |
1778 TileUniformLocation(GetTileProgramAA(tex_coord_precision, sampler), | 1742 TileUniformLocation(GetTileProgramAA(tex_coord_precision, sampler), |
1779 &uniforms); | 1743 &uniforms); |
1780 } | 1744 } |
1781 | 1745 |
1782 SetUseProgram(uniforms.program); | 1746 SetUseProgram(uniforms.program); |
1783 GLC(gl_, gl_->Uniform1i(uniforms.sampler_location, 0)); | 1747 gl_->Uniform1i(uniforms.sampler_location, 0); |
1784 | 1748 |
1785 float viewport[4] = { | 1749 float viewport[4] = { |
1786 static_cast<float>(current_window_space_viewport_.x()), | 1750 static_cast<float>(current_window_space_viewport_.x()), |
1787 static_cast<float>(current_window_space_viewport_.y()), | 1751 static_cast<float>(current_window_space_viewport_.y()), |
1788 static_cast<float>(current_window_space_viewport_.width()), | 1752 static_cast<float>(current_window_space_viewport_.width()), |
1789 static_cast<float>(current_window_space_viewport_.height()), | 1753 static_cast<float>(current_window_space_viewport_.height()), |
1790 }; | 1754 }; |
1791 GLC(gl_, gl_->Uniform4fv(uniforms.viewport_location, 1, viewport)); | 1755 gl_->Uniform4fv(uniforms.viewport_location, 1, viewport); |
1792 GLC(gl_, gl_->Uniform3fv(uniforms.edge_location, 8, edge)); | 1756 gl_->Uniform3fv(uniforms.edge_location, 8, edge); |
1793 | 1757 |
1794 GLC(gl_, | 1758 gl_->Uniform4f(uniforms.vertex_tex_transform_location, vertex_tex_translate_x, |
1795 gl_->Uniform4f(uniforms.vertex_tex_transform_location, | 1759 vertex_tex_translate_y, vertex_tex_scale_x, |
1796 vertex_tex_translate_x, | 1760 vertex_tex_scale_y); |
1797 vertex_tex_translate_y, | 1761 gl_->Uniform4f(uniforms.fragment_tex_transform_location, |
1798 vertex_tex_scale_x, | 1762 fragment_tex_translate_x, fragment_tex_translate_y, |
1799 vertex_tex_scale_y)); | 1763 fragment_tex_scale_x, fragment_tex_scale_y); |
1800 GLC(gl_, | |
1801 gl_->Uniform4f(uniforms.fragment_tex_transform_location, | |
1802 fragment_tex_translate_x, | |
1803 fragment_tex_translate_y, | |
1804 fragment_tex_scale_x, | |
1805 fragment_tex_scale_y)); | |
1806 | 1764 |
1807 // Blending is required for antialiasing. | 1765 // Blending is required for antialiasing. |
1808 SetBlendEnabled(true); | 1766 SetBlendEnabled(true); |
1809 | 1767 |
1810 // Normalize to tile_rect. | 1768 // Normalize to tile_rect. |
1811 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | 1769 local_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); |
1812 | 1770 |
1813 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); | 1771 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); |
1814 SetShaderQuadF(local_quad, uniforms.quad_location); | 1772 SetShaderQuadF(local_quad, uniforms.quad_location); |
1815 | 1773 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1877 if (quad->swizzle_contents) { | 1835 if (quad->swizzle_contents) { |
1878 TileUniformLocation( | 1836 TileUniformLocation( |
1879 GetTileProgramSwizzleOpaque(tex_coord_precision, sampler), &uniforms); | 1837 GetTileProgramSwizzleOpaque(tex_coord_precision, sampler), &uniforms); |
1880 } else { | 1838 } else { |
1881 TileUniformLocation(GetTileProgramOpaque(tex_coord_precision, sampler), | 1839 TileUniformLocation(GetTileProgramOpaque(tex_coord_precision, sampler), |
1882 &uniforms); | 1840 &uniforms); |
1883 } | 1841 } |
1884 } | 1842 } |
1885 | 1843 |
1886 SetUseProgram(uniforms.program); | 1844 SetUseProgram(uniforms.program); |
1887 GLC(gl_, gl_->Uniform1i(uniforms.sampler_location, 0)); | 1845 gl_->Uniform1i(uniforms.sampler_location, 0); |
1888 | 1846 |
1889 GLC(gl_, | 1847 gl_->Uniform4f(uniforms.vertex_tex_transform_location, vertex_tex_translate_x, |
1890 gl_->Uniform4f(uniforms.vertex_tex_transform_location, | 1848 vertex_tex_translate_y, vertex_tex_scale_x, |
1891 vertex_tex_translate_x, | 1849 vertex_tex_scale_y); |
1892 vertex_tex_translate_y, | |
1893 vertex_tex_scale_x, | |
1894 vertex_tex_scale_y)); | |
1895 | 1850 |
1896 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1851 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
1897 | 1852 |
1898 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); | 1853 SetShaderOpacity(quad->opacity(), uniforms.alpha_location); |
1899 | 1854 |
1900 // Pass quad coordinates to the uniform in the same order as GeometryBinding | 1855 // Pass quad coordinates to the uniform in the same order as GeometryBinding |
1901 // does, then vertices will match the texture mapping in the vertex buffer. | 1856 // does, then vertices will match the texture mapping in the vertex buffer. |
1902 // The method SetShaderQuadF() changes the order of vertices and so it's | 1857 // The method SetShaderQuadF() changes the order of vertices and so it's |
1903 // not used here. | 1858 // not used here. |
1904 gfx::QuadF tile_rect(quad->visible_rect); | 1859 gfx::QuadF tile_rect(quad->visible_rect); |
(...skipping 21 matching lines...) Expand all Loading... |
1926 float gl_quad[8] = { | 1881 float gl_quad[8] = { |
1927 tile_rect.p4().x(), | 1882 tile_rect.p4().x(), |
1928 tile_rect.p4().y(), | 1883 tile_rect.p4().y(), |
1929 tile_rect.p1().x(), | 1884 tile_rect.p1().x(), |
1930 tile_rect.p1().y(), | 1885 tile_rect.p1().y(), |
1931 tile_rect.p2().x(), | 1886 tile_rect.p2().x(), |
1932 tile_rect.p2().y(), | 1887 tile_rect.p2().y(), |
1933 tile_rect.p3().x(), | 1888 tile_rect.p3().x(), |
1934 tile_rect.p3().y(), | 1889 tile_rect.p3().y(), |
1935 }; | 1890 }; |
1936 GLC(gl_, gl_->Uniform2fv(uniforms.quad_location, 4, gl_quad)); | 1891 gl_->Uniform2fv(uniforms.quad_location, 4, gl_quad); |
1937 | 1892 |
1938 static float gl_matrix[16]; | 1893 static float gl_matrix[16]; |
1939 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad->quadTransform()); | 1894 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad->quadTransform()); |
1940 GLC(gl_, | 1895 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0]); |
1941 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0])); | |
1942 | 1896 |
1943 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 1897 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); |
1944 } | 1898 } |
1945 | 1899 |
1946 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, | 1900 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, |
1947 const YUVVideoDrawQuad* quad, | 1901 const YUVVideoDrawQuad* quad, |
1948 const gfx::QuadF* clip_region) { | 1902 const gfx::QuadF* clip_region) { |
1949 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1903 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
1950 | 1904 |
1951 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1905 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
1952 gl_, | 1906 gl_, |
1953 &highp_threshold_cache_, | 1907 &highp_threshold_cache_, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2014 v_texture_location = program->fragment_shader().v_texture_location(); | 1968 v_texture_location = program->fragment_shader().v_texture_location(); |
2015 yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); | 1969 yuv_matrix_location = program->fragment_shader().yuv_matrix_location(); |
2016 yuv_adj_location = program->fragment_shader().yuv_adj_location(); | 1970 yuv_adj_location = program->fragment_shader().yuv_adj_location(); |
2017 ya_clamp_rect_location = | 1971 ya_clamp_rect_location = |
2018 program->fragment_shader().ya_clamp_rect_location(); | 1972 program->fragment_shader().ya_clamp_rect_location(); |
2019 uv_clamp_rect_location = | 1973 uv_clamp_rect_location = |
2020 program->fragment_shader().uv_clamp_rect_location(); | 1974 program->fragment_shader().uv_clamp_rect_location(); |
2021 alpha_location = program->fragment_shader().alpha_location(); | 1975 alpha_location = program->fragment_shader().alpha_location(); |
2022 } | 1976 } |
2023 | 1977 |
2024 GLC(gl_, | 1978 gl_->Uniform2f(tex_scale_location, quad->tex_coord_rect.width(), |
2025 gl_->Uniform2f(tex_scale_location, | 1979 quad->tex_coord_rect.height()); |
2026 quad->tex_coord_rect.width(), | 1980 gl_->Uniform2f(tex_offset_location, quad->tex_coord_rect.x(), |
2027 quad->tex_coord_rect.height())); | 1981 quad->tex_coord_rect.y()); |
2028 GLC(gl_, | |
2029 gl_->Uniform2f(tex_offset_location, | |
2030 quad->tex_coord_rect.x(), | |
2031 quad->tex_coord_rect.y())); | |
2032 // Clamping to half a texel inside the tex coord rect prevents bilinear | 1982 // Clamping to half a texel inside the tex coord rect prevents bilinear |
2033 // filtering from filtering outside the tex coord rect. | 1983 // filtering from filtering outside the tex coord rect. |
2034 gfx::RectF ya_clamp_rect(quad->tex_coord_rect); | 1984 gfx::RectF ya_clamp_rect(quad->tex_coord_rect); |
2035 // Special case: empty texture size implies no clamping. | 1985 // Special case: empty texture size implies no clamping. |
2036 if (!quad->ya_tex_size.IsEmpty()) { | 1986 if (!quad->ya_tex_size.IsEmpty()) { |
2037 ya_clamp_rect.Inset(0.5f / quad->ya_tex_size.width(), | 1987 ya_clamp_rect.Inset(0.5f / quad->ya_tex_size.width(), |
2038 0.5f / quad->ya_tex_size.height()); | 1988 0.5f / quad->ya_tex_size.height()); |
2039 } | 1989 } |
2040 gfx::RectF uv_clamp_rect(quad->tex_coord_rect); | 1990 gfx::RectF uv_clamp_rect(quad->tex_coord_rect); |
2041 if (!quad->uv_tex_size.IsEmpty()) { | 1991 if (!quad->uv_tex_size.IsEmpty()) { |
2042 uv_clamp_rect.Inset(0.5f / quad->uv_tex_size.width(), | 1992 uv_clamp_rect.Inset(0.5f / quad->uv_tex_size.width(), |
2043 0.5f / quad->uv_tex_size.height()); | 1993 0.5f / quad->uv_tex_size.height()); |
2044 } | 1994 } |
2045 GLC(gl_, gl_->Uniform4f(ya_clamp_rect_location, ya_clamp_rect.x(), | 1995 gl_->Uniform4f(ya_clamp_rect_location, ya_clamp_rect.x(), ya_clamp_rect.y(), |
2046 ya_clamp_rect.y(), ya_clamp_rect.right(), | 1996 ya_clamp_rect.right(), ya_clamp_rect.bottom()); |
2047 ya_clamp_rect.bottom())); | 1997 gl_->Uniform4f(uv_clamp_rect_location, uv_clamp_rect.x(), uv_clamp_rect.y(), |
2048 GLC(gl_, gl_->Uniform4f(uv_clamp_rect_location, uv_clamp_rect.x(), | 1998 uv_clamp_rect.right(), uv_clamp_rect.bottom()); |
2049 uv_clamp_rect.y(), uv_clamp_rect.right(), | |
2050 uv_clamp_rect.bottom())); | |
2051 | 1999 |
2052 GLC(gl_, gl_->Uniform1i(y_texture_location, 1)); | 2000 gl_->Uniform1i(y_texture_location, 1); |
2053 GLC(gl_, gl_->Uniform1i(u_texture_location, 2)); | 2001 gl_->Uniform1i(u_texture_location, 2); |
2054 GLC(gl_, gl_->Uniform1i(v_texture_location, 3)); | 2002 gl_->Uniform1i(v_texture_location, 3); |
2055 if (use_alpha_plane) | 2003 if (use_alpha_plane) |
2056 GLC(gl_, gl_->Uniform1i(a_texture_location, 4)); | 2004 gl_->Uniform1i(a_texture_location, 4); |
2057 | 2005 |
2058 // These values are magic numbers that are used in the transformation from YUV | 2006 // These values are magic numbers that are used in the transformation from YUV |
2059 // to RGB color values. They are taken from the following webpage: | 2007 // to RGB color values. They are taken from the following webpage: |
2060 // http://www.fourcc.org/fccyvrgb.php | 2008 // http://www.fourcc.org/fccyvrgb.php |
2061 float yuv_to_rgb_rec601[9] = { | 2009 float yuv_to_rgb_rec601[9] = { |
2062 1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f, | 2010 1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f, |
2063 }; | 2011 }; |
2064 float yuv_to_rgb_jpeg[9] = { | 2012 float yuv_to_rgb_jpeg[9] = { |
2065 1.f, 1.f, 1.f, 0.0f, -.34414f, 1.772f, 1.402f, -.71414f, 0.0f, | 2013 1.f, 1.f, 1.f, 0.0f, -.34414f, 1.772f, 1.402f, -.71414f, 0.0f, |
2066 }; | 2014 }; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 yuv_to_rgb = yuv_to_rgb_jpeg; | 2047 yuv_to_rgb = yuv_to_rgb_jpeg; |
2100 yuv_adjust = yuv_adjust_full; | 2048 yuv_adjust = yuv_adjust_full; |
2101 break; | 2049 break; |
2102 } | 2050 } |
2103 | 2051 |
2104 // The transform and vertex data are used to figure out the extents that the | 2052 // The transform and vertex data are used to figure out the extents that the |
2105 // un-antialiased quad should have and which vertex this is and the float | 2053 // un-antialiased quad should have and which vertex this is and the float |
2106 // quad passed in via uniform is the actual geometry that gets used to draw | 2054 // quad passed in via uniform is the actual geometry that gets used to draw |
2107 // it. This is why this centered rect is used and not the original quad_rect. | 2055 // it. This is why this centered rect is used and not the original quad_rect. |
2108 gfx::RectF tile_rect = quad->rect; | 2056 gfx::RectF tile_rect = quad->rect; |
2109 GLC(gl_, gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb)); | 2057 gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb); |
2110 GLC(gl_, gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust)); | 2058 gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust); |
2111 | 2059 |
2112 SetShaderOpacity(quad->opacity(), alpha_location); | 2060 SetShaderOpacity(quad->opacity(), alpha_location); |
2113 if (!clip_region) { | 2061 if (!clip_region) { |
2114 DrawQuadGeometry(frame, quad->quadTransform(), tile_rect, matrix_location); | 2062 DrawQuadGeometry(frame, quad->quadTransform(), tile_rect, matrix_location); |
2115 } else { | 2063 } else { |
2116 float uvs[8] = {0}; | 2064 float uvs[8] = {0}; |
2117 GetScaledUVs(quad->visible_rect, clip_region, uvs); | 2065 GetScaledUVs(quad->visible_rect, clip_region, uvs); |
2118 gfx::QuadF region_quad = *clip_region; | 2066 gfx::QuadF region_quad = *clip_region; |
2119 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | 2067 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); |
2120 region_quad -= gfx::Vector2dF(0.5f, 0.5f); | 2068 region_quad -= gfx::Vector2dF(0.5f, 0.5f); |
(...skipping 15 matching lines...) Expand all Loading... |
2136 gl_, | 2084 gl_, |
2137 &highp_threshold_cache_, | 2085 &highp_threshold_cache_, |
2138 highp_threshold_min_, | 2086 highp_threshold_min_, |
2139 quad->shared_quad_state->visible_content_rect.bottom_right()); | 2087 quad->shared_quad_state->visible_content_rect.bottom_right()); |
2140 | 2088 |
2141 const VideoStreamTextureProgram* program = | 2089 const VideoStreamTextureProgram* program = |
2142 GetVideoStreamTextureProgram(tex_coord_precision); | 2090 GetVideoStreamTextureProgram(tex_coord_precision); |
2143 SetUseProgram(program->program()); | 2091 SetUseProgram(program->program()); |
2144 | 2092 |
2145 ToGLMatrix(&gl_matrix[0], quad->matrix); | 2093 ToGLMatrix(&gl_matrix[0], quad->matrix); |
2146 GLC(gl_, | 2094 gl_->UniformMatrix4fv(program->vertex_shader().tex_matrix_location(), 1, |
2147 gl_->UniformMatrix4fv( | 2095 false, gl_matrix); |
2148 program->vertex_shader().tex_matrix_location(), 1, false, gl_matrix)); | |
2149 | 2096 |
2150 ResourceProvider::ScopedReadLockGL lock(resource_provider_, | 2097 ResourceProvider::ScopedReadLockGL lock(resource_provider_, |
2151 quad->resource_id); | 2098 quad->resource_id); |
2152 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | 2099 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
2153 GLC(gl_, gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, lock.texture_id())); | 2100 gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, lock.texture_id()); |
2154 | 2101 |
2155 GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0)); | 2102 gl_->Uniform1i(program->fragment_shader().sampler_location(), 0); |
2156 | 2103 |
2157 SetShaderOpacity(quad->opacity(), | 2104 SetShaderOpacity(quad->opacity(), |
2158 program->fragment_shader().alpha_location()); | 2105 program->fragment_shader().alpha_location()); |
2159 if (!clip_region) { | 2106 if (!clip_region) { |
2160 DrawQuadGeometry(frame, quad->quadTransform(), quad->rect, | 2107 DrawQuadGeometry(frame, quad->quadTransform(), quad->rect, |
2161 program->vertex_shader().matrix_location()); | 2108 program->vertex_shader().matrix_location()); |
2162 } else { | 2109 } else { |
2163 gfx::QuadF region_quad(*clip_region); | 2110 gfx::QuadF region_quad(*clip_region); |
2164 region_quad.Scale(1.0f / quad->rect.width(), 1.0f / quad->rect.height()); | 2111 region_quad.Scale(1.0f / quad->rect.width(), 1.0f / quad->rect.height()); |
2165 region_quad -= gfx::Vector2dF(0.5f, 0.5f); | 2112 region_quad -= gfx::Vector2dF(0.5f, 0.5f); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2207 | 2154 |
2208 PrepareGeometry(flush_binding); | 2155 PrepareGeometry(flush_binding); |
2209 | 2156 |
2210 // Set the correct blending mode. | 2157 // Set the correct blending mode. |
2211 SetBlendEnabled(draw_cache_.needs_blending); | 2158 SetBlendEnabled(draw_cache_.needs_blending); |
2212 | 2159 |
2213 // Bind the program to the GL state. | 2160 // Bind the program to the GL state. |
2214 SetUseProgram(draw_cache_.program_id); | 2161 SetUseProgram(draw_cache_.program_id); |
2215 | 2162 |
2216 // Bind the correct texture sampler location. | 2163 // Bind the correct texture sampler location. |
2217 GLC(gl_, gl_->Uniform1i(draw_cache_.sampler_location, 0)); | 2164 gl_->Uniform1i(draw_cache_.sampler_location, 0); |
2218 | 2165 |
2219 // Assume the current active textures is 0. | 2166 // Assume the current active textures is 0. |
2220 ResourceProvider::ScopedSamplerGL locked_quad( | 2167 ResourceProvider::ScopedSamplerGL locked_quad( |
2221 resource_provider_, | 2168 resource_provider_, |
2222 draw_cache_.resource_id, | 2169 draw_cache_.resource_id, |
2223 draw_cache_.nearest_neighbor ? GL_NEAREST : GL_LINEAR); | 2170 draw_cache_.nearest_neighbor ? GL_NEAREST : GL_LINEAR); |
2224 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | 2171 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
2225 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, locked_quad.texture_id())); | 2172 gl_->BindTexture(GL_TEXTURE_2D, locked_quad.texture_id()); |
2226 | 2173 |
2227 static_assert(sizeof(Float4) == 4 * sizeof(float), | 2174 static_assert(sizeof(Float4) == 4 * sizeof(float), |
2228 "Float4 struct should be densely packed"); | 2175 "Float4 struct should be densely packed"); |
2229 static_assert(sizeof(Float16) == 16 * sizeof(float), | 2176 static_assert(sizeof(Float16) == 16 * sizeof(float), |
2230 "Float16 struct should be densely packed"); | 2177 "Float16 struct should be densely packed"); |
2231 | 2178 |
2232 // Upload the tranforms for both points and uvs. | 2179 // Upload the tranforms for both points and uvs. |
2233 GLC(gl_, | 2180 gl_->UniformMatrix4fv( |
2234 gl_->UniformMatrix4fv( | 2181 static_cast<int>(draw_cache_.matrix_location), |
2235 static_cast<int>(draw_cache_.matrix_location), | 2182 static_cast<int>(draw_cache_.matrix_data.size()), false, |
2236 static_cast<int>(draw_cache_.matrix_data.size()), | 2183 reinterpret_cast<float*>(&draw_cache_.matrix_data.front())); |
2237 false, | 2184 gl_->Uniform4fv(static_cast<int>(draw_cache_.uv_xform_location), |
2238 reinterpret_cast<float*>(&draw_cache_.matrix_data.front()))); | 2185 static_cast<int>(draw_cache_.uv_xform_data.size()), |
2239 GLC(gl_, | 2186 reinterpret_cast<float*>(&draw_cache_.uv_xform_data.front())); |
2240 gl_->Uniform4fv( | |
2241 static_cast<int>(draw_cache_.uv_xform_location), | |
2242 static_cast<int>(draw_cache_.uv_xform_data.size()), | |
2243 reinterpret_cast<float*>(&draw_cache_.uv_xform_data.front()))); | |
2244 | 2187 |
2245 if (draw_cache_.background_color != SK_ColorTRANSPARENT) { | 2188 if (draw_cache_.background_color != SK_ColorTRANSPARENT) { |
2246 Float4 background_color = PremultipliedColor(draw_cache_.background_color); | 2189 Float4 background_color = PremultipliedColor(draw_cache_.background_color); |
2247 GLC(gl_, | 2190 gl_->Uniform4fv(draw_cache_.background_color_location, 1, |
2248 gl_->Uniform4fv( | 2191 background_color.data); |
2249 draw_cache_.background_color_location, 1, background_color.data)); | |
2250 } | 2192 } |
2251 | 2193 |
2252 GLC(gl_, | 2194 gl_->Uniform1fv( |
2253 gl_->Uniform1fv( | 2195 static_cast<int>(draw_cache_.vertex_opacity_location), |
2254 static_cast<int>(draw_cache_.vertex_opacity_location), | 2196 static_cast<int>(draw_cache_.vertex_opacity_data.size()), |
2255 static_cast<int>(draw_cache_.vertex_opacity_data.size()), | 2197 static_cast<float*>(&draw_cache_.vertex_opacity_data.front())); |
2256 static_cast<float*>(&draw_cache_.vertex_opacity_data.front()))); | |
2257 | 2198 |
2258 // Draw the quads! | 2199 // Draw the quads! |
2259 GLC(gl_, | 2200 gl_->DrawElements(GL_TRIANGLES, 6 * draw_cache_.matrix_data.size(), |
2260 gl_->DrawElements(GL_TRIANGLES, | 2201 GL_UNSIGNED_SHORT, 0); |
2261 6 * draw_cache_.matrix_data.size(), | |
2262 GL_UNSIGNED_SHORT, | |
2263 0)); | |
2264 | 2202 |
2265 // Clear the cache. | 2203 // Clear the cache. |
2266 draw_cache_.program_id = -1; | 2204 draw_cache_.program_id = -1; |
2267 draw_cache_.uv_xform_data.resize(0); | 2205 draw_cache_.uv_xform_data.resize(0); |
2268 draw_cache_.vertex_opacity_data.resize(0); | 2206 draw_cache_.vertex_opacity_data.resize(0); |
2269 draw_cache_.matrix_data.resize(0); | 2207 draw_cache_.matrix_data.resize(0); |
2270 | 2208 |
2271 // If we had a clipped binding, prepare the shared binding for the | 2209 // If we had a clipped binding, prepare the shared binding for the |
2272 // next inserts. | 2210 // next inserts. |
2273 if (flush_binding == CLIPPED_BINDING) { | 2211 if (flush_binding == CLIPPED_BINDING) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2386 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 2324 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
2387 gl_, | 2325 gl_, |
2388 &highp_threshold_cache_, | 2326 &highp_threshold_cache_, |
2389 highp_threshold_min_, | 2327 highp_threshold_min_, |
2390 quad->shared_quad_state->visible_content_rect.bottom_right()); | 2328 quad->shared_quad_state->visible_content_rect.bottom_right()); |
2391 | 2329 |
2392 TexTransformTextureProgramBinding binding; | 2330 TexTransformTextureProgramBinding binding; |
2393 binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision)); | 2331 binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision)); |
2394 | 2332 |
2395 SetUseProgram(binding.program_id); | 2333 SetUseProgram(binding.program_id); |
2396 GLC(gl_, gl_->Uniform1i(binding.sampler_location, 0)); | 2334 gl_->Uniform1i(binding.sampler_location, 0); |
2397 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { | 2335 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { |
2398 GLC(gl_, | 2336 gl_->Uniform4f( |
2399 gl_->Uniform4f(binding.tex_transform_location, | 2337 binding.tex_transform_location, 0, quad->io_surface_size.height(), |
2400 0, | 2338 quad->io_surface_size.width(), quad->io_surface_size.height() * -1.0f); |
2401 quad->io_surface_size.height(), | |
2402 quad->io_surface_size.width(), | |
2403 quad->io_surface_size.height() * -1.0f)); | |
2404 } else { | 2339 } else { |
2405 GLC(gl_, | 2340 gl_->Uniform4f(binding.tex_transform_location, 0, 0, |
2406 gl_->Uniform4f(binding.tex_transform_location, | 2341 quad->io_surface_size.width(), |
2407 0, | 2342 quad->io_surface_size.height()); |
2408 0, | |
2409 quad->io_surface_size.width(), | |
2410 quad->io_surface_size.height())); | |
2411 } | 2343 } |
2412 | 2344 |
2413 const float vertex_opacity[] = {quad->opacity(), quad->opacity(), | 2345 const float vertex_opacity[] = {quad->opacity(), quad->opacity(), |
2414 quad->opacity(), quad->opacity()}; | 2346 quad->opacity(), quad->opacity()}; |
2415 GLC(gl_, gl_->Uniform1fv(binding.vertex_opacity_location, 4, vertex_opacity)); | 2347 gl_->Uniform1fv(binding.vertex_opacity_location, 4, vertex_opacity); |
2416 | 2348 |
2417 ResourceProvider::ScopedReadLockGL lock(resource_provider_, | 2349 ResourceProvider::ScopedReadLockGL lock(resource_provider_, |
2418 quad->io_surface_resource_id); | 2350 quad->io_surface_resource_id); |
2419 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); | 2351 DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_)); |
2420 GLC(gl_, gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, lock.texture_id())); | 2352 gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, lock.texture_id()); |
2421 | 2353 |
2422 if (!clip_region) { | 2354 if (!clip_region) { |
2423 DrawQuadGeometry(frame, quad->quadTransform(), quad->rect, | 2355 DrawQuadGeometry(frame, quad->quadTransform(), quad->rect, |
2424 binding.matrix_location); | 2356 binding.matrix_location); |
2425 } else { | 2357 } else { |
2426 float uvs[8] = {0}; | 2358 float uvs[8] = {0}; |
2427 GetScaledUVs(quad->visible_rect, clip_region, uvs); | 2359 GetScaledUVs(quad->visible_rect, clip_region, uvs); |
2428 DrawQuadGeometryClippedByQuadF(frame, quad->quadTransform(), quad->rect, | 2360 DrawQuadGeometryClippedByQuadF(frame, quad->quadTransform(), quad->rect, |
2429 *clip_region, binding.matrix_location, uvs); | 2361 *clip_region, binding.matrix_location, uvs); |
2430 } | 2362 } |
2431 | 2363 |
2432 GLC(gl_, gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, 0)); | 2364 gl_->BindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); |
2433 } | 2365 } |
2434 | 2366 |
2435 void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { | 2367 void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
2436 if (use_sync_query_) { | 2368 if (use_sync_query_) { |
2437 DCHECK(current_sync_query_); | 2369 DCHECK(current_sync_query_); |
2438 current_sync_query_->End(); | 2370 current_sync_query_->End(); |
2439 pending_sync_queries_.push_back(current_sync_query_.Pass()); | 2371 pending_sync_queries_.push_back(current_sync_query_.Pass()); |
2440 } | 2372 } |
2441 | 2373 |
2442 current_framebuffer_lock_ = nullptr; | 2374 current_framebuffer_lock_ = nullptr; |
2443 swap_buffer_rect_.Union(gfx::ToEnclosingRect(frame->root_damage_rect)); | 2375 swap_buffer_rect_.Union(gfx::ToEnclosingRect(frame->root_damage_rect)); |
2444 | 2376 |
2445 GLC(gl_, gl_->Disable(GL_BLEND)); | 2377 gl_->Disable(GL_BLEND); |
2446 blend_shadow_ = false; | 2378 blend_shadow_ = false; |
2447 | 2379 |
2448 ScheduleOverlays(frame); | 2380 ScheduleOverlays(frame); |
2449 } | 2381 } |
2450 | 2382 |
2451 void GLRenderer::FinishDrawingQuadList() { | 2383 void GLRenderer::FinishDrawingQuadList() { |
2452 FlushTextureQuadCache(SHARED_BINDING); | 2384 FlushTextureQuadCache(SHARED_BINDING); |
2453 } | 2385 } |
2454 | 2386 |
2455 bool GLRenderer::FlippedFramebuffer(const DrawingFrame* frame) const { | 2387 bool GLRenderer::FlippedFramebuffer(const DrawingFrame* frame) const { |
2456 if (frame->current_render_pass != frame->root_render_pass) | 2388 if (frame->current_render_pass != frame->root_render_pass) |
2457 return true; | 2389 return true; |
2458 return FlippedRootFramebuffer(); | 2390 return FlippedRootFramebuffer(); |
2459 } | 2391 } |
2460 | 2392 |
2461 bool GLRenderer::FlippedRootFramebuffer() const { | 2393 bool GLRenderer::FlippedRootFramebuffer() const { |
2462 // GL is normally flipped, so a flipped output results in an unflipping. | 2394 // GL is normally flipped, so a flipped output results in an unflipping. |
2463 return !output_surface_->capabilities().flipped_output_surface; | 2395 return !output_surface_->capabilities().flipped_output_surface; |
2464 } | 2396 } |
2465 | 2397 |
2466 void GLRenderer::EnsureScissorTestEnabled() { | 2398 void GLRenderer::EnsureScissorTestEnabled() { |
2467 if (is_scissor_enabled_) | 2399 if (is_scissor_enabled_) |
2468 return; | 2400 return; |
2469 | 2401 |
2470 FlushTextureQuadCache(SHARED_BINDING); | 2402 FlushTextureQuadCache(SHARED_BINDING); |
2471 GLC(gl_, gl_->Enable(GL_SCISSOR_TEST)); | 2403 gl_->Enable(GL_SCISSOR_TEST); |
2472 is_scissor_enabled_ = true; | 2404 is_scissor_enabled_ = true; |
2473 } | 2405 } |
2474 | 2406 |
2475 void GLRenderer::EnsureScissorTestDisabled() { | 2407 void GLRenderer::EnsureScissorTestDisabled() { |
2476 if (!is_scissor_enabled_) | 2408 if (!is_scissor_enabled_) |
2477 return; | 2409 return; |
2478 | 2410 |
2479 FlushTextureQuadCache(SHARED_BINDING); | 2411 FlushTextureQuadCache(SHARED_BINDING); |
2480 GLC(gl_, gl_->Disable(GL_SCISSOR_TEST)); | 2412 gl_->Disable(GL_SCISSOR_TEST); |
2481 is_scissor_enabled_ = false; | 2413 is_scissor_enabled_ = false; |
2482 } | 2414 } |
2483 | 2415 |
2484 void GLRenderer::CopyCurrentRenderPassToBitmap( | 2416 void GLRenderer::CopyCurrentRenderPassToBitmap( |
2485 DrawingFrame* frame, | 2417 DrawingFrame* frame, |
2486 scoped_ptr<CopyOutputRequest> request) { | 2418 scoped_ptr<CopyOutputRequest> request) { |
2487 TRACE_EVENT0("cc", "GLRenderer::CopyCurrentRenderPassToBitmap"); | 2419 TRACE_EVENT0("cc", "GLRenderer::CopyCurrentRenderPassToBitmap"); |
2488 gfx::Rect copy_rect = frame->current_render_pass->output_rect; | 2420 gfx::Rect copy_rect = frame->current_render_pass->output_rect; |
2489 if (request->has_area()) | 2421 if (request->has_area()) |
2490 copy_rect.Intersect(request->area()); | 2422 copy_rect.Intersect(request->area()); |
(...skipping 10 matching lines...) Expand all Loading... |
2501 | 2433 |
2502 float gl_quad[8]; | 2434 float gl_quad[8]; |
2503 gl_quad[0] = quad.p1().x(); | 2435 gl_quad[0] = quad.p1().x(); |
2504 gl_quad[1] = quad.p1().y(); | 2436 gl_quad[1] = quad.p1().y(); |
2505 gl_quad[2] = quad.p2().x(); | 2437 gl_quad[2] = quad.p2().x(); |
2506 gl_quad[3] = quad.p2().y(); | 2438 gl_quad[3] = quad.p2().y(); |
2507 gl_quad[4] = quad.p3().x(); | 2439 gl_quad[4] = quad.p3().x(); |
2508 gl_quad[5] = quad.p3().y(); | 2440 gl_quad[5] = quad.p3().y(); |
2509 gl_quad[6] = quad.p4().x(); | 2441 gl_quad[6] = quad.p4().x(); |
2510 gl_quad[7] = quad.p4().y(); | 2442 gl_quad[7] = quad.p4().y(); |
2511 GLC(gl_, gl_->Uniform2fv(quad_location, 4, gl_quad)); | 2443 gl_->Uniform2fv(quad_location, 4, gl_quad); |
2512 } | 2444 } |
2513 | 2445 |
2514 void GLRenderer::SetShaderOpacity(float opacity, int alpha_location) { | 2446 void GLRenderer::SetShaderOpacity(float opacity, int alpha_location) { |
2515 if (alpha_location != -1) | 2447 if (alpha_location != -1) |
2516 GLC(gl_, gl_->Uniform1f(alpha_location, opacity)); | 2448 gl_->Uniform1f(alpha_location, opacity); |
2517 } | 2449 } |
2518 | 2450 |
2519 void GLRenderer::SetStencilEnabled(bool enabled) { | 2451 void GLRenderer::SetStencilEnabled(bool enabled) { |
2520 if (enabled == stencil_shadow_) | 2452 if (enabled == stencil_shadow_) |
2521 return; | 2453 return; |
2522 | 2454 |
2523 if (enabled) | 2455 if (enabled) |
2524 GLC(gl_, gl_->Enable(GL_STENCIL_TEST)); | 2456 gl_->Enable(GL_STENCIL_TEST); |
2525 else | 2457 else |
2526 GLC(gl_, gl_->Disable(GL_STENCIL_TEST)); | 2458 gl_->Disable(GL_STENCIL_TEST); |
2527 stencil_shadow_ = enabled; | 2459 stencil_shadow_ = enabled; |
2528 } | 2460 } |
2529 | 2461 |
2530 void GLRenderer::SetBlendEnabled(bool enabled) { | 2462 void GLRenderer::SetBlendEnabled(bool enabled) { |
2531 if (enabled == blend_shadow_) | 2463 if (enabled == blend_shadow_) |
2532 return; | 2464 return; |
2533 | 2465 |
2534 if (enabled) | 2466 if (enabled) |
2535 GLC(gl_, gl_->Enable(GL_BLEND)); | 2467 gl_->Enable(GL_BLEND); |
2536 else | 2468 else |
2537 GLC(gl_, gl_->Disable(GL_BLEND)); | 2469 gl_->Disable(GL_BLEND); |
2538 blend_shadow_ = enabled; | 2470 blend_shadow_ = enabled; |
2539 } | 2471 } |
2540 | 2472 |
2541 void GLRenderer::SetUseProgram(unsigned program) { | 2473 void GLRenderer::SetUseProgram(unsigned program) { |
2542 if (program == program_shadow_) | 2474 if (program == program_shadow_) |
2543 return; | 2475 return; |
2544 gl_->UseProgram(program); | 2476 gl_->UseProgram(program); |
2545 program_shadow_ = program; | 2477 program_shadow_ = program; |
2546 } | 2478 } |
2547 | 2479 |
2548 void GLRenderer::DrawQuadGeometryClippedByQuadF( | 2480 void GLRenderer::DrawQuadGeometryClippedByQuadF( |
2549 const DrawingFrame* frame, | 2481 const DrawingFrame* frame, |
2550 const gfx::Transform& draw_transform, | 2482 const gfx::Transform& draw_transform, |
2551 const gfx::RectF& quad_rect, | 2483 const gfx::RectF& quad_rect, |
2552 const gfx::QuadF& clipping_region_quad, | 2484 const gfx::QuadF& clipping_region_quad, |
2553 int matrix_location, | 2485 int matrix_location, |
2554 const float* uvs) { | 2486 const float* uvs) { |
2555 PrepareGeometry(CLIPPED_BINDING); | 2487 PrepareGeometry(CLIPPED_BINDING); |
2556 if (uvs) { | 2488 if (uvs) { |
2557 clipped_geometry_->InitializeCustomQuadWithUVs(clipping_region_quad, uvs); | 2489 clipped_geometry_->InitializeCustomQuadWithUVs(clipping_region_quad, uvs); |
2558 } else { | 2490 } else { |
2559 clipped_geometry_->InitializeCustomQuad(clipping_region_quad); | 2491 clipped_geometry_->InitializeCustomQuad(clipping_region_quad); |
2560 } | 2492 } |
2561 gfx::Transform quad_rect_matrix; | 2493 gfx::Transform quad_rect_matrix; |
2562 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2494 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
2563 static float gl_matrix[16]; | 2495 static float gl_matrix[16]; |
2564 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2496 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); |
2565 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 2497 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); |
2566 | 2498 |
2567 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, | 2499 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, |
2568 reinterpret_cast<const void*>(0))); | 2500 reinterpret_cast<const void*>(0)); |
2569 } | 2501 } |
2570 | 2502 |
2571 void GLRenderer::DrawQuadGeometry(const DrawingFrame* frame, | 2503 void GLRenderer::DrawQuadGeometry(const DrawingFrame* frame, |
2572 const gfx::Transform& draw_transform, | 2504 const gfx::Transform& draw_transform, |
2573 const gfx::RectF& quad_rect, | 2505 const gfx::RectF& quad_rect, |
2574 int matrix_location) { | 2506 int matrix_location) { |
2575 PrepareGeometry(SHARED_BINDING); | 2507 PrepareGeometry(SHARED_BINDING); |
2576 gfx::Transform quad_rect_matrix; | 2508 gfx::Transform quad_rect_matrix; |
2577 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2509 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
2578 static float gl_matrix[16]; | 2510 static float gl_matrix[16]; |
2579 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2511 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); |
2580 GLC(gl_, gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 2512 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); |
2581 | 2513 |
2582 GLC(gl_, gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 2514 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); |
2583 } | 2515 } |
2584 | 2516 |
2585 void GLRenderer::Finish() { | 2517 void GLRenderer::Finish() { |
2586 TRACE_EVENT0("cc", "GLRenderer::Finish"); | 2518 TRACE_EVENT0("cc", "GLRenderer::Finish"); |
2587 GLC(gl_, gl_->Finish()); | 2519 gl_->Finish(); |
2588 } | 2520 } |
2589 | 2521 |
2590 void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { | 2522 void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
2591 DCHECK(!is_backbuffer_discarded_); | 2523 DCHECK(!is_backbuffer_discarded_); |
2592 | 2524 |
2593 TRACE_EVENT0("cc,benchmark", "GLRenderer::SwapBuffers"); | 2525 TRACE_EVENT0("cc,benchmark", "GLRenderer::SwapBuffers"); |
2594 // We're done! Time to swapbuffers! | 2526 // We're done! Time to swapbuffers! |
2595 | 2527 |
2596 gfx::Size surface_size = output_surface_->SurfaceSize(); | 2528 gfx::Size surface_size = output_surface_->SurfaceSize(); |
2597 | 2529 |
(...skipping 28 matching lines...) Expand all Loading... |
2626 swap_buffer_rect_ = gfx::Rect(); | 2558 swap_buffer_rect_ = gfx::Rect(); |
2627 } | 2559 } |
2628 | 2560 |
2629 void GLRenderer::EnforceMemoryPolicy() { | 2561 void GLRenderer::EnforceMemoryPolicy() { |
2630 if (!visible()) { | 2562 if (!visible()) { |
2631 TRACE_EVENT0("cc", "GLRenderer::EnforceMemoryPolicy dropping resources"); | 2563 TRACE_EVENT0("cc", "GLRenderer::EnforceMemoryPolicy dropping resources"); |
2632 ReleaseRenderPassTextures(); | 2564 ReleaseRenderPassTextures(); |
2633 DiscardBackbuffer(); | 2565 DiscardBackbuffer(); |
2634 resource_provider_->ReleaseCachedData(); | 2566 resource_provider_->ReleaseCachedData(); |
2635 output_surface_->context_provider()->DeleteCachedResources(); | 2567 output_surface_->context_provider()->DeleteCachedResources(); |
2636 GLC(gl_, gl_->Flush()); | 2568 gl_->Flush(); |
2637 } | 2569 } |
2638 PrepareGeometry(NO_BINDING); | 2570 PrepareGeometry(NO_BINDING); |
2639 } | 2571 } |
2640 | 2572 |
2641 void GLRenderer::DiscardBackbuffer() { | 2573 void GLRenderer::DiscardBackbuffer() { |
2642 if (is_backbuffer_discarded_) | 2574 if (is_backbuffer_discarded_) |
2643 return; | 2575 return; |
2644 | 2576 |
2645 output_surface_->DiscardBackbuffer(); | 2577 output_surface_->DiscardBackbuffer(); |
2646 | 2578 |
(...skipping 26 matching lines...) Expand all Loading... |
2673 DCHECK_GE(window_rect.y(), 0); | 2605 DCHECK_GE(window_rect.y(), 0); |
2674 DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 2606 DCHECK_LE(window_rect.right(), current_surface_size_.width()); |
2675 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 2607 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); |
2676 | 2608 |
2677 if (!request->force_bitmap_result()) { | 2609 if (!request->force_bitmap_result()) { |
2678 bool own_mailbox = !request->has_texture_mailbox(); | 2610 bool own_mailbox = !request->has_texture_mailbox(); |
2679 | 2611 |
2680 GLuint texture_id = 0; | 2612 GLuint texture_id = 0; |
2681 gpu::Mailbox mailbox; | 2613 gpu::Mailbox mailbox; |
2682 if (own_mailbox) { | 2614 if (own_mailbox) { |
2683 GLC(gl_, gl_->GenMailboxCHROMIUM(mailbox.name)); | 2615 gl_->GenMailboxCHROMIUM(mailbox.name); |
2684 gl_->GenTextures(1, &texture_id); | 2616 gl_->GenTextures(1, &texture_id); |
2685 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, texture_id)); | 2617 gl_->BindTexture(GL_TEXTURE_2D, texture_id); |
2686 | 2618 |
2687 GLC(gl_, | 2619 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
2688 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 2620 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
2689 GLC(gl_, | 2621 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
2690 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 2622 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
2691 GLC(gl_, | 2623 gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
2692 gl_->TexParameteri( | |
2693 GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); | |
2694 GLC(gl_, | |
2695 gl_->TexParameteri( | |
2696 GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); | |
2697 GLC(gl_, gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name)); | |
2698 } else { | 2624 } else { |
2699 mailbox = request->texture_mailbox().mailbox(); | 2625 mailbox = request->texture_mailbox().mailbox(); |
2700 DCHECK_EQ(static_cast<unsigned>(GL_TEXTURE_2D), | 2626 DCHECK_EQ(static_cast<unsigned>(GL_TEXTURE_2D), |
2701 request->texture_mailbox().target()); | 2627 request->texture_mailbox().target()); |
2702 DCHECK(!mailbox.IsZero()); | 2628 DCHECK(!mailbox.IsZero()); |
2703 unsigned incoming_sync_point = request->texture_mailbox().sync_point(); | 2629 unsigned incoming_sync_point = request->texture_mailbox().sync_point(); |
2704 if (incoming_sync_point) | 2630 if (incoming_sync_point) |
2705 GLC(gl_, gl_->WaitSyncPointCHROMIUM(incoming_sync_point)); | 2631 gl_->WaitSyncPointCHROMIUM(incoming_sync_point); |
2706 | 2632 |
2707 texture_id = GLC( | 2633 texture_id = |
2708 gl_, | 2634 gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); |
2709 gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name)); | |
2710 } | 2635 } |
2711 GetFramebufferTexture(texture_id, RGBA_8888, window_rect); | 2636 GetFramebufferTexture(texture_id, RGBA_8888, window_rect); |
2712 | 2637 |
2713 unsigned sync_point = gl_->InsertSyncPointCHROMIUM(); | 2638 unsigned sync_point = gl_->InsertSyncPointCHROMIUM(); |
2714 TextureMailbox texture_mailbox(mailbox, GL_TEXTURE_2D, sync_point); | 2639 TextureMailbox texture_mailbox(mailbox, GL_TEXTURE_2D, sync_point); |
2715 | 2640 |
2716 scoped_ptr<SingleReleaseCallback> release_callback; | 2641 scoped_ptr<SingleReleaseCallback> release_callback; |
2717 if (own_mailbox) { | 2642 if (own_mailbox) { |
2718 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | 2643 gl_->BindTexture(GL_TEXTURE_2D, 0); |
2719 release_callback = texture_mailbox_deleter_->GetReleaseCallback( | 2644 release_callback = texture_mailbox_deleter_->GetReleaseCallback( |
2720 output_surface_->context_provider(), texture_id); | 2645 output_surface_->context_provider(), texture_id); |
2721 } else { | 2646 } else { |
2722 gl_->DeleteTextures(1, &texture_id); | 2647 gl_->DeleteTextures(1, &texture_id); |
2723 } | 2648 } |
2724 | 2649 |
2725 request->SendTextureResult( | 2650 request->SendTextureResult( |
2726 window_rect.size(), texture_mailbox, release_callback.Pass()); | 2651 window_rect.size(), texture_mailbox, release_callback.Pass()); |
2727 return; | 2652 return; |
2728 } | 2653 } |
(...skipping 11 matching lines...) Expand all Loading... |
2740 unsigned temporary_fbo = 0; | 2665 unsigned temporary_fbo = 0; |
2741 | 2666 |
2742 if (do_workaround) { | 2667 if (do_workaround) { |
2743 // On Mac OS X, calling glReadPixels() against an FBO whose color attachment | 2668 // On Mac OS X, calling glReadPixels() against an FBO whose color attachment |
2744 // is an IOSurface-backed texture causes corruption of future glReadPixels() | 2669 // is an IOSurface-backed texture causes corruption of future glReadPixels() |
2745 // calls, even those on different OpenGL contexts. It is believed that this | 2670 // calls, even those on different OpenGL contexts. It is believed that this |
2746 // is the root cause of top crasher | 2671 // is the root cause of top crasher |
2747 // http://crbug.com/99393. <rdar://problem/10949687> | 2672 // http://crbug.com/99393. <rdar://problem/10949687> |
2748 | 2673 |
2749 gl_->GenTextures(1, &temporary_texture); | 2674 gl_->GenTextures(1, &temporary_texture); |
2750 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, temporary_texture)); | 2675 gl_->BindTexture(GL_TEXTURE_2D, temporary_texture); |
2751 GLC(gl_, | 2676 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
2752 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 2677 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
2753 GLC(gl_, | 2678 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
2754 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 2679 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
2755 GLC(gl_, | |
2756 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); | |
2757 GLC(gl_, | |
2758 gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); | |
2759 // Copy the contents of the current (IOSurface-backed) framebuffer into a | 2680 // Copy the contents of the current (IOSurface-backed) framebuffer into a |
2760 // temporary texture. | 2681 // temporary texture. |
2761 GetFramebufferTexture( | 2682 GetFramebufferTexture( |
2762 temporary_texture, RGBA_8888, gfx::Rect(current_surface_size_)); | 2683 temporary_texture, RGBA_8888, gfx::Rect(current_surface_size_)); |
2763 gl_->GenFramebuffers(1, &temporary_fbo); | 2684 gl_->GenFramebuffers(1, &temporary_fbo); |
2764 // Attach this texture to an FBO, and perform the readback from that FBO. | 2685 // Attach this texture to an FBO, and perform the readback from that FBO. |
2765 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, temporary_fbo)); | 2686 gl_->BindFramebuffer(GL_FRAMEBUFFER, temporary_fbo); |
2766 GLC(gl_, | 2687 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
2767 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, | 2688 GL_TEXTURE_2D, temporary_texture, 0); |
2768 GL_COLOR_ATTACHMENT0, | |
2769 GL_TEXTURE_2D, | |
2770 temporary_texture, | |
2771 0)); | |
2772 | 2689 |
2773 DCHECK_EQ(static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE), | 2690 DCHECK_EQ(static_cast<unsigned>(GL_FRAMEBUFFER_COMPLETE), |
2774 gl_->CheckFramebufferStatus(GL_FRAMEBUFFER)); | 2691 gl_->CheckFramebufferStatus(GL_FRAMEBUFFER)); |
2775 } | 2692 } |
2776 | 2693 |
2777 GLuint buffer = 0; | 2694 GLuint buffer = 0; |
2778 gl_->GenBuffers(1, &buffer); | 2695 gl_->GenBuffers(1, &buffer); |
2779 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, buffer)); | 2696 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, buffer); |
2780 GLC(gl_, | 2697 gl_->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
2781 gl_->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 2698 4 * window_rect.size().GetArea(), NULL, GL_STREAM_READ); |
2782 4 * window_rect.size().GetArea(), | |
2783 NULL, | |
2784 GL_STREAM_READ)); | |
2785 | 2699 |
2786 GLuint query = 0; | 2700 GLuint query = 0; |
2787 gl_->GenQueriesEXT(1, &query); | 2701 gl_->GenQueriesEXT(1, &query); |
2788 GLC(gl_, gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query)); | 2702 gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query); |
2789 | 2703 |
2790 GLC(gl_, | 2704 gl_->ReadPixels(window_rect.x(), window_rect.y(), window_rect.width(), |
2791 gl_->ReadPixels(window_rect.x(), | 2705 window_rect.height(), GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
2792 window_rect.y(), | |
2793 window_rect.width(), | |
2794 window_rect.height(), | |
2795 GL_RGBA, | |
2796 GL_UNSIGNED_BYTE, | |
2797 NULL)); | |
2798 | 2706 |
2799 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0)); | 2707 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); |
2800 | 2708 |
2801 if (do_workaround) { | 2709 if (do_workaround) { |
2802 // Clean up. | 2710 // Clean up. |
2803 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, 0)); | 2711 gl_->BindFramebuffer(GL_FRAMEBUFFER, 0); |
2804 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | 2712 gl_->BindTexture(GL_TEXTURE_2D, 0); |
2805 GLC(gl_, gl_->DeleteFramebuffers(1, &temporary_fbo)); | 2713 gl_->DeleteFramebuffers(1, &temporary_fbo); |
2806 GLC(gl_, gl_->DeleteTextures(1, &temporary_texture)); | 2714 gl_->DeleteTextures(1, &temporary_texture); |
2807 } | 2715 } |
2808 | 2716 |
2809 base::Closure finished_callback = base::Bind(&GLRenderer::FinishedReadback, | 2717 base::Closure finished_callback = base::Bind(&GLRenderer::FinishedReadback, |
2810 base::Unretained(this), | 2718 base::Unretained(this), |
2811 buffer, | 2719 buffer, |
2812 query, | 2720 query, |
2813 window_rect.size()); | 2721 window_rect.size()); |
2814 // Save the finished_callback so it can be cancelled. | 2722 // Save the finished_callback so it can be cancelled. |
2815 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset( | 2723 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset( |
2816 finished_callback); | 2724 finished_callback); |
2817 base::Closure cancelable_callback = | 2725 base::Closure cancelable_callback = |
2818 pending_async_read_pixels_.front()-> | 2726 pending_async_read_pixels_.front()-> |
2819 finished_read_pixels_callback.callback(); | 2727 finished_read_pixels_callback.callback(); |
2820 | 2728 |
2821 // Save the buffer to verify the callbacks happen in the expected order. | 2729 // Save the buffer to verify the callbacks happen in the expected order. |
2822 pending_async_read_pixels_.front()->buffer = buffer; | 2730 pending_async_read_pixels_.front()->buffer = buffer; |
2823 | 2731 |
2824 GLC(gl_, gl_->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM)); | 2732 gl_->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM); |
2825 context_support_->SignalQuery(query, cancelable_callback); | 2733 context_support_->SignalQuery(query, cancelable_callback); |
2826 | 2734 |
2827 EnforceMemoryPolicy(); | 2735 EnforceMemoryPolicy(); |
2828 } | 2736 } |
2829 | 2737 |
2830 void GLRenderer::FinishedReadback(unsigned source_buffer, | 2738 void GLRenderer::FinishedReadback(unsigned source_buffer, |
2831 unsigned query, | 2739 unsigned query, |
2832 const gfx::Size& size) { | 2740 const gfx::Size& size) { |
2833 DCHECK(!pending_async_read_pixels_.empty()); | 2741 DCHECK(!pending_async_read_pixels_.empty()); |
2834 | 2742 |
2835 if (query != 0) { | 2743 if (query != 0) { |
2836 GLC(gl_, gl_->DeleteQueriesEXT(1, &query)); | 2744 gl_->DeleteQueriesEXT(1, &query); |
2837 } | 2745 } |
2838 | 2746 |
2839 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); | 2747 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); |
2840 // Make sure we service the readbacks in order. | 2748 // Make sure we service the readbacks in order. |
2841 DCHECK_EQ(source_buffer, current_read->buffer); | 2749 DCHECK_EQ(source_buffer, current_read->buffer); |
2842 | 2750 |
2843 uint8* src_pixels = NULL; | 2751 uint8* src_pixels = NULL; |
2844 scoped_ptr<SkBitmap> bitmap; | 2752 scoped_ptr<SkBitmap> bitmap; |
2845 | 2753 |
2846 if (source_buffer != 0) { | 2754 if (source_buffer != 0) { |
2847 GLC(gl_, | 2755 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, source_buffer); |
2848 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, source_buffer)); | |
2849 src_pixels = static_cast<uint8*>(gl_->MapBufferCHROMIUM( | 2756 src_pixels = static_cast<uint8*>(gl_->MapBufferCHROMIUM( |
2850 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); | 2757 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); |
2851 | 2758 |
2852 if (src_pixels) { | 2759 if (src_pixels) { |
2853 bitmap.reset(new SkBitmap); | 2760 bitmap.reset(new SkBitmap); |
2854 bitmap->allocN32Pixels(size.width(), size.height()); | 2761 bitmap->allocN32Pixels(size.width(), size.height()); |
2855 scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap)); | 2762 scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap)); |
2856 uint8* dest_pixels = static_cast<uint8*>(bitmap->getPixels()); | 2763 uint8* dest_pixels = static_cast<uint8*>(bitmap->getPixels()); |
2857 | 2764 |
2858 size_t row_bytes = size.width() * 4; | 2765 size_t row_bytes = size.width() * 4; |
2859 int num_rows = size.height(); | 2766 int num_rows = size.height(); |
2860 size_t total_bytes = num_rows * row_bytes; | 2767 size_t total_bytes = num_rows * row_bytes; |
2861 for (size_t dest_y = 0; dest_y < total_bytes; dest_y += row_bytes) { | 2768 for (size_t dest_y = 0; dest_y < total_bytes; dest_y += row_bytes) { |
2862 // Flip Y axis. | 2769 // Flip Y axis. |
2863 size_t src_y = total_bytes - dest_y - row_bytes; | 2770 size_t src_y = total_bytes - dest_y - row_bytes; |
2864 // Swizzle OpenGL -> Skia byte order. | 2771 // Swizzle OpenGL -> Skia byte order. |
2865 for (size_t x = 0; x < row_bytes; x += 4) { | 2772 for (size_t x = 0; x < row_bytes; x += 4) { |
2866 dest_pixels[dest_y + x + SK_R32_SHIFT / 8] = | 2773 dest_pixels[dest_y + x + SK_R32_SHIFT / 8] = |
2867 src_pixels[src_y + x + 0]; | 2774 src_pixels[src_y + x + 0]; |
2868 dest_pixels[dest_y + x + SK_G32_SHIFT / 8] = | 2775 dest_pixels[dest_y + x + SK_G32_SHIFT / 8] = |
2869 src_pixels[src_y + x + 1]; | 2776 src_pixels[src_y + x + 1]; |
2870 dest_pixels[dest_y + x + SK_B32_SHIFT / 8] = | 2777 dest_pixels[dest_y + x + SK_B32_SHIFT / 8] = |
2871 src_pixels[src_y + x + 2]; | 2778 src_pixels[src_y + x + 2]; |
2872 dest_pixels[dest_y + x + SK_A32_SHIFT / 8] = | 2779 dest_pixels[dest_y + x + SK_A32_SHIFT / 8] = |
2873 src_pixels[src_y + x + 3]; | 2780 src_pixels[src_y + x + 3]; |
2874 } | 2781 } |
2875 } | 2782 } |
2876 | 2783 |
2877 GLC(gl_, | 2784 gl_->UnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); |
2878 gl_->UnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM)); | |
2879 } | 2785 } |
2880 GLC(gl_, gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0)); | 2786 gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); |
2881 GLC(gl_, gl_->DeleteBuffers(1, &source_buffer)); | 2787 gl_->DeleteBuffers(1, &source_buffer); |
2882 } | 2788 } |
2883 | 2789 |
2884 if (bitmap) | 2790 if (bitmap) |
2885 current_read->copy_request->SendBitmapResult(bitmap.Pass()); | 2791 current_read->copy_request->SendBitmapResult(bitmap.Pass()); |
2886 pending_async_read_pixels_.pop_back(); | 2792 pending_async_read_pixels_.pop_back(); |
2887 } | 2793 } |
2888 | 2794 |
2889 void GLRenderer::GetFramebufferTexture(unsigned texture_id, | 2795 void GLRenderer::GetFramebufferTexture(unsigned texture_id, |
2890 ResourceFormat texture_format, | 2796 ResourceFormat texture_format, |
2891 const gfx::Rect& window_rect) { | 2797 const gfx::Rect& window_rect) { |
2892 DCHECK(texture_id); | 2798 DCHECK(texture_id); |
2893 DCHECK_GE(window_rect.x(), 0); | 2799 DCHECK_GE(window_rect.x(), 0); |
2894 DCHECK_GE(window_rect.y(), 0); | 2800 DCHECK_GE(window_rect.y(), 0); |
2895 DCHECK_LE(window_rect.right(), current_surface_size_.width()); | 2801 DCHECK_LE(window_rect.right(), current_surface_size_.width()); |
2896 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); | 2802 DCHECK_LE(window_rect.bottom(), current_surface_size_.height()); |
2897 | 2803 |
2898 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, texture_id)); | 2804 gl_->BindTexture(GL_TEXTURE_2D, texture_id); |
2899 GLC(gl_, | 2805 gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, GLDataFormat(texture_format), |
2900 gl_->CopyTexImage2D(GL_TEXTURE_2D, | 2806 window_rect.x(), window_rect.y(), window_rect.width(), |
2901 0, | 2807 window_rect.height(), 0); |
2902 GLDataFormat(texture_format), | 2808 gl_->BindTexture(GL_TEXTURE_2D, 0); |
2903 window_rect.x(), | |
2904 window_rect.y(), | |
2905 window_rect.width(), | |
2906 window_rect.height(), | |
2907 0)); | |
2908 GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, 0)); | |
2909 } | 2809 } |
2910 | 2810 |
2911 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, | 2811 bool GLRenderer::UseScopedTexture(DrawingFrame* frame, |
2912 const ScopedResource* texture, | 2812 const ScopedResource* texture, |
2913 const gfx::Rect& viewport_rect) { | 2813 const gfx::Rect& viewport_rect) { |
2914 DCHECK(texture->id()); | 2814 DCHECK(texture->id()); |
2915 frame->current_render_pass = NULL; | 2815 frame->current_render_pass = NULL; |
2916 frame->current_texture = texture; | 2816 frame->current_texture = texture; |
2917 | 2817 |
2918 return BindFramebufferToTexture(frame, texture, viewport_rect); | 2818 return BindFramebufferToTexture(frame, texture, viewport_rect); |
2919 } | 2819 } |
2920 | 2820 |
2921 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { | 2821 void GLRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) { |
2922 current_framebuffer_lock_ = nullptr; | 2822 current_framebuffer_lock_ = nullptr; |
2923 output_surface_->BindFramebuffer(); | 2823 output_surface_->BindFramebuffer(); |
2924 | 2824 |
2925 if (output_surface_->HasExternalStencilTest()) { | 2825 if (output_surface_->HasExternalStencilTest()) { |
2926 SetStencilEnabled(true); | 2826 SetStencilEnabled(true); |
2927 GLC(gl_, gl_->StencilFunc(GL_EQUAL, 1, 1)); | 2827 gl_->StencilFunc(GL_EQUAL, 1, 1); |
2928 } else { | 2828 } else { |
2929 SetStencilEnabled(false); | 2829 SetStencilEnabled(false); |
2930 } | 2830 } |
2931 } | 2831 } |
2932 | 2832 |
2933 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, | 2833 bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame, |
2934 const ScopedResource* texture, | 2834 const ScopedResource* texture, |
2935 const gfx::Rect& target_rect) { | 2835 const gfx::Rect& target_rect) { |
2936 DCHECK(texture->id()); | 2836 DCHECK(texture->id()); |
2937 | 2837 |
2938 // Explicitly release lock, otherwise we can crash when try to lock | 2838 // Explicitly release lock, otherwise we can crash when try to lock |
2939 // same texture again. | 2839 // same texture again. |
2940 current_framebuffer_lock_ = nullptr; | 2840 current_framebuffer_lock_ = nullptr; |
2941 | 2841 |
2942 SetStencilEnabled(false); | 2842 SetStencilEnabled(false); |
2943 GLC(gl_, gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_)); | 2843 gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_); |
2944 current_framebuffer_lock_ = | 2844 current_framebuffer_lock_ = |
2945 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( | 2845 make_scoped_ptr(new ResourceProvider::ScopedWriteLockGL( |
2946 resource_provider_, texture->id())); | 2846 resource_provider_, texture->id())); |
2947 unsigned texture_id = current_framebuffer_lock_->texture_id(); | 2847 unsigned texture_id = current_framebuffer_lock_->texture_id(); |
2948 GLC(gl_, | 2848 gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, |
2949 gl_->FramebufferTexture2D( | 2849 texture_id, 0); |
2950 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0)); | |
2951 | 2850 |
2952 DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == | 2851 DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) == |
2953 GL_FRAMEBUFFER_COMPLETE || | 2852 GL_FRAMEBUFFER_COMPLETE || |
2954 IsContextLost()); | 2853 IsContextLost()); |
2955 return true; | 2854 return true; |
2956 } | 2855 } |
2957 | 2856 |
2958 void GLRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { | 2857 void GLRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { |
2959 EnsureScissorTestEnabled(); | 2858 EnsureScissorTestEnabled(); |
2960 | 2859 |
2961 // Don't unnecessarily ask the context to change the scissor, because it | 2860 // Don't unnecessarily ask the context to change the scissor, because it |
2962 // may cause undesired GPU pipeline flushes. | 2861 // may cause undesired GPU pipeline flushes. |
2963 if (scissor_rect == scissor_rect_ && !scissor_rect_needs_reset_) | 2862 if (scissor_rect == scissor_rect_ && !scissor_rect_needs_reset_) |
2964 return; | 2863 return; |
2965 | 2864 |
2966 scissor_rect_ = scissor_rect; | 2865 scissor_rect_ = scissor_rect; |
2967 FlushTextureQuadCache(SHARED_BINDING); | 2866 FlushTextureQuadCache(SHARED_BINDING); |
2968 GLC(gl_, | 2867 gl_->Scissor(scissor_rect.x(), scissor_rect.y(), scissor_rect.width(), |
2969 gl_->Scissor(scissor_rect.x(), | 2868 scissor_rect.height()); |
2970 scissor_rect.y(), | |
2971 scissor_rect.width(), | |
2972 scissor_rect.height())); | |
2973 | 2869 |
2974 scissor_rect_needs_reset_ = false; | 2870 scissor_rect_needs_reset_ = false; |
2975 } | 2871 } |
2976 | 2872 |
2977 void GLRenderer::SetViewport() { | 2873 void GLRenderer::SetViewport() { |
2978 GLC(gl_, gl_->Viewport(current_window_space_viewport_.x(), | 2874 gl_->Viewport(current_window_space_viewport_.x(), |
2979 current_window_space_viewport_.y(), | 2875 current_window_space_viewport_.y(), |
2980 current_window_space_viewport_.width(), | 2876 current_window_space_viewport_.width(), |
2981 current_window_space_viewport_.height())); | 2877 current_window_space_viewport_.height()); |
2982 } | 2878 } |
2983 | 2879 |
2984 void GLRenderer::InitializeSharedObjects() { | 2880 void GLRenderer::InitializeSharedObjects() { |
2985 TRACE_EVENT0("cc", "GLRenderer::InitializeSharedObjects"); | 2881 TRACE_EVENT0("cc", "GLRenderer::InitializeSharedObjects"); |
2986 | 2882 |
2987 // Create an FBO for doing offscreen rendering. | 2883 // Create an FBO for doing offscreen rendering. |
2988 GLC(gl_, gl_->GenFramebuffers(1, &offscreen_framebuffer_id_)); | 2884 gl_->GenFramebuffers(1, &offscreen_framebuffer_id_); |
2989 | 2885 |
2990 shared_geometry_ = | 2886 shared_geometry_ = |
2991 make_scoped_ptr(new StaticGeometryBinding(gl_, QuadVertexRect())); | 2887 make_scoped_ptr(new StaticGeometryBinding(gl_, QuadVertexRect())); |
2992 clipped_geometry_ = make_scoped_ptr(new DynamicGeometryBinding(gl_)); | 2888 clipped_geometry_ = make_scoped_ptr(new DynamicGeometryBinding(gl_)); |
2993 } | 2889 } |
2994 | 2890 |
2995 void GLRenderer::PrepareGeometry(BoundGeometry binding) { | 2891 void GLRenderer::PrepareGeometry(BoundGeometry binding) { |
2996 if (binding == bound_geometry_) { | 2892 if (binding == bound_geometry_) { |
2997 return; | 2893 return; |
2998 } | 2894 } |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3460 video_stream_texture_program_[i].Cleanup(gl_); | 3356 video_stream_texture_program_[i].Cleanup(gl_); |
3461 } | 3357 } |
3462 | 3358 |
3463 tile_checkerboard_program_.Cleanup(gl_); | 3359 tile_checkerboard_program_.Cleanup(gl_); |
3464 | 3360 |
3465 debug_border_program_.Cleanup(gl_); | 3361 debug_border_program_.Cleanup(gl_); |
3466 solid_color_program_.Cleanup(gl_); | 3362 solid_color_program_.Cleanup(gl_); |
3467 solid_color_program_aa_.Cleanup(gl_); | 3363 solid_color_program_aa_.Cleanup(gl_); |
3468 | 3364 |
3469 if (offscreen_framebuffer_id_) | 3365 if (offscreen_framebuffer_id_) |
3470 GLC(gl_, gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_)); | 3366 gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); |
3471 | 3367 |
3472 if (on_demand_tile_raster_resource_id_) | 3368 if (on_demand_tile_raster_resource_id_) |
3473 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 3369 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); |
3474 | 3370 |
3475 ReleaseRenderPassTextures(); | 3371 ReleaseRenderPassTextures(); |
3476 } | 3372 } |
3477 | 3373 |
3478 void GLRenderer::ReinitializeGLState() { | 3374 void GLRenderer::ReinitializeGLState() { |
3479 is_scissor_enabled_ = false; | 3375 is_scissor_enabled_ = false; |
3480 scissor_rect_needs_reset_ = true; | 3376 scissor_rect_needs_reset_ = true; |
3481 stencil_shadow_ = false; | 3377 stencil_shadow_ = false; |
3482 blend_shadow_ = true; | 3378 blend_shadow_ = true; |
3483 program_shadow_ = 0; | 3379 program_shadow_ = 0; |
3484 | 3380 |
3485 RestoreGLState(); | 3381 RestoreGLState(); |
3486 } | 3382 } |
3487 | 3383 |
3488 void GLRenderer::RestoreGLState() { | 3384 void GLRenderer::RestoreGLState() { |
3489 // This restores the current GLRenderer state to the GL context. | 3385 // This restores the current GLRenderer state to the GL context. |
3490 bound_geometry_ = NO_BINDING; | 3386 bound_geometry_ = NO_BINDING; |
3491 PrepareGeometry(SHARED_BINDING); | 3387 PrepareGeometry(SHARED_BINDING); |
3492 | 3388 |
3493 GLC(gl_, gl_->Disable(GL_DEPTH_TEST)); | 3389 gl_->Disable(GL_DEPTH_TEST); |
3494 GLC(gl_, gl_->Disable(GL_CULL_FACE)); | 3390 gl_->Disable(GL_CULL_FACE); |
3495 GLC(gl_, gl_->ColorMask(true, true, true, true)); | 3391 gl_->ColorMask(true, true, true, true); |
3496 GLC(gl_, gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 3392 gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); |
3497 GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); | 3393 gl_->ActiveTexture(GL_TEXTURE0); |
3498 | 3394 |
3499 if (program_shadow_) | 3395 if (program_shadow_) |
3500 gl_->UseProgram(program_shadow_); | 3396 gl_->UseProgram(program_shadow_); |
3501 | 3397 |
3502 if (stencil_shadow_) | 3398 if (stencil_shadow_) |
3503 GLC(gl_, gl_->Enable(GL_STENCIL_TEST)); | 3399 gl_->Enable(GL_STENCIL_TEST); |
3504 else | 3400 else |
3505 GLC(gl_, gl_->Disable(GL_STENCIL_TEST)); | 3401 gl_->Disable(GL_STENCIL_TEST); |
3506 | 3402 |
3507 if (blend_shadow_) | 3403 if (blend_shadow_) |
3508 GLC(gl_, gl_->Enable(GL_BLEND)); | 3404 gl_->Enable(GL_BLEND); |
3509 else | 3405 else |
3510 GLC(gl_, gl_->Disable(GL_BLEND)); | 3406 gl_->Disable(GL_BLEND); |
3511 | 3407 |
3512 if (is_scissor_enabled_) { | 3408 if (is_scissor_enabled_) { |
3513 GLC(gl_, gl_->Enable(GL_SCISSOR_TEST)); | 3409 gl_->Enable(GL_SCISSOR_TEST); |
3514 GLC(gl_, | 3410 gl_->Scissor(scissor_rect_.x(), scissor_rect_.y(), scissor_rect_.width(), |
3515 gl_->Scissor(scissor_rect_.x(), | 3411 scissor_rect_.height()); |
3516 scissor_rect_.y(), | |
3517 scissor_rect_.width(), | |
3518 scissor_rect_.height())); | |
3519 } else { | 3412 } else { |
3520 GLC(gl_, gl_->Disable(GL_SCISSOR_TEST)); | 3413 gl_->Disable(GL_SCISSOR_TEST); |
3521 } | 3414 } |
3522 } | 3415 } |
3523 | 3416 |
3524 void GLRenderer::RestoreFramebuffer(DrawingFrame* frame) { | 3417 void GLRenderer::RestoreFramebuffer(DrawingFrame* frame) { |
3525 UseRenderPass(frame, frame->current_render_pass); | 3418 UseRenderPass(frame, frame->current_render_pass); |
3526 | 3419 |
3527 // Call SetViewport directly, rather than through PrepareSurfaceForPass. | 3420 // Call SetViewport directly, rather than through PrepareSurfaceForPass. |
3528 // PrepareSurfaceForPass also clears the surface, which is not desired when | 3421 // PrepareSurfaceForPass also clears the surface, which is not desired when |
3529 // restoring. | 3422 // restoring. |
3530 SetViewport(); | 3423 SetViewport(); |
(...skipping 23 matching lines...) Expand all Loading... |
3554 context_support_->ScheduleOverlayPlane( | 3447 context_support_->ScheduleOverlayPlane( |
3555 overlay.plane_z_order, | 3448 overlay.plane_z_order, |
3556 overlay.transform, | 3449 overlay.transform, |
3557 pending_overlay_resources_.back()->texture_id(), | 3450 pending_overlay_resources_.back()->texture_id(), |
3558 overlay.display_rect, | 3451 overlay.display_rect, |
3559 overlay.uv_rect); | 3452 overlay.uv_rect); |
3560 } | 3453 } |
3561 } | 3454 } |
3562 | 3455 |
3563 } // namespace cc | 3456 } // namespace cc |
OLD | NEW |