И это всё МОЁ

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

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








 ,