D3D12: Что определяет обратный буфер цепочки обмена? - PullRequest
0 голосов
/ 27 октября 2019

У меня проблема с пониманием последовательности буферов обратной цепочки обмена при вызове IDXGISwapChain :: Present ().

В следующем уроке у него есть 2 буфера (двойная буферизация) в цепочке обмена,Объясняется, что когда вызывается IDXGISwapChain :: Present (), текущий передний буфер становится задним буфером, а текущий задний буфер становится передним буфером.

                          Present() called
Buffer[0] : Front Buffer      \  /         Buffer[0] : Back Buffer
                               \/
                               /\
Buffer[1] : Back Buffer       /  \         Buffer[1] : Front Buffer

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

Q1. Если я предполагаю, что в цепочке свопинга есть 3 буфера (тройная буферизация), какой из двух других буферов станет резервным буфером?

Согласно этой статье, порядок обратного буфера равен 0, 1, 2, 0, 1, 2 и так далее. И порядок определяется значением DXGI_PRESENT. http://milty.nl/grad_guide/basic_implementation/d3d12/rendering.html

Также в другой статье говорится: «При использовании перевернутой модели DXGI_SWAP_EFFECT_FLIP_DISCARD порядок обратного буфера не гарантируется последовательным. Метод IDXGISwapChain3 :: GetCurrentBackBufferIndex используется для получения индекса свопатекущий обратный буфер цепочки. "https://www.3dgep.com/learning-directx-12-1/

                           Present() called
Buffer[0] : Front Buffer         \  /        Buffer[0] : Buffer
                                  \/
Buffer[1] : Back Buffer          \/\         Buffer[1] : Front Buffer
                                 /\
Buffer[2] : Buffer              /  \         Buffer[2] : Back Buffer

Q2. Интересно, что определяет индекс заднего буфера?

Если задний буфер всегда является следующим индексом текущего индекса переднего буфера (если только следующий индекс буфера не превышает общее число буферов), проблем нет. Но, если следующий обратный буфер может быть случайным, кажется, что IDXGISwapChain3 :: GetCurrentBackBufferIndex () должен использоваться каждый раз для проверки того, какой буфер является текущим обратным буфером.

Q3. Всегда ли Buffer [0] является задним буфером в первый раз, когда еще не отображен передний буфер?

Добрые и подробные объяснения будут очень признательны.

...