J’ai pensé, pendant très longtemps, qu’il y avait un mécanisme de bouton d’arrêt sur le pipeline de pixels. Le cas d’utilisation est le suivant :
- vous modifiez un paramètre de module,
- les aperçus (celui de la chambre noire central et la vignette dans le panneau de gauche, également utilisé pour l’histogramme et les sélecteurs de couleurs) reconstruisent leur pipeline pour tenir compte de ce changement,
- l’un des aperçus finit de se rendre avant l’autre, et le résultat n’est évidemment pas celui que vous vouliez,
- vous modifiez à nouveau le paramètre du module, sans attendre la fin de la recomputation.
Dans ce cas, vous souhaitez annuler tous les pipelines actifs car leur résultat ne sera pas utilisé, et commencer immédiatement à tout recalculer avec les nouveaux paramètres. Sauf que Darktable ne fait pas ça, il laisse le pipeline se terminer avant de le redémarrer, et en regardant les commentaires dans le code source, il semble que ce soit une régression assez récente et non le comportement initialement prévu.
J’ai (re)implémenté cette fonction dans Ansel, mais c’est délicat car nous avons affaire à différents threads (GUI, historique d’édition et pipeline sur CPU/OpenCL) et nous devons les synchroniser correctement.
Si cela tourne mal, vous risquez de rencontrer des aperçus déformés à cause d’états de cache incohérents. C’est uniquement un problème de GUI, et la stratégie d’atténuation consiste à aller dans le menu global -> Exécuter -> Invalider tous les caches.
Pour déboguer, vous pouvez démarrer Ansel avec :
1$ ansel -d perf
Lorsque vous interagissez avec les curseurs et les comboboxes dans le GUI (par exemple ici dans le module d’exposition), vous obtiendrez :
1100,407003 [dev_process_all] envoyer un signal d'arrêt sur les pipelines en cours a pris 0,000 secondes (0,000 CPU)
2100,509816 [dev_pixelpipe] a pris 0,011 secondes (0,023 CPU) traité `exposition` sur le GPU, mélangé sur le GPU [complet]
3100,510498 [dev_pixelpipe] a pris 0,019 secondes (0,035 CPU) traité `exposition` sur le GPU, mélangé sur le GPU [aperçu]
4100,533228 [dev_pixelpipe] a pris 0,023 secondes (0,061 CPU) traité `correction de l'objectif` sur le GPU, mélangé sur le GPU [complet]
5100,558939 [dev_pixelpipe] a pris 0,026 secondes (0,129 CPU) traité `équaliseur de tonalité` sur le CPU, mélangé sur le CPU [complet]
6100,563703 [dev_pixelpipe] a pris 0,005 secondes (0,008 CPU) traité `profil d'entrée en surbrillance` sur le GPU, mélangé sur le GPU [complet]
7...
Le comportement normal est que la ligne [dev_process_all] envoyer un signal d'arrêt
devrait apparaître au moment de votre interaction, et devrait être suivie par une recomputation commençant au module avec lequel vous avez interagi (pas celui d’avant, pas celui d’après), jusqu’à la fin (module d’encodage d’affichage).
Translated from English by : Aurélien Pierre, ChatGPT. In case of conflict, inconsistency or error, the English version shall prevail.