Похоже, что это ошибка в специализированном пути в MPSImageHistogramEqualization
, и я призываю вас подать отзыв .
Когда numberOfHistogramEntries
больше 256,Ядро образа выделяет внутренний буфер, достаточно большой для хранения данных, с которыми ему нужно работать (для N = 512 это 8192 байта) плюс дополнительный бит пространства (32 байта). Когда установлен внутренний флаг optimized256BinsUseCase
, он выделяет ровно 4096 байтов, опуская этот последний бит дополнительной памяти. Я подозреваю, что последующие операции зависят от наличия большего количества места после начального блока данных и непреднамеренного задания смещения буфера, превышающего длину внутреннего буфера.
Возможно, вы сможете обойти это, используя другое числобинов гистограммы, как 512. Это тратит немного времени и пространства, но я предполагаю, что это даст те же результаты.
Кроме того, вы можете избежать этого сбоя, отключив слой проверки металла, но я настоятельно не рекомендую этого, поскольку вы просто будете маскировать основную проблему, пока она не будет устранена.
Примечание : я выполнил реверс-инжиниринг платформы MetalPerformanceShaders на macOS Catalina. Разные платформы и разные версии программного обеспечения, вероятно, имеют разные пути кода.