diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 23:38:45 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 23:38:45 +0000 |
commit | 5b86251b266a60f8fe4fee2e942b8299a75935cc (patch) | |
tree | b00fca412064a45d83bac1e95570a2058a506192 /cc/output/output_surface_unittest.cc | |
parent | a21d25b38343920a2ad1132f944f9ce53ae72ab9 (diff) | |
download | chromium_src-5b86251b266a60f8fe4fee2e942b8299a75935cc.zip chromium_src-5b86251b266a60f8fe4fee2e942b8299a75935cc.tar.gz chromium_src-5b86251b266a60f8fe4fee2e942b8299a75935cc.tar.bz2 |
Factor out cc::OutputSurface::InitializeAndSetContext3D
This is a protected method so that it can be called by subclasses to set
and initialize a new Context3D post construction time.
BUG=230197
Review URL: https://chromiumcodereview.appspot.com/15647021
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204976 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/output/output_surface_unittest.cc')
-rw-r--r-- | cc/output/output_surface_unittest.cc | 97 |
1 files changed, 95 insertions, 2 deletions
diff --git a/cc/output/output_surface_unittest.cc b/cc/output/output_surface_unittest.cc index 1d365d9..72bf0a4 100644 --- a/cc/output/output_surface_unittest.cc +++ b/cc/output/output_surface_unittest.cc @@ -4,7 +4,9 @@ #include "cc/output/output_surface.h" #include "cc/output/output_surface_client.h" +#include "cc/output/software_output_device.h" #include "cc/test/test_web_graphics_context_3d.h" +#include "gpu/GLES2/gl2extchromium.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { @@ -24,13 +26,25 @@ class TestOutputSurface : public OutputSurface { : OutputSurface(context3d.Pass(), software_device.Pass()) {} OutputSurfaceClient* client() { return client_; } + + bool InitializeNewContext3D( + scoped_ptr<WebKit::WebGraphicsContext3D> new_context3d) { + return InitializeAndSetContext3D(new_context3d.Pass(), + scoped_refptr<ContextProvider>()); + } }; class FakeOutputSurfaceClient : public OutputSurfaceClient { public: + FakeOutputSurfaceClient() + : deferred_initialize_result_(true), + deferred_initialize_called_(false), + did_lose_output_surface_called_(false) {} + virtual bool DeferredInitialize( scoped_refptr<ContextProvider> offscreen_context_provider) OVERRIDE { - return true; + deferred_initialize_called_ = true; + return deferred_initialize_result_; } virtual void SetNeedsRedrawRect(gfx::Rect damage_rect) OVERRIDE {} virtual void OnVSyncParametersChanged(base::TimeTicks timebase, @@ -39,9 +53,28 @@ class FakeOutputSurfaceClient : public OutputSurfaceClient { virtual void OnSendFrameToParentCompositorAck(const CompositorFrameAck& ack) OVERRIDE {} virtual void OnSwapBuffersComplete() OVERRIDE {} - virtual void DidLoseOutputSurface() OVERRIDE {} + virtual void DidLoseOutputSurface() OVERRIDE { + did_lose_output_surface_called_ = true; + } virtual void SetExternalDrawConstraints(const gfx::Transform& transform, gfx::Rect viewport) OVERRIDE {} + + void set_deferred_initialize_result(bool result) { + deferred_initialize_result_ = result; + } + + bool deferred_initialize_called() { + return deferred_initialize_called_; + } + + bool did_lose_output_surface_called() { + return did_lose_output_surface_called_; + } + + private: + bool deferred_initialize_result_; + bool deferred_initialize_called_; + bool did_lose_output_surface_called_; }; TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { @@ -55,6 +88,13 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) { FakeOutputSurfaceClient client; EXPECT_TRUE(output_surface.BindToClient(&client)); EXPECT_EQ(&client, output_surface.client()); + EXPECT_FALSE(client.deferred_initialize_called()); + + // Verify DidLoseOutputSurface callback is hooked up correctly. + EXPECT_FALSE(client.did_lose_output_surface_called()); + output_surface.context3d()->loseContextCHROMIUM( + GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); + EXPECT_TRUE(client.did_lose_output_surface_called()); } TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { @@ -73,5 +113,58 @@ TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) { EXPECT_EQ(NULL, output_surface.client()); } +class InitializeNewContext3D : public ::testing::Test { + public: + InitializeNewContext3D() + : context3d_(TestWebGraphicsContext3D::Create()), + output_surface_( + scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice)) {} + + protected: + void BindOutputSurface() { + EXPECT_TRUE(output_surface_.BindToClient(&client_)); + EXPECT_EQ(&client_, output_surface_.client()); + } + + void InitializeNewContextExpectFail() { + EXPECT_FALSE(output_surface_.InitializeNewContext3D( + context3d_.PassAs<WebKit::WebGraphicsContext3D>())); + EXPECT_EQ(&client_, output_surface_.client()); + + EXPECT_FALSE(output_surface_.context3d()); + EXPECT_TRUE(output_surface_.software_device()); + } + + scoped_ptr<TestWebGraphicsContext3D> context3d_; + TestOutputSurface output_surface_; + FakeOutputSurfaceClient client_; +}; + +TEST_F(InitializeNewContext3D, Success) { + BindOutputSurface(); + EXPECT_FALSE(client_.deferred_initialize_called()); + + EXPECT_TRUE(output_surface_.InitializeNewContext3D( + context3d_.PassAs<WebKit::WebGraphicsContext3D>())); + EXPECT_TRUE(client_.deferred_initialize_called()); + + EXPECT_FALSE(client_.did_lose_output_surface_called()); + output_surface_.context3d()->loseContextCHROMIUM( + GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB); + EXPECT_TRUE(client_.did_lose_output_surface_called()); +} + +TEST_F(InitializeNewContext3D, Context3dMakeCurrentFails) { + BindOutputSurface(); + context3d_->set_times_make_current_succeeds(0); + InitializeNewContextExpectFail(); +} + +TEST_F(InitializeNewContext3D, ClientDeferredInitializeFails) { + BindOutputSurface(); + client_.set_deferred_initialize_result(false); + InitializeNewContextExpectFail(); +} + } // namespace } // namespace cc |