Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - lefta

Pages: [1] 2 Suivante »
1
Graphique / Contournement
« le: Juin 10, 2012, 07:38:36 pm »
Le problème, c'est que les derniers drivers à supporter ma carte graphique seront ceux de juin, et que ça va me bloquer au serveur X version 1.11.x (version actuelle : 1.12.x) et noyau version 3.2.x (version actuelle : 3.4.x). Donc retour à la case départ  :(

Merci quand même Laurent  ;)

EDIT : Alors là je ne comprends plus rien  :o :
J'ai rajouté mon instance de jeu en variable globale, je l'ai incluse dans mon fichier map.cpp, mais j'ai oublié de modifier mon code pour accéder à mon jeu via la variable, j'utilise toujours le code que j'ai posté. Et pourtant ça marche!?!?

EDIT 2 : Au cas où quelqu'un tomberait sur ce topic en cherchant une solution, J'ai (enfin) trouvé un moyen viable de contourner ce bug. Il suffit de forcer le rendu software. (Je me demande pourquoi je n'y ai pas pensé avant)
Celà peut être accompli de deux façons différentes :

1 - À chaque lancement, fonctionnera même s'il ne s'agit pas de votre application :
Dans un terminal rajouter LIBGL_ALWAYS_SOFTWARE=1 avant de lancer l'application, exemple :
LIBGL_ALWAYS_SOFTWARE=1 chemin/vers/l'application arguments

2 - S'il s'agit de votre application, vous pouvez rajouter au début de votre main :
char forceSoftwareRender[] = "LIBGL_ALWAYS_SOFTWARE=1";
putenv(forceSoftwareRender);

2
Testé avec les drivers proprio, ça fonctionne. Le problème vient bien des drivers... :(

3
Du style?
Je n'utilise que très peu de jeux sur mon pc, seulement Minecraft. Niveau applications, j'ai Gimp, LibreOffice Draw, et des applications "banales" (firefox, ...). Aucune forme de bug remarquée sur l'ensemble de mon système.

En vrac :
Config Gentoo x86_64
ATI Mobility radeon HD 4570
drivers radeon libres
mesa 8.0.2 drivers gallium
kernel 3.4.

Je ne vois pas quoi dire de plus, a part que j'ai été touché par le bug de quadrillage : http://fr.sfml-dev.org/forums/index.php?topic=8131.0

Si tu veux autre chose, n'hésite pas à demander :)

4
J'ai déja évoqué cette possibilité dans mon premier post. Depuis le début j'ai l'intuition que le driver est en cause, mais encore une fois, je n'ai pas les connaissances pour l'affirmer. Surtout que seules les cartes ATI chipset r600 config 64 bits semblent être touchées (cf lien du premier post).

5
Je crée une fenêtre de rendu dans le constructeur de la classe Game. A l'intérieur du jeu, j'appelle ma classe Map pour créer le rendu du jeu, en lui passant en paramètre le pointeur this. Ma carte calcule le rendu et appelle Game::afficherSprite() pour afficher le sprite, via le pointeur this. Ma classe Game execute donc fenêtreDeRendu.draw(sprite) pour afficher le sprite à l'écran.

Avant, mon instance de Game était une variable globale, pour tester, et afficherSprite était appelé directement grace à cette variable (jeu.afficherSprite). Le rendu s'affichait correctement. Maintenant, avec l'appel via le pointeur, j'obtiens le même bug qu'avec deux fenêtres.
De plus, j'obtiens le même message que précédemment : texture bo too small.

PS : L'exemple des shaders me crée ce bug (j'ai pas vérifié le message d'erreur) : la coccinelle s'affiche et se pixelise correctement, mais la barre en bas ne s'affiche pas correctement.

En espérant avoir été plus clair  :)

6
J'ai eu le même problème. N'ayant trouvé aucun moyen de le résoudre, j'ai finalement décidé de passer à SFML 2. Depuis, je n'ai plus ce souci.
Désolé, ce n'est pas la réponse que tu attends, mais voilà pour mon expérience personnelle.
En espérant que tu trouves une autre solution...  ;)

7
Du neuf : j'obtiens le même bug en affichant en direction d'un pointeur, avec une seule fenêtre :

Game::Game() : fenetreDeRendu(sf::VideoMode(800,600),"Version debug de la légende éternelle")
...

void Game::inGame()
{
...
testMap.creerRendu(this);
...
}

void Game::afficherSprite(sf::Sprite& sprite)
{
    fenetreDeRendu.draw(sprite);
}

void Map::creerRendu(Game* parent)
{
...
parent->afficherSprite(fichiersDeTiles[nbTileset]);  //fichierDeTiles est un sf::Sprite
...
}

Comment gères-tu le multi-fenêtrage? (Je ne pense pas que ça me serve directement  ;D)
Est-ce lié? (sûrement)
Cela peut-il t'aider à cerner le problème?

8
Non, le seul message que j'obtenais est celui que j'ai déja décrit. En plus, j'ai modifié le kernel pour désactiver la vérification entraînant l'erreur, des fois qu'il s'agisse d'un faux positif.
Tu as une idée? Peut-être le driver attribue-t-il l'image à la dernière fenêtre créée, ou un truc du style? C'est juste une idée, je ne suis pas dev de librairies et encore moins de drivers, et je ne sais pas exactement comment ça se passe en interne :)

