Как переинтерпретировать_каст с указателем на адаптацию MTLBuffer Swift - PullRequest
1 голос
/ 03 апреля 2020

У меня есть целевой блок - c, который использует (для моего понимания) некоторые дополнительные вещи, и я хотел бы сделать это полностью в Swift. Вот оригинальный код, с которого я начал. (Я пытался преобразовать это с помощью Swiftify, но безуспешно) И эта статья SO, к сожалению, не помогла: Как переинтерпретировать в Swift?

- (void)updateBuffers
{
    id<MTLBuffer> noiseBuffer = _noise[[self frameIndex]];
    RandomSample* ptr = reinterpret_cast<RandomSample*>([noiseBuffer contents]);
    for (NSUInteger i = 0; i < (NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE); ++i)
    {
        ptr->pixelSample.x = uniformFloatDistribution(randomGenerator);
        ptr->pixelSample.y = uniformFloatDistribution(randomGenerator);
        ptr->barycentricSample.x = uniformFloatDistribution(randomGenerator);
        ptr->barycentricSample.y = uniformFloatDistribution(randomGenerator);
        ptr->emitterBsdfSample.x = uniformFloatDistribution(randomGenerator);
        ptr->emitterBsdfSample.y = uniformFloatDistribution(randomGenerator);
        ptr->bsdfSample.x = uniformFloatDistribution(randomGenerator);
        ptr->bsdfSample.y = uniformFloatDistribution(randomGenerator);
        ptr->componentSample = uniformFloatDistribution(randomGenerator);
        ptr->emitterSample = uniformFloatDistribution(randomGenerator);
        ptr->rrSample = uniformFloatDistribution(randomGenerator);
        ++ptr;
    }
    [_noise[[self frameIndex]] didModifyRange:NSMakeRange(0, [noiseBuffer length])];


}

Я предполагаю, цель - c код заполняет содержимое буфера (используя for l oop) содержимым из Struct (RandomSample). NOISE_BLOCK_SIZE в этом случае 64

И это то, что я до сих пор имею:

    func updateBuffers() {

        let noiseBuffer = noise[Int(frameIndex())] // MTLBuffer

        var randomStruct = RandomSample()
        // Here I should have this ptr (pointer) that like on objective-c

        for i in 0..<(NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE) {

            randomStruct.pixelSample.x          = Float.random(in: 0..<1)
            randomStruct.pixelSample.y          = Float.random(in: 0..<1)
            randomStruct.barycentricSample.x    = Float.random(in: 0..<1)
            randomStruct.barycentricSample.y    = Float.random(in: 0..<1)
            randomStruct.emitterBsdfSample.x    = Float.random(in: 0..<1)
            randomStruct.emitterBsdfSample.y    = Float.random(in: 0..<1)
            randomStruct.bsdfSample.x           = Float.random(in: 0..<1)
            randomStruct.bsdfSample.y           = Float.random(in: 0..<1)
            randomStruct.componentSample        = Float.random(in: 0..<1)
            randomStruct.emitterSample          = Float.random(in: 0..<1)
            randomStruct.rrSample               = Float.random(in: 0..<1)

        }

        // etc... etc...

    }

Это структура RandomSample, на которую я хочу ссылаться, определенная в файле .h (которая является моей Заголовок моста)

struct RandomSample
{
    simd_float2 pixelSample;
    simd_float2 barycentricSample;
    simd_float2 bsdfSample;
    simd_float2 emitterBsdfSample;
    float componentSample;
    float emitterSample;
    float rrSample;
};

Вместо uniformFloatDistribution, который я использую (в коде Swift) Float.random(in: 0..<1), который должен производить более или менее то же самое.

1 Ответ

2 голосов
/ 03 апреля 2020

Очевидно, я не могу проверить это на моей машине, но вы должны быть в состоянии сделать что-то вроде этого.

var noiseRaw = noiseBuffer.contents()
let samples = noiseRaw.bindMemory(
    to: RandomSample.self,
    capacity: NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE
)

for i in 0..<NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE {
    let sample = samples + i
    sample.pointee.componentSample = Float.random(in: 0..<1)
    sample.pointee.emitterSample = Float.random(in: 0..<1)
    sample.pointee.rrSample = Float.random(in: 0..<1)
}
...