我正在尝试转换" Metal By example ";App - textrendering -适用于IOS到OSX。不幸的是,Xcode告诉我,MTLTextureDescriptor的storageMode需要设置为MTLStorageModePrivate,当我这样做时:replaceRegion:mipmapLevel:withBytes:bytesPerRow:抛出"断言失败"的CPU访问纹理与MTLResourceStorageModePrivate存储模式是不允许的。
MTLTextureDescriptor *textureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:AAPLDepthPixelFormat
width:MBEFontAtlasSize
height:MBEFontAtlasSize
mipmapped:NO];
textureDesc.storageMode = MTLStorageModePrivate;
textureDesc.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead | MTLTextureUsageShaderWrite;
textureDesc.usage = MTLTextureUsageShaderRead;//MTLTextureUsageRenderTarget;
MTLRegion region = MTLRegionMake2D(0, 0, MBEFontAtlasSize, MBEFontAtlasSize);
_fontTexture = [_device newTextureWithDescriptor:textureDesc];
[_fontTexture setLabel:@"Font Atlas"];
[_fontTexture replaceRegion:region mipmapLevel:0 withBytes:_fontAtlas.textureData.bytes bytesPerRow:MBEFontAtlasSize];
任何帮助都将非常感激!
在macOS上,你实际上必须显式地同步CPU/RAM和GPU之间的资源(因为Mac可能有一个专用的GPU与自己的内存,与iOS上的共享内存模型相反)。
为此,您需要将存储模式设置为managed
,并使用MTLBlitCommandEncoder
在设备之间复制内存(参见managed
的文档)。