EDIT :
Un bout de code qui va plus ou moin dans mon sens :
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");

    sf::Texture texture;
    if (!texture.loadFromFile("cb.bmp"))
        return EXIT_FAILURE;
    sf::Sprite sprite(texture);

    sf::RenderWindow Bug(sf::VideoMode(800, 600), "SFML bugging window", sf::Style::Default, sf::ContextSettings(32));

    sf::Texture texture2;
    if (!texture2.loadFromFile("blender.png"))
        return 1;
    sf::Sprite sprite2(texture2);

    while (App.isOpen()||Bug.isOpen())
    {
        sf::Event event2;
        sf::Event event;
        while (App.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                App.close();
            }
        }

        while (Bug.pollEvent(event2))
        {
            if(event2.type == sf::Event::Closed)
            {
                Bug.close();
            }
        }

        Bug.clear();
        App.clear();

        Bug.draw(sprite);
        App.draw(sprite);

        Bug.display();
        App.display();
    }
    return EXIT_SUCCESS;
}
 

Avec ce code, App affiche l'image ce Code::Blocks, mais Bug affiche l'image de blender, rayée horizontalement un pixel sur deux, à la bonne taille mais uniquement dans le carré réservé à l'image de Code::Blocks.
Euh... hésite pas à demander un screenshot  ;D

De plus, si je charge cb.bmp dans texture2, j'obtiens le bon rendu  :o

9
Etrange tu dis? Alors écoute (euh... lis  ;D ) :
En chargeant deux fois la texture en mémoire ça peut fonctionner, à condition de :
- ouvrir la première fenêtre
- charger l'image liée
- ouvrir la deuxième fenêtre
- charger l'image de la deuxième fenêtre

En effet, si je charge les deux fenêtres puis les deux images, j'obtiens le même bug qu'au début, l'image ne s'affiche pas dans la première fenêtre créée.  :o

10
Ça c'est ma spécialité : poser le problème ou trouver le bug à la con auquel personne n'a réponse  ;D

11
Je viens de trouver un moyen de contourner le problème : il suffit de lancer la deuxième fenêtre dans un thread.
Un code d'exemple :
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

void fenetreBug()
{
    sf::RenderWindow Bug(sf::VideoMode(800, 600), "SFML bugging window");

    sf::Texture texture;
    if (!texture.loadFromFile("cb.bmp"))
        return;
    sf::Sprite sprite(texture);

    while (Bug.isOpen())
    {
        sf::Event event;
        while (Bug.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                Bug.close();
            }
        }
        Bug.clear();
        Bug.draw(sprite);
        Bug.display();
    }
}

int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");

    sf::Texture texture;
    if (!texture.loadFromFile("cb.bmp"))
        return EXIT_FAILURE;
    sf::Sprite sprite(texture);

    sf::Thread thread(&fenetreBug);
    thread.launch();

    while (App.isOpen())
    {
        sf::Event event;
        while (App.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                thread.wait();
                App.close();
            }
        }

        App.clear();
        App.draw(sprite);
        App.display();
    }
    return EXIT_SUCCESS;
}
 

Je ne connais toujours pas la source du problème, mais maintenant, Laurent pourra se concentrer sur d'autres bugs avant de se pencher sur celui là :)

12
Si ça peut avoir un rapport, j'ai une ati mobility radeon hd 4570  :)

EDIT : /var/log/Xorg.0.log :
[  3117.824] (II) RADEON(0): EDID vendor "AUO", prod id 4333
[  3117.824] (II) RADEON(0): Printing DDC gathered Modelines:
[  3117.824] (II) RADEON(0): Modeline "1920x1080"x0.0  134.40  1920 1950 1970 1982  1080 1090 1100 1130 +hsync -vsync (67.8 kHz eP)
 

EDIT 2 : C'est au moment du draw() que le bug se présente. Commenter Bug.draw() "supprime" le bug :)

EDIT 3 : J'ai supprimé la vérification entraînant le message d'erreur dans les sources du kernel, j'obtient un affichage presque noir avec quelque lignes bleues, pas du tout mon image. J'ai donc deux hypothèses :
- Le noyau linux n'arrive pas à gérer la deuxième fenêtre correctement
- SFML fait une erreur en passant la deuxième image au driver

Ce qui me donne une idée : est-ce que cela fonctionnera si la deuxième fenetre est dans un autre thread?

13
Alors Laurent, tu as du nouveau? Tu as réussi à reproduire le bug ou pas?  :)

14
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow Bug(sf::VideoMode(800, 600), "SFML bugging window");
    sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");

    sf::Texture texture;
    if (!texture.loadFromFile("cb.bmp"))
        return EXIT_FAILURE;
    sf::Sprite sprite(texture);

    while (App.isOpen())
    {
        sf::Event event;
        sf::Event event2;
        while (App.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                Bug.close();
                App.close();
            }
        }

        while (Bug.pollEvent(event2))
        {
            if(event2.type == sf::Event::Closed)
            {
                Bug.close();
                App.close();
            }
        }


        Bug.clear();
        App.clear();

        Bug.draw(sprite);
        App.draw(sprite);

        Bug.display();
        App.display();
    }
    return EXIT_SUCCESS;
}
 

PS : J'ai une machine virtuelle windows XP, dans laquelle ça ne fonctionne qu'à moitié : le deuxième contrôle est rafraichi, mais plutôt que d'afficher les tiles de ma map, ça affiche des carrés blancs. Mais s'il s'agit d'un bug du driver, il se peut que la VM en hérite non?

15
Idem, ça m'aurait étonné que ça change quoi que ce soit de toutes façons  :(

Pages: [1] 2 Suivante »
anything