MPSImageIntegral возвращает все нули - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь использовать MPSImageIntegral для вычисления суммы некоторых элементов в MTLTexture. Вот что я делаю:

std::vector<float> integralSumData;
for(int i = 0; i < 10; i++)
    integralSumData.push_back((float)i);

MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR32Float
                                                                                             width:(integralSumData.size()) height:1 mipmapped:NO];
textureDescriptor.usage = MTLTextureUsageShaderRead | MTLTextureUsageShaderWrite;
id<MTLTexture> texture = [_device newTextureWithDescriptor:textureDescriptor];

// Calculate the number of bytes per row in the image.
NSUInteger bytesPerRow = integralSumData.size() * sizeof(float);

MTLRegion region =
{
    { 0, 0, 0 },                   // MTLOrigin
    {integralSumData.size(), 1, 1} // MTLSize
};

// Copy the bytes from the data object into the texture
[texture replaceRegion:region
           mipmapLevel:0
             withBytes:integralSumData.data()
           bytesPerRow:bytesPerRow];


MTLTextureDescriptor *textureDescriptor2 = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR32Float
                                                                                              width:(integralSumData.size()) height:1 mipmapped:NO];
textureDescriptor2.usage = MTLTextureUsageShaderRead | MTLTextureUsageShaderWrite;
id<MTLTexture> outtexture = [_device newTextureWithDescriptor:textureDescriptor2];


// Create a MPS filter.
MPSImageIntegral *integral = [[MPSImageIntegral alloc] initWithDevice: _device];
MPSOffset offset = { 0,0,0};
[integral setOffset:offset];
[integral setEdgeMode:MPSImageEdgeModeZero];
[integral encodeToCommandBuffer:commandBuffer sourceTexture:texture destinationTexture:outtexture];

[commandBuffer commit];
[commandBuffer waitUntilCompleted];

Но, когда я проверяю свои outtexture значения, все нули. Я делаю что-то неправильно? Это правильный способ, которым я буду использовать MPSImageIntegral?

Я использую следующий код для чтения значений, записанных в outTexture:

float outData[100];
[outtexture getBytes:outData bytesPerRow:bytesPerRow fromRegion:region mipmapLevel:0];
for(int i = 0; i < 100; i++)
    std::cout << outData[i] << "\n";

Спасибо

1 Ответ

0 голосов
/ 13 июня 2019

Как указал @Matthijis: все, что мне нужно было сделать, это использовать MTLBlitEncoder, чтобы убедиться, что я синхронизирую свой MTLTexture перед считыванием его в ЦП, и он работал как шарм!

...