IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Ecran de veille, acces carte graphique


Sujet :

DirectX

  1. #1
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut Ecran de veille, acces carte graphique
    Bonjour,

    Voila j'ai fais un programme permet de générer automatiquement (toutes les minutes par exemple) des graphiques avec directx9. Ces graphiques sont sauvegardés sur le disque via D3DXSaveSurfaceToFile(...)
    Lorsque mon ecran passe en veille, tout mes graphiques deviennent noirs.
    Comment faire pour contourner ce problème ?
    Sortir de la veille, tracer, remettre la veille ?
    Je pense que les instructions ne sont pas du tout envoyées à la carte graphique qui doit être dans un mode deveille, est-ce cela ??
    Si quelqu'un a une solution simple...je suis preneur.

    Antoine.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faudrait que tu nous montre un peu de code, ou que tu nous décrives un peu plus en détail ta manière de procéder.

  3. #3
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Merci Loulou de ta réponse.

    L'application est réduite dans le systray tout le temps (c'est un multi document mfc).
    Ma façon de proceder, c'est comme pour du directx normal en c++

    Voila l'initialisation (j'ai taillé à la hache dedans, gestions erreurs etc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    m_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
     
    ZeroMemory(&m_PresentationParameters, sizeof(m_PresentationParameters) );
    m_PresentationParameters.Windowed = TRUE;
    m_PresentationParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
    m_PresentationParameters.BackBufferFormat = D3DFMT_X8R8G8B8;
    m_PresentationParameters.BackBufferWidth=m_BackBufferWidth;
    m_PresentationParameters.BackBufferHeight=m_BackBufferHeight;
    m_PresentationParameters.MultiSampleType=m_MultiSampleType;
    m_PresentationParameters.MultiSampleQuality=0;
     
    m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
    								m_DeviceType,
    								hWnd,
    								D3DCREATE_SOFTWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE,
    								&m_PresentationParameters, 
    								&m_pD3DDevice);
     
    m_pD3DDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&m_pBBSurface);
    Ensuite je fais un clear(),begin(), je texture des quads, je trace des lignes, affiche du texte, etc...rien de spécial à priori.
    Je termine par un end(),et ne present() pas car l'application est réduite (ca ne serta a rien).

    Pour enregistrer mon image j'utilise ce code (bien taillé encore):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    IDirect3DSurface9* pSurface=NULL;
    hRes=m_pD3DDevice->CreateOffscreenPlainSurface(m_Image[ImageId].Width,m_Image[ImageId].Height,
    											D3DFMT_X8R8G8B8,D3DPOOL_SCRATCH,&pSurface,NULL);
     
    // un calcul de SrcRect ici
     
    D3DXLoadSurfaceFromSurface(pSurface,NULL,NULL,m_pBBSurface,NULL,&SrcRect,D3DX_FILTER_NONE,0);	D3DXSaveSurfaceToFile(PathName,D3DXIFF_PNG,pSurface,NULL,NULL);
    Je ne copie pas tout le backbuffer car il me sert a tracer des images qui sont differentes en taille. Le backbuffer à la dimension de l'image de plus grande taille. Donc je ne copie que ce dont j'ai besoin dans la surface temporaire "pSurface" en D3DPOOL_SCRATCH.

    J'espère que c'est suffisant comme code.
    Je ne sais pas tellement comment peut fonctionner la carte graphique quand l'ecran est en veille.
    En tout cas :
    mode sans veille => beaux graphiques
    mode veille => les images générés sont noires

    Antoine.

  4. #4
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Je pense que c'est résolu. Le pool n'etait pas bon.
    Il etait en D3DPOOL_SCRATCH, je l'ai passé en D3DPOOL_SYSTEMMEM,
    et ca fonctionne bien !

    Quelqu'un sait pourquoi le Scratch ne fonctionne pas en mode veille ?

    Par contre, j'ai un thread qui accedait au device et j'avais de beaux warning en debug directx. J'ai donc ajouté le flag D3DCREATE_MULTITHREADED. Je ne pense pas que c'était cela qui coincait...hum...je vais remettre un D3DPOOL_SCRATCH pour en avoir le coeur nette.

    EDIT : en fait je n'arrive plus a reproduire ce phénomène .
    Je vais refaire des tests...

  5. #5
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Bon, j'ai resolu mon problème.

    J'ai pu reproduire le problème sur une veille Rage Fury 32Mo.
    A ce moment les fonctions CreateOffscreenPlainSurface et/ou D3DXSaveSurfaceToFile échoue avec un D3DERR_INVALIDCALL après un Reset sur le device. Je me suis apercu que c'est parceque les dimensions du backbuffer n'etait pas une puissance de deux (me demandez pas pourquoi...)

    Sur mon pc recent j'avais eu le problème une fois, certainement sur le D3DXSaveSurfaceToFile (je ne testais pas la valeur de retour ). Aucune idée de ce qui s'est passé cette fois.

    Bref tout fonctionne bien maintenant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/11/2009, 08h37
  2. Carte graphique pour deux ecrans
    Par Louis Griffont dans le forum Composants
    Réponses: 8
    Dernier message: 23/09/2008, 18h17
  3. Réponses: 1
    Dernier message: 02/07/2007, 18h37
  4. [Carte Graphique] Ecran Noir avec une Asus Extreme AX800/XL
    Par slowpoke dans le forum Composants
    Réponses: 2
    Dernier message: 06/10/2005, 18h45
  5. [DX 9][C++]Plein ecran + carte graphique
    Par delire8 dans le forum DirectX
    Réponses: 2
    Dernier message: 09/05/2003, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo