summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 04:45:19 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-23 04:45:19 +0000
commit0afb2c080f1b068080d435445740b44b0d827518 (patch)
tree1da0d16e82f6ae80dfe292dbf7ec08eea1169a71 /gpu
parent6d94e3fb391ebd706730848f7c2fc0cb9edd240c (diff)
downloadchromium_src-0afb2c080f1b068080d435445740b44b0d827518.zip
chromium_src-0afb2c080f1b068080d435445740b44b0d827518.tar.gz
chromium_src-0afb2c080f1b068080d435445740b44b0d827518.tar.bz2
Revert 265469 "Fix slow TextureManager::StopTracking()"
This broke mac and asan builders. See following for one: http://build.chromium.org/p/chromium.memory/builders/Linux%20ASan%20LSan%20Tests%20%281%29/builds/1584/steps/gpu_unittests/logs/AsyncPixelTransfers > 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 TBR=vmiura@chromium.org Review URL: https://codereview.chromium.org/247343003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265542 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_manager.cc15
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc14
-rw-r--r--gpu/command_buffer/service/texture_manager.cc17
-rw-r--r--gpu/command_buffer/service/texture_manager.h20
4 files changed, 13 insertions, 53 deletions
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager.cc b/gpu/command_buffer/service/async_pixel_transfer_manager.cc
index efc893a..3084dd6 100644
--- a/gpu/command_buffer/service/async_pixel_transfer_manager.cc
+++ b/gpu/command_buffer/service/async_pixel_transfer_manager.cc
@@ -17,12 +17,6 @@ AsyncPixelTransferManager::AsyncPixelTransferManager() {}
AsyncPixelTransferManager::~AsyncPixelTransferManager() {
if (manager_)
manager_->RemoveObserver(this);
-
- for (TextureToDelegateMap::iterator ref = delegate_map_.begin();
- ref != delegate_map_.end();
- ref++) {
- ref->first->RemoveObserver();
- }
}
void AsyncPixelTransferManager::Initialize(gles2::TextureManager* manager) {
@@ -38,7 +32,6 @@ AsyncPixelTransferManager::CreatePixelTransferDelegate(
AsyncPixelTransferDelegate* delegate =
CreatePixelTransferDelegateImpl(ref, define_params);
delegate_map_[ref] = make_linked_ptr(delegate);
- ref->AddObserver();
return delegate;
}
@@ -56,10 +49,8 @@ AsyncPixelTransferManager::GetPixelTransferDelegate(
void AsyncPixelTransferManager::ClearPixelTransferDelegateForTest(
gles2::TextureRef* ref) {
TextureToDelegateMap::iterator it = delegate_map_.find(ref);
- if (it != delegate_map_.end()) {
+ if (it != delegate_map_.end())
delegate_map_.erase(it);
- ref->RemoveObserver();
- }
}
bool AsyncPixelTransferManager::AsyncTransferIsInProgress(
@@ -78,10 +69,8 @@ void AsyncPixelTransferManager::OnTextureManagerDestroying(
void AsyncPixelTransferManager::OnTextureRefDestroying(
gles2::TextureRef* texture) {
TextureToDelegateMap::iterator it = delegate_map_.find(texture);
- if (it != delegate_map_.end()) {
+ if (it != delegate_map_.end())
delegate_map_.erase(it);
- texture->RemoveObserver();
- }
}
} // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index 9f2518a..8691dd1 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -8389,7 +8389,6 @@ 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>))
@@ -8409,7 +8408,6 @@ 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!
@@ -8443,10 +8441,8 @@ 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.
@@ -8502,13 +8498,11 @@ 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;
@@ -8587,11 +8581,6 @@ 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) {
@@ -8642,14 +8631,11 @@ 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);
}
}
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index c3a824c..8f7703b 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -66,8 +66,9 @@ TextureManager::DestructionObserver::DestructionObserver() {}
TextureManager::DestructionObserver::~DestructionObserver() {}
TextureManager::~TextureManager() {
- for (unsigned int i = 0; i < destruction_observers_.size(); i++)
- destruction_observers_[i]->OnTextureManagerDestroying(this);
+ FOR_EACH_OBSERVER(DestructionObserver,
+ destruction_observers_,
+ OnTextureManagerDestroying(this));
DCHECK(textures_.empty());
@@ -872,8 +873,7 @@ TextureRef::TextureRef(TextureManager* manager,
Texture* texture)
: manager_(manager),
texture_(texture),
- client_id_(client_id),
- num_observers_(0) {
+ client_id_(client_id) {
DCHECK(manager_);
DCHECK(texture_);
texture_->AddTextureRef(this);
@@ -1222,12 +1222,9 @@ void TextureManager::StartTracking(TextureRef* ref) {
}
void TextureManager::StopTracking(TextureRef* ref) {
- if (ref->num_observers()) {
- for (unsigned int i = 0; i < destruction_observers_.size(); i++) {
- destruction_observers_[i]->OnTextureRefDestroying(ref);
- }
- DCHECK_EQ(ref->num_observers(), 0);
- }
+ FOR_EACH_OBSERVER(DestructionObserver,
+ destruction_observers_,
+ OnTextureRefDestroying(ref));
Texture* texture = ref->texture();
diff --git a/gpu/command_buffer/service/texture_manager.h b/gpu/command_buffer/service/texture_manager.h
index 6b3a32e..8513264 100644
--- a/gpu/command_buffer/service/texture_manager.h
+++ b/gpu/command_buffer/service/texture_manager.h
@@ -13,6 +13,7 @@
#include "base/containers/hash_tables.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
+#include "base/observer_list.h"
#include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/command_buffer/service/memory_tracking.h"
@@ -403,15 +404,10 @@ class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
static scoped_refptr<TextureRef> Create(TextureManager* manager,
GLuint client_id,
GLuint service_id);
-
- void AddObserver() { num_observers_++; }
- void RemoveObserver() { num_observers_--; }
-
const Texture* texture() const { return texture_; }
Texture* texture() { return texture_; }
GLuint client_id() const { return client_id_; }
GLuint service_id() const { return texture_->service_id(); }
- GLint num_observers() const { return num_observers_; }
private:
friend class base::RefCounted<TextureRef>;
@@ -426,7 +422,6 @@ class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
TextureManager* manager_;
Texture* texture_;
GLuint client_id_;
- GLint num_observers_;
DISALLOW_COPY_AND_ASSIGN(TextureRef);
};
@@ -687,18 +682,11 @@ class GPU_EXPORT TextureManager {
std::string* signature) const;
void AddObserver(DestructionObserver* observer) {
- destruction_observers_.push_back(observer);
+ destruction_observers_.AddObserver(observer);
}
void RemoveObserver(DestructionObserver* observer) {
- for (unsigned int i = 0; i < destruction_observers_.size(); i++) {
- if (destruction_observers_[i] == observer) {
- std::swap(destruction_observers_[i], destruction_observers_.back());
- destruction_observers_.pop_back();
- return;
- }
- }
- NOTREACHED();
+ destruction_observers_.RemoveObserver(observer);
}
struct DoTextImage2DArguments {
@@ -808,7 +796,7 @@ class GPU_EXPORT TextureManager {
// The default textures for each target (texture name = 0)
scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures];
- std::vector<DestructionObserver*> destruction_observers_;
+ ObserverList<DestructionObserver> destruction_observers_;
DISALLOW_COPY_AND_ASSIGN(TextureManager);
};