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

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

Issue 197223003: Start of hardware overlay support in CC with Ubercompositor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/base/scoped_ptr_vector.h"
6 #include "cc/output/output_surface.h"
7 #include "cc/output/output_surface_client.h"
8 #include "cc/output/overlay_candidates.h"
9 #include "cc/output/overlay_renderer.h"
10 #include "cc/quads/checkerboard_draw_quad.h"
11 #include "cc/quads/render_pass.h"
12 #include "cc/quads/texture_draw_quad.h"
13 #include "cc/resources/resource_provider.h"
14 #include "cc/resources/texture_mailbox.h"
15 #include "cc/test/fake_output_surface_client.h"
16 #include "cc/test/test_context_provider.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace cc {
20 namespace {
21
22 static const gfx::Rect overlay_rect(0, 0, 128, 128);
23 static const gfx::PointF uv_top_left(0.1f, 0.2f);
24 static const gfx::PointF uv_bottom_right(1.0f, 1.0f);
piman 2014/03/14 03:42:34 nit: naming kOverlayRect, etc. Also, you don't nee
alexst (slow to review) 2014/03/14 19:54:22 Done.
25
26 void MailboxReleased(unsigned sync_point, bool lost_resource) {}
27
28 class SingleOverlayCandidate : public OverlayCandidates {
enne (OOO) 2014/03/14 18:13:41 This naming is a bit awkward. Singular "FooOverla
29 public:
30 virtual void CheckOverlaySupport(
31 OverlayCandidates::OverlaySurfaceCandidateList* surfaces) OVERRIDE;
32 };
33
34 void SingleOverlayCandidate::CheckOverlaySupport(
35 OverlayCandidates::OverlaySurfaceCandidateList* surfaces) {
36 size_t expected_candidates = 2;
37 EXPECT_EQ(expected_candidates, surfaces->size());
38
39 OverlayCandidates::OverlaySurfaceCandidate& candidate = surfaces->back();
40 EXPECT_EQ(overlay_rect.ToString(), candidate.display_rect.ToString());
41 EXPECT_EQ(BoundingRect(uv_top_left, uv_bottom_right).ToString(),
42 candidate.crop_rect.ToString());
43 candidate.overlay_handled = true;
44 }
45
46 class OverlayOutputSurface : public OutputSurface {
47 public:
48 explicit OverlayOutputSurface(scoped_refptr<ContextProvider> context_provider)
49 : OutputSurface(context_provider) {}
50
51 void InitOverlayCandidates() {
52 overlay_candidates_.reset(new SingleOverlayCandidate);
53 }
54 };
55
56 gpu::Mailbox MailboxFromChar(char value) {
57 gpu::Mailbox mailbox;
58 memset(mailbox.name, value, sizeof(mailbox.name));
59 return mailbox;
60 }
piman 2014/03/14 03:42:34 note: you can use gpu::Mailbox::Generate() now. It
alexst (slow to review) 2014/03/14 19:54:22 Done.
61
62 TEST(OverlayCandidatesTest, NoOverlaysByDefault) {
63 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
64 OverlayOutputSurface output_surface(provider);
65 EXPECT_EQ(nullptr, output_surface.overlay_candidates());
piman 2014/03/14 03:42:34 nit: we don't (yet) allow nullptr because we still
alexst (slow to review) 2014/03/14 19:54:22 Done.
66
67 output_surface.InitOverlayCandidates();
68 EXPECT_NE(nullptr, output_surface.overlay_candidates());
piman 2014/03/14 03:42:34 nit: nullptr
alexst (slow to review) 2014/03/14 19:54:22 Done.
69 }
70
71 TEST(OverlayCandidatesTest, ResourceTest) {
piman 2014/03/14 03:42:34 This is really an OverlayRenderer test
72 scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
73 OverlayOutputSurface output_surface(provider);
74 FakeOutputSurfaceClient client;
75 EXPECT_TRUE(output_surface.BindToClient(&client));
76 output_surface.InitOverlayCandidates();
77 EXPECT_NE(nullptr, output_surface.overlay_candidates());
78
79 scoped_ptr<ResourceProvider> resource_provider(
80 ResourceProvider::Create(&output_surface, NULL, 0, false, 1));
81
82 scoped_ptr<OverlayRenderer> overlay_renderer(
83 new OverlayRenderer(&output_surface, resource_provider.get()));
84
85 RenderPass::Id id(1, 0);
86 gfx::Rect output_rect(0, 0, 256, 256);
87 bool has_transparent_background = true;
88
89 scoped_ptr<RenderPass> pass = RenderPass::Create();
90 pass->SetAll(id,
91 output_rect,
92 output_rect,
93 gfx::Transform(),
94 has_transparent_background);
95
96 // Stick a quad in the pass, this should not get copied.
97 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
98 pass->shared_quad_state_list.push_back(shared_state.Pass());
99
100 // Add an overlay candidate to the pass.
101 unsigned sync_point = 0;
102 TextureMailbox mailbox =
103 TextureMailbox(MailboxFromChar('a'), GL_TEXTURE_2D, sync_point);
104 mailbox.set_hw_backed(true);
105 scoped_ptr<SingleReleaseCallback> release_callback =
106 SingleReleaseCallback::Create(base::Bind(&MailboxReleased));
107
108 ResourceProvider::ResourceId resource_id =
109 resource_provider->CreateResourceFromTextureMailbox(
110 mailbox, release_callback.Pass());
111 bool premultiplied_alpha = false;
112 bool flipped = false;
113 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
114
115 scoped_ptr<TextureDrawQuad> overlay_quad = TextureDrawQuad::Create();
116 overlay_quad->SetNew(pass->shared_quad_state_list.back(),
117 overlay_rect,
118 overlay_rect,
119 overlay_rect,
120 resource_id,
121 premultiplied_alpha,
122 uv_top_left,
123 uv_bottom_right,
124 SK_ColorBLACK,
125 vertex_opacity,
126 flipped);
127
128 pass->quad_list.push_back(overlay_quad.PassAs<DrawQuad>());
129
130 // Add something behind it.
131 scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
132 CheckerboardDrawQuad::Create();
133 checkerboard_quad->SetNew(
134 pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor());
135 pass->quad_list.push_back(checkerboard_quad.PassAs<DrawQuad>());
136
137 RenderPassList pass_list;
138 pass_list.push_back(pass.Pass());
139
140 // Check for potential candidates.
141 overlay_renderer->ProcessForOverlays(&pass_list);
142
143 // This should have one more pass with an overlay.
144 size_t expected_pass_count = 2;
145 EXPECT_EQ(expected_pass_count, pass_list.size());
piman 2014/03/14 03:42:34 nit: ASSERT_EQ since you will dereference the elem
alexst (slow to review) 2014/03/14 19:54:22 Done.
146
147 RenderPass* overlay_pass = pass_list.front();
148 EXPECT_EQ(RenderPass::SIMPLE_OVERLAY, overlay_pass->overlay_state);
149 RenderPass* main_pass = pass_list.back();
150 EXPECT_EQ(RenderPass::NO_OVERLAY, main_pass->overlay_state);
151 }
152
153 } // namespace
154 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698