@@ -186,29 +186,83 @@ traite que les commandes de calcul et qu'une autre ne supporte que les commandes
186186
187187Nous devons analyser quelles queue families existent sur le système et lesquelles correspondent aux commandes que nous
188188souhaitons utiliser. Nous allons donc créer la fonction `findQueueFamilies` dans laquelle nous chercherons les
189- commandes nous intéressant. Nous allons commencer par ne chercher qu'une queue supportant les commandes graphiques, mais
190- nous étendrons cela plus tard dans le tutoriel.
189+ commandes nous intéressant.
191190
192- Cette fonction retournera les indices des queue families satisfaisant les propriétés que nous désirons. La meilleure
193- manière de faire cela est d'utiliser une structure dans laquelle les valeurs seront contenues dans des `std::optional`.
194- De cette manière il sera facile de voir quelles queues ont été trouvées.
191+ Nous allons chercher une queue qui supporte les commandes graphiques, la fonction pourrait ressembler à ça:
195192
196193```c++
197- struct QueueFamilyIndices {
198- std::optional<uint32_t> graphicsFamily;
194+ uint32_t findQueueFamilies(VkPhysicalDevice device) {
195+ // Code servant à trouver la famille de queue "graphique"
196+ }
197+ ```
199198
200- bool isComplete() {
201- return graphicsFamily.has_value();
202- }
199+ Mais dans un des prochains chapitres, nous allons avoir besoin d'une autre famille de queues, il est donc plus intéressant
200+ de s'y préparer dès maintenant en empactant plusieurs indices dans une structure:
201+
202+ ``` c++
203+ struct QueueFamilyIndices {
204+ uint32_t graphicsFamily;
203205};
206+
207+ QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device) {
208+ QueueFamilyIndices indices;
209+ // Code pour trouver les indices de familles à ajouter à la structure
210+ return indices
211+ }
212+ ```
213+
214+ Que se passe-t-il si une famille n'est pas disponible ? On pourrait lancer une exception dans `findQueueFamilies`,
215+ mais cette fonction n'est pas vraiment le bon endroit pour prendre des decisions concernant le choix du bon Device.
216+ Par exemple, on pourrait *préférer* des Devices avec une queue de transfert dédiée, sans toutefois le requérir.
217+ Par conséquent nous avons besoin d'indiquer si une certaine famille de queues à été trouvé.
218+
219+ Ce n'est pas très pratique d'utiliser une valeur magique pour indiquer la non-existence d'une famille, comme n'importe
220+ quelle valeur de `uint32_t` peut théoriquement être une valeur valide d'index de famille, incluant `0`.
221+ Heureusement, le C++17 introduit un type qui permet la distinction entre le cas où la valeur existe et celui
222+ où elle n'existe pas:
223+
224+ ```c++
225+ #include <optional>
226+
227+ ...
228+
229+ std::optional<uint32_t> graphicsFamily;
230+
231+ std::cout << std::boolalpha << graphicsFamily.has_value() << std::endl; // faux
232+
233+ graphicsFamily = 0;
234+
235+ std::cout << std::boolalpha << graphicsFamily.has_value() << std::endl; // vrai
204236```
205237
206- Il est nécessaire d'inclure ` optional ` . Nous pouvons dès maintenant implémenter ` findQueueFamilies ` :
238+ ` std::optional ` est un wrapper qui ne contient aucune valeur tant que vous ne lui en assignez pas une.
239+ Vous pouvez, quelque soit le moment, lui demander si il contient une valeur ou non en appelant sa fonction membre
240+ ` has_value() ` . On peut donc changer le code comme suit:
207241
208242``` c++
243+ #include < optional>
244+
245+ ...
246+
247+ struct QueueFamilyIndices {
248+ std::optional<uint32_t> graphicsFamily;
249+ };
250+
209251QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device) {
210252 QueueFamilyIndices indices;
211253
254+ // Assigne l'index aux familles qui ont pu être trouvées
255+
256+ return indices;
257+ }
258+ ```
259+
260+ On peut maintenant commencer à implémenter `findQueueFamilies`:
261+
262+ ```c++
263+ QueueFamilyIndices findQueueFamily(VkPhysicalDevice) {
264+ QueueFamilyIndices indices;
265+
212266 ...
213267
214268 return indices;
@@ -237,10 +291,6 @@ for (const auto& queueFamily : queueFamilies) {
237291 indices.graphicsFamily = i;
238292 }
239293
240- if (indices.isComplete()) {
241- break;
242- }
243-
244294 i++;
245295}
246296```
@@ -249,13 +299,47 @@ Nous pouvons maintenant utiliser cette fonction dans `isDeviceSuitable` pour s'a
249299recevoir les commandes que nous voulons lui envoyer :
250300
251301``` c++
302+ bool isDeviceSuitable (VkPhysicalDevice device) {
303+ QueueFamilyIndices indices = findQueueFamilies(device);
304+
305+ return indices.graphicsFamily.has_value();
306+ }
307+ ```
308+
309+ Pour que ce soit plus pratique, nous allons aussi ajouté une fonction générique à la structure:
310+
311+ ```c++
312+ struct QueueFamilyIndices {
313+ std::optional<uint32_t> graphicsFamily;
314+
315+ bool isComplete() {
316+ return graphicsFamily.has_value();
317+ }
318+ };
319+
320+ ...
321+
252322bool isDeviceSuitable(VkPhysicalDevice device) {
253323 QueueFamilyIndices indices = findQueueFamilies(device);
254324
255325 return indices.isComplete();
256326}
257327```
258328
329+ On peut également utiliser ceci pour sortitr plus tôt de ` findQueueFamilies ` :
330+
331+ ``` c++
332+ for (const auto & queueFamily : queueFamilies) {
333+ ...
334+
335+ if (indices.isComplete()) {
336+ break;
337+ }
338+
339+ i++;
340+ }
341+ ```
342+
259343Bien, c'est tout ce dont nous aurons besoin pour choisir le bon physical device! La prochaine étape est de [ créer un
260344logical device] ( !fr/Dessiner_un_triangle/Mise_en_place/Logical_device_et_queues ) pour créer une interface avec la carte.
261345
0 commit comments