Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4ed54ab

Browse files
committed
Remove reference to nonexistent validation layer warning (fixes #250)
1 parent 883255b commit 4ed54ab

3 files changed

Lines changed: 17 additions & 20 deletions

File tree

en/03_Drawing_a_triangle/03_Drawing/02_Rendering_and_presentation.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -524,11 +524,12 @@ void drawFrame() {
524524

525525
The `vkWaitForFences` function takes an array of fences and waits for either any or all of them to be signaled before returning. The `VK_TRUE` we pass here indicates that we want to wait for all fences, but in the case of a single one it obviously doesn't matter. Just like `vkAcquireNextImageKHR` this function also takes a timeout. Unlike the semaphores, we manually need to restore the fence to the unsignaled state by resetting it with the `vkResetFences` call.
526526

527-
If you run the program now, you'll notice something something strange. The application no longer seems to be rendering anything. With validation layers enabled, you'll see the following message:
528-
529-
![](/images/unsubmitted_fence.png)
530-
531-
That means that we're waiting for a fence that has not been submitted. The problem here is that, by default, fences are created in the unsignaled state. That means that `vkWaitForFences` will wait forever if we haven't used the fence before. To solve that, we can change the fence creation to initialize it in the signaled state as if we had rendered an initial frame that finished:
527+
If you run the program now, you'll notice something something strange. The application
528+
no longer seems to be rendering anything. The problem is that we're waiting for a fence
529+
that has not been submitted. Fences are created in the unsignaled state by default,
530+
which means that `vkWaitForFences` will wait forever if we haven't used the fence
531+
before. To solve that, we can change the fence creation to initialize it in the
532+
signaled state as if we had rendered an initial frame that finished:
532533

533534
```c++
534535
void createSyncObjects() {

fr/03_Dessiner_un_triangle/03_Effectuer_le_rendu/02_Rendu_et_présentation.md

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ permettent d'attendre qu'une opération se termine en relayant un signal émis p
3636
l'origine du lancement de l'opération.
3737

3838
Ils ont cependant une différence : l'état d'une fence peut être accédé depuis le programme à l'aide de fonctions telles
39-
que `vkWaitForFences` alors que les sémaphores ne le permettent pas. Les fences sont généralement utilisées pour
39+
que `vkWaitForFences` alors que les sémaphores ne le permettent pas. Les fences sont généralement utilisées pour
4040
synchroniser votre programme avec les opérations alors que les sémaphores synchronisent les opérations entre elles. Nous
4141
voulons synchroniser les queues, les commandes d'affichage et la présentation, donc les sémaphores nous conviennent le
4242
mieux.
@@ -191,7 +191,7 @@ subpasses implicites.
191191
Il existe deux dépendances préexistantes capables de gérer les transitions au début et à la fin de la render pass. Le
192192
problème est que cette première dépendance ne s'exécute pas au bon moment. Elle part du principe que la transition de
193193
l'organisation de l'image doit être réalisée au début de la pipeline, mais dans notre programme l'image n'est pas encore
194-
acquise à ce moment! Il existe deux manières de régler ce problème. Nous pourrions changer `waitStages` pour
194+
acquise à ce moment! Il existe deux manières de régler ce problème. Nous pourrions changer `waitStages` pour
195195
`imageAvailableSemaphore` à `VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT` pour être sûrs que la pipeline ne commence pas avant
196196
que l'image ne soit acquise, mais nous perdrions en performance car les shaders travaillant sur les vertices n'ont pas
197197
besoin de l'image. Il faudrait faire quelque chose de plus subtil. Nous allons donc plutôt faire attendre la render
@@ -209,7 +209,7 @@ dependency.dstSubpass = 0;
209209

210210
Les deux premiers champs permettent de fournir l'indice de la subpasse d'origine et de la subpasse d'arrivée. La valeur
211211
particulière `VK_SUBPASS_EXTERNAL` réfère à la subpass implicite soit avant soit après la render pass, selon que
212-
cette valeur est indiquée dans respectivement `srcSubpass` ou `dstSubpass`. L'indice `0` correspond à notre
212+
cette valeur est indiquée dans respectivement `srcSubpass` ou `dstSubpass`. L'indice `0` correspond à notre
213213
seule et unique subpasse. La valeur fournie à `dstSubpass` doit toujours être supérieure à `srcSubpass` car sinon une
214214
boucle infinie peut apparaître (sauf si une des subpasse est `VK_SUBPASS_EXTERNAL`).
215215

@@ -311,7 +311,7 @@ void mainLoop() {
311311
}
312312
```
313313

314-
Vous pouvez également attendre la fin d'une opération quelconque depuis une queue spécifique à l'aide de la fonction
314+
Vous pouvez également attendre la fin d'une opération quelconque depuis une queue spécifique à l'aide de la fonction
315315
`vkQueueWaitIdle`. Ces fonction peuvent par ailleurs être utilisées pour réaliser une synchronisation très basique,
316316
mais très inefficace. Le programme devrait maintenant se terminer sans problème quand vous fermez la fenêtre.
317317

@@ -445,7 +445,7 @@ std::vector<VkFence> inFlightFences;
445445
size_t currentFrame = 0;
446446
```
447447

448-
J'ai choisi de créer les fences avec les sémaphores et de renommer la fonction `createSemaphores` en
448+
J'ai choisi de créer les fences avec les sémaphores et de renommer la fonction `createSemaphores` en
449449
`createSyncObjects` :
450450

451451
```c++
@@ -519,15 +519,11 @@ différence vu que nous n'avons qu'une seule fence. Comme la fonction `vkAcquire
519519
durée en argument, que nous ignorons. Nous devons ensuite réinitialiser les fences manuellement à l'aide d'un appel à
520520
la fonction `vkResetFences`.
521521

522-
Si vous lancez le programme maintenant vous allez constater un comportement étrange. Plus rien ne se passe. Encore
523-
une fois regardez ce que les validation layers vous fournissent comme informations :
524-
525-
![](/images/unsubmitted_fence.png)
526-
527-
Nous attendons qu'une fence soit signalée alors qu'elle n'a jamais été envoyée à aucune fonction. En effet les fences
528-
sont par défaut crées dans le mode non signalé. Comme nous appelons `vkWaitForFences` avant `vkQueueSubmit` notre
529-
première fence va créer une pause infinie. Pour empêcher cela nous devons initialiser les fences dans le mode signalé,
530-
et ce dès leur création :
522+
Si vous lancez le programme maintenant vous allez constater un comportement étrange. Plus rien ne se passe. Nous attendons qu'une fence soit signalée alors qu'elle n'a
523+
jamais été envoyée à aucune fonction. En effet les fences sont par défaut crées dans le
524+
mode non signalé. Comme nous appelons `vkWaitForFences` avant `vkQueueSubmit` notre
525+
première fence va créer une pause infinie. Pour empêcher cela nous devons initialiser
526+
les fences dans le mode signalé, et ce dès leur création :
531527

532528
```c++
533529
void createSyncObjects() {
@@ -569,7 +565,7 @@ void createSyncObjects() {
569565
}
570566
```
571567

572-
Initialement aucune frame n'utilise d'image, donc on peut explicitement l'initialiser à *pas de fence*. Maintenant, nous allons modifier
568+
Initialement aucune frame n'utilise d'image, donc on peut explicitement l'initialiser à *pas de fence*. Maintenant, nous allons modifier
573569
`drawFrame` pour attendre la fin de n'importe quelle frame qui serait en train d'utiliser l'image qu'on nous assigné pour la nouvelle frame.
574570

575571
```c++

images/unsubmitted_fence.png

-4.54 KB
Binary file not shown.

0 commit comments

Comments
 (0)