LINUX.ORG.RU

А как у нормальных людей принято стримить буфера в видяху?

 ,


1

2

Я тут в кои-то веки заменить 210ю видюху на 710ю, чтоб GL4.6 было. И столкнулся с интересной проблемой.

Был код, который на 210й просто работал:

GLenum flags = GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT|GL_CLIENT_STORAGE_BIT;

glNamedBufferStorage(buffer, length, nullptr, flags);

flags |= GL_MAP_FLUSH_EXPLICIT_BIT|GL_MAP_UNSYNCHRONIZED_BIT;

pointer = gl->glMapNamedBufferRange(buffer, 0, length, flags);

glMapBufferRange выделял место в оперативной памяти, ты туда пишешь, делаешь glFlushMappedNamedBufferRange на изменения, ставишь glFenceSync, всё что ты записал забирают по DMA, и потом когда-нибудь эти данные можно использовать. Как бонус - была возможность читать эти данные несмотря на отсутствие GL_MAP_READ_BIT, чем я и пользовался.

На 710й видяхе внезапно обнаружилось, что на месте записанных данных спавнятся нули. И таки да, это говно поместило мой буфер на видеокарту. Видимо, чтоб DMA-контроллер видеокарты не изнашивался от трения об биты.

Причем, вернуть его обратно можно(GL_CLIENT_STORAGE_BIT), но помоему тогда буфер переедет целиком в память. В обсуждениях wined3d есть даже тема про то, как этот флаг ставит раком видеокарты.

А как сделать «как раньше»? Чтоб буфер был на видяхе, а его копия - локально в оперативке?

Ответ на: комментарий от LINUX-ORG-RU

видяха как раз умеет забирать из оперативки. в месе вот прямо так и работает как мне надо, но там нету sparse buffer,sparse texture,spir, и чего-то ещё по мелочи.

а оперативка нужна для того, чтоб не тормозя процом подготавливать данные и затем их запускать на видяху оптом. я как бы туда дофига чего скидывать собираюсь, десятками мегабайт на кадр. а тут такое добро пожаловать во времена ДОСа и VESA

example_cat
() автор топика
Ответ на: комментарий от example_cat

Понял =) Ну к сожалению подсказать ничего тогда не смогу, наверное придётся тебе как то выкручиваться по иному, но, вполне возможно просто где то это делается по иному сейчас, а вот как, хрен его знает. Напиши ещё на gamedev.ru, может там подскажут.

Если что отпиши пожалуйста решение если найдёшь, так как у меня всё по старинке сейчас через юниформы, но данных стало много и пора мне их как то паковать и сгружать разом.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от example_cat

тут такое добро пожаловать во времена ДОСа и VESA

Это времена vulkan и dx12, где делают как я предлагаю.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

вообще, для AMD работает именно оригинальный человеческий вариант. для нвидии видимо придётся гонять glBufferSubData.

example_cat
() автор топика
Ответ на: комментарий от example_cat

вообще, для AMD работает именно оригинальный человеческий вариант.

Ну так я и говорю что по nvidia ничего подсказать не могу =)

для нвидии видимо придётся гонять glBufferSubData.

Эх, специфичный код отрисовки, как же я его не люблю, ну а что поделать? Ничего надо выкручиваться. Благо я ленивый и не суюсь за пределы OpenGL2.1 и выкидываю всё в чём сомневаюсь… и от этого у меня всё тормозное нахрен )))))))

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от anonymous

Потому как если использовать glBufferSubData() не с нулём, а с указателем в последнем аргументе и без забинденого GL_COPY_XXX_BUFFER оче тормозно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.