MTLBuffer поврежденные данные

Я начал играть с металлическим api и включил его в свой рендерер как новый api. Однако у меня возникают проблемы с данными в моем MTLBuffer после создания и инициализации.

У меня есть некоторый api-независимый класс для буферов и потоков вершин, который я использую вот так:

// Fill vertex streams with data
    auto& positionStream = vb.GetDataStream<0>().AddData(
         // Quad 1
         Vec4{ -0.5f, -0.5f, -0.5f, 1.0f },
         Vec4{  x.xf, -0.5f, -0.5f, 1.0f },
         Vec4{  0.5f, -0.5f,  0.5f, 1.0f },
         Vec4{ -0.5f, -0.5f,  0.5f, 1.0f },

         // Quad 2
         Vec4{ -0.5f,  0.5f, -0.5f, 1.0f },
         Vec4{  0.5f,  0.5f, -0.5f, 1.0f },
         Vec4{  0.5f,  0.5f,  0.5f, 1.0f },
         Vec4{ -0.5f,  0.5f,  0.5f, 1.0f }
    );

Где Vec4 действительно более простая структура:

struct Vec4
{
    float x{ 0.0f };
    float y{ 0.0f };
    float z{ 0.0f };
    float w{ 0.0f };
};

Каждый поток данных буфера вершин поддерживается MTLBuffer. Однако, когда я создаю и инициализирую этот поток данными, элемент x, который я пометил в образце кода как x.x, содержит какое-то значение мусора. Если я устанавливаю это значение на что-нибудь, это всегда мусор. Я использую некоторые другие потоки для индексов, цветов, текскордов, и все эти данные верны. Создаю буферы с обращением к

[device newBufferWithBytes:data length:length options:0]

Вот что я вижу, когда снимаю кадр:

введите описание изображения здесь Редактировать: Я также заметил, что это происходит при моем первом создании MTLBuffer, я пытался сначала создать MTLBuffer для данных цвета, а затем для позиций и цвета были повреждены, а позиции отлично.

Есть идеи, что может вызвать это?


person mezo    schedule 11.07.2019    source источник
comment
Что length в вашем newBufferWithBytes:... звонке? Помогает ли делать [buffer didModifyRange:NSMakeRange(0, length)] после создания? (Не обязательно, но мало ли.)   -  person Ken Thomases    schedule 11.07.2019
comment
@KenThomases это 128 для обоих потоков (MTLBuffers, позиции и цвета), что правильно. Оба буфера имеют выделенный размер 4096 Байт. Кстати, в настоящее время меня особо не заботила производительность создания буфера, иначе говоря, я не создаю промежуточные буферы для загрузки данных, поэтому мои буферы являются общими (у меня все равно есть графический процессор Intel, поэтому это не имеет значения), и поэтому я не могу вызовите didModifyRange, поскольку это допустимо только для частных буферов   -  person mezo    schedule 11.07.2019


Ответы (1)


Наконец-то мне удалось найти проблему. Я использую MacOS 10.15 Catalina Beta (19A501i) с XCode-Beta. Я пытался создать приложение в небета-версии XCode, и все кажется правильным даже после проверки этих буферов в отладчике gpu.

Я использовал Xcode-beta (версия 11.0 beta (11M336w)), до которого, похоже, возникла проблема.

person mezo    schedule 11.07.2019