Skip to content

Crash in Gu::SinglePersistentContactManifold::reduceBatchContactsConvex #691

Description

@msinilo

We sometimes crash in Gu::SinglePersistentContactManifold::reduceBatchContactsConvex, line 1735:
chosen[index] = true;
Doesn't happen in-house so all I have is a crash dump, but AFAICT index is invalid (GU_MANIFOLD_INVALID_INDEX), so clearly out of bounds.
My best theory is that when we do reduceManifoldContactsInDifferentPatches it drops 'duplicate' contacts by decreasing mEndIndex but it does not modify "root" patch's mTotalSize.
That means if we start with total size over GU_SINGLE_MANIFOLD_CACHE_SIZE we might hit the contact reduction path in addBatchManifoldContactsConvex. From that, it's possible to hit reduceBatchContactsConvex with fewer than 6 'live' contacts.
In our case it seems to be 2, so 2 'live' contacts, total size = 7, the third pick starts at index=invalid, but it can't update it, since both 'slots' are chosen so it fails the if(!chosen[i]) test.

The fix seems to be 1 line in reduceManifoldContactsInDifferentPatches:
manifoldContacts[l] = manifoldContacts[nextPatch->mEndIndex-1];
nextPatch->mEndIndex--;

  •            contactPatch[i]->mTotalSize--;
    

... but to be 100% honest I'm not quite sure if I fully understand what's going on so could use a second opinion

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions