diff options
author | vmiura@chromium.org <vmiura@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-23 01:32:27 +0000 |
---|---|---|
committer | vmiura@chromium.org <vmiura@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-23 01:32:27 +0000 |
commit | 6dfc4f973d0edca869cb49a89638f95c4b3029f6 (patch) | |
tree | 4d5e9d69e51ff808fe42fd93d84e53c5f48d1bcd /gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | |
parent | e02de1ea723925763710a73634e562b9a1e97e8d (diff) | |
download | chromium_src-6dfc4f973d0edca869cb49a89638f95c4b3029f6.zip chromium_src-6dfc4f973d0edca869cb49a89638f95c4b3029f6.tar.gz chromium_src-6dfc4f973d0edca869cb49a89638f95c4b3029f6.tar.bz2 |
Fix slow TextureManager::StopTracking()
Iterating an ObserverList which uses WeakPtr items seems very slow.
Changing to std::vector<> gives about a 15X speedup.
Further skipping the observer call backs for TextureRefs with no current observers should cut this close to 0.
BUG=365536
Review URL: https://codereview.chromium.org/246353002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265469 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index 8691dd1..9f2518a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -8389,6 +8389,7 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { // AsyncTexImage2D { // Create transfer state since it doesn't exist. + EXPECT_EQ(texture_ref->num_observers(), 0); EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) .WillOnce(Return( delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) @@ -8408,6 +8409,7 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { EXPECT_TRUE(texture->SafeToRenderFrom()); GLsizei width, height; EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(texture_ref->num_observers(), 1); } { // Async redefinitions are not allowed! @@ -8441,8 +8443,10 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { } // AsyncTexSubImage2D + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); decoder_->GetAsyncPixelTransferManager() ->ClearPixelTransferDelegateForTest(texture_ref); + EXPECT_EQ(texture_ref->num_observers(), 0); texture->SetImmutable(false); { // Create transfer state since it doesn't exist. @@ -8498,11 +8502,13 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { // Delete delegate on DeleteTexture. { + EXPECT_EQ(texture_ref->num_observers(), 1); EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); DoDeleteTexture(client_texture_id_, kServiceTextureId); EXPECT_FALSE( decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( texture_ref)); + EXPECT_EQ(texture_ref->num_observers(), 0); texture = NULL; texture_ref = NULL; delegate = NULL; @@ -8581,6 +8587,11 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { EXPECT_EQ(error::kNoError, ExecuteCmd(wait_all_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } + + // Remove PixelTransferManager before the decoder destroys. + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + decoder_->ResetAsyncPixelTransferManagerForTest(); + manager = NULL; } TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { @@ -8631,11 +8642,14 @@ TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { // Delete delegate on manager teardown. { + EXPECT_EQ(texture_ref->num_observers(), 1); EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); decoder_->ResetAsyncPixelTransferManagerForTest(); + manager = NULL; // Texture ref still valid. EXPECT_EQ(texture_ref, GetTexture(client_texture_id_)); + EXPECT_EQ(texture_ref->num_observers(), 0); } } |