MacOS MTKView metal self.device.newBufferWithBytes crashes with assert

别等时光非礼了梦想. 提交于 2019-12-23 22:14:28

问题


I want to draw a simple triangle and it crashes after I am trying to create MTLBuffer.

static float vertexes[] = {
        0.0, 0.5, 0.0,
        -0.5f, -0.5f, 0.0,
        0.5, -0.5f, 0.0
};

id <MTLBuffer> buffer = [self.device newBufferWithBytes:vertexes
        length:sizeof(vertexes) options:MTLResourceStorageModePrivate];

Here is the assert:

-[MTLDebugDevice newBufferWithBytes:length:options:]:392: failed assertion `storageModePrivate incompatible with ...WithBytes variant of newBuffer'

So how to create a buffer from the vertexes using MTLResourceStorageModePrivate option?


回答1:


You must create a temporary blit buffer and use it to copy the contents to the private buffer. Here's example code:

buffer = [self.device newBufferWithLength:sizeof( vertexes )
                   options:MTLResourceStorageModePrivate];

id<MTLBuffer> blitBuffer = [self.device newBufferWithBytes:vertexes
                                   length:sizeof( vertexes )
                                  options:MTLResourceCPUCacheModeDefaultCache];

id <MTLCommandBuffer> cmd_buffer =     [commandQueue commandBuffer];
id <MTLBlitCommandEncoder> blit_encoder = [cmd_buffer blitCommandEncoder];
[blit_encoder copyFromBuffer:blitBuffer
                    sourceOffset:0
                        toBuffer:buffer
               destinationOffset:0
                            size:sizeof( vertexes )];
[blit_encoder endEncoding];
[cmd_buffer commit];
[cmd_buffer waitUntilCompleted];


来源:https://stackoverflow.com/questions/51159795/macos-mtkview-metal-self-device-newbufferwithbytes-crashes-with-assert

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!