PxTask.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved.
3  *
4  * NVIDIA CORPORATION and its licensors retain all intellectual property
5  * and proprietary rights in and to this software, related documentation
6  * and any modifications thereto. Any use, reproduction, disclosure or
7  * distribution of this software and related documentation without an express
8  * license agreement from NVIDIA CORPORATION is strictly prohibited.
9  */
10 
11 #ifndef PX_TASK_H
12 #define PX_TASK_H
13 
14 #include "foundation/Px.h"
15 #include "pxtask/PxTaskManager.h"
16 #include "foundation/PxAssert.h"
17 
18 #ifndef PX_DOXYGEN
19 namespace physx
20 {
21 #endif
22 
29 {
30 public:
31  PxBaseTask() : mEventID(0xFFFF), mProfileStat(0), mTm(0) {}
32  virtual ~PxBaseTask() {}
33 
40  virtual void run() = 0;
41 
49  virtual const char* getName() const = 0;
50 
52  virtual void addReference() = 0;
54  virtual void removeReference() = 0;
56  virtual PxI32 getReference() const = 0;
57 
65  virtual void release() = 0;
66 
74  PX_INLINE void runProfiled(PxU32 threadId=0)
75  {
76  mTm->emitStartEvent(*this, threadId);
77  run();
78  mTm->emitStopEvent(*this, threadId);
79  }
80 
89  PX_INLINE void setProfileStat( PxU16 stat )
90  {
91  mProfileStat = stat;
92  }
93 
100  PX_INLINE PxTaskManager* getTaskManager() const
101  {
102  return mTm;
103  }
104 
105 protected:
109 
110  friend class PxTaskMgr;
111 };
112 
113 
120 class PxTask : public PxBaseTask
121 {
122 public:
123  PxTask() : mTaskID(0) {}
124  virtual ~PxTask() {}
125 
127  virtual void release()
128  {
129  PX_ASSERT(mTm);
130 
131  // clear mTm before calling taskCompleted() for safety
132  PxTaskManager* save = mTm;
133  mTm = NULL;
134  save->taskCompleted( *this );
135  }
136 
138  // task is allowed to start.
139  PX_INLINE void finishBefore( PxTaskID taskID )
140  {
141  PX_ASSERT(mTm);
142  mTm->finishBefore( *this, taskID);
143  }
144 
146  // task has completed.
147  PX_INLINE void startAfter( PxTaskID taskID )
148  {
149  PX_ASSERT(mTm);
150  mTm->startAfter( *this, taskID );
151  }
152 
157  PX_INLINE void addReference()
158  {
159  PX_ASSERT(mTm);
160  mTm->addReference( mTaskID );
161  }
162 
167  PX_INLINE void removeReference()
168  {
169  PX_ASSERT(mTm);
170  mTm->decrReference( mTaskID );
171  }
172 
176  PX_INLINE PxI32 getReference() const
177  {
178  return mTm->getReference( mTaskID );
179  }
180 
184  PX_INLINE PxTaskID getTaskID() const
185  {
186  return mTaskID;
187  }
188 
194  virtual void submitted()
195  {
196  mStreamIndex = 0;
197  mPreSyncRequired = false;
198  mProfileStat = 0;
199  }
200 
204  PX_INLINE void requestSyncPoint()
205  {
206  mPreSyncRequired = true;
207  }
208 
209 
210 protected:
214 
215  friend class PxTaskMgr;
216  friend class PxGpuWorkerThread;
217 };
218 
219 
234 {
235 public:
237  : mCont( NULL )
238  , mRefCount( 0 )
239  {
240  }
241  virtual ~PxLightCpuTask()
242  {
243  mTm = NULL;
244  }
245 
255  PX_INLINE void setContinuation(PxTaskManager& tm, PxBaseTask* c)
256  {
257  PX_ASSERT( mRefCount == 0 );
258  mRefCount = 1;
259  mCont = c;
260  mTm = &tm;
261  if( mCont )
262  {
263  mCont->addReference();
264  }
265  }
266 
274  PX_INLINE void setContinuation( PxBaseTask* c )
275  {
276  PX_ASSERT( c );
277  PX_ASSERT( mRefCount == 0 );
278  mRefCount = 1;
279  mCont = c;
280  if( mCont )
281  {
282  mCont->addReference();
283  mTm = mCont->getTaskManager();
284  PX_ASSERT( mTm );
285  }
286  }
287 
291  PX_INLINE PxBaseTask* getContinuation() const
292  {
293  return mCont;
294  }
295 
300  PX_INLINE void removeReference()
301  {
302  mTm->decrReference(*this);
303  }
304 
306  PX_INLINE PxI32 getReference() const
307  {
308  return mRefCount;
309  }
310 
315  PX_INLINE void addReference()
316  {
317  mTm->addReference(*this);
318  }
319 
325  PX_INLINE void release()
326  {
327  if( mCont )
328  {
329  mCont->removeReference();
330  }
331  }
332 
333 protected:
334 
336  volatile PxI32 mRefCount;
337 
338  friend class PxTaskMgr;
339 };
340 
341 #ifndef PX_DOXYGEN
342 } // end physx namespace
343 #endif
344 
345 #endif


Copyright © 2008-2015 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com