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

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

Issue 2646243002: Use IDCompositionSurface to implement DirectCompositionSurfaceWin. (Closed)
Patch Set: add unittest and move implementation around Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/direct_renderer.h" 5 #include "cc/output/direct_renderer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <utility> 10 #include <utility>
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 77
78 DirectRenderer::~DirectRenderer() = default; 78 DirectRenderer::~DirectRenderer() = default;
79 79
80 void DirectRenderer::Initialize() { 80 void DirectRenderer::Initialize() {
81 overlay_processor_->Initialize(); 81 overlay_processor_->Initialize();
82 82
83 auto* context_provider = output_surface_->context_provider(); 83 auto* context_provider = output_surface_->context_provider();
84 84
85 use_partial_swap_ = settings_->partial_swap_enabled && CanPartialSwap(); 85 use_partial_swap_ = settings_->partial_swap_enabled && CanPartialSwap();
86 allow_empty_swap_ = use_partial_swap_; 86 allow_empty_swap_ = use_partial_swap_;
87 if (context_provider && 87 if (context_provider) {
88 context_provider->ContextCapabilities().commit_overlay_planes) 88 if (context_provider->ContextCapabilities().commit_overlay_planes)
89 allow_empty_swap_ = true; 89 allow_empty_swap_ = true;
90 if (context_provider->ContextCapabilities().set_draw_rectangle)
91 use_set_draw_rectangle_ = true;
92 }
90 93
91 initialized_ = true; 94 initialized_ = true;
92 } 95 }
93 96
94 // static 97 // static
95 gfx::RectF DirectRenderer::QuadVertexRect() { 98 gfx::RectF DirectRenderer::QuadVertexRect() {
96 return gfx::RectF(-0.5f, -0.5f, 1.f, 1.f); 99 return gfx::RectF(-0.5f, -0.5f, 1.f, 1.f);
97 } 100 }
98 101
99 // static 102 // static
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 current_frame()->root_render_pass) { 506 current_frame()->root_render_pass) {
504 render_pass_scissor_in_draw_space.Intersect( 507 render_pass_scissor_in_draw_space.Intersect(
505 DeviceViewportRectInDrawSpace()); 508 DeviceViewportRectInDrawSpace());
506 } 509 }
507 510
508 if (use_partial_swap_) { 511 if (use_partial_swap_) {
509 render_pass_scissor_in_draw_space.Intersect( 512 render_pass_scissor_in_draw_space.Intersect(
510 current_frame()->ComputeScissorRectForRenderPass()); 513 current_frame()->ComputeScissorRectForRenderPass());
511 } 514 }
512 515
513 bool render_pass_is_clipped =
514 !render_pass_scissor_in_draw_space.Contains(surface_rect_in_draw_space);
515 bool is_root_render_pass = 516 bool is_root_render_pass =
516 current_frame()->current_render_pass == current_frame()->root_render_pass; 517 current_frame()->current_render_pass == current_frame()->root_render_pass;
518
519 // The SetDrawRectangleCHROMIUM spec requires that the scissor bit is always
520 // set on the root framebuffer or else the rendering may modify something
521 // outside the damage rectangle, even if the damage rectangle is the size of
522 // the full backbuffer.
523 bool render_pass_is_clipped =
524 (use_set_draw_rectangle_ && is_root_render_pass) ||
525 !render_pass_scissor_in_draw_space.Contains(surface_rect_in_draw_space);
517 bool has_external_stencil_test = 526 bool has_external_stencil_test =
518 is_root_render_pass && output_surface_->HasExternalStencilTest(); 527 is_root_render_pass && output_surface_->HasExternalStencilTest();
519 bool should_clear_surface = 528 bool should_clear_surface =
520 !has_external_stencil_test && 529 !has_external_stencil_test &&
521 (!is_root_render_pass || settings_->should_clear_root_render_pass); 530 (!is_root_render_pass || settings_->should_clear_root_render_pass);
522 531
523 // If |has_external_stencil_test| we can't discard or clear. Make sure we 532 // If |has_external_stencil_test| we can't discard or clear. Make sure we
524 // don't need to. 533 // don't need to.
525 DCHECK(!has_external_stencil_test || 534 DCHECK(!has_external_stencil_test ||
526 !current_frame()->current_render_pass->has_transparent_background); 535 !current_frame()->current_render_pass->has_transparent_background);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 584
576 DoDrawQuad(&quad, nullptr); 585 DoDrawQuad(&quad, nullptr);
577 } 586 }
578 FlushPolygons(&poly_list, render_pass_scissor_in_draw_space, 587 FlushPolygons(&poly_list, render_pass_scissor_in_draw_space,
579 render_pass_is_clipped); 588 render_pass_is_clipped);
580 FinishDrawingQuadList(); 589 FinishDrawingQuadList();
581 } 590 }
582 591
583 bool DirectRenderer::UseRenderPass(const RenderPass* render_pass) { 592 bool DirectRenderer::UseRenderPass(const RenderPass* render_pass) {
584 current_frame()->current_render_pass = render_pass; 593 current_frame()->current_render_pass = render_pass;
585 current_frame()->current_texture = NULL; 594 current_frame()->current_texture = nullptr;
586 if (render_pass == current_frame()->root_render_pass) { 595 if (render_pass == current_frame()->root_render_pass) {
587 BindFramebufferToOutputSurface(); 596 BindFramebufferToOutputSurface();
597
598 if (use_set_draw_rectangle_)
599 output_surface_->SetDrawRectangle(current_frame()->root_damage_rect);
588 InitializeViewport(current_frame(), render_pass->output_rect, 600 InitializeViewport(current_frame(), render_pass->output_rect,
589 gfx::Rect(current_frame()->device_viewport_size), 601 gfx::Rect(current_frame()->device_viewport_size),
590 current_frame()->device_viewport_size); 602 current_frame()->device_viewport_size);
591 return true; 603 return true;
592 } 604 }
593 605
594 ScopedResource* texture = render_pass_textures_[render_pass->id].get(); 606 ScopedResource* texture = render_pass_textures_[render_pass->id].get();
595 DCHECK(texture); 607 DCHECK(texture);
596 608
597 gfx::Size size = RenderPassTextureSize(render_pass); 609 gfx::Size size = RenderPassTextureSize(render_pass);
(...skipping 25 matching lines...) Expand all
623 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { 635 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) {
624 return render_pass->output_rect.size(); 636 return render_pass->output_rect.size();
625 } 637 }
626 638
627 void DirectRenderer::SetCurrentFrameForTesting(const DrawingFrame& frame) { 639 void DirectRenderer::SetCurrentFrameForTesting(const DrawingFrame& frame) {
628 current_frame_valid_ = true; 640 current_frame_valid_ = true;
629 current_frame_ = frame; 641 current_frame_ = frame;
630 } 642 }
631 643
632 } // namespace cc 644 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698