Синхронизация с ограждением

У меня неправильное понимание использования функции glClientWaitSync.

Признайтесь, я использую что-то вроде этого:

glDraw(...);
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glDraw(...);
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000);
glDeleteSync(sync);

Если я хорошо понимаю OpenGL Wiki, у нас есть два случая

Первый случай: OpenGL 4.5: В этом случае после glClientWaitSync мы уверены, что выполняется только первая отрисовка, потому что в вики написано:

В OpenGL 4.5 этот сброс сделан специальным. Если вы ожидаете этого конкретного объекта синхронизации впервые и ожидание происходит в том же контексте, в котором был создан объект синхронизации, сброс будет вести себя так, как если бы вы инициировали его сразу после объекта синхронизации. Поэтому, если вы ввели другие команды OpenGL после создания объекта синхронизации, они не будут сброшены.

Второй случай: OpenGL 4.4 или ниже: мы уверены, что оба отрисовки выполняются, потому что эта функция имеет «глобально» то же поведение, что и функция glFlush? Идя таким образом, как на самом деле использовать постоянное отображение с использованием циклического перебора с OpenGL 4.4, если весь командный буфер сброшен?


person Antoine Morrier    schedule 01.09.2016    source источник


Ответы (1)


"Сброс" не означает "завершено". Это просто означает, что «в конечном итоге будет выполняться графическим процессором без дальнейших вызовов OpenGL».

Поведение 4.4 сбрасывает все до команды glClientWaitSync. Поведение 4.5 будет сбрасывать все только до вызова glFenceSync включительно.

Но в обоих случаях, если glClientWaitSync возвращается без тайм-аута или ошибки, единственное, что вы знаете о состоянии графического процессора, это то, что все команды до вызова glFenceSync были завершены.

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

Если вы просто хотите сбросить синхронизацию забора, то это то, что вам нужно сделать в версии 4.4. То есть glFlush сразу после создания забора, но не сбрасывать при использовании glClientWaitSync. Это даст вам эффект поведения 4.5.

person Nicol Bolas    schedule 01.09.2016
comment
Итак, если я правильно понял, выполнение сброса в моде 4.4 гарантирует, что все команды до забора будут завершены, а какие после - начнутся? В версии 4.5 последующие не обязательно начинать? - person Antoine Morrier; 02.09.2016