Как объединить MPSImages - PullRequest
       32

Как объединить MPSImages

0 голосов
/ 11 марта 2020

Я создаю график MPS, состоящий из одного узла конкатенации:

auto node = [MPSNNConcatenationNode nodeWithSources:sourceNodes];
auto graph = [MPSNNGraph graphWithDevice:device
                             resultImage:resultNode
                     resultImageIsNeeded:YES];

и кодирую его:

auto resultImage = [graph encodeToCommandBuffer:cmdBuffer
                                   sourceImages:sourceImages];

(другой код на самом деле не имеет значения, поэтому я его опускаю )

sourceImages выглядит следующим образом:

Printing description of sourceImages:
<__NSArrayM 0x604000059150>(
<MPSImage: 0x60f000003010> ""
    device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
    width: 3
    height: 4
    featureChannelsPerImage: 2
    numberOfImages: 1
    MTLPixelFormat: MTLPixelFormatRG32Float
    feature channel format: MPSImageFeatureChannelFormatFloat32
    parent:  0x0
    texture: 0x606000043d00
,
<MPSImage: 0x60f000003010> ""
    device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
    width: 3
    height: 4
    featureChannelsPerImage: 2
    numberOfImages: 1
    MTLPixelFormat: MTLPixelFormatRG32Float
    feature channel format: MPSImageFeatureChannelFormatFloat32
    parent:  0x0
    texture: 0x606000043d00

)

Я ожидал получить изображение, состоящее из одной 2D текстуры с featureChannelsPerImage, равным 4. Это будет идеально соответствовать MTLPixelFormatRGBA32Float.

Однако resultImage выглядит следующим образом:

Printing description of resultImage:
<MPSImage: 0x60f0000031f0> ""
    device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
    width: 3
    height: 4
    featureChannelsPerImage: 8
    numberOfImages: 1
    MTLPixelFormat: MTLPixelFormatRGBA32Float
    feature channel format: MPSImageFeatureChannelFormatFloat32
    parent:  0x0
    texture: 0x606000044c60

Документация класса говорит, что на самом деле это правильное поведение:

Поскольку все изображения дополняются Для кратных четырем характерным каналам M, N и O здесь также кратны четырем, даже если MPSImages нет. То есть, если изображение состоит из 23 характерных каналов и одного канала заполнения, в объединенном результате оно занимает пространство, равное 24 характерным каналам.

Я мог бы использовать resultImage, но не могу см. способ восстановления информации о количестве каналов в каждом срезе массива.

Таким образом, вопрос состоит в том, как объединить 2 или более MPSImage s в «действительный» MPSImage (состоящий из обычного 2D-текстура или 2D-массив текстур)?

...