Как использовать разделяемую память между GPU и CPU на iOS с Metal? (в идеале с целью c) - PullRequest
0 голосов
/ 07 января 2019

Я создал текстуру MTL следующим образом:

descTex=[MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:texCamWidth height:texCamHeight mipmapped:NO];
descTex.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead ;
[descTex setStorageMode:MTLStorageModeShared];
texOutRGB = [_device newTextureWithDescriptor:descTex];

Использовал вычислительный шейдер, чтобы заполнить текстуру и отобразить ее на экране. Результаты ожидаемые. Теперь мне нужно сделать хук процессора, чтобы изменить данные текстуры, что нельзя сделать с помощью шейдера. Я ожидал, что содержимое MTLTexture.buffer позволит мне зацикливаться на пикселях, но, похоже, это так не работает. Я вижу людей, использующих getBytes и затем replaceRegion, чтобы записать его обратно, но это не похоже на использование разделяемой памяти, поскольку создается копия данных. Как зациклить данные пикселей RGBA в текстуре с помощью процессора?

1 Ответ

0 голосов
/ 07 января 2019

Если вместо этого вы создали простой 1D-буфер, просто получите доступ к элементу содержимого в качестве указателя. Если вам нужен буфер RGBA, то создайте CVPixelBuffer, который содержит пиксели BGRA, затем вы можете получить доступ к пикселям, заблокировав и затем прочитав / записав в базовый указатель для буфера (позаботьтесь о соблюдении ширины строк), и, наконец, вы можете обернуть CVPixelBuffer как металлическая текстура, чтобы избежать memcpy (). 2D-обработка не является тривиальной, намного проще просто использовать 1D-буфер.

...