MPSImageHistogramEqualization бросает утверждение, что смещение должно быть <[длина буфера] - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь выполнить выравнивание гистограммы с помощью MPSImageHistogramEqualization на iOS, но в результате получается утверждение, которое я не понимаю. Вот мой код:

    // Calculate Histogram
    var histogramInfo = MPSImageHistogramInfo(
        numberOfHistogramEntries: 256,
        histogramForAlpha: false,
        minPixelValue: vector_float4(0,0,0,0),
        maxPixelValue: vector_float4(1,1,1,1))
    let calculation = MPSImageHistogram(device: self.mtlDevice, histogramInfo: &histogramInfo)
    let bufferLength = calculation.histogramSize(forSourceFormat: sourceTexture.pixelFormat)
    let histogramInfoBuffer = self.mtlDevice.makeBuffer(length: bufferLength, options: [.storageModePrivate])!
    calculation.encode(to: commandBuffer,
                       sourceTexture: sourceTexture,
                       histogram: histogramInfoBuffer,
                       histogramOffset: 0)
    let histogramEqualization = MPSImageHistogramEqualization(device: self.mtlDevice, histogramInfo: &histogramInfo)
    histogramEqualization.encodeTransform(to: commandBuffer, sourceTexture: sourceTexture, histogram: histogramInfoBuffer, histogramOffset: 0)

А вот итоговое утверждение, которое происходит в последней строке:

-[MTLDebugComputeCommandEncoder setBuffer:offset:atIndex:]:283: failed assertion `offset(4096) must be < [buffer length](4096).'

Есть предложения о том, что здесь может происходить?

1 Ответ

1 голос
/ 15 октября 2019

Похоже, что это ошибка в специализированном пути в MPSImageHistogramEqualization, и я призываю вас подать отзыв .

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

Возможно, вы сможете обойти это, используя другое числобинов гистограммы, как 512. Это тратит немного времени и пространства, но я предполагаю, что это даст те же результаты.

Кроме того, вы можете избежать этого сбоя, отключив слой проверки металла, но я настоятельно не рекомендую этого, поскольку вы просто будете маскировать основную проблему, пока она не будет устранена.

Примечание : я выполнил реверс-инжиниринг платформы MetalPerformanceShaders на macOS Catalina. Разные платформы и разные версии программного обеспечения, вероятно, имеют разные пути кода.

...