MacOS MTKView金属self.device.newBufferWithBytes因assert

时间:2018-07-03 17:07:30

标签: objective-c macos metal

我想绘制一个简单的三角形,在尝试创建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];

这是断言:

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

那么如何使用MTLResourceStorageModePrivate选项从顶点创建缓冲区?

1 个答案:

答案 0 :(得分:3)

您必须创建一个临时blit缓冲区并将其用于将内容复制到专用缓冲区。这是示例代码:

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];