首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Metalkit: swift 3中的MTLBuffer和指针

Metalkit: swift 3中的MTLBuffer和指针
EN

Stack Overflow用户
提问于 2016-12-11 18:18:43
回答 1查看 580关注 0票数 2

我从Metalkit开始,我有一个非常简单的内核作为测试用例。

代码语言:javascript
复制
kernel void compute(device float* outData [[ buffer(0) ]])
{
  outData[0] = 234.5;
  outData[3] = 345.6;
}

这些“计算”的数据存储在一个MTLBuffer中。

代码语言:javascript
复制
var buffer : MTLBuffer?
...
buffer = device.makeBuffer(length: MemoryLayout<Float>.size * 5, options: [])
...
commandBuffer.waitUntilCompleted()

此时,内核已经向MTLBuffer写入了一些测试数据。问题是我应该如何从我的主程序中访问这些数据?

我从buffer.contents()那里得到了一个unsafeMutableRawPointer。我如何获得一个可以在其他地方使用的快速数组(在屏幕上显示,写入文件,等等)?

这些代码片段在这个非常简单的应用程序中可以工作,但我不确定它们是否正确:

代码语言:javascript
复制
let raw = buffer.contents()
let b = raw.bindMemory(to: Float.self, capacity: 5) 
print(b.advanced(by: 3).pointee)

let a = raw.assumingMemoryBound(to: Float.self)
print(a.advanced(by: 3).pointee)


let bufferPointer = UnsafeBufferPointer(start: b, count: 5)
let values = Array(bufferPointer)
print(values)


let value = raw.load(fromByteOffset: MemoryLayout<Float>.size * 3, as: Float.self)
print(value)

bindMemoryassumingMemoryBound都可以工作。虽然assumingMemoryBound假设底层字节已经输入,而bindMemory没有,但我认为这两种方法中的任何一种都应该有效,但不能同时适用。它应该是哪一个?为什么?

EN

回答 1

Stack Overflow用户

发布于 2017-12-19 19:45:38

我使用下面给出的代码加载到数组,但我不能确定我的版本和您的版本哪个最好。

代码语言:javascript
复制
let count = 16

var array = [Float]()
array.reserveCapacity(count)

    for i in 0..<count {
        array.append(buffer.contents().load(fromByteOffset: MemoryLayout<Float>.size * i, as: Float.self))
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41085120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档