Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Unified Diff: gpu/command_buffer/service/valuebuffer_manager.cc

Issue 816543004: Update from https://crrev.com/308996 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/valuebuffer_manager.cc
diff --git a/gpu/command_buffer/service/valuebuffer_manager.cc b/gpu/command_buffer/service/valuebuffer_manager.cc
index 21de3f88831c706d20e03fcd7289f3b135dc54a6..96a50aa0db288dfe26d41cb5afc482126110fc01 100644
--- a/gpu/command_buffer/service/valuebuffer_manager.cc
+++ b/gpu/command_buffer/service/valuebuffer_manager.cc
@@ -9,6 +9,46 @@
namespace gpu {
namespace gles2 {
+SubscriptionRefSet::Observer::~Observer() {
+}
+
+SubscriptionRefSet::SubscriptionRefSet() {
+}
+
+SubscriptionRefSet::~SubscriptionRefSet() {
+ // Make sure no valuebuffers are still holding references to targets
+ DCHECK(reference_set_.empty());
+}
+
+void SubscriptionRefSet::AddSubscription(unsigned int target) {
+ RefSet::iterator it = reference_set_.find(target);
+ if (it == reference_set_.end()) {
+ reference_set_.insert(std::make_pair(target, 1));
+ FOR_EACH_OBSERVER(Observer, observers_, OnAddSubscription(target));
+ } else {
+ ++it->second;
+ }
+}
+
+void SubscriptionRefSet::RemoveSubscription(unsigned int target) {
+ RefSet::iterator it = reference_set_.find(target);
+ DCHECK(it != reference_set_.end());
+ if (it->second == 1) {
+ reference_set_.erase(it);
+ FOR_EACH_OBSERVER(Observer, observers_, OnRemoveSubscription(target));
+ } else {
+ --it->second;
+ }
+}
+
+void SubscriptionRefSet::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void SubscriptionRefSet::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
Valuebuffer::Valuebuffer(ValuebufferManager* manager, unsigned int client_id)
: manager_(manager), client_id_(client_id), has_been_bound_(false) {
manager_->StartTracking(this);
@@ -17,17 +57,28 @@ Valuebuffer::Valuebuffer(ValuebufferManager* manager, unsigned int client_id)
Valuebuffer::~Valuebuffer() {
if (manager_) {
+ for (SubscriptionSet::const_iterator it = subscriptions_.begin();
+ it != subscriptions_.end(); ++it) {
+ manager_->NotifyRemoveSubscription(*it);
+ }
manager_->StopTracking(this);
manager_ = NULL;
}
}
void Valuebuffer::AddSubscription(unsigned int subscription) {
- subscriptions_.insert(subscription);
+ if (subscriptions_.find(subscription) == subscriptions_.end()) {
+ subscriptions_.insert(subscription);
+ manager_->NotifyAddSubscription(subscription);
+ }
}
void Valuebuffer::RemoveSubscription(unsigned int subscription) {
- subscriptions_.erase(subscription);
+ SubscriptionSet::iterator it = subscriptions_.find(subscription);
+ if (subscriptions_.find(subscription) != subscriptions_.end()) {
+ subscriptions_.erase(it);
+ manager_->NotifyRemoveSubscription(subscription);
+ }
}
bool Valuebuffer::IsSubscribed(unsigned int subscription) {
@@ -49,9 +100,11 @@ void Valuebuffer::UpdateState(const ValueStateMap* pending_state) {
}
}
-ValuebufferManager::ValuebufferManager(ValueStateMap* state_map)
+ValuebufferManager::ValuebufferManager(SubscriptionRefSet* ref_set,
+ ValueStateMap* state_map)
: valuebuffer_count_(0),
- pending_state_map_(state_map) {
+ pending_state_map_(state_map),
+ subscription_ref_set_(ref_set) {
}
ValuebufferManager::~ValuebufferManager() {
@@ -73,6 +126,13 @@ void ValuebufferManager::StopTracking(Valuebuffer* /* valuebuffer */) {
--valuebuffer_count_;
}
+void ValuebufferManager::NotifyAddSubscription(unsigned int target) {
+ subscription_ref_set_->AddSubscription(target);
+}
+void ValuebufferManager::NotifyRemoveSubscription(unsigned int target) {
+ subscription_ref_set_->RemoveSubscription(target);
+}
+
void ValuebufferManager::CreateValuebuffer(unsigned int client_id) {
scoped_refptr<Valuebuffer> valuebuffer(new Valuebuffer(this, client_id));
std::pair<ValuebufferMap::iterator, bool> result =
« no previous file with comments | « gpu/command_buffer/service/valuebuffer_manager.h ('k') | gpu/command_buffer/service/valuebuffer_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698