15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_checker.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages the sync points, which allow cross-channel
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synchronization.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncPointManager : public base::RefCountedThreadSafe<SyncPointManager> {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncPointManager();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates a sync point, returning its ID. This can me called on any thread.
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // IDs start at a random number. Never return 0.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 GenerateSyncPoint();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retires a sync point. This will call all the registered callbacks for this
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sync point. This can only be called on the main thread.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RetireSyncPoint(uint32 sync_point);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a callback to the sync point. The callback will be called when the
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sync point is retired, or immediately (from within that function) if the
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sync point was already retired (or not created yet). This can only be
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called on the main thread.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsSyncPointRetired(uint32 sync_point);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<SyncPointManager>;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<base::Closure> ClosureList;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<uint32, ClosureList > SyncPointMap;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SyncPointManager();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadChecker thread_checker_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protects the 2 fields below. Note: callbacks shouldn't be called with this
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // held.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock lock_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncPointMap sync_point_map_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 next_sync_point_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncPointManager);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_
61