Bonjour,
Dans la SFML 2.0 RC j'ai eu un problème avec les sf::Textures sur ma carte ATI.
J'avais déjà parlé d'un problème avec les sf::ConvexShape.
J'ai maintenant la raison de "pourquoi ça fonctionnait sur la 1.6 et ne fonctionne plus sur la 2.0 !"
Les sf::Shape de la 1.6 étaient fait uniquement par des points et des couleurs. Les sf::ConvexShape de la 2.0 utilisent des sf::Texture.
A partir d'ici vous pouvez quasiment zapper le message et passer au suivant, je me rends compte que j'ai dit un truc parfaitement inutile et que le message suivant corrige, en apportant un code minimal. (Vous pouvez toujours télécharger la comparaison de rendu d'image entre les 2 cartes de ce post pour avoir une idée plus précise du bug)Dans je ne sais quelle condition, je n'arrive pas a utiliser correctement les sf::Texture sur ma carte ATI.
J'ai testé dans une fenêtre SFML seule, ça a l'air de marcher.
Dans un QSFMLCanvas ça a l'air de marcher (sauf que pour la version nightly fait rajouter XInitThread dans le main.cpp sinon ça le programme crash).
Moi je suis dans le cas où justement j'utilise un QSFMLCanvas.
J'ai un QWidget de base, qui contient un menu (Type Fichier, Édition, etc..) et j'ai juste en dessous un rendu SFML. (Si le QWidget ne contient rien, a priori tout fonctionne dans la SFML)
Maintenant, j'ai 2 jeux différents, qui utilisent le même système de fenêtre avec une menu sur le QWidget, et le rendu SFML en dessous.
Sur ces 2 jeux, j'ai le problème suivant: Les sf::Texture ont des bugs.
Dans le premier jeu, le problème a l'air de se limiter aux textures générées à partir de sf::Image, et donc mes sf::ConvexShape. C'est comme ça que je génère mes dégradés, et a priori il y a un conflit quelque part avec Qt puisque les textures sont bugguées.
Dans un second jeu, toutes les sf::Texture que je charge sur la carte ATI sont buguées. (Je n'ai pas de problèmes sur la carte Nvidia, les pilotes Nvidia doivent s'occuper eux même du problème)
J'ai donc modifié le code du jeu, et essayé la chose suivante: Charger une sf::Image. La sauvegarder sur le disque dur. La convertir en sf::Texture, et sauvegarder la sf::Texture sur le disque dur.
Résultat: Sur la carte Nvidia, tout fonctionne correctement en jeu, et les images de sorties sont intactes.
Sur la carte ATI, le jeu est entièrement buggué, les images provenant des sf::Images sont intactes, et les images provenant des sf::Textures sont bugguées.
Je vous ai fait une archive contenant les images sauvées sur le disque dur pour chaque carte graphiques.
Elles sont de tailles différentes, et donc ce n'est pas un type d'image qui bug, c'est bien toutes les textures.
L'archive:
http://s2.smglive.org/SFML/Test.7zLes images en _Img sont les sf::Image qui ont été chargé depuis le disque dur et sauvés directement.
Les images en _Tex sont les sf::Texture qui ont été sauvées sur le disque dur.
→ Charger une sf::Texture depuis le disque dur, ou charger une sf::Image et la convertir en sf::Texture ensuite fait le même résultat.
Je pense a un bug mémoire où quelque chose du genre parce que les _Tex de la carte ATI changent à chaque fois de tête.
ici on reconnais encore par endroit des fragments de l'image originale.
Si j'avais lancé un autre jeu avant (SFML ou pas) j'aurais eu des fragments de cet autre jeu.
Si j'avais tapé dans mon shell de GNOME3 avant, j'aurais eu des fragments de mes raccourcis de mon shell GNOME3.
J'ai fait un test du programme donc, depuis l'ordi avec la carte ATI, qui lance le jeu par SSH sur un ordi avec une carte Nvidia. Résultat: Le jeu s'affiche correctement sur le client avec la carte ATI. (avec quelques lenteurs dues au SSH)
Le problème n'est donc pas de l'affichage, mais du calcul des textures par la SFML.
Je dois faire une présentation pour mon TPE (pour mon bac), et j'ai codé exprès un logiciel pour faire de meilleures diapo qu'un simple PowerPoint, et il utilise la SFML avec Qt.
Je l'ai développé sur ma tour avec carte Nvidia, et surprise pour ma carte ATI....
Au début, je pensais que c'était uniquement ma carte qui bugguait avec les pilotes Linux. (Proprio, et je les ai mis a jour en version 13.1 hier j'ai la même chose).
Ma carte est une Mobility Radeon HD 4470.
Et en fait non, j'ai testé sur 7 ordis avec tous une carte ATI différente, et j'ai le même résultat partout.
J'ai testé sur:
Ubuntu 12.04 LTS
Ubuntu 12.10
Windows Xp
Windows 7
Et j'ai testé généralement un Windows et un Linux pour chaque ordi.
J'ai pareil, ou presque. Sur Linux, j'ai une image totalement bugguée qui s'affiche. Sur Windows, je n'ai pas d'image du tout, j'ai "rien" qui s'affiche.
En dehors des sf::Texture, tous les autres objets graphiques fonctionnent correctement.
→ Je le dit au passage, malgré que j'ai mis XInitThreads dans le main.cpp sans quoi le jeu crash, il arrive qu'il crash encore de temps en temps avec ça. Exemple, le second jeu que j'ai voulu testé, je n'ai pas pu le démarrer sur le serveur SSH a cause de cette erreur, tant qu'il n'y a que l'interface Qt tout va bien, mais dès que le QSFMLCanvas démarre j'ai cette erreur:
Xlib: sequence lost (0x10053 > 0x56) in reply type 0x0!
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
SMG_RPG: ../../src/xcb_io.c :178 : dequeue_pending_request: l'assertion « !xcb_xlib_unknown_req_in_deq » a échoué.
./Start.sh : ligne 3 : 3546 Abandon (core dumped) ./SMG_RPG
Erreur que j'avais de temps en temps avec la SFML 2.0 rc (pas nightly) et que j'ai aussi sur carte Nvidia.
Donc je pense que le "fameux bug" graphique est du a un problème d'intégration entre la SFML et Qt. (Ils doivent s’emmêler les pinceaux ou le genre..)
Voilà, je termine de reproduire le bug mais actuellement la seule différence entre la version qui marche et celle qui bug c'est l'intégration avec Qt.
→ Sur la version Windows par contre, j'avais carrément des crash graphiques et impossible de démarrer la SFML en tant que QSFMLCanvas dans Qt, donc mes tests sur Windows ont été en tant que QSFMLCanvas mais en dehors d'un autre QWidget.
Faudrait donc creuser de ce coté là. Le QSFMLCanva utilisé est celui de la 1.6 modifié pour appeler les fonctions de la 2.0 (changement de casse des noms de fonction) a partir de là j'espère que vous pourrez m'aider, je peux faire des tests, modifier les QSFMLCanva et au besoin aller directement modifier dans les fichiers de la SFML (et recompiler) pour trouver d'où ça viens

Je suis là toute la semaine (vacances solaires) et j'espère qu'on aura trouvé une solution pour le Lundi 11, si d'ici là c'est pas trouvé je m'arrangerait autrement bien sûr, mais avoir des jeux qui marchent sur carte ATI ça serait nickel.
→ Si vous connaissez "M.A.R.S a ridiculous shooter" qui est un jeu développé avec la SFML 2.0. Je l'ai testé sur la carte ATI il y a 5min pour voir, et il ne bug absolument pas. Il utilise uniquement la SFML sans Qt. Donc le bug doit vraiment provenir de l'intégration de la SFML dans Qt.
Merci

PS: Désolé pour la taille du post, je ne sais pas trop faire court pour expliquer un truc.