Intentionally leak MTLDevice.counterSets to workaround a crash

Some drivers over-release this object when is accessed more than
once.

Bug: chromium:1443658
Change-Id: I861a74e7756dcf16b0a2d25a85bf47815b6779f0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/132262
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
Austin Eng 2023-05-10 20:08:42 +00:00 committed by Dawn LUCI CQ
parent dfaeb429f8
commit 3d511b3b7e
1 changed files with 19 additions and 0 deletions

View File

@ -467,6 +467,25 @@ class PhysicalDevice : public PhysicalDeviceBase {
}
if (@available(macOS 10.15, iOS 14.0, *)) {
auto ShouldLeakCounterSets = [this]() {
// Intentionally leak counterSets to workaround an issue where the driver
// over-releases the handle if it is accessed more than once. It becomes a zombie.
// For more information, see crbug.com/1443658.
// Appears to occur on Intel prior to MacOS 11, and continuing on Intel Gen 7 after
// that OS version.
uint32_t vendorId = GetVendorId();
uint32_t deviceId = GetDeviceId();
if (gpu_info::IsIntelGen7(vendorId, deviceId)) {
return true;
}
if (gpu_info::IsIntel(vendorId) && !IsMacOSVersionAtLeast(11)) {
return true;
}
return false;
};
if (ShouldLeakCounterSets()) {
[[*mDevice counterSets] retain];
}
if (IsGPUCounterSupported(
*mDevice, MTLCommonCounterSetStatistic,
{MTLCommonCounterVertexInvocations, MTLCommonCounterClipperInvocations,