// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright (c) 2008-2025 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PXG_BROADPHASE_DESC_H #define PXG_BROADPHASE_DESC_H #include "foundation/PxSimpleTypes.h" // PT: the GPU AABB manager apparently DMAs the updated handles' *bitmap* to the GPU directly, bypassing the // BP API. This creates coupling between the GPU BP and the GPU AABB manager, i.e. the GPU BP cannot be used // outside of the SDK as a standalone BP. The code controlled by this define tries to undo that and support // a "regular" update handles array (not a bitmap), like the CPU implementations do. #define SUPPORT_UPDATE_HANDLES_ARRAY_FOR_GPU namespace physx { class PxgIntegerAABB; class PxgSapBox1D; struct PxgBroadPhasePair; struct PxgHandleRegion; struct PxgIntegerRegion; class PxBounds3; namespace Bp { struct VolumeData; } typedef PxU64 regionOverlapType; struct PxgBroadPhaseDesc { PxU32* updateData_createdHandles; // PT: copy of updateData buffer in device memory PxU32 numCreatedHandles; PxU32* updateData_removedHandles; // PT: copy of updateData buffer in device memory PxU32 numRemovedHandles; #ifdef SUPPORT_UPDATE_HANDLES_ARRAY_FOR_GPU PxU32* updateData_updatedHandles; // PT: copy of updateData buffer in device memory PxU32 numUpdatedHandles; #endif PxU32* aabbMngr_changedHandleMap; // PT: data coming from the AABB manager, creating all the coupling problems PxU32 aabbMngr_changedHandleBitMapWordCounts; // PT: data coming from the AABB manager, creating all the coupling problems PxU32* aabbMngr_addedHandleMap; // PT: data coming from the AABB manager, creating all the coupling problems PxU32* aabbMngr_removedHandleMap; // PT: data coming from the AABB manager, creating all the coupling problems PxU32* aabbMngr_aggregatedBoundHandles; // PT: data coming from the AABB manager, creating all the coupling problems PxBounds3* updateData_fpBounds; // PT: copy of updateData buffer in device memory PxReal* updateData_contactDistances; // PT: copy of updateData buffer in device memory PxgIntegerAABB* newIntegerBounds; // PT: computed by translateAABBsLaunch kernel. PxU32* updateData_groups; // PT: copy of updateData buffer in device memory TODO: type could be better PxU32* updateData_envIDs; // PT: copy of updateData buffer in device memory PxgIntegerAABB* oldIntegerBounds; PxgSapBox1D* boxSapBox1D[3]; PxgSapBox1D* boxNewSapBox1D[3]; PxU32* boxProjections[3]; PxU32* boxHandles[2][3]; PxU32 numPreviousHandles; PxU32 sharedFoundPairIndex; PxU32 sharedLostPairIndex; PxU32 sharedFoundAggPairIndex; PxU32 sharedLostAggPairIndex; PxgBroadPhasePair* foundPairReport; //device memory for GPU foundReport (include actors and aggregates) PxgBroadPhasePair* lostPairReport; //device memory for GPU lostReport (include actors and aggregates) PxgBroadPhasePair* foundAggPairReport; //device memory for GPU aggregate foundReport PxgBroadPhasePair* lostAggPairReport; //device memory for GPU aggregate lostReport PxgBroadPhasePair* foundActorPairReport; //device memory for GPU actor foundReport PxgBroadPhasePair* lostActorPairReport; //device memory for GPU actor lostReport PxgBroadPhasePair* foundPairReportMap; //mapped address in the GPU for the cpu foundReport for actor pairs (not include aggregate); PxgBroadPhasePair* lostPairReportMap; //mapped address in the GPU for the cpu lostReport for actor pairs(not include aggregate); Bp::VolumeData* aabbMngr_volumeData; // PT: data coming from the AABB manager, creating all the coupling problems PxU32* activeRegionsHistogram; //! Histogram used for active handles, 64 regions and each regions has nbProjections(multiply of 4) elements PxU32* startRegionsHistogram; //! Histogram for all start handles PxU32* orderedActiveRegionHandles; //! An ordered list of active handles PxU32* orderedStartRegionHandles; //! An ordered list of start handles regionOverlapType* blockOverlapChecksRegion; regionOverlapType* overlapChecksRegion; //this variable is to store the exclusive scan add overlap checks for each objects regionOverlapType overlapChecksTotalRegion; //this variable is to store the total number of overlap checks for all objects PxgHandleRegion* overlapChecksHandleRegiones; PxgIntegerRegion* regionRange; PxU32* startRegionAccum; PxU32* blockStartRegionAccum; PxU32 startRegionAccumTotal; PxU32* regionAccum; PxU32* blockRegionAccum; PxU32 regionAccumTotal; PxU32* endPtHistogram[2][3]; PxU32* blockEndPtHistogram[2][3]; PxU32* endPointHandles[2][3]; PxU32* totalEndPtHistogram[3]; PxU32* blockTotalEndPtHistogram[3]; PxU32* startPtHistogram[2][3]; PxU32* blockStartPtHistogram[2][3]; PxU32* startPointHandles[2][3]; PxU32* boxProjectionRanks[3]; PxU32* incrementalComparisons[3]; PxU32* incrementalBlockComparisons[3]; PxU32* aggReportBlock[2]; PxU32* actorReportBlock[2]; PxU32 totalIncrementalComparisons[3]; PxU32 max_found_lost_pairs; PxU32 max_found_lost_agg_pairs; bool found_lost_pairs_overflow_flags; }; PX_FORCE_INLINE PX_CUDA_CALLABLE PxU32 createHandle(const PxU32 handle, const bool isStart, const bool isNew) { return (handle << 3) | (PxU32)isStart | (PxU32)isNew << 1; } PX_FORCE_INLINE PX_CUDA_CALLABLE PxU32 markDeleted(const PxU32 handle) { return handle | (1 << 2); } PX_FORCE_INLINE PX_CUDA_CALLABLE PxU32 getHandle(const PxU32 sortedHandle) { return sortedHandle >> 3; } PX_FORCE_INLINE PX_CUDA_CALLABLE bool isStartProjection(const PxU32 sortedHandle) { return !!(sortedHandle & 1); } PX_FORCE_INLINE PX_CUDA_CALLABLE bool isNewProjection(const PxU32 sortedHandle) { return !!((sortedHandle >> 1) & 1); } PX_FORCE_INLINE PX_CUDA_CALLABLE bool isDeletedProjection(const PxU32 sortedHandle) { return !!((sortedHandle) & (1 << 2)); } } #endif