如何使用Metal在iOS上的GPU和CPU之间使用共享内存? (理想情况下是目标c)

时间:2019-01-07 11:46:02

标签: ios metal

我创建了这样的MTLTexture:

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

使用计算着色器填充纹理并将其渲染到屏幕。结果符合预期。 现在,我需要做一个CPU钩子来修改纹理数据,而着色器无法做到这一点。我希望MTLTexture.buffer的内容可以让我循环遍历像素,但看来它不能那样工作。我看到人们使用getBytes,然后使用replaceRegion来写回它,但这看起来不像使用共享内存,因为已经复制了数据。 如何使用CPU循环纹理中的RGBA像素数据?

2 个答案:

答案 0 :(得分:2)

如果您创建了一个简单的1D缓冲区,则只需访问content成员作为指针即可。如果需要RGBA缓冲区,然后创建一个包含BGRA像素的CVPixelBuffer,则可以通过锁定来访问像素,然后对该缓冲区的基本指针进行读/写操作(请注意行宽),最后可以包装CVPixelBuffer作为金属质感以避免memcpy()。 2D处理并非易事,仅使用1D缓冲区要容易得多。

答案 1 :(得分:0)

您试图做的事仅在macOS上可行。

  

macOS实现了托管模式,该模式定义了同步内存   配对一个资源,一个副本在系统内存中,另一个副本在   显存。托管资源受益于快速的CPU和GPU访问   到资源的每个副本,只需最少的API调用即可   同步这些副本。

enter image description here

参考链接:Metal Best Practices Guide