diff options
| author | Sheikh Dawood <[email protected]> | 2018-04-09 10:13:48 -0500 |
|---|---|---|
| committer | Sheikh Dawood <[email protected]> | 2018-04-09 10:13:48 -0500 |
| commit | 238605d8225a9135d6b60646e05d066e25424eee (patch) | |
| tree | 2b013bd4946bb3c699d7a06ef1f21be85d367f63 /PhysX_3.4/Source/PhysX | |
| parent | Add ParamTool.exe (diff) | |
| download | physx-3.4-238605d8225a9135d6b60646e05d066e25424eee.tar.xz physx-3.4-238605d8225a9135d6b60646e05d066e25424eee.zip | |
PhysX 3.4, APEX 1.4 patch release @23879214
Diffstat (limited to 'PhysX_3.4/Source/PhysX')
| -rw-r--r-- | PhysX_3.4/Source/PhysX/src/NpScene.cpp | 129 | ||||
| -rw-r--r-- | PhysX_3.4/Source/PhysX/src/NpScene.h | 10 | ||||
| -rw-r--r-- | PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp | 14 | ||||
| -rw-r--r-- | PhysX_3.4/Source/PhysX/src/NpSceneQueries.h | 11 |
4 files changed, 162 insertions, 2 deletions
diff --git a/PhysX_3.4/Source/PhysX/src/NpScene.cpp b/PhysX_3.4/Source/PhysX/src/NpScene.cpp index 52b89e21..4ba6334a 100644 --- a/PhysX_3.4/Source/PhysX/src/NpScene.cpp +++ b/PhysX_3.4/Source/PhysX/src/NpScene.cpp @@ -99,12 +99,17 @@ NpSceneQueries::NpSceneQueries(const PxSceneDesc& desc) : mSQManager (mScene, desc.staticStructure, desc.dynamicStructure, desc.dynamicTreeRebuildRateHint, desc.limits), mCachedRaycastFuncs (Gu::getRaycastFuncTable()), mCachedSweepFuncs (Gu::getSweepFuncTable()), - mCachedOverlapFuncs (Gu::getOverlapFuncTable()) + mCachedOverlapFuncs (Gu::getOverlapFuncTable()), + mSceneQueriesStaticPrunerUpdate (getContextId(), 0, "NpSceneQueries.sceneQueriesStaticPrunerUpdate"), + mSceneQueriesDynamicPrunerUpdate(getContextId(), 0, "NpSceneQueries.sceneQueriesDynamicPrunerUpdate"), + mSceneQueryUpdateMode (desc.sceneQueryUpdateMode) #if PX_SUPPORT_PVD , mSingleSqCollector (mScene, false), mBatchedSqCollector (mScene, true) #endif { + mSceneQueriesStaticPrunerUpdate.setObject(this); + mSceneQueriesDynamicPrunerUpdate.setObject(this); } NpScene::NpScene(const PxSceneDesc& desc) : @@ -124,6 +129,7 @@ NpScene::NpScene(const PxSceneDesc& desc) : mClientBehaviorFlags (PX_DEBUG_EXP("sceneBehaviorFlags")), mSceneCompletion (getContextId(), mPhysicsDone), mCollisionCompletion (getContextId(), mCollisionDone), + mSceneQueriesCompletion (getContextId(), mSceneQueriesDone), mSceneExecution (getContextId(), 0, "NpScene.execution"), mSceneCollide (getContextId(), 0, "NpScene.collide"), mSceneAdvance (getContextId(), 0, "NpScene.solve"), @@ -133,6 +139,7 @@ NpScene::NpScene(const PxSceneDesc& desc) : mConcurrentReadCount (0), mConcurrentErrorCount (0), mCurrentWriter (0), + mSceneQueriesUpdateRunning (false), mHasSimulatedOnce (false), mBetweenFetchResults (false) { @@ -2246,7 +2253,11 @@ void NpScene::fetchResultsPostContactCallbacks() SqRefFinder sqRefFinder; mScene.getScScene().syncSceneQueryBounds(mSQManager.getDynamicBoundsSync(), sqRefFinder); - mSQManager.afterSync(!(getFlagsFast()&PxSceneFlag::eSUPPRESS_EAGER_SCENE_QUERY_REFIT)); + // A.B. temp check if eSUPPRESS_EAGER_SCENE_QUERY_REFIT was set and update mode not, then replicate the flag to the enum + PxSceneQueryUpdateMode::Enum updateMode = getSceneQueryUpdateModeFast(); + if((getFlagsFast() & PxSceneFlag::eSUPPRESS_EAGER_SCENE_QUERY_REFIT) && updateMode == PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED) + updateMode = PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_DISABLED; + mSQManager.afterSync(updateMode); #if PX_DEBUG && 0 mSQManager.validateSimUpdates(); @@ -2683,6 +2694,18 @@ void NpScene::releaseVolumeCache(NpVolumeCache* volumeCache) PX_DELETE(static_cast<NpVolumeCache*>(volumeCache)); } +void NpScene::setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode) +{ + NP_WRITE_CHECK(this); + mSceneQueryUpdateMode = updateMode; +} + +PxSceneQueryUpdateMode::Enum NpScene::getSceneQueryUpdateMode() const +{ + NP_READ_CHECK(this); + return mSceneQueryUpdateMode; +} + void NpScene::setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint) { PX_CHECK_AND_RETURN((dynamicTreeRebuildRateHint >= 4), "PxScene::setDynamicTreeRebuildRateHint(): Param has to be >= 4!"); @@ -3174,6 +3197,108 @@ PxPvdSceneClient* NpScene::getScenePvdClient() } #endif +void NpScene::sceneQueriesUpdate(physx::PxBaseTask* completionTask, bool controlSimulation) +{ + PX_SIMD_GUARD; + + bool runUpdateTasks[PruningIndex::eCOUNT] = {true, true}; + { + // write guard must end before scene queries tasks kicks off worker threads + NP_WRITE_CHECK(this); + + PX_PROFILE_START_CROSSTHREAD("Basic.sceneQueriesUpdate", getContextId()); + + if(mSceneQueriesUpdateRunning) + { + //fetchSceneQueries doesn't get called + Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, "PxScene::fetchSceneQueries was not called!"); + return; + } + + // flush scene queries updates + mSQManager.flushUpdates(); + + // prepare scene queries for build - copy bounds + runUpdateTasks[PruningIndex::eSTATIC] = mSQManager.prepareSceneQueriesUpdate(PruningIndex::eSTATIC); + runUpdateTasks[PruningIndex::eDYNAMIC] = mSQManager.prepareSceneQueriesUpdate(PruningIndex::eDYNAMIC); + + mSceneQueriesUpdateRunning = true; + } + + { + PX_PROFILE_ZONE("Sim.sceneQueriesTaskSetup", getContextId()); + + if (controlSimulation) + { + { + PX_PROFILE_ZONE("Sim.resetDependencies", getContextId()); + // Only reset dependencies, etc if we own the TaskManager. Will be false + // when an NpScene is controlled by an APEX scene. + mTaskManager->resetDependencies(); + } + mTaskManager->startSimulation(); + } + + mSceneQueriesCompletion.setContinuation(*mTaskManager, completionTask); + if(runUpdateTasks[PruningIndex::eSTATIC]) + mSceneQueriesStaticPrunerUpdate.setContinuation(&mSceneQueriesCompletion); + if(runUpdateTasks[PruningIndex::eDYNAMIC]) + mSceneQueriesDynamicPrunerUpdate.setContinuation(&mSceneQueriesCompletion); + + mSceneQueriesCompletion.removeReference(); + if(runUpdateTasks[PruningIndex::eSTATIC]) + mSceneQueriesStaticPrunerUpdate.removeReference(); + if(runUpdateTasks[PruningIndex::eDYNAMIC]) + mSceneQueriesDynamicPrunerUpdate.removeReference(); + } +} + +bool NpScene::checkSceneQueriesInternal(bool block) +{ + PX_PROFILE_ZONE("Basic.checkSceneQueries", getContextId()); + return mSceneQueriesDone.wait(block ? Ps::Sync::waitForever : 0); +} + +bool NpScene::checkQueries(bool block) +{ + return checkSceneQueriesInternal(block); +} + +bool NpScene::fetchQueries(bool block) +{ + if(!mSceneQueriesUpdateRunning) + { + //fetchSceneQueries doesn't get called + Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, + "PxScene::fetchQueries: fetchQueries() called illegally! It must be called after sceneQueriesUpdate()"); + return false; + } + + if(!checkSceneQueriesInternal(block)) + return false; + + { + PX_SIMD_GUARD; + + NP_WRITE_CHECK(this); + + // we use cross thread profile here, to show the event in cross thread view + // PT: TODO: why do we want to show it in the cross thread view? + PX_PROFILE_START_CROSSTHREAD("Basic.fetchQueries", getContextId()); + + // flush updates and commit if work is done + mSQManager.flushUpdates(); + + PX_PROFILE_STOP_CROSSTHREAD("Basic.fetchQueries", getContextId()); + PX_PROFILE_STOP_CROSSTHREAD("Basic.sceneQueriesUpdate", getContextId()); + + mSceneQueriesDone.reset(); + mSceneQueriesUpdateRunning = false; + } + return true; +} + + PxBatchQuery* NpScene::createBatchQuery(const PxBatchQueryDesc& desc) { PX_PROFILE_ZONE("API.createBatchQuery", getContextId()); diff --git a/PhysX_3.4/Source/PhysX/src/NpScene.h b/PhysX_3.4/Source/PhysX/src/NpScene.h index 4c07f38e..a5e9ca65 100644 --- a/PhysX_3.4/Source/PhysX/src/NpScene.h +++ b/PhysX_3.4/Source/PhysX/src/NpScene.h @@ -237,6 +237,11 @@ class NpScene : public NpSceneQueries, public Ps::UserAllocated virtual void setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint); virtual PxU32 getDynamicTreeRebuildRateHint() const; virtual void forceDynamicTreeRebuild(bool rebuildStaticStructure, bool rebuildDynamicStructure); + virtual void sceneQueriesUpdate(physx::PxBaseTask* completionTask, bool controlSimulation); + virtual bool checkQueries(bool block); + virtual bool fetchQueries(bool block); + virtual void setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode); + virtual PxSceneQueryUpdateMode::Enum getSceneQueryUpdateMode() const; virtual void setSolverBatchSize(PxU32 solverBatchSize); virtual PxU32 getSolverBatchSize(void) const; @@ -365,6 +370,7 @@ class NpScene : public NpSceneQueries, public Ps::UserAllocated private: bool checkResultsInternal(bool block); bool checkCollisionInternal(bool block); + bool checkSceneQueriesInternal(bool block); void simulateOrCollide(PxReal elapsedTime, physx::PxBaseTask* completionTask, void* scratchBlock, PxU32 scratchBlockSize, bool controlSimulation, const char* invalidCallMsg, Sc::SimulationStage::Enum simStage); void addRigidStatic(NpRigidStatic& , bool hasPrunerStructure = false); @@ -422,6 +428,7 @@ private: Ps::Sync mPhysicsDone; // physics thread signals this when update ready Ps::Sync mCollisionDone; // physics thread signals this when all collisions ready + Ps::Sync mSceneQueriesDone; // physics thread signals this when all scene queries update ready //legacy timing settings: @@ -469,6 +476,7 @@ private: PxTaskManager* mTaskManager; SceneCompletion mSceneCompletion; SceneCompletion mCollisionCompletion; + SceneCompletion mSceneQueriesCompletion; SceneExecution mSceneExecution; SceneCollide mSceneCollide; SceneAdvance mSceneAdvance; @@ -485,6 +493,8 @@ private: Ps::Thread::Id mCurrentWriter; Ps::ReadWriteLock mRWLock; + bool mSceneQueriesUpdateRunning; + bool mHasSimulatedOnce; bool mBetweenFetchResults; }; diff --git a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp index 45202c2d..a50844c6 100644 --- a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp +++ b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.cpp @@ -819,6 +819,20 @@ bool NpSceneQueries::multiQuery( } } +void NpSceneQueries::sceneQueriesStaticPrunerUpdate(PxBaseTask* ) +{ + PX_PROFILE_ZONE("SceneQuery.sceneQueriesStaticPrunerUpdate", getContextId()); + // run pruner build only, this will build the new tree only, no commit happens + mSQManager.sceneQueryBuildStep(PruningIndex::eSTATIC); +} + +void NpSceneQueries::sceneQueriesDynamicPrunerUpdate(PxBaseTask*) +{ + PX_PROFILE_ZONE("SceneQuery.sceneQueriesDynamicPrunerUpdate", getContextId()); + // run pruner build only, this will build the new tree only, no commit happens + mSQManager.sceneQueryBuildStep(PruningIndex::eDYNAMIC); +} + //explicit template instantiation template bool NpSceneQueries::multiQuery<PxRaycastHit>(const MultiQueryInput&, PxHitCallback<PxRaycastHit>&, PxHitFlags, const PxQueryCache*, const PxQueryFilterData&, PxQueryFilterCallback*, BatchQueryFilterData*) const; template bool NpSceneQueries::multiQuery<PxOverlapHit>(const MultiQueryInput&, PxHitCallback<PxOverlapHit>&, PxHitFlags, const PxQueryCache*, const PxQueryFilterData&, PxQueryFilterCallback*, BatchQueryFilterData*) const; diff --git a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h index e2ceaf83..b30b7b51 100644 --- a/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h +++ b/PhysX_3.4/Source/PhysX/src/NpSceneQueries.h @@ -176,6 +176,10 @@ public: PX_FORCE_INLINE const Scb::Scene& getScene() const { return mScene; } PX_FORCE_INLINE PxU32 getFlagsFast() const { return mScene.getFlags(); } PX_FORCE_INLINE Sq::SceneQueryManager& getSceneQueryManagerFast() { return mSQManager; } + PX_FORCE_INLINE PxSceneQueryUpdateMode::Enum getSceneQueryUpdateModeFast() const { return mSceneQueryUpdateMode; } + + void sceneQueriesStaticPrunerUpdate(PxBaseTask* continuation); + void sceneQueriesDynamicPrunerUpdate(PxBaseTask* continuation); Scb::Scene mScene; Sq::SceneQueryManager mSQManager; @@ -184,6 +188,13 @@ public: const Gu::GeomSweepFuncs& mCachedSweepFuncs; const Gu::GeomOverlapTable* mCachedOverlapFuncs; + typedef Cm::DelegateTask<NpSceneQueries, &NpSceneQueries::sceneQueriesStaticPrunerUpdate> SceneQueriesStaticPrunerUpdate; + typedef Cm::DelegateTask<NpSceneQueries, &NpSceneQueries::sceneQueriesDynamicPrunerUpdate> SceneQueriesDynamicPrunerUpdate; + SceneQueriesStaticPrunerUpdate mSceneQueriesStaticPrunerUpdate; + SceneQueriesDynamicPrunerUpdate mSceneQueriesDynamicPrunerUpdate; + + PxSceneQueryUpdateMode::Enum mSceneQueryUpdateMode; + #if PX_SUPPORT_PVD public: //Scene query and hits for pvd, collected in current frame |