LINUX.ORG.RU

Разделяемые контексты OpenGL

 ,


0

1

После того как вызван

ctx0->setShareContext(ctx1);
ctx0 и ctx1 разделяют ресурсы OpenGL, так? Или требуется ещё вызвать
ctx1->setShareContext(ctx0);

В документации написано, что после этого ctx0 должен быть пересоздан, по логике должен быть пересоздан также ctx1, так?

Если есть несколько экземпляров потомков QOpenGLWindow, которые отображают одну и ту же сцену и QOpenGLContext с QOffscreenSurface для инициализации ресурсов, то можно ли использовать context()->setShareContext(..) или обязательно нужно использовать параметр конструктора?

Для работы с ресурсами нужно использовать QOpenGLFunctions, полученный из текущего контекста, или сойдёт из любого контекста, находящегося в разделяемой группе?

★★★★★

Или требуется ещё вызвать

по логике должен быть пересоздан также ctx1, так?

Отнюдь. Для того чтобы понять что происходит нужно сначала изучить как работают контексты OpenGL. В первом вызове ctx0 начинает использовать ресурсы ctx1, естественно второй про это ничего не знает и может просто продолжать работать. Общий ресурс можно указать только в момент создания контекста, поэтому Qt честно говорит, что изменения придут в силу только после явного вызова ctx0->create(), что равносильно пересозданию контекста. Иными словами переключать на лету с кем контекст шарить нельзя, при вызове create() все предыдущие ресурсы будут уничтожены. Ибо их идентификаторы, к примеру, текстуры, это просто число, и это число будет одним и тем же в обоих контекстах.

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

при вызове create() все предыдущие ресурсы будут уничтожены

Всей разделяемой группы? То есть если я ещё раз вызову ctx0->create(); будут ли доступны ресурсы в ctx1, при условии что созданы они в ctx1?

robus ★★★★★
() автор топика
Последнее исправление: robus (всего исправлений: 1)
Ответ на: комментарий от robus

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

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

Спасибо. Буду пробовать.

robus ★★★★★
() автор топика

Почему-то не работает. Я хотел сделать систему при которой инициализация и обновление ресурсов будет происходить в собственном контексте сцены, а окна будут рисоваться каждое своим контекстом. Но почему-то не вышло. Хорошо, что QOpenGLContext::makeCurrent() принимает указатель на QSurface. Теперь все окна (а в будующем и все другие вьюверы) будут рисоваться собственным контекстом сцены. Прощай, многопоточность.

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