summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
diff options
context:
space:
mode:
authorvmiura@chromium.org <vmiura@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 01:32:27 +0000
committervmiura@chromium.org <vmiura@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 01:32:27 +0000
commit6dfc4f973d0edca869cb49a89638f95c4b3029f6 (patch)
tree4d5e9d69e51ff808fe42fd93d84e53c5f48d1bcd /gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
parente02de1ea723925763710a73634e562b9a1e97e8d (diff)
downloadchromium_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.cc14
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);
}
}