Несколько контекст с другой версией - PullRequest
2 голосов
/ 21 сентября 2011

Я экспериментирую с разделением списка между несколькими контекстами OpenGL. Это отличная функция, так как она позволяет мне выполнять параллельные потоки рендеринга.

Но так как я использую CreateContextAttribs, я предлагаю возможность запросить конкретную реализацию OpenGL. Так что может случиться так, что один контекст реализует версию 3.2+, а другой - версию 2.1.

На самом деле работает довольно хорошо, но я подозреваю, что этот способ действия скрывает некоторые побочные эффекты. Каков будет список проблем, которые могут возникнуть при использовании контекстов, имеющих разные версии?

Помимо этого, я запрашиваю реализованные расширения для каждой версии контекста, поскольку полагаю, что разные версии могут поддерживать разные расширения, верно? А как насчет указателей на функции? Я должен запросить их для каждого контекста с другой версией (действительно, указатели меняются в зависимости от версии)?

1 Ответ

8 голосов
/ 21 сентября 2011

Это отличная функция, поскольку она позволяет мне выполнять параллельные потоки рендеринга.

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

Если вы хотите ускорить загрузку ресурсов, изучите буферные объекты и асинхронный доступ.Но избегайте одновременного выполнения нескольких контекстов OpenGL в отдельных потоках.


Но так как я использую CreateContextAttribs, я предлагаю возможность запросить конкретную реализацию OpenGL.Таким образом, может случиться так, что один контекст реализует версию 3.2+, в то время как другой реализует версию 2.1.

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

Это на самом деле очень хороший вопрос.И спецификация четко отвечает на это:

1) Can different GL context versions share data?

    PROPOSED: Yes, with restrictions as defined by the supported feature
    sets. For example, program and shader objects cannot be shared with
    OpenGL 1.x contexts, which do not support them.

    NOTE: When the new object model is introduced, sharing must be
    established at creation time, since the object handle namespace is
    also shared. wglShareLists would therefore fail if either context
    parameter to it were to be a context supporting the new object
    model.

Помимо этого, я запрашиваю реализованные расширения для каждой версии контекста, так как полагаю, что разные версии могут поддерживать разные расширения,это правильно?

Действительно, запрос набора поддерживаемых расширений для каждого контекста - это правильная вещь.

А как насчет указателей на функции?Я должен запросить их для каждого контекста с другой версией (действительно, указатели меняются в зависимости от версии)?

В Windows указатели на функции расширения связаны с контекстом.Разумный способ сделать это состоит в том, чтобы иметь

typedef struct OpenGLExtFunctions_S {
    GLvoid (*glFoobarEXT)(GLenum, ...);
    /* OpenGL function pointers */
} OpenGLExtFunctions;

/* currentContextFunction must be thread loacal since
   contexts are active in one thread only */
__declspec(thread) OpenGLExtFunctions *currentContextFunctions;

#define glFoobarEXT (currentContextFunctions->glFoobarEXT);
#define ...

и обернуть wglMakeCurrent и wglMakeContextCurrent некоторой вспомогательной функцией, которая устанавливает указатель currentContextFunctions на тот из контекста, который становится текущим.Библиотеки-обертки расширений, такие как GLEW, выполняют всю эту тяжелую работу за вас, поэтому вам не нужно беспокоиться о том, чтобы делать это самостоятельно.

В X11 / GLX все гораздо проще: указатели на функции, возвращаемые glXGetProcAddress, должныодинаково для всех контекстов, поэтому переключать их не нужно.

...