2016-07-29 12 views
4

Я реализую некоторые функции, которые требуют от меня реализовать API, чтобы дождаться завершения d3d10. В основном я пытаюсь реализовать синхронизацию доступа к общей текстуре, чтобы я мог обновить текстура после того, как d3d10 успешно может подавать на бэкбуффер. Называя этот черный ящик api, я думаю, что это может быть достигнуто, и я думаю, что это будет нечто похожее на glfinish(). Я читал, что мы можем использовать запросы ID3D10Query для реализации синхронизации доступа.Внедрить API, чтобы ждать завершения команд d3d10

D3D10_QUERY_DESC queryDesc; 

    ... // Fill out queryDesc structure 

    ID3D10Query * pQuery; 
    pDevice->CreateQuery(&queryDesc, &pQuery); 

    pQuery->Begin(); 

    ... // Issue graphis commands, do whatever 

    pQuery->End(); 

    UINT64 queryData; // This data type is different depending on the query type 

    while(S_OK != pQuery->GetData(&queryData, sizeof(UINT64), 0)) 
    { 
    } 

Должен ли я помещать некоторую фиктивную команду между началом и концом? так как я хочу раскрывать эту функциональность, как открытый API, что-то названо waitforgraphiscompletion

что должно быть фиктивной командой здесь?

ответ

2

Если вы пытаетесь синхронизировать выполнение CPU и GPU в OpenGL, вы должны использовать glFenceSync, а затем glClientWaitSync. Эквиваленты в Direct 10 равны ID3D10Asynchronous::End и ID3D10Asynchronous::GetData (обратите внимание, что в DX11 интерфейсы немного отличаются). Они сообщают вам, когда графический процессор завершил обработку командного буфера до определенной точки. Это позволяет узнать, когда завершились предыдущие операции чтения/записи на ресурсе, и ЦП может безопасно получить доступ к ресурсу без дополнительной синхронизации.

Вы не обязаны вводить какие-либо команды в цикл while. Буфер команды в конечном итоге обработает ваш запрос и вернет S_OK (или сообщение об ошибке, которое вы, возможно, захотите обработать). Однако это несколько расточительно, так как процессор просто запустит ожидающий GPU, поэтому, если это возможно, вы должны сделать дополнительную полезную работу в цикле.

Примечание: если вы использовали D3D10_ASYNC_GETDATA_DONOTFLUSH в качестве окончательного параметра для GetData (вместо '0'), то выше не было бы случая - нет гарантии, что командный буфер будет автоматически запускаться, и вы можете заканчиваются бесконечным циклом (и, как таковое, не рекомендуемое использование).

+0

спасибо, что это имеет смысл для меня. У меня есть один или два вопроса. Как glfinish отличается от glFenceSync, за которым следует glClientWaitSync? Что касается D3D10, это просто означает, что мне просто нужно называть конец ID3D10Query (это означает, что нет начала), и он будет ждать выполнения всей команды на устройстве, с которого был создан ID3D10Query? –

+0

glFinish будет ждать завершения всех операций OpenGL, включая запись в фреймбуфер. glClientWaitSync не гарантирует этого, это только гарантирует, что любые команды GL, выпущенные до завершения glFenceSync. Обычно это не обязательно, если вы хотите синхронизировать доступ к определенной текстуре, как вы должны знать, когда она считывается/записывается из вашего собственного кода рендеринга. – MuertoExcobito

+0

Хм получилось спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^