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 есть даже тема про то, как этот флаг ставит раком видеокарты.

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

Ну так и сделай два буфера и копируй между ними?

Или тебе нужно чтобы драйвер всрато делал то же самое за кулисой, потенциально внося проблемы?

anonymous
()

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

Зззмызззле? В оперативке же будет необработанные данные, а что бы получить реальные нужно выгрузить из видеопамяти, видеокарта не работает с оперативкой при обработке своего буфера (Поправьте если всё не так и я дурак)

И да, как это было по скорости? Неужели было сильно быстрее чем ->

  glBindTexture(GL_TEXTURE_2D,my_texture);
  glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, my_buffer_for read);

  update my_buffer_for_read ...

  glBindTexture(GL_TEXTURE_2D, my_texture);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size_x, size_y, 0, GL_RGBA, GL_UNSIGNED_BYTE,data );

Я знаю что это медленно, но насколько быстрее было у тебя? И там реально можно было делать произвольный доступ? Не верю! Ибо тогда надо ждать окончания отрисовки всей! Sick!.

Прям интересно

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

мне нужно, чтоб драйвер сделал мне буфер в видеопамяти и буфер в оперативной памяти и оттуда гнал данные через DMA. так как это сделано в MESA. но у зелёных ублюдков этот буфер лежит прямо на видяхе с последствиями вроде ручного копирования процессором туда всех данных.

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

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

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

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

процессором

Когда ты дергаешь вызовы opengl, всё копироется драйвером по dma. Процессор просто не имеет прямого доступа к видеопамяти, если это не встройка.

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

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

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

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

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

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

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

это не совсем так. на радеонах это утверждение близко к действителности, т.к. там есть «окошко» размером 128мегабайт. но да, у красных всё как у людей сделано.

а вот у зеленых, как оказалось, не как у людей.

https://github.com/acomminos/wine-pba/blob/master/patches/0009-wined3d-Add-qu...

// FIXME(acomminos): So, about GL_CLIENT_STORAGE_BIT:
+    // - On NVIDIA, DMA CACHED memory is used when this flag is set. SYSTEM HEAP
+    //   memory is used without it, which (in my testing) is much faster.
+    // - On Mesa, GTT is used when this flag is set. This is what we want- we
+    //   upload to VRAM occur otherwise, which is unusably slow (on radeon).

тут пальцем линуса не обойтись, надо на бутылку сажать.

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

я пока сделал buffer orphaning - через glInvalidateNamedBuffer + glNamedBufferSubData

но это затычка для вывода UI от chromium embedded, там не сильно большой fps.

а что делать с кольцевым буфером, через который анимация заливается я пока не знаю, это атас какой-то. спасибо зелёным козлам.

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

через который анимация заливается я пока не знаю

Хз, заливать несколько кадров подряд в сетку 8x8 и пока 60 кадров отрисовываются поочереди, по смещению uv залить новый буфер данными и когда придёт время то переключить на него для показа новой порции кадров и так далее по кругу переключать буферы

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

и пока 60 кадров отрисовываются поочереди, по смещению uv залить новый буфер данными

Чёртовы запятые! :D

*и пока 60 кадров отрисовываются поочереди по смещению uv в это время залить новый буфер данными

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

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

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

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

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

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

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

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

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

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

Насколько я помню, стандарт OpenGL тебе DMA не обещает. Это детали реализации.

Дальше вопрос к писателям дров на твою видеокарту.

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