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

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

Issue 1339203002: Added global order numbers to in process command buffers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor changes Created 5 years, 3 months 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
« no previous file with comments | « gpu/command_buffer/service/sync_point_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/sync_point_manager.cc
diff --git a/gpu/command_buffer/service/sync_point_manager.cc b/gpu/command_buffer/service/sync_point_manager.cc
index 562fa8ca675c9ea61c4153e5190888caf8eb3fdf..039e494de8b1d4bd5ea3df100c89ec10cb508690 100644
--- a/gpu/command_buffer/service/sync_point_manager.cc
+++ b/gpu/command_buffer/service/sync_point_manager.cc
@@ -14,15 +14,87 @@ namespace gpu {
static const int kMaxSyncBase = INT_MAX;
+scoped_refptr<SyncPointClientState> SyncPointClientState::Create() {
+ return new SyncPointClientState;
+}
+
+uint32_t SyncPointClientState::GenerateUnprocessedOrderNumber(
+ SyncPointManager* sync_point_manager) {
+ const uint32_t order_num = sync_point_manager->GenerateOrderNumber();
+ base::subtle::Release_Store(&unprocessed_order_num_, order_num);
+ return order_num;
+}
+
+SyncPointClientState::SyncPointClientState()
+ : processed_order_num_(0),
+ unprocessed_order_num_(0),
+ current_order_num_(0) {
+}
+
+SyncPointClientState::~SyncPointClientState() {
+}
+
+SyncPointClient::~SyncPointClient() {
+ sync_point_manager_->DestroySyncPointClient(namespace_id_, client_id_);
+}
+
+SyncPointClient::SyncPointClient(SyncPointManager* sync_point_manager,
+ scoped_refptr<SyncPointClientState> state,
+ CommandBufferNamespace namespace_id,
+ uint64_t client_id)
+ : sync_point_manager_(sync_point_manager),
+ client_state_(state),
+ namespace_id_(namespace_id),
+ client_id_(client_id) {
+}
+
SyncPointManager::SyncPointManager(bool allow_threaded_wait)
: allow_threaded_wait_(allow_threaded_wait),
// To reduce the risk that a sync point created in a previous GPU process
// will be in flight in the next GPU process, randomize the starting sync
// point number. http://crbug.com/373452
next_sync_point_(base::RandInt(1, kMaxSyncBase)),
- retire_cond_var_(&lock_) {}
+ retire_cond_var_(&lock_) {
+ global_order_num_.GetNext();
+}
-SyncPointManager::~SyncPointManager() {}
+SyncPointManager::~SyncPointManager() {
+ for (const ClientMap& client_map : client_maps_) {
+ DCHECK(client_map.empty());
+ }
+}
+
+scoped_ptr<SyncPointClient> SyncPointManager::CreateSyncPointClient(
+ scoped_refptr<SyncPointClientState> client_state,
+ CommandBufferNamespace namespace_id, uint64_t client_id) {
+ DCHECK_GE(namespace_id, 0);
+ DCHECK_LT(static_cast<size_t>(namespace_id), arraysize(client_maps_));
+ base::AutoLock auto_lock(client_maps_lock_);
+
+ ClientMap& client_map = client_maps_[namespace_id];
+ std::pair<ClientMap::iterator, bool> result = client_map.insert(
+ std::make_pair(client_id, new SyncPointClient(this,
+ client_state,
+ namespace_id,
+ client_id)));
+ DCHECK(result.second);
+
+ return make_scoped_ptr(result.first->second);
+}
+
+scoped_refptr<SyncPointClientState> SyncPointManager::GetSyncPointClientState(
+ CommandBufferNamespace namespace_id, uint64_t client_id) {
+ DCHECK_GE(namespace_id, 0);
+ DCHECK_LT(static_cast<size_t>(namespace_id), arraysize(client_maps_));
+ base::AutoLock auto_lock(client_maps_lock_);
+
+ ClientMap& client_map = client_maps_[namespace_id];
+ ClientMap::iterator it = client_map.find(client_id);
+ if (it != client_map.end()) {
+ return it->second->client_state();
+ }
+ return nullptr;
+}
uint32 SyncPointManager::GenerateSyncPoint() {
base::AutoLock lock(lock_);
@@ -95,4 +167,20 @@ bool SyncPointManager::IsSyncPointRetiredLocked(uint32 sync_point) {
return sync_point_map_.find(sync_point) == sync_point_map_.end();
}
+uint32_t SyncPointManager::GenerateOrderNumber() {
+ return global_order_num_.GetNext();
+}
+
+void SyncPointManager::DestroySyncPointClient(
+ CommandBufferNamespace namespace_id, uint64_t client_id) {
+ DCHECK_GE(namespace_id, 0);
+ DCHECK_LT(static_cast<size_t>(namespace_id), arraysize(client_maps_));
+
+ base::AutoLock auto_lock(client_maps_lock_);
+ ClientMap& client_map = client_maps_[namespace_id];
+ ClientMap::iterator it = client_map.find(client_id);
+ DCHECK(it != client_map.end());
+ client_map.erase(it);
+}
+
} // namespace gpu
« no previous file with comments | « gpu/command_buffer/service/sync_point_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698