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

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

Issue 2752393002: gpu: Add SequenceId for identifying sync point sequences. (Closed)
Patch Set: piman's review 3 Created 3 years, 9 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/sequence_id.h ('k') | gpu/command_buffer/service/sync_point_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/sync_point_manager.h
diff --git a/gpu/command_buffer/service/sync_point_manager.h b/gpu/command_buffer/service/sync_point_manager.h
index a34a17cede443e758d5f453b91f012c4147c11b9..ad5587d5f2b564cae35a916705a646070e4bc342 100644
--- a/gpu/command_buffer/service/sync_point_manager.h
+++ b/gpu/command_buffer/service/sync_point_manager.h
@@ -24,6 +24,7 @@
#include "gpu/command_buffer/common/command_buffer_id.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/common/sync_token.h"
+#include "gpu/command_buffer/service/sequence_id.h"
#include "gpu/gpu_export.h"
namespace base {
@@ -39,13 +40,9 @@ class SyncPointManager;
class GPU_EXPORT SyncPointOrderData
: public base::RefCountedThreadSafe<SyncPointOrderData> {
public:
- static scoped_refptr<SyncPointOrderData> Create();
void Destroy();
- uint32_t GenerateUnprocessedOrderNumber(SyncPointManager* sync_point_manager);
- void BeginProcessingOrderNumber(uint32_t order_num);
- void PauseProcessingOrderNumber(uint32_t order_num);
- void FinishProcessingOrderNumber(uint32_t order_num);
+ SequenceId sequence_id() { return sequence_id_; }
uint32_t processed_order_num() const {
base::AutoLock auto_lock(lock_);
@@ -67,14 +64,15 @@ class GPU_EXPORT SyncPointOrderData
return !paused_ && current_order_num_ > processed_order_num();
}
- bool ValidateReleaseOrderNumber(
- scoped_refptr<SyncPointClientState> client_state,
- uint32_t wait_order_num,
- uint64_t fence_release,
- const base::Closure& release_callback);
+ uint32_t GenerateUnprocessedOrderNumber();
+ void BeginProcessingOrderNumber(uint32_t order_num);
+ void PauseProcessingOrderNumber(uint32_t order_num);
+ void FinishProcessingOrderNumber(uint32_t order_num);
private:
friend class base::RefCountedThreadSafe<SyncPointOrderData>;
+ friend class SyncPointManager;
+ friend class SyncPointClientState;
struct OrderFence {
uint32_t order_num;
@@ -99,9 +97,21 @@ class GPU_EXPORT SyncPointOrderData
std::greater<OrderFence>>
OrderFenceQueue;
- SyncPointOrderData();
+ SyncPointOrderData(SyncPointManager* sync_point_manager,
+ SequenceId seqeunce_id);
+
~SyncPointOrderData();
+ bool ValidateReleaseOrderNumber(
+ scoped_refptr<SyncPointClientState> client_state,
+ uint32_t wait_order_num,
+ uint64_t fence_release,
+ const base::Closure& release_callback);
+
+ SyncPointManager* const sync_point_manager_;
+
+ const SequenceId sequence_id_;
+
// Non thread-safe functions need to be called from a single thread.
base::ThreadChecker processing_thread_checker_;
@@ -137,30 +147,35 @@ class GPU_EXPORT SyncPointOrderData
DISALLOW_COPY_AND_ASSIGN(SyncPointOrderData);
};
-// Internal state for sync point clients.
class GPU_EXPORT SyncPointClientState
: public base::RefCountedThreadSafe<SyncPointClientState> {
public:
- explicit SyncPointClientState(scoped_refptr<SyncPointOrderData> order_data);
+ void Destroy();
- bool IsFenceSyncReleased(uint64_t release);
+ CommandBufferNamespace namespace_id() const { return namespace_id_; }
+ CommandBufferId command_buffer_id() const { return command_buffer_id_; }
+ SequenceId sequence_id() const { return order_data_->sequence_id(); }
- // Queues the callback to be called if the release is valid. If the release
- // is invalid this function will return False and the callback will never
- // be called.
- bool WaitForRelease(uint64_t release,
- uint32_t wait_order_num,
- const base::Closure& callback);
+ // This behaves similarly to SyncPointManager::Wait but uses the order data
+ // to guarantee no deadlocks with other clients. Must be called on order
+ // number processing thread.
+ bool Wait(const SyncToken& sync_token, const base::Closure& callback);
- // Releases a fence sync and all fence syncs below.
- void ReleaseFenceSync(uint64_t release);
+ // Like Wait but runs the callback on the given task runner's thread. Must be
+ // called on order number processing thread.
+ bool WaitNonThreadSafe(
+ const SyncToken& sync_token,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner,
+ const base::Closure& callback);
- // Does not release the fence sync, but releases callbacks waiting on that
- // fence sync.
- void EnsureWaitReleased(uint64_t release, const base::Closure& callback);
+ // Release fence sync and run queued callbacks. Must be called on order number
+ // processing thread.
+ void ReleaseFenceSync(uint64_t release);
private:
friend class base::RefCountedThreadSafe<SyncPointClientState>;
+ friend class SyncPointManager;
+ friend class SyncPointOrderData;
struct ReleaseCallback {
uint64_t release_count;
@@ -179,11 +194,39 @@ class GPU_EXPORT SyncPointClientState
std::greater<ReleaseCallback>>
ReleaseCallbackQueue;
+ SyncPointClientState(SyncPointManager* sync_point_manager,
+ scoped_refptr<SyncPointOrderData> order_data,
+ CommandBufferNamespace namespace_id,
+ CommandBufferId command_buffer_id);
+
~SyncPointClientState();
+ // Returns true if fence sync has been released.
+ bool IsFenceSyncReleased(uint64_t release);
+
+ // Queues the callback to be called if the release is valid. If the release
+ // is invalid this function will return False and the callback will never
+ // be called.
+ bool WaitForRelease(uint64_t release,
+ uint32_t wait_order_num,
+ const base::Closure& callback);
+
+ // Does not release the fence sync, but releases callbacks waiting on that
+ // fence sync.
+ void EnsureWaitReleased(uint64_t release, const base::Closure& callback);
+
+ void ReleaseFenceSyncHelper(uint64_t release);
+
+ // Sync point manager is guaranteed to exist in the lifetime of the client.
+ SyncPointManager* sync_point_manager_ = nullptr;
+
// Global order data where releases will originate from.
scoped_refptr<SyncPointOrderData> order_data_;
+ // Unique namespace/client id pair for this sync point client.
+ const CommandBufferNamespace namespace_id_;
+ const CommandBufferId command_buffer_id_;
+
// Protects fence_sync_release_, fence_callback_queue_.
base::Lock fence_sync_lock_;
@@ -197,42 +240,6 @@ class GPU_EXPORT SyncPointClientState
DISALLOW_COPY_AND_ASSIGN(SyncPointClientState);
};
-class GPU_EXPORT SyncPointClient {
- public:
- SyncPointClient(SyncPointManager* sync_point_manager,
- scoped_refptr<SyncPointOrderData> order_data,
- CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id);
- ~SyncPointClient();
-
- // This behaves similarly to SyncPointManager::Wait but uses the order data
- // to guarantee no deadlocks with other clients.
- bool Wait(const SyncToken& sync_token, const base::Closure& callback);
-
- // Like Wait but runs the callback on the given task runner's thread.
- bool WaitNonThreadSafe(
- const SyncToken& sync_token,
- scoped_refptr<base::SingleThreadTaskRunner> task_runner,
- const base::Closure& callback);
-
- // Release fence sync and run queued callbacks.
- void ReleaseFenceSync(uint64_t release);
-
- private:
- // Sync point manager is guaranteed to exist in the lifetime of the client.
- SyncPointManager* const sync_point_manager_;
-
- scoped_refptr<SyncPointOrderData> order_data_;
-
- scoped_refptr<SyncPointClientState> client_state_;
-
- // Unique namespace/client id pair for this sync point client.
- const CommandBufferNamespace namespace_id_;
- const CommandBufferId command_buffer_id_;
-
- DISALLOW_COPY_AND_ASSIGN(SyncPointClient);
-};
-
// This class manages the sync points, which allow cross-channel
// synchronization.
class GPU_EXPORT SyncPointManager {
@@ -240,10 +247,26 @@ class GPU_EXPORT SyncPointManager {
SyncPointManager();
~SyncPointManager();
- // Returns true if the sync token has been released or if the command buffer
- // does not exist.
+ scoped_refptr<SyncPointOrderData> CreateSyncPointOrderData();
+
+ scoped_refptr<SyncPointClientState> CreateSyncPointClientState(
+ CommandBufferNamespace namespace_id,
+ CommandBufferId command_buffer_id,
+ SequenceId sequence_id);
+
+ // Returns true if the sync token has been released or if the command
+ // buffer does not exist.
bool IsSyncTokenReleased(const SyncToken& sync_token);
+ // Returns the sequence ID that will release this sync token.
+ SequenceId GetSyncTokenReleaseSequenceId(const SyncToken& sync_token);
+
+ // Returns the global last processed order number.
+ uint32_t GetProcessedOrderNum() const;
+
+ // // Returns the global last unprocessed order number.
+ uint32_t GetUnprocessedOrderNum() const;
+
// If the wait is valid (sync token hasn't been processed or command buffer
// does not exist), the callback is queued to run when the sync point is
// released. If the wait is invalid, the callback is NOT run. The callback
@@ -272,33 +295,44 @@ class GPU_EXPORT SyncPointManager {
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
const base::Closure& callback);
- // Used by SyncPointClient.
- void RegisterSyncPointClient(scoped_refptr<SyncPointClientState> client_state,
- CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id);
-
- void DeregisterSyncPointClient(CommandBufferNamespace namespace_id,
- CommandBufferId command_buffer_id);
-
// Used by SyncPointOrderData.
uint32_t GenerateOrderNumber();
+ void DestroyedSyncPointOrderData(SequenceId sequence_id);
+
+ void DestroyedSyncPointClientState(CommandBufferNamespace namespace_id,
+ CommandBufferId command_buffer_id);
+
private:
using ClientStateMap = std::unordered_map<CommandBufferId,
scoped_refptr<SyncPointClientState>,
CommandBufferId::Hasher>;
+ using OrderDataMap = std::unordered_map<SequenceId,
+ scoped_refptr<SyncPointOrderData>,
+ SequenceId::Hasher>;
+
+ scoped_refptr<SyncPointOrderData> GetSyncPointOrderData(
+ SequenceId sequence_id);
+
scoped_refptr<SyncPointClientState> GetSyncPointClientState(
CommandBufferNamespace namespace_id,
CommandBufferId command_buffer_id);
// Order number is global for all clients.
- base::AtomicSequenceNumber global_order_num_;
+ base::AtomicSequenceNumber order_num_generator_;
- // Client map holds a map of clients id to client for each namespace.
- base::Lock client_state_maps_lock_;
+ // The following are protected by |lock_|.
+ // Map of command buffer id to client state for each namespace.
ClientStateMap client_state_maps_[NUM_COMMAND_BUFFER_NAMESPACES];
+ // Map of sequence id to order data.
+ OrderDataMap order_data_map_;
+
+ uint32_t next_sequence_id_ = 1;
+
+ mutable base::Lock lock_;
+
DISALLOW_COPY_AND_ASSIGN(SyncPointManager);
};
« no previous file with comments | « gpu/command_buffer/service/sequence_id.h ('k') | gpu/command_buffer/service/sync_point_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698