Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/output_surface.h" | 5 #include "cc/output/output_surface.h" |
| 6 #include "cc/output/output_surface_client.h" | 6 #include "cc/output/output_surface_client.h" |
| 7 #include "cc/test/test_web_graphics_context_3d.h" | 7 #include "cc/test/test_web_graphics_context_3d.h" |
| 8 #include "gpu/GLES2/gl2extchromium.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 10 |
| 10 namespace cc { | 11 namespace cc { |
| 11 namespace { | 12 namespace { |
| 12 | 13 |
| 13 class TestOutputSurface : public OutputSurface { | 14 class TestOutputSurface : public OutputSurface { |
| 14 public: | 15 public: |
| 15 explicit TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) | 16 explicit TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d) |
| 16 : OutputSurface(context3d.Pass()) {} | 17 : OutputSurface(context3d.Pass()) {} |
| 17 | 18 |
| 18 explicit TestOutputSurface( | 19 explicit TestOutputSurface( |
| 19 scoped_ptr<cc::SoftwareOutputDevice> software_device) | 20 scoped_ptr<cc::SoftwareOutputDevice> software_device) |
| 20 : OutputSurface(software_device.Pass()) {} | 21 : OutputSurface(software_device.Pass()) {} |
| 21 | 22 |
| 22 TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d, | 23 TestOutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d, |
| 23 scoped_ptr<cc::SoftwareOutputDevice> software_device) | 24 scoped_ptr<cc::SoftwareOutputDevice> software_device) |
| 24 : OutputSurface(context3d.Pass(), software_device.Pass()) {} | 25 : OutputSurface(context3d.Pass(), software_device.Pass()) {} |
| 25 | 26 |
| 26 OutputSurfaceClient* client() { return client_; } | 27 OutputSurfaceClient* client() { return client_; } |
| 28 | |
| 29 bool InitializeNewContext3D( | |
| 30 scoped_ptr<WebKit::WebGraphicsContext3D> new_context3d) { | |
| 31 return InitializeAndSetContext3D(new_context3d.Pass()); | |
| 32 } | |
| 27 }; | 33 }; |
| 28 | 34 |
| 29 class FakeOutputSurfaceClient : public OutputSurfaceClient { | 35 class FakeOutputSurfaceClient : public OutputSurfaceClient { |
| 30 public: | 36 public: |
| 37 FakeOutputSurfaceClient() : did_lose_output_surface_called_(false) {} | |
| 38 | |
| 31 virtual void SetNeedsRedrawRect(gfx::Rect damage_rect) OVERRIDE {} | 39 virtual void SetNeedsRedrawRect(gfx::Rect damage_rect) OVERRIDE {} |
| 32 virtual void OnVSyncParametersChanged(base::TimeTicks timebase, | 40 virtual void OnVSyncParametersChanged(base::TimeTicks timebase, |
| 33 base::TimeDelta interval) OVERRIDE {} | 41 base::TimeDelta interval) OVERRIDE {} |
| 34 virtual void BeginFrame(base::TimeTicks frame_time) OVERRIDE {} | 42 virtual void BeginFrame(base::TimeTicks frame_time) OVERRIDE {} |
| 35 virtual void OnSendFrameToParentCompositorAck(const CompositorFrameAck& ack) | 43 virtual void OnSendFrameToParentCompositorAck(const CompositorFrameAck& ack) |
| 36 OVERRIDE {} | 44 OVERRIDE {} |
| 37 virtual void OnSwapBuffersComplete() OVERRIDE {} | 45 virtual void OnSwapBuffersComplete() OVERRIDE {} |
| 38 virtual void DidLoseOutputSurface() OVERRIDE {} | 46 virtual void DidLoseOutputSurface() OVERRIDE { |
| 47 did_lose_output_surface_called_ = true; | |
| 48 } | |
| 49 | |
| 50 bool did_lose_output_surface_called() { | |
| 51 return did_lose_output_surface_called_; | |
| 52 } | |
| 53 | |
| 54 private: | |
| 55 bool did_lose_output_surface_called_; | |
| 39 }; | 56 }; |
| 40 | 57 |
| 41 TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { | 58 TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { |
| 42 scoped_ptr<TestWebGraphicsContext3D> context3d = | 59 scoped_ptr<TestWebGraphicsContext3D> context3d = |
| 43 TestWebGraphicsContext3D::Create(); | 60 TestWebGraphicsContext3D::Create(); |
| 44 | 61 |
| 45 TestOutputSurface output_surface( | 62 TestOutputSurface output_surface( |
| 46 context3d.PassAs<WebKit::WebGraphicsContext3D>()); | 63 context3d.PassAs<WebKit::WebGraphicsContext3D>()); |
| 47 EXPECT_EQ(NULL, output_surface.client()); | 64 EXPECT_EQ(NULL, output_surface.client()); |
| 48 | 65 |
| 49 FakeOutputSurfaceClient client; | 66 FakeOutputSurfaceClient client; |
| 50 EXPECT_TRUE(output_surface.BindToClient(&client)); | 67 EXPECT_TRUE(output_surface.BindToClient(&client)); |
| 51 EXPECT_EQ(&client, output_surface.client()); | 68 EXPECT_EQ(&client, output_surface.client()); |
| 69 | |
| 70 // Verify DidLoseOutputSurface callback is hooked up correctly. | |
| 71 ASSERT_FALSE(client.did_lose_output_surface_called()); | |
|
danakj
2013/06/05 18:50:22
nit: EXPECT instead of ASSERT throughout, this doe
boliu
2013/06/05 19:06:31
All except ASSERT_TRUE(output_surface.context3d())
| |
| 72 output_surface.context3d()->loseContextCHROMIUM( | |
| 73 GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); | |
| 74 ASSERT_TRUE(client.did_lose_output_surface_called()); | |
| 52 } | 75 } |
| 53 | 76 |
| 54 TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { | 77 TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { |
| 55 scoped_ptr<TestWebGraphicsContext3D> context3d = | 78 scoped_ptr<TestWebGraphicsContext3D> context3d = |
| 56 TestWebGraphicsContext3D::Create(); | 79 TestWebGraphicsContext3D::Create(); |
| 57 | 80 |
| 58 // Lose the context so BindToClient fails. | 81 // Lose the context so BindToClient fails. |
| 59 context3d->set_times_make_current_succeeds(0); | 82 context3d->set_times_make_current_succeeds(0); |
| 60 | 83 |
| 61 TestOutputSurface output_surface( | 84 TestOutputSurface output_surface( |
| 62 context3d.PassAs<WebKit::WebGraphicsContext3D>()); | 85 context3d.PassAs<WebKit::WebGraphicsContext3D>()); |
| 63 EXPECT_EQ(NULL, output_surface.client()); | 86 EXPECT_EQ(NULL, output_surface.client()); |
| 64 | 87 |
| 65 FakeOutputSurfaceClient client; | 88 FakeOutputSurfaceClient client; |
| 66 EXPECT_FALSE(output_surface.BindToClient(&client)); | 89 EXPECT_FALSE(output_surface.BindToClient(&client)); |
| 67 EXPECT_EQ(NULL, output_surface.client()); | 90 EXPECT_EQ(NULL, output_surface.client()); |
| 68 } | 91 } |
| 69 | 92 |
| 93 TEST(OutputSurfaceTest, InitializeNewContext3DSuccess) { | |
| 94 scoped_ptr<TestWebGraphicsContext3D> first_context3d = | |
| 95 TestWebGraphicsContext3D::Create(); | |
| 96 TestOutputSurface output_surface( | |
| 97 first_context3d.PassAs<WebKit::WebGraphicsContext3D>()); | |
| 98 | |
| 99 FakeOutputSurfaceClient client; | |
| 100 EXPECT_TRUE(output_surface.BindToClient(&client)); | |
| 101 EXPECT_EQ(&client, output_surface.client()); | |
| 102 | |
| 103 scoped_ptr<TestWebGraphicsContext3D> second_context3d = | |
| 104 TestWebGraphicsContext3D::Create(); | |
| 105 EXPECT_TRUE(output_surface.InitializeNewContext3D( | |
| 106 second_context3d.PassAs<WebKit::WebGraphicsContext3D>())); | |
| 107 ASSERT_FALSE(client.did_lose_output_surface_called()); | |
| 108 output_surface.context3d()->loseContextCHROMIUM( | |
| 109 GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); | |
| 110 ASSERT_TRUE(client.did_lose_output_surface_called()); | |
| 111 } | |
| 112 | |
| 113 TEST(OutputSurfaceTest, InitializeNewContext3DFails) { | |
| 114 scoped_ptr<TestWebGraphicsContext3D> first_context3d = | |
| 115 TestWebGraphicsContext3D::Create(); | |
| 116 TestWebGraphicsContext3D* first_context3d_ptr = first_context3d.get(); | |
| 117 TestOutputSurface output_surface( | |
| 118 first_context3d.PassAs<WebKit::WebGraphicsContext3D>()); | |
| 119 | |
| 120 FakeOutputSurfaceClient client; | |
| 121 EXPECT_TRUE(output_surface.BindToClient(&client)); | |
| 122 EXPECT_EQ(&client, output_surface.client()); | |
| 123 | |
| 124 scoped_ptr<TestWebGraphicsContext3D> second_context3d = | |
| 125 TestWebGraphicsContext3D::Create(); | |
| 126 second_context3d->set_times_make_current_succeeds(0); | |
| 127 | |
| 128 EXPECT_FALSE(output_surface.InitializeNewContext3D( | |
| 129 second_context3d.PassAs<WebKit::WebGraphicsContext3D>())); | |
| 130 EXPECT_EQ(&client, output_surface.client()); | |
| 131 | |
| 132 // First context3d still in place. | |
| 133 ASSERT_TRUE(output_surface.context3d()); | |
| 134 EXPECT_EQ(first_context3d_ptr, output_surface.context3d()); | |
| 135 ASSERT_FALSE(client.did_lose_output_surface_called()); | |
| 136 output_surface.context3d()->loseContextCHROMIUM( | |
| 137 GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); | |
| 138 ASSERT_TRUE(client.did_lose_output_surface_called()); | |
| 139 } | |
| 140 | |
| 70 } // namespace | 141 } // namespace |
| 71 } // namespace cc | 142 } // namespace cc |
| OLD | NEW |