reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 1 | // Copyright 2015 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 | |
Fady Samuel | e478607 | 2017-07-24 20:03:38 | [diff] [blame] | 5 | #include "components/exo/surface.h" |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 6 | |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 7 | #include "base/bind.h" |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 8 | #include "base/command_line.h" |
| 9 | #include "base/strings/stringprintf.h" |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 10 | #include "components/exo/buffer.h" |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 11 | #include "components/exo/shell_surface.h" |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 12 | #include "components/exo/sub_surface.h" |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 13 | #include "components/exo/test/exo_test_base.h" |
| 14 | #include "components/exo/test/exo_test_helper.h" |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 15 | #include "components/viz/common/quads/compositor_frame.h" |
danakj | e5805be | 2017-09-15 19:24:55 | [diff] [blame] | 16 | #include "components/viz/common/quads/texture_draw_quad.h" |
Fady Samuel | dea5e8f | 2017-07-19 21:41:33 | [diff] [blame] | 17 | #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h" |
Fady Samuel | e478607 | 2017-07-24 20:03:38 | [diff] [blame] | 18 | #include "components/viz/service/surfaces/surface.h" |
Fady Samuel | c296f5fb | 2017-07-21 04:02:19 | [diff] [blame] | 19 | #include "components/viz/test/begin_frame_args_test.h" |
Fady Samuel | e65ab0a1 | 2017-07-28 17:47:25 | [diff] [blame] | 20 | #include "components/viz/test/fake_external_begin_frame_source.h" |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 21 | #include "testing/gtest/include/gtest/gtest.h" |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 22 | #include "third_party/khronos/GLES2/gl2.h" |
jbauman | 45c0686 | 2016-06-23 19:35:02 | [diff] [blame] | 23 | #include "ui/aura/env.h" |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 24 | #include "ui/compositor/layer_tree_owner.h" |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 25 | #include "ui/display/display.h" |
| 26 | #include "ui/display/display_switches.h" |
| 27 | #include "ui/gfx/geometry/dip_util.h" |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 28 | #include "ui/gfx/gpu_memory_buffer.h" |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 29 | #include "ui/wm/core/window_util.h" |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 30 | |
| 31 | namespace exo { |
| 32 | namespace { |
| 33 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 34 | class SurfaceTest : public test::ExoTestBase, |
| 35 | public ::testing::WithParamInterface<float> { |
| 36 | public: |
| 37 | SurfaceTest() = default; |
| 38 | ~SurfaceTest() override = default; |
| 39 | void SetUp() override { |
| 40 | base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| 41 | // Set the device scale factor. |
| 42 | command_line->AppendSwitchASCII( |
| 43 | switches::kForceDeviceScaleFactor, |
| 44 | base::StringPrintf("%f", device_scale_factor())); |
| 45 | test::ExoTestBase::SetUp(); |
| 46 | } |
| 47 | |
| 48 | void TearDown() override { |
| 49 | test::ExoTestBase::TearDown(); |
| 50 | display::Display::ResetForceDeviceScaleFactorForTesting(); |
| 51 | } |
| 52 | |
| 53 | float device_scale_factor() const { return GetParam(); } |
| 54 | |
| 55 | gfx::Rect ToPixel(const gfx::Rect rect) { |
| 56 | return gfx::ConvertRectToPixel(device_scale_factor(), rect); |
| 57 | } |
| 58 | |
| 59 | private: |
| 60 | DISALLOW_COPY_AND_ASSIGN(SurfaceTest); |
| 61 | }; |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 62 | |
| 63 | void ReleaseBuffer(int* release_buffer_call_count) { |
| 64 | (*release_buffer_call_count)++; |
| 65 | } |
| 66 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 67 | // Instantiate the Boolean which is used to toggle mouse and touch events in |
| 68 | // the parameterized tests. |
| 69 | INSTANTIATE_TEST_CASE_P(, SurfaceTest, testing::Values(1.0f, 1.25f, 2.0f)); |
| 70 | |
| 71 | TEST_P(SurfaceTest, Attach) { |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 72 | gfx::Size buffer_size(256, 256); |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 73 | std::unique_ptr<Buffer> buffer( |
reveman | c8623d5b | 2016-02-09 02:29:10 | [diff] [blame] | 74 | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 75 | |
| 76 | // Set the release callback that will be run when buffer is no longer in use. |
| 77 | int release_buffer_call_count = 0; |
| 78 | buffer->set_release_callback( |
| 79 | base::Bind(&ReleaseBuffer, base::Unretained(&release_buffer_call_count))); |
| 80 | |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 81 | std::unique_ptr<Surface> surface(new Surface); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 82 | |
| 83 | // Attach the buffer to surface1. |
reveman | ced21f86 | 2015-11-24 00:42:49 | [diff] [blame] | 84 | surface->Attach(buffer.get()); |
| 85 | surface->Commit(); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 86 | |
reveman | ced21f86 | 2015-11-24 00:42:49 | [diff] [blame] | 87 | // Commit without calling Attach() should have no effect. |
| 88 | surface->Commit(); |
| 89 | EXPECT_EQ(0, release_buffer_call_count); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 90 | |
reveman | ced21f86 | 2015-11-24 00:42:49 | [diff] [blame] | 91 | // Attach a null buffer to surface, this should release the previously |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 92 | // attached buffer. |
reveman | ced21f86 | 2015-11-24 00:42:49 | [diff] [blame] | 93 | surface->Attach(nullptr); |
| 94 | surface->Commit(); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 95 | // LayerTreeFrameSinkHolder::ReclaimResources() gets called via |
danakj | 2e3aca0 | 2017-06-23 22:58:52 | [diff] [blame] | 96 | // CompositorFrameSinkClient interface. We need to wait here for the mojo |
staraz | d8f4f64 | 2016-12-10 23:49:20 | [diff] [blame] | 97 | // call to finish so that the release callback finishes running before |
| 98 | // the assertion below. |
| 99 | RunAllPendingInMessageLoop(); |
reveman | ced21f86 | 2015-11-24 00:42:49 | [diff] [blame] | 100 | ASSERT_EQ(1, release_buffer_call_count); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 101 | } |
| 102 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 103 | const viz::CompositorFrame& GetFrameFromSurface(ShellSurface* shell_surface) { |
Dominik Laskowski | 0b3a6d1d | 2017-10-03 20:29:11 | [diff] [blame] | 104 | viz::SurfaceId surface_id = shell_surface->host_window()->GetSurfaceId(); |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 105 | viz::SurfaceManager* surface_manager = aura::Env::GetInstance() |
| 106 | ->context_factory_private() |
| 107 | ->GetFrameSinkManager() |
| 108 | ->surface_manager(); |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 109 | const viz::CompositorFrame& frame = |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 110 | surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); |
| 111 | return frame; |
| 112 | } |
| 113 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 114 | TEST_P(SurfaceTest, Damage) { |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 115 | gfx::Size buffer_size(256, 256); |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 116 | std::unique_ptr<Buffer> buffer( |
reveman | c8623d5b | 2016-02-09 02:29:10 | [diff] [blame] | 117 | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 118 | std::unique_ptr<Surface> surface(new Surface); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 119 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 120 | |
| 121 | // Attach the buffer to the surface. This will update the pending bounds of |
| 122 | // the surface to the buffer size. |
| 123 | surface->Attach(buffer.get()); |
| 124 | |
reveman | 5c353d5 | 2016-02-11 21:28:56 | [diff] [blame] | 125 | // Mark areas inside the bounds of the surface as damaged. This should result |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 126 | // in pending damage. |
| 127 | surface->Damage(gfx::Rect(0, 0, 10, 10)); |
reveman | 5c353d5 | 2016-02-11 21:28:56 | [diff] [blame] | 128 | surface->Damage(gfx::Rect(10, 10, 10, 10)); |
| 129 | EXPECT_TRUE(surface->HasPendingDamageForTesting(gfx::Rect(0, 0, 10, 10))); |
| 130 | EXPECT_TRUE(surface->HasPendingDamageForTesting(gfx::Rect(10, 10, 10, 10))); |
| 131 | EXPECT_FALSE(surface->HasPendingDamageForTesting(gfx::Rect(5, 5, 10, 10))); |
reveman | 93f6cf7 | 2017-03-07 13:50:35 | [diff] [blame] | 132 | |
| 133 | // Check that damage larger than contents is handled correctly at commit. |
| 134 | surface->Damage(gfx::Rect(gfx::ScaleToCeiledSize(buffer_size, 2.0f))); |
| 135 | surface->Commit(); |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 136 | RunAllPendingInMessageLoop(); |
| 137 | |
| 138 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 139 | const viz::CompositorFrame& frame = |
| 140 | GetFrameFromSurface(shell_surface.get()); |
David Reveman | 472ec321 | 2017-11-11 04:19:03 | [diff] [blame] | 141 | EXPECT_EQ(ToPixel(gfx::Rect(buffer_size)), |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 142 | frame.render_pass_list.back()->damage_rect); |
| 143 | } |
| 144 | |
David Reveman | 472ec321 | 2017-11-11 04:19:03 | [diff] [blame] | 145 | gfx::RectF buffer_damage(32, 64, 16, 32); |
| 146 | gfx::Rect surface_damage = gfx::ToNearestRect(buffer_damage); |
| 147 | |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 148 | // Check that damage is correct for a non-square rectangle not at the origin. |
David Reveman | 472ec321 | 2017-11-11 04:19:03 | [diff] [blame] | 149 | surface->Damage(surface_damage); |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 150 | surface->Commit(); |
| 151 | RunAllPendingInMessageLoop(); |
| 152 | |
David Reveman | 472ec321 | 2017-11-11 04:19:03 | [diff] [blame] | 153 | // Adjust damage for DSF filtering and verify it below. |
| 154 | if (device_scale_factor() > 1.f) |
| 155 | buffer_damage.Inset(-1.f, -1.f); |
| 156 | |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 157 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 158 | const viz::CompositorFrame& frame = |
| 159 | GetFrameFromSurface(shell_surface.get()); |
David Reveman | 472ec321 | 2017-11-11 04:19:03 | [diff] [blame] | 160 | EXPECT_TRUE( |
| 161 | gfx::RectF(frame.render_pass_list.back()->damage_rect) |
| 162 | .Contains(gfx::ScaleRect(buffer_damage, device_scale_factor()))); |
Lloyd Pique | 8b62e99 | 2017-09-07 21:24:52 | [diff] [blame] | 163 | } |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 164 | } |
| 165 | |
| 166 | void SetFrameTime(base::TimeTicks* result, base::TimeTicks frame_time) { |
| 167 | *result = frame_time; |
| 168 | } |
| 169 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 170 | TEST_P(SurfaceTest, RequestFrameCallback) { |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 171 | std::unique_ptr<Surface> surface(new Surface); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 172 | |
| 173 | base::TimeTicks frame_time; |
| 174 | surface->RequestFrameCallback( |
| 175 | base::Bind(&SetFrameTime, base::Unretained(&frame_time))); |
| 176 | surface->Commit(); |
| 177 | |
| 178 | // Callback should not run synchronously. |
| 179 | EXPECT_TRUE(frame_time.is_null()); |
| 180 | } |
| 181 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 182 | TEST_P(SurfaceTest, SetOpaqueRegion) { |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 183 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 184 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 185 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 186 | auto surface = std::make_unique<Surface>(); |
| 187 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 188 | |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 189 | // Attaching a buffer with alpha channel. |
| 190 | surface->Attach(buffer.get()); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 191 | |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 192 | // Setting an opaque region that contains the buffer size doesn't require |
| 193 | // draw with blending. |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 194 | surface->SetOpaqueRegion(gfx::Rect(256, 256)); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 195 | surface->Commit(); |
| 196 | RunAllPendingInMessageLoop(); |
| 197 | |
| 198 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 199 | const viz::CompositorFrame& frame = |
| 200 | GetFrameFromSurface(shell_surface.get()); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 201 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 202 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 203 | EXPECT_FALSE(frame.render_pass_list.back() |
| 204 | ->quad_list.back() |
| 205 | ->ShouldDrawWithBlending()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 206 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 1, 1)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 207 | frame.render_pass_list.back()->damage_rect); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | // Setting an empty opaque region requires draw with blending. |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 211 | surface->SetOpaqueRegion(gfx::Rect()); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 212 | surface->Commit(); |
| 213 | RunAllPendingInMessageLoop(); |
| 214 | |
| 215 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 216 | const viz::CompositorFrame& frame = |
| 217 | GetFrameFromSurface(shell_surface.get()); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 218 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 219 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 220 | EXPECT_TRUE(frame.render_pass_list.back() |
| 221 | ->quad_list.back() |
| 222 | ->ShouldDrawWithBlending()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 223 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 1, 1)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 224 | frame.render_pass_list.back()->damage_rect); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 225 | } |
| 226 | |
| 227 | std::unique_ptr<Buffer> buffer_without_alpha( |
| 228 | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer( |
| 229 | buffer_size, gfx::BufferFormat::RGBX_8888))); |
| 230 | |
| 231 | // Attaching a buffer without an alpha channel doesn't require draw with |
| 232 | // blending. |
| 233 | surface->Attach(buffer_without_alpha.get()); |
| 234 | surface->Commit(); |
| 235 | RunAllPendingInMessageLoop(); |
| 236 | |
| 237 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 238 | const viz::CompositorFrame& frame = |
| 239 | GetFrameFromSurface(shell_surface.get()); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 240 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 241 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 242 | EXPECT_FALSE(frame.render_pass_list.back() |
| 243 | ->quad_list.back() |
| 244 | ->ShouldDrawWithBlending()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 245 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 0, 0)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 246 | frame.render_pass_list.back()->damage_rect); |
reveman | ca132dc | 2017-01-31 22:35:54 | [diff] [blame] | 247 | } |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 248 | } |
| 249 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 250 | TEST_P(SurfaceTest, SetInputRegion) { |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 251 | // Create a shell surface which size is 512x512. |
| 252 | auto surface = std::make_unique<Surface>(); |
| 253 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
| 254 | gfx::Size buffer_size(512, 512); |
| 255 | auto buffer = std::make_unique<Buffer>( |
| 256 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
| 257 | surface->Attach(buffer.get()); |
| 258 | surface->Commit(); |
Dominik Laskowski | 5706470 | 2017-11-30 10:31:41 | [diff] [blame] | 259 | |
| 260 | { |
| 261 | // Default input region should match surface bounds. |
| 262 | auto rects = surface->GetHitTestShapeRects(); |
| 263 | ASSERT_TRUE(rects); |
| 264 | ASSERT_EQ(1u, rects->size()); |
| 265 | ASSERT_EQ(gfx::Rect(512, 512), (*rects)[0]); |
| 266 | } |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 267 | |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 268 | { |
| 269 | // Setting a non-empty input region should succeed. |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 270 | surface->SetInputRegion(gfx::Rect(256, 256)); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 271 | surface->Commit(); |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 272 | |
Dominik Laskowski | 5706470 | 2017-11-30 10:31:41 | [diff] [blame] | 273 | auto rects = surface->GetHitTestShapeRects(); |
| 274 | ASSERT_TRUE(rects); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 275 | ASSERT_EQ(1u, rects->size()); |
| 276 | ASSERT_EQ(gfx::Rect(256, 256), (*rects)[0]); |
| 277 | } |
| 278 | |
| 279 | { |
| 280 | // Setting an empty input region should succeed. |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 281 | surface->SetInputRegion(gfx::Rect()); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 282 | surface->Commit(); |
| 283 | |
Dominik Laskowski | 5706470 | 2017-11-30 10:31:41 | [diff] [blame] | 284 | EXPECT_FALSE(surface->GetHitTestShapeRects()); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 285 | } |
| 286 | |
| 287 | { |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 288 | cc::Region region = gfx::Rect(512, 512); |
| 289 | region.Subtract(gfx::Rect(0, 64, 64, 64)); |
| 290 | region.Subtract(gfx::Rect(88, 88, 12, 55)); |
| 291 | region.Subtract(gfx::Rect(100, 0, 33, 66)); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 292 | |
| 293 | // Setting a non-rectangle input region should succeed. |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 294 | surface->SetInputRegion(region); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 295 | surface->Commit(); |
| 296 | |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 297 | auto rects = surface->GetHitTestShapeRects(); |
Dominik Laskowski | 5706470 | 2017-11-30 10:31:41 | [diff] [blame] | 298 | ASSERT_TRUE(rects); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 299 | ASSERT_EQ(10u, rects->size()); |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 300 | cc::Region result; |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 301 | for (const auto& r : *rects) |
Dominik Laskowski | 0dcf9135 | 2017-11-29 19:21:35 | [diff] [blame] | 302 | result.Union(r); |
Peng Huang | b921f3f | 2017-09-27 20:01:23 | [diff] [blame] | 303 | ASSERT_EQ(result, region); |
| 304 | } |
Dominik Laskowski | 5706470 | 2017-11-30 10:31:41 | [diff] [blame] | 305 | |
| 306 | { |
| 307 | // Input region should be clipped to surface bounds. |
| 308 | surface->SetInputRegion(gfx::Rect(-50, -50, 1000, 100)); |
| 309 | surface->Commit(); |
| 310 | |
| 311 | auto rects = surface->GetHitTestShapeRects(); |
| 312 | ASSERT_TRUE(rects); |
| 313 | ASSERT_EQ(1u, rects->size()); |
| 314 | ASSERT_EQ(gfx::Rect(512, 50), (*rects)[0]); |
| 315 | } |
| 316 | |
| 317 | { |
| 318 | // Hit test region should accumulate input regions of sub-surfaces. |
| 319 | gfx::Rect input_rect(50, 50, 100, 100); |
| 320 | surface->SetInputRegion(input_rect); |
| 321 | |
| 322 | gfx::Rect child_input_rect(-50, -50, 1000, 100); |
| 323 | auto child_buffer = std::make_unique<Buffer>( |
| 324 | exo_test_helper()->CreateGpuMemoryBuffer(child_input_rect.size())); |
| 325 | auto child_surface = std::make_unique<Surface>(); |
| 326 | auto sub_surface = |
| 327 | std::make_unique<SubSurface>(child_surface.get(), surface.get()); |
| 328 | sub_surface->SetPosition(child_input_rect.origin()); |
| 329 | child_surface->Attach(child_buffer.get()); |
| 330 | child_surface->Commit(); |
| 331 | surface->Commit(); |
| 332 | |
| 333 | auto rects = surface->GetHitTestShapeRects(); |
| 334 | ASSERT_TRUE(rects); |
| 335 | ASSERT_EQ(2u, rects->size()); |
| 336 | cc::Region result = cc::UnionRegions((*rects)[0], (*rects)[1]); |
| 337 | ASSERT_EQ(cc::UnionRegions(input_rect, child_input_rect), result); |
| 338 | } |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 339 | } |
| 340 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 341 | TEST_P(SurfaceTest, SetBufferScale) { |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 342 | gfx::Size buffer_size(512, 512); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 343 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 344 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 345 | auto surface = std::make_unique<Surface>(); |
| 346 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 347 | |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 348 | // This will update the bounds of the surface and take the buffer scale into |
| 349 | // account. |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 350 | const float kBufferScale = 2.0f; |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 351 | surface->Attach(buffer.get()); |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 352 | surface->SetBufferScale(kBufferScale); |
reveman | 2966d770 | 2016-02-12 02:09:54 | [diff] [blame] | 353 | surface->Commit(); |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 354 | EXPECT_EQ( |
| 355 | gfx::ScaleToFlooredSize(buffer_size, 1.0f / kBufferScale).ToString(), |
jbauman | e352625 | 2016-06-09 18:43:05 | [diff] [blame] | 356 | surface->window()->bounds().size().ToString()); |
jbauman | b362a89 | 2016-06-17 03:30:56 | [diff] [blame] | 357 | EXPECT_EQ( |
| 358 | gfx::ScaleToFlooredSize(buffer_size, 1.0f / kBufferScale).ToString(), |
| 359 | surface->content_size().ToString()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 360 | |
| 361 | RunAllPendingInMessageLoop(); |
| 362 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 363 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 364 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 365 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 256, 256)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 366 | frame.render_pass_list.back()->damage_rect); |
reveman | 7efa4b0 | 2016-01-06 08:29:54 | [diff] [blame] | 367 | } |
| 368 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 369 | TEST_P(SurfaceTest, SetBufferTransform) { |
David Reveman | fca309b | 2017-08-24 18:18:11 | [diff] [blame] | 370 | gfx::Size buffer_size(256, 512); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 371 | auto buffer = std::make_unique<Buffer>( |
David Reveman | fca309b | 2017-08-24 18:18:11 | [diff] [blame] | 372 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 373 | auto surface = std::make_unique<Surface>(); |
| 374 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
David Reveman | fca309b | 2017-08-24 18:18:11 | [diff] [blame] | 375 | |
| 376 | // This will update the bounds of the surface and take the buffer transform |
| 377 | // into account. |
| 378 | surface->Attach(buffer.get()); |
| 379 | surface->SetBufferTransform(Transform::ROTATE_90); |
| 380 | surface->Commit(); |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 381 | EXPECT_EQ(gfx::Size(buffer_size.height(), buffer_size.width()), |
| 382 | surface->window()->bounds().size()); |
| 383 | EXPECT_EQ(gfx::Size(buffer_size.height(), buffer_size.width()), |
| 384 | surface->content_size()); |
David Reveman | fca309b | 2017-08-24 18:18:11 | [diff] [blame] | 385 | |
| 386 | RunAllPendingInMessageLoop(); |
| 387 | |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 388 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 389 | const viz::CompositorFrame& frame = |
| 390 | GetFrameFromSurface(shell_surface.get()); |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 391 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 392 | EXPECT_EQ( |
| 393 | ToPixel(gfx::Rect(0, 0, buffer_size.height(), buffer_size.width())), |
| 394 | frame.render_pass_list.back()->damage_rect); |
danakj | e5805be | 2017-09-15 19:24:55 | [diff] [blame] | 395 | const auto& quad_list = frame.render_pass_list[0]->quad_list; |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 396 | ASSERT_EQ(1u, quad_list.size()); |
| 397 | EXPECT_EQ( |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 398 | ToPixel(gfx::Rect(0, 0, 512, 256)), |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 399 | cc::MathUtil::MapEnclosingClippedRect( |
| 400 | quad_list.front()->shared_quad_state->quad_to_target_transform, |
| 401 | quad_list.front()->rect)); |
| 402 | } |
| 403 | |
| 404 | gfx::Size child_buffer_size(64, 128); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 405 | auto child_buffer = std::make_unique<Buffer>( |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 406 | exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 407 | auto child_surface = std::make_unique<Surface>(); |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 408 | auto sub_surface = |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 409 | std::make_unique<SubSurface>(child_surface.get(), surface.get()); |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 410 | |
| 411 | // Set position to 20, 10. |
| 412 | gfx::Point child_position(20, 10); |
| 413 | sub_surface->SetPosition(child_position); |
| 414 | |
| 415 | child_surface->Attach(child_buffer.get()); |
| 416 | child_surface->SetBufferTransform(Transform::ROTATE_180); |
| 417 | const int kChildBufferScale = 2; |
| 418 | child_surface->SetBufferScale(kChildBufferScale); |
| 419 | child_surface->Commit(); |
| 420 | surface->Commit(); |
| 421 | EXPECT_EQ( |
| 422 | gfx::ScaleToRoundedSize(child_buffer_size, 1.0f / kChildBufferScale), |
| 423 | child_surface->window()->bounds().size()); |
| 424 | EXPECT_EQ( |
| 425 | gfx::ScaleToRoundedSize(child_buffer_size, 1.0f / kChildBufferScale), |
| 426 | child_surface->content_size()); |
| 427 | |
| 428 | RunAllPendingInMessageLoop(); |
| 429 | |
| 430 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 431 | const viz::CompositorFrame& frame = |
| 432 | GetFrameFromSurface(shell_surface.get()); |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 433 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
danakj | e5805be | 2017-09-15 19:24:55 | [diff] [blame] | 434 | const auto& quad_list = frame.render_pass_list[0]->quad_list; |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 435 | ASSERT_EQ(2u, quad_list.size()); |
| 436 | EXPECT_EQ( |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 437 | ToPixel(gfx::Rect(child_position, |
| 438 | gfx::ScaleToRoundedSize(child_buffer_size, |
| 439 | 1.0f / kChildBufferScale))), |
David Reveman | 22587fbc | 2017-08-28 22:27:18 | [diff] [blame] | 440 | cc::MathUtil::MapEnclosingClippedRect( |
| 441 | quad_list.front()->shared_quad_state->quad_to_target_transform, |
| 442 | quad_list.front()->rect)); |
| 443 | } |
David Reveman | fca309b | 2017-08-24 18:18:11 | [diff] [blame] | 444 | } |
| 445 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 446 | TEST_P(SurfaceTest, MirrorLayers) { |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 447 | gfx::Size buffer_size(512, 512); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 448 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 449 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 450 | auto surface = std::make_unique<Surface>(); |
| 451 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 452 | |
| 453 | surface->Attach(buffer.get()); |
| 454 | surface->Commit(); |
| 455 | |
Dominik Laskowski | 0b3a6d1d | 2017-10-03 20:29:11 | [diff] [blame] | 456 | EXPECT_EQ(buffer_size, surface->window()->bounds().size()); |
| 457 | EXPECT_EQ(buffer_size, surface->window()->layer()->bounds().size()); |
| 458 | std::unique_ptr<ui::LayerTreeOwner> old_layer_owner = |
| 459 | ::wm::MirrorLayers(shell_surface->host_window(), false /* sync_bounds */); |
| 460 | EXPECT_EQ(buffer_size, surface->window()->bounds().size()); |
| 461 | EXPECT_EQ(buffer_size, surface->window()->layer()->bounds().size()); |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 462 | EXPECT_EQ(buffer_size, old_layer_owner->root()->bounds().size()); |
Dominik Laskowski | 0b3a6d1d | 2017-10-03 20:29:11 | [diff] [blame] | 463 | EXPECT_TRUE(shell_surface->host_window()->layer()->has_external_content()); |
jbauman | 3bf9b9c | 2016-06-07 01:33:14 | [diff] [blame] | 464 | EXPECT_TRUE(old_layer_owner->root()->has_external_content()); |
| 465 | } |
| 466 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 467 | TEST_P(SurfaceTest, SetViewport) { |
reveman | 642d8c33 | 2016-02-19 19:55:44 | [diff] [blame] | 468 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 469 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 470 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 471 | auto surface = std::make_unique<Surface>(); |
| 472 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | 642d8c33 | 2016-02-19 19:55:44 | [diff] [blame] | 473 | |
| 474 | // This will update the bounds of the surface and take the viewport into |
| 475 | // account. |
| 476 | surface->Attach(buffer.get()); |
| 477 | gfx::Size viewport(256, 256); |
| 478 | surface->SetViewport(viewport); |
| 479 | surface->Commit(); |
jbauman | b362a89 | 2016-06-17 03:30:56 | [diff] [blame] | 480 | EXPECT_EQ(viewport.ToString(), surface->content_size().ToString()); |
reveman | 1468135 | 2016-06-02 15:37:51 | [diff] [blame] | 481 | |
| 482 | // This will update the bounds of the surface and take the viewport2 into |
| 483 | // account. |
| 484 | gfx::Size viewport2(512, 512); |
| 485 | surface->SetViewport(viewport2); |
| 486 | surface->Commit(); |
jbauman | e352625 | 2016-06-09 18:43:05 | [diff] [blame] | 487 | EXPECT_EQ(viewport2.ToString(), |
| 488 | surface->window()->bounds().size().ToString()); |
jbauman | b362a89 | 2016-06-17 03:30:56 | [diff] [blame] | 489 | EXPECT_EQ(viewport2.ToString(), surface->content_size().ToString()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 490 | |
| 491 | RunAllPendingInMessageLoop(); |
| 492 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 493 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 494 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 495 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 512, 512)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 496 | frame.render_pass_list.back()->damage_rect); |
reveman | 642d8c33 | 2016-02-19 19:55:44 | [diff] [blame] | 497 | } |
| 498 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 499 | TEST_P(SurfaceTest, SetCrop) { |
reveman | 8e32390 | 2016-05-23 21:55:36 | [diff] [blame] | 500 | gfx::Size buffer_size(16, 16); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 501 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 502 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 503 | auto surface = std::make_unique<Surface>(); |
| 504 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | 8e32390 | 2016-05-23 21:55:36 | [diff] [blame] | 505 | |
| 506 | surface->Attach(buffer.get()); |
| 507 | gfx::Size crop_size(12, 12); |
| 508 | surface->SetCrop(gfx::RectF(gfx::PointF(2.0, 2.0), gfx::SizeF(crop_size))); |
| 509 | surface->Commit(); |
jbauman | e352625 | 2016-06-09 18:43:05 | [diff] [blame] | 510 | EXPECT_EQ(crop_size.ToString(), |
| 511 | surface->window()->bounds().size().ToString()); |
jbauman | b362a89 | 2016-06-17 03:30:56 | [diff] [blame] | 512 | EXPECT_EQ(crop_size.ToString(), surface->content_size().ToString()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 513 | |
| 514 | RunAllPendingInMessageLoop(); |
| 515 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 516 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 517 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 518 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 12, 12)), |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 519 | frame.render_pass_list.back()->damage_rect); |
reveman | 8e32390 | 2016-05-23 21:55:36 | [diff] [blame] | 520 | } |
| 521 | |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 522 | TEST_P(SurfaceTest, SetCropAndBufferTransform) { |
| 523 | gfx::Size buffer_size(128, 64); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 524 | auto buffer = std::make_unique<Buffer>( |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 525 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 526 | auto surface = std::make_unique<Surface>(); |
| 527 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 528 | |
| 529 | const gfx::RectF crop_0( |
| 530 | gfx::SkRectToRectF(SkRect::MakeLTRB(0.03125f, 0.1875f, 0.4375f, 0.25f))); |
| 531 | const gfx::RectF crop_90( |
| 532 | gfx::SkRectToRectF(SkRect::MakeLTRB(0.875f, 0.0625f, 0.90625f, 0.875f))); |
| 533 | const gfx::RectF crop_180( |
| 534 | gfx::SkRectToRectF(SkRect::MakeLTRB(0.5625f, 0.75f, 0.96875f, 0.8125f))); |
| 535 | const gfx::RectF crop_270( |
| 536 | gfx::SkRectToRectF(SkRect::MakeLTRB(0.09375f, 0.125f, 0.125f, 0.9375f))); |
| 537 | const gfx::Rect target_with_no_viewport(ToPixel(gfx::Rect(gfx::Size(52, 4)))); |
| 538 | const gfx::Rect target_with_viewport(ToPixel(gfx::Rect(gfx::Size(128, 64)))); |
| 539 | |
| 540 | surface->Attach(buffer.get()); |
| 541 | gfx::Size crop_size(52, 4); |
| 542 | surface->SetCrop(gfx::RectF(gfx::PointF(4, 12), gfx::SizeF(crop_size))); |
| 543 | surface->SetBufferTransform(Transform::NORMAL); |
| 544 | surface->Commit(); |
| 545 | |
| 546 | RunAllPendingInMessageLoop(); |
| 547 | |
| 548 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 549 | const viz::CompositorFrame& frame = |
| 550 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 551 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 552 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 553 | ASSERT_EQ(1u, quad_list.size()); |
| 554 | const viz::TextureDrawQuad* quad = |
| 555 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 556 | EXPECT_EQ(crop_0.origin(), quad->uv_top_left); |
| 557 | EXPECT_EQ(crop_0.bottom_right(), quad->uv_bottom_right); |
| 558 | EXPECT_EQ( |
| 559 | ToPixel(gfx::Rect(0, 0, 52, 4)), |
| 560 | cc::MathUtil::MapEnclosingClippedRect( |
| 561 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 562 | } |
| 563 | |
| 564 | surface->SetBufferTransform(Transform::ROTATE_90); |
| 565 | surface->Commit(); |
| 566 | |
| 567 | RunAllPendingInMessageLoop(); |
| 568 | |
| 569 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 570 | const viz::CompositorFrame& frame = |
| 571 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 572 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 573 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 574 | ASSERT_EQ(1u, quad_list.size()); |
| 575 | const viz::TextureDrawQuad* quad = |
| 576 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 577 | EXPECT_EQ(crop_90.origin(), quad->uv_top_left); |
| 578 | EXPECT_EQ(crop_90.bottom_right(), quad->uv_bottom_right); |
| 579 | EXPECT_EQ( |
| 580 | ToPixel(gfx::Rect(0, 0, 52, 4)), |
| 581 | cc::MathUtil::MapEnclosingClippedRect( |
| 582 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 583 | } |
| 584 | |
| 585 | surface->SetBufferTransform(Transform::ROTATE_180); |
| 586 | surface->Commit(); |
| 587 | |
| 588 | RunAllPendingInMessageLoop(); |
| 589 | |
| 590 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 591 | const viz::CompositorFrame& frame = |
| 592 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 593 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 594 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 595 | ASSERT_EQ(1u, quad_list.size()); |
| 596 | const viz::TextureDrawQuad* quad = |
| 597 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 598 | EXPECT_EQ(crop_180.origin(), quad->uv_top_left); |
| 599 | EXPECT_EQ(crop_180.bottom_right(), quad->uv_bottom_right); |
| 600 | EXPECT_EQ( |
| 601 | ToPixel(gfx::Rect(0, 0, 52, 4)), |
| 602 | cc::MathUtil::MapEnclosingClippedRect( |
| 603 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 604 | } |
| 605 | |
| 606 | surface->SetBufferTransform(Transform::ROTATE_270); |
| 607 | surface->Commit(); |
| 608 | |
| 609 | RunAllPendingInMessageLoop(); |
| 610 | |
| 611 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 612 | const viz::CompositorFrame& frame = |
| 613 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 614 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 615 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 616 | ASSERT_EQ(1u, quad_list.size()); |
| 617 | const viz::TextureDrawQuad* quad = |
| 618 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 619 | EXPECT_EQ(crop_270.origin(), quad->uv_top_left); |
| 620 | EXPECT_EQ(crop_270.bottom_right(), quad->uv_bottom_right); |
| 621 | EXPECT_EQ( |
| 622 | target_with_no_viewport, |
| 623 | cc::MathUtil::MapEnclosingClippedRect( |
| 624 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 625 | } |
| 626 | |
| 627 | surface->SetViewport(gfx::Size(128, 64)); |
| 628 | surface->SetBufferTransform(Transform::NORMAL); |
| 629 | surface->Commit(); |
| 630 | |
| 631 | RunAllPendingInMessageLoop(); |
| 632 | |
| 633 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 634 | const viz::CompositorFrame& frame = |
| 635 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 636 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 637 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 638 | ASSERT_EQ(1u, quad_list.size()); |
| 639 | const viz::TextureDrawQuad* quad = |
| 640 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 641 | EXPECT_EQ(crop_0.origin(), quad->uv_top_left); |
| 642 | EXPECT_EQ(crop_0.bottom_right(), quad->uv_bottom_right); |
| 643 | EXPECT_EQ( |
| 644 | target_with_viewport, |
| 645 | cc::MathUtil::MapEnclosingClippedRect( |
| 646 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 647 | } |
| 648 | |
| 649 | surface->SetBufferTransform(Transform::ROTATE_90); |
| 650 | surface->Commit(); |
| 651 | |
| 652 | RunAllPendingInMessageLoop(); |
| 653 | |
| 654 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 655 | const viz::CompositorFrame& frame = |
| 656 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 657 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 658 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 659 | ASSERT_EQ(1u, quad_list.size()); |
| 660 | const viz::TextureDrawQuad* quad = |
| 661 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 662 | EXPECT_EQ(crop_90.origin(), quad->uv_top_left); |
| 663 | EXPECT_EQ(crop_90.bottom_right(), quad->uv_bottom_right); |
| 664 | EXPECT_EQ( |
| 665 | target_with_viewport, |
| 666 | cc::MathUtil::MapEnclosingClippedRect( |
| 667 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 668 | } |
| 669 | |
| 670 | surface->SetBufferTransform(Transform::ROTATE_180); |
| 671 | surface->Commit(); |
| 672 | |
| 673 | RunAllPendingInMessageLoop(); |
| 674 | |
| 675 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 676 | const viz::CompositorFrame& frame = |
| 677 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 678 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 679 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 680 | ASSERT_EQ(1u, quad_list.size()); |
| 681 | const viz::TextureDrawQuad* quad = |
| 682 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 683 | EXPECT_EQ(crop_180.origin(), quad->uv_top_left); |
| 684 | EXPECT_EQ(crop_180.bottom_right(), quad->uv_bottom_right); |
| 685 | EXPECT_EQ( |
| 686 | target_with_viewport, |
| 687 | cc::MathUtil::MapEnclosingClippedRect( |
| 688 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 689 | } |
| 690 | |
| 691 | surface->SetBufferTransform(Transform::ROTATE_270); |
| 692 | surface->Commit(); |
| 693 | |
| 694 | RunAllPendingInMessageLoop(); |
| 695 | |
| 696 | { |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 697 | const viz::CompositorFrame& frame = |
| 698 | GetFrameFromSurface(shell_surface.get()); |
Lloyd Pique | 0a3045f | 2017-09-15 23:34:12 | [diff] [blame] | 699 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 700 | const viz::QuadList& quad_list = frame.render_pass_list[0]->quad_list; |
| 701 | ASSERT_EQ(1u, quad_list.size()); |
| 702 | const viz::TextureDrawQuad* quad = |
| 703 | viz::TextureDrawQuad::MaterialCast(quad_list.front()); |
| 704 | EXPECT_EQ(crop_270.origin(), quad->uv_top_left); |
| 705 | EXPECT_EQ(crop_270.bottom_right(), quad->uv_bottom_right); |
| 706 | EXPECT_EQ( |
| 707 | target_with_viewport, |
| 708 | cc::MathUtil::MapEnclosingClippedRect( |
| 709 | quad->shared_quad_state->quad_to_target_transform, quad->rect)); |
| 710 | } |
| 711 | } |
| 712 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 713 | TEST_P(SurfaceTest, SetBlendMode) { |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 714 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 715 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 716 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 717 | auto surface = std::make_unique<Surface>(); |
| 718 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 719 | |
| 720 | surface->Attach(buffer.get()); |
reed | cc9c70f | 2016-11-22 04:26:01 | [diff] [blame] | 721 | surface->SetBlendMode(SkBlendMode::kSrc); |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 722 | surface->Commit(); |
staraz | d8f4f64 | 2016-12-10 23:49:20 | [diff] [blame] | 723 | RunAllPendingInMessageLoop(); |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 724 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 725 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 726 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 727 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 728 | EXPECT_FALSE(frame.render_pass_list.back() |
jbauman | 45c0686 | 2016-06-23 19:35:02 | [diff] [blame] | 729 | ->quad_list.back() |
| 730 | ->ShouldDrawWithBlending()); |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 731 | } |
| 732 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 733 | TEST_P(SurfaceTest, OverlayCandidate) { |
dcastagna | 3ee39998 | 2016-07-18 23:36:31 | [diff] [blame] | 734 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 735 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 736 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D, 0, |
| 737 | true, true); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 738 | auto surface = std::make_unique<Surface>(); |
| 739 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
dcastagna | 3ee39998 | 2016-07-18 23:36:31 | [diff] [blame] | 740 | |
| 741 | surface->Attach(buffer.get()); |
| 742 | surface->Commit(); |
staraz | d8f4f64 | 2016-12-10 23:49:20 | [diff] [blame] | 743 | RunAllPendingInMessageLoop(); |
dcastagna | 3ee39998 | 2016-07-18 23:36:31 | [diff] [blame] | 744 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 745 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
samans | ce5c3c3 | 2016-11-18 13:47:34 | [diff] [blame] | 746 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 747 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
danakj | 1a01068 | 2017-09-07 20:08:19 | [diff] [blame] | 748 | viz::DrawQuad* draw_quad = frame.render_pass_list.back()->quad_list.back(); |
| 749 | ASSERT_EQ(viz::DrawQuad::TEXTURE_CONTENT, draw_quad->material); |
dcastagna | 3ee39998 | 2016-07-18 23:36:31 | [diff] [blame] | 750 | |
danakj | e5805be | 2017-09-15 19:24:55 | [diff] [blame] | 751 | const viz::TextureDrawQuad* texture_quad = |
| 752 | viz::TextureDrawQuad::MaterialCast(draw_quad); |
dcastagna | 3ee39998 | 2016-07-18 23:36:31 | [diff] [blame] | 753 | EXPECT_FALSE(texture_quad->resource_size_in_pixels().IsEmpty()); |
| 754 | } |
| 755 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 756 | TEST_P(SurfaceTest, SetAlpha) { |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 757 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 758 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 759 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D, 0, |
| 760 | true, true); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 761 | auto surface = std::make_unique<Surface>(); |
| 762 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 763 | |
Peng Huang | a72f3a9 | 2017-10-05 00:32:27 | [diff] [blame] | 764 | { |
| 765 | surface->Attach(buffer.get()); |
| 766 | surface->SetAlpha(0.5f); |
| 767 | surface->Commit(); |
| 768 | RunAllPendingInMessageLoop(); |
Lloyd Pique | d1e23fd | 2017-08-15 23:10:51 | [diff] [blame] | 769 | |
Peng Huang | a72f3a9 | 2017-10-05 00:32:27 | [diff] [blame] | 770 | const viz::CompositorFrame& frame = |
| 771 | GetFrameFromSurface(shell_surface.get()); |
| 772 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 773 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 774 | ASSERT_EQ(1u, frame.resource_list.size()); |
| 775 | ASSERT_EQ(1u, frame.resource_list.back().id); |
| 776 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 1, 1)), |
| 777 | frame.render_pass_list.back()->damage_rect); |
| 778 | } |
| 779 | |
| 780 | { |
| 781 | surface->SetAlpha(0.f); |
| 782 | surface->Commit(); |
| 783 | const viz::CompositorFrame& frame = |
| 784 | GetFrameFromSurface(shell_surface.get()); |
| 785 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 786 | // No quad if alpha is 0. |
| 787 | ASSERT_EQ(0u, frame.render_pass_list.back()->quad_list.size()); |
| 788 | ASSERT_EQ(0u, frame.resource_list.size()); |
| 789 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 1, 1)), |
| 790 | frame.render_pass_list.back()->damage_rect); |
| 791 | } |
| 792 | |
| 793 | { |
| 794 | surface->SetAlpha(1.f); |
| 795 | surface->Commit(); |
| 796 | const viz::CompositorFrame& frame = |
| 797 | GetFrameFromSurface(shell_surface.get()); |
| 798 | ASSERT_EQ(1u, frame.render_pass_list.size()); |
| 799 | ASSERT_EQ(1u, frame.render_pass_list.back()->quad_list.size()); |
| 800 | ASSERT_EQ(1u, frame.resource_list.size()); |
| 801 | // The resource should be updated again, the id should be changed. |
| 802 | ASSERT_EQ(2u, frame.resource_list.back().id); |
| 803 | EXPECT_EQ(ToPixel(gfx::Rect(0, 0, 1, 1)), |
| 804 | frame.render_pass_list.back()->damage_rect); |
| 805 | } |
reveman | fca687e | 2016-05-10 21:44:48 | [diff] [blame] | 806 | } |
| 807 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 808 | TEST_P(SurfaceTest, Commit) { |
dcheng | 31759da | 2016-04-21 01:26:31 | [diff] [blame] | 809 | std::unique_ptr<Surface> surface(new Surface); |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 810 | |
| 811 | // Calling commit without a buffer should succeed. |
| 812 | surface->Commit(); |
| 813 | } |
| 814 | |
Peng Huang | 76f5fd0 | 2017-09-01 00:59:39 | [diff] [blame] | 815 | TEST_P(SurfaceTest, SendsBeginFrameAcks) { |
Fady Samuel | e65ab0a1 | 2017-07-28 17:47:25 | [diff] [blame] | 816 | viz::FakeExternalBeginFrameSource source(0.f, false); |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 817 | gfx::Size buffer_size(1, 1); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 818 | auto buffer = std::make_unique<Buffer>( |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 819 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), GL_TEXTURE_2D, 0, |
| 820 | true, true); |
David Reveman | d0ab1fb8 | 2017-09-18 22:27:57 | [diff] [blame] | 821 | auto surface = std::make_unique<Surface>(); |
| 822 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 823 | shell_surface->SetBeginFrameSource(&source); |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 824 | surface->Attach(buffer.get()); |
| 825 | |
| 826 | // Request a frame callback so that Surface now needs BeginFrames. |
| 827 | base::TimeTicks frame_time; |
| 828 | surface->RequestFrameCallback( |
| 829 | base::Bind(&SetFrameTime, base::Unretained(&frame_time))); |
| 830 | surface->Commit(); // Move callback from pending callbacks to current ones. |
| 831 | RunAllPendingInMessageLoop(); |
| 832 | |
staraz | 09b06ca | 2017-04-06 23:27:21 | [diff] [blame] | 833 | // Surface should add itself as observer during |
| 834 | // DidReceiveCompositorFrameAck(). |
Peng Huang | 583c9dc6 | 2017-07-27 23:38:28 | [diff] [blame] | 835 | shell_surface->DidReceiveCompositorFrameAck(); |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 836 | EXPECT_EQ(1u, source.num_observers()); |
| 837 | |
Fady Samuel | c296f5fb | 2017-07-21 04:02:19 | [diff] [blame] | 838 | viz::BeginFrameArgs args(source.CreateBeginFrameArgs(BEGINFRAME_FROM_HERE)); |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 839 | args.frame_time = base::TimeTicks::FromInternalValue(100); |
| 840 | source.TestOnBeginFrame(args); // Runs the frame callback. |
| 841 | EXPECT_EQ(args.frame_time, frame_time); |
| 842 | |
eseckler | ca6d7cb7 | 2017-05-26 11:33:47 | [diff] [blame] | 843 | surface->Commit(); // Acknowledges the BeginFrame via CompositorFrame. |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 844 | RunAllPendingInMessageLoop(); |
| 845 | |
danakj | 5e0a12b | 2017-09-25 17:26:49 | [diff] [blame] | 846 | const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get()); |
Fady Samuel | c296f5fb | 2017-07-21 04:02:19 | [diff] [blame] | 847 | viz::BeginFrameAck expected_ack(args.source_id, args.sequence_number, true); |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 848 | EXPECT_EQ(expected_ack, frame.metadata.begin_frame_ack); |
eseckler | ca6d7cb7 | 2017-05-26 11:33:47 | [diff] [blame] | 849 | |
| 850 | // TODO(eseckler): Add test for DidNotProduceFrame plumbing. |
eseckler | 599d86bb | 2017-03-15 09:02:55 | [diff] [blame] | 851 | } |
| 852 | |
Eliot Courtney | 28e7aa5 | 2017-09-27 02:16:21 | [diff] [blame] | 853 | TEST_P(SurfaceTest, RemoveSubSurface) { |
| 854 | gfx::Size buffer_size(256, 256); |
| 855 | std::unique_ptr<Buffer> buffer( |
| 856 | new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
| 857 | std::unique_ptr<Surface> surface(new Surface); |
| 858 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
| 859 | surface->Attach(buffer.get()); |
| 860 | |
| 861 | // Create a subsurface: |
| 862 | gfx::Size child_buffer_size(64, 128); |
| 863 | auto child_buffer = std::make_unique<Buffer>( |
| 864 | exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size)); |
| 865 | auto child_surface = std::make_unique<Surface>(); |
| 866 | auto sub_surface = |
| 867 | std::make_unique<SubSurface>(child_surface.get(), surface.get()); |
| 868 | sub_surface->SetPosition(gfx::Point(20, 10)); |
| 869 | child_surface->Attach(child_buffer.get()); |
| 870 | child_surface->Commit(); |
| 871 | surface->Commit(); |
| 872 | RunAllPendingInMessageLoop(); |
| 873 | |
Peng Huang | f925ebf | 2017-10-31 15:37:50 | [diff] [blame] | 874 | // Remove the subsurface by destroying it. This should not damage |surface|. |
| 875 | // TODO(penghuang): Make the damage more precise for sub surface changes. |
| 876 | // https://crbug.com/779704 |
Eliot Courtney | 28e7aa5 | 2017-09-27 02:16:21 | [diff] [blame] | 877 | sub_surface.reset(); |
Peng Huang | f925ebf | 2017-10-31 15:37:50 | [diff] [blame] | 878 | EXPECT_FALSE(surface->HasPendingDamageForTesting(gfx::Rect(20, 10, 64, 128))); |
Eliot Courtney | 28e7aa5 | 2017-09-27 02:16:21 | [diff] [blame] | 879 | } |
| 880 | |
David Reveman | e6e2334 | 2017-11-07 06:18:06 | [diff] [blame] | 881 | TEST_P(SurfaceTest, DestroyAttachedBuffer) { |
| 882 | gfx::Size buffer_size(1, 1); |
| 883 | auto buffer = std::make_unique<Buffer>( |
| 884 | exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)); |
| 885 | auto surface = std::make_unique<Surface>(); |
| 886 | auto shell_surface = std::make_unique<ShellSurface>(surface.get()); |
| 887 | |
| 888 | surface->Attach(buffer.get()); |
| 889 | surface->Commit(); |
| 890 | RunAllPendingInMessageLoop(); |
| 891 | |
| 892 | // Make sure surface size is still valid after buffer is destroyed. |
| 893 | buffer.reset(); |
| 894 | surface->Commit(); |
| 895 | EXPECT_FALSE(surface->content_size().IsEmpty()); |
| 896 | } |
| 897 | |
reveman | b195f41d | 2015-11-19 22:16:48 | [diff] [blame] | 898 | } // namespace |
| 899 | } // namespace exo |