Когда я запускаю этот код на интегрированном графическом процессоре Intel на Macbook Pro, у меня нет проблем. Но когда я запускаю его на iMa c с графическим процессором AMD, этот простой «Hello World» дает мне артефакты по правому краю:
Шейдер очень прост:
kernel void helloworld(texture2d<float, access::write> outTexture [[texture(0)]],
uint2 gid [[thread_position_in_grid]])
{
outTexture.write(float4((float)gid.x/640,
(float)gid.y/360,0,1),
gid);
}
Я пытался просмотреть содержимое текстуры двумя разными способами, и оба вызывают проблемы:
Преобразование текстуры в CIImage и просмотр это в NSImageView, или вызывая getBytes
и копируя данные пикселей напрямую и вручную создавая из него PNG (полностью пропуская CIImage). В любом случае получается этот странный артефакт, поэтому он действительно находится в самой текстуре.
Есть идеи, что вызывает проблемы такого рода?
ОБНОВЛЕНИЕ:
Увлекательно, проблема возникает быть связанным с threadsPerThreadgroup
, но я не уверен, почему это так.
Приведенное выше изображение было создано с 24 потоками на группу. Если я изменю это на 16, артефакты переместятся к нижнему краю.
Что я не понимаю в этом, так это то, что позиция gid
должна быть исправлена независимо от того, какая группа потоков на самом деле работает, не должна Это? Потому что это положение отдельных нитей на всем изображении.