aboutsummaryrefslogtreecommitdiff
path: root/sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h')
-rwxr-xr-x[-rw-r--r--]sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h418
1 files changed, 209 insertions, 209 deletions
diff --git a/sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h b/sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h
index 0fd9779..6388584 100644..100755
--- a/sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h
+++ b/sdk/extensions/physx/source/physics/NvBlastExtPxTaskImpl.h
@@ -1,209 +1,209 @@
-// This code contains NVIDIA Confidential Information and is disclosed to you
-// under a form of NVIDIA software license agreement provided separately to you.
-//
-// Notice
-// NVIDIA Corporation and its licensors retain all intellectual property and
-// proprietary rights in and to this software and related documentation and
-// any modifications thereto. Any use, reproduction, disclosure, or
-// distribution of this software and related documentation without an express
-// license agreement from NVIDIA Corporation is strictly prohibited.
-//
-// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
-// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
-// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
-// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
-//
-// Information and code furnished is believed to be accurate and reliable.
-// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
-// information or for any infringement of patents or other rights of third parties that may
-// result from its use. No license is granted by implication or otherwise under any patent
-// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
-// This code supersedes and replaces all information previously supplied.
-// NVIDIA Corporation products are not authorized for use as critical
-// components in life support devices or systems without express written approval of
-// NVIDIA Corporation.
-//
-// Copyright (c) 2016-2018 NVIDIA Corporation. All rights reserved.
-
-
-#ifndef NVBLASTEXTPXTASKIMPL_H
-#define NVBLASTEXTPXTASKIMPL_H
-
-#include "NvBlastExtPxTask.h"
-#include "PxTask.h"
-#include "NvBlastTkGroup.h"
-
-#include <atomic>
-#include <mutex>
-#include <condition_variable>
-
-namespace Nv
-{
-namespace Blast
-{
-
-/**
-Counting synchronization object for waiting on TkWorkers to finish.
-*/
-class ExtTaskSync
-{
-public:
- /**
- Initializes with an expected number of notifications.
- */
- ExtTaskSync(uint32_t count) : m_count(count) {}
-
- /**
- Blocks until the expected number of notifications happened.
- */
- void wait()
- {
- std::unique_lock<std::mutex> lk(m_mutex);
- m_cv.wait(lk, [&] { return m_count == 0; });
- }
-
- /**
- Decrement the wait() count by one.
- */
- void notify()
- {
- //PERF_SCOPE_H("TaskSync::notify");
- std::unique_lock<std::mutex> lk(m_mutex);
- if (m_count > 0)
- {
- m_count--;
- }
- if (m_count == 0)
- {
- lk.unlock();
- m_cv.notify_one();
- }
- }
-
- /**
- Peek if notifications are pending.
- */
- bool isDone()
- {
- std::unique_lock<std::mutex> lk(m_mutex);
- return m_count == 0;
- }
-
- /**
- Sets the expected number of notifications for wait() to unblock.
- */
- void setCount(uint32_t count)
- {
- m_count = count;
- }
-
-private:
- std::mutex m_mutex;
- std::condition_variable m_cv;
- uint32_t m_count;
-};
-
-
-/**
-Common job counter for all tasks.
-*/
-class ExtAtomicCounter
-{
-public:
- ExtAtomicCounter() : m_current(0), m_maxCount(0) {}
-
- bool isValid(uint32_t val)
- {
- return val < m_maxCount;
- }
-
- uint32_t next()
- {
- return m_current.fetch_add(1);
- }
-
- void reset(uint32_t maxCount)
- {
- m_maxCount = maxCount;
- m_current = 0;
- }
-private:
- std::atomic<uint32_t> m_current;
- uint32_t m_maxCount;
-};
-
-
-/**
-A task running one group job after the other until done. Synchronizes atomically with its siblings.
-*/
-class ExtGroupWorkerTask : public physx::PxLightCpuTask
-{
-public:
- ExtGroupWorkerTask() : PxLightCpuTask(), m_group(nullptr), m_counter(nullptr), m_sync(nullptr)
- {
- }
-
- void setup(TkGroup* group, ExtAtomicCounter* counter, ExtTaskSync* sync)
- {
- m_group = group;
- m_counter = counter;
- m_sync = sync;
- }
-
- virtual void run() override
- {
- Nv::Blast::TkGroupWorker* worker = m_group->acquireWorker();
- uint32_t jobID = m_counter->next();
- while (m_counter->isValid(jobID))
- {
- worker->process(jobID);
- jobID = m_counter->next();
- }
- m_group->returnWorker(worker);
- }
-
- virtual void release() override
- {
- PxLightCpuTask::release();
-
- // release the sync last
- m_sync->notify();
- }
-
- virtual const char* getName() const override { return "BlastGroupWorkerTask"; }
-
-private:
- TkGroup* m_group;
- ExtAtomicCounter* m_counter;
- ExtTaskSync* m_sync;
-};
-
-
-/**
-Implements ExtGroupTaskManager
-*/
-class ExtGroupTaskManagerImpl : public ExtGroupTaskManager
-{
-public:
- ExtGroupTaskManagerImpl(physx::PxTaskManager& taskManager, TkGroup* group)
- : m_taskManager(taskManager), m_sync(0), m_group(group) {}
-
- // ExtGroupTaskManager API
- virtual void setGroup(TkGroup*) override;
- virtual uint32_t process(uint32_t) override;
- virtual void release() override;
- virtual bool wait(bool block) override;
-
-private:
- static const uint32_t TASKS_MAX_COUNT = 16;
- physx::PxTaskManager& m_taskManager;
- ExtAtomicCounter m_counter;
- ExtGroupWorkerTask m_tasks[TASKS_MAX_COUNT];
- ExtTaskSync m_sync;
- TkGroup* m_group;
-};
-
-} // namespace Blast
-} // namespace Nv
-
-#endif // NVBLASTEXTPXTASKIMPL_H
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2016-2018 NVIDIA Corporation. All rights reserved.
+
+
+#ifndef NVBLASTEXTPXTASKIMPL_H
+#define NVBLASTEXTPXTASKIMPL_H
+
+#include "NvBlastExtPxTask.h"
+#include "PxTask.h"
+#include "NvBlastTkGroup.h"
+
+#include <atomic>
+#include <mutex>
+#include <condition_variable>
+
+namespace Nv
+{
+namespace Blast
+{
+
+/**
+Counting synchronization object for waiting on TkWorkers to finish.
+*/
+class ExtTaskSync
+{
+public:
+ /**
+ Initializes with an expected number of notifications.
+ */
+ ExtTaskSync(uint32_t count) : m_count(count) {}
+
+ /**
+ Blocks until the expected number of notifications happened.
+ */
+ void wait()
+ {
+ std::unique_lock<std::mutex> lk(m_mutex);
+ m_cv.wait(lk, [&] { return m_count == 0; });
+ }
+
+ /**
+ Decrement the wait() count by one.
+ */
+ void notify()
+ {
+ //PERF_SCOPE_H("TaskSync::notify");
+ std::unique_lock<std::mutex> lk(m_mutex);
+ if (m_count > 0)
+ {
+ m_count--;
+ }
+ if (m_count == 0)
+ {
+ lk.unlock();
+ m_cv.notify_one();
+ }
+ }
+
+ /**
+ Peek if notifications are pending.
+ */
+ bool isDone()
+ {
+ std::unique_lock<std::mutex> lk(m_mutex);
+ return m_count == 0;
+ }
+
+ /**
+ Sets the expected number of notifications for wait() to unblock.
+ */
+ void setCount(uint32_t count)
+ {
+ m_count = count;
+ }
+
+private:
+ std::mutex m_mutex;
+ std::condition_variable m_cv;
+ uint32_t m_count;
+};
+
+
+/**
+Common job counter for all tasks.
+*/
+class ExtAtomicCounter
+{
+public:
+ ExtAtomicCounter() : m_current(0), m_maxCount(0) {}
+
+ bool isValid(uint32_t val)
+ {
+ return val < m_maxCount;
+ }
+
+ uint32_t next()
+ {
+ return m_current.fetch_add(1);
+ }
+
+ void reset(uint32_t maxCount)
+ {
+ m_maxCount = maxCount;
+ m_current = 0;
+ }
+private:
+ std::atomic<uint32_t> m_current;
+ uint32_t m_maxCount;
+};
+
+
+/**
+A task running one group job after the other until done. Synchronizes atomically with its siblings.
+*/
+class ExtGroupWorkerTask : public physx::PxLightCpuTask
+{
+public:
+ ExtGroupWorkerTask() : PxLightCpuTask(), m_group(nullptr), m_counter(nullptr), m_sync(nullptr)
+ {
+ }
+
+ void setup(TkGroup* group, ExtAtomicCounter* counter, ExtTaskSync* sync)
+ {
+ m_group = group;
+ m_counter = counter;
+ m_sync = sync;
+ }
+
+ virtual void run() override
+ {
+ Nv::Blast::TkGroupWorker* worker = m_group->acquireWorker();
+ uint32_t jobID = m_counter->next();
+ while (m_counter->isValid(jobID))
+ {
+ worker->process(jobID);
+ jobID = m_counter->next();
+ }
+ m_group->returnWorker(worker);
+ }
+
+ virtual void release() override
+ {
+ PxLightCpuTask::release();
+
+ // release the sync last
+ m_sync->notify();
+ }
+
+ virtual const char* getName() const override { return "BlastGroupWorkerTask"; }
+
+private:
+ TkGroup* m_group;
+ ExtAtomicCounter* m_counter;
+ ExtTaskSync* m_sync;
+};
+
+
+/**
+Implements ExtGroupTaskManager
+*/
+class ExtGroupTaskManagerImpl : public ExtGroupTaskManager
+{
+public:
+ ExtGroupTaskManagerImpl(physx::PxTaskManager& taskManager, TkGroup* group)
+ : m_taskManager(taskManager), m_sync(0), m_group(group) {}
+
+ // ExtGroupTaskManager API
+ virtual void setGroup(TkGroup*) override;
+ virtual uint32_t process(uint32_t) override;
+ virtual void release() override;
+ virtual bool wait(bool block) override;
+
+private:
+ static const uint32_t TASKS_MAX_COUNT = 16;
+ physx::PxTaskManager& m_taskManager;
+ ExtAtomicCounter m_counter;
+ ExtGroupWorkerTask m_tasks[TASKS_MAX_COUNT];
+ ExtTaskSync m_sync;
+ TkGroup* m_group;
+};
+
+} // namespace Blast
+} // namespace Nv
+
+#endif // NVBLASTEXTPXTASKIMPL_H