Я тут в кои-то веки заменить 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 есть даже тема про то, как этот флаг ставит раком видеокарты.
А как сделать «как раньше»? Чтоб буфер был на видяхе, а его копия - локально в оперативке?