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

Windows Discussion :

Taille totale de la mémoire vidéo


Sujet :

Windows

  1. #1
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut Taille totale de la mémoire vidéo
    Bonjour,

    Pour les besoins personnel d'un projet, je souhaiterai pouvoir récupérer la taille totale de la mémoire vidéo de ma carte graphique sous Windows en C++. Comment puis-je m'y prendre ? Merci d'avance pour votre aide.


    Nico.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    -> GetAvailableVidMem() dans l'interface DirectDraw.

    Il y a certainement d'autres façons de le faire mais personnellement je ne connais que celle-là.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Après trouvé un morceau de code sur le net, j'ai compilé et exécuté mon programme sous Code::Blocks. Par contre, je rencontre un problème : l'exécutable plante lorsque je le lance et j'obtiens la traditionnelle popup windows XP me proposant d'envoyer l'erreur à Microsoft. En analysant plus finement le problème, je me suis aperçu que le plantage est provoqué par l'appel à la fonction 'QueryInterface'. Voici le code du programme :

    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
    #include <cstdio>
    #include <windows.h>
    #include <ddraw.h>
    
    
    int main()
    {
            DWORD dwTotal, dwFree;
            DDSCAPS2 ddscaps;
            ddscaps.dwCaps = DDSCAPS_VIDEOMEMORY;
            LPDIRECTDRAW7 lpDD;
    
            lpDD->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpDD);
    }
    Pour information, je linke le programme avec les bibliothèques ddraw et dxguid. Savez-vous pourquoi le programme plante et comment je peux éviter cela ?
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    C'est pourtant simple: le pointeur lpDD n'est pas initialisé avant utilisation dans ton code !!

    Essaie plutôt ça, ça devrait faire moins mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DirectDrawCreateEx(0, (LPVOID*) &lpDD), IID_IDirectDraw7, 0);
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  5. #5
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Bon j'ai rajouté le bout de code pour l'initialisation du pointeur mais j'ai un autre problème. Lorsque je compile le code, j'obtiens cette erreur-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    undefined reference to `DirectDrawCreateEx@16'
    Pourtant j'ai bien inclu le fichier 'ddraw.h' et j'ai linké avec la bibliothèque 'ddraw.lib' ...
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    undefined reference to `DirectDrawCreateEx@16'
    Une erreur de linkage donc.

    Quel compilo et quel SDK utilises-tu ?
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  7. #7
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    J'utilise Code::Blocks sous Windows avec gcc. En ce qui concerne DirectX, c'est la version 9.0c que j'utilise avec le SDK 9.0.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    J'utilise Code::Blocks sous Windows avec gcc. En ce qui concerne DirectX, c'est la version 9.0c que j'utilise avec le SDK 9.0.
    Je ne vois pas trop quel est le problème.

    J'utilise moi aussi le SDK 9.0 (update summer 2003), et ça marche parfaitement, je viens de revérifier.
    Petite précision : je suis sous Visual C/C++ 6/7/8.

    Mais DirectDrawCreateEx() se trouve dans ddraw.lib, c'est-à-dire bien dans le SDK DirectX et non dans celui du compilateur, donc ça ne devrait pas faire de différence avec GCC.

    Je ne peux que te suggérer de revérifiez la config de ton projet... Désolé !
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Ca devrait pouvoir marcher avec DirectDrawCreateEx(),
    mais au pire, si tu es vraiment coincé, tu peux peut-être essayer avec DirectDrawCreate() puis QueryInterface(), sait-on jamais...
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  10. #10
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Bon beh code::blocks c'est pas si bien que ça en fait . Ya un super menu pour ajouter une par une les biliothèques et ca fonctionne pas. Donc j'ai dû me servir du menu d'à côté pour passer les paramètres à la mano '-ldxguid -lddraw'. No comment .

    Bref, j'ai enfin réussi à compiler le programme et j'ai trouvé un peu de chose près la même quantité de mémoire vidéo qu'en réalité.

    Par contre, j'ai la nette impression que le morceau de code que j'ai posté précédemment avec la constante 'IID_IDirectDraw7' ne soit pas compatible avec les anciennes versions de DirectX. Existe-t-il un moyen de pallier à cela ?
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    Par contre, j'ai la nette impression que le morceau de code que j'ai posté précédemment avec la constante 'IID_IDirectDraw7' ne soit pas compatible avec les anciennes versions de DirectX. Existe-t-il un moyen de pallier à cela ?
    Quel code au juste, et en es-tu bien sûr ?

    Et si c'était le cas, serait-ce si grave ?
    Si je ne m'abuse DX7 est intégré à WinMe, DX8 à Win2K, DX9 à WinXP et ... DX6 à Win98 SE
    Mais bon, tu connais beaucoup de gens qui sont encore sous Win95/98 et qui utilisent DX 3/5 ou 6 ?

    Sinon tu peux essayer de retrouver un SDK DX6 sur le net pour voir s'il n'y aurait pas une fonction équivalente dans DirectDraw6, mais bon courage...
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  12. #12
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par rigobert
    Quel code au juste, et en es-tu bien sûr ?
    Je parle du code que j'ai posté au début de la discussion.

    Citation Envoyé par rigobert
    Et si c'était le cas, serait-ce si grave ?
    Si je ne m'abuse DX7 est intégré à WinMe, DX8 à Win2K, DX9 à WinXP et ... DX6 à Win98 SE
    Mais bon, tu connais beaucoup de gens qui sont encore sous Win95/98 et qui utilisent DX 3/5 ou 6 ?

    Sinon tu peux essayer de retrouver un SDK DX6 sur le net pour voir s'il n'y aurait pas une fonction équivalente dans DirectDraw6, mais bon courage...
    Je ne connais pas beaucoup de personnes qui utilisent Win9x mais j'en connais quand même. Je trouve ca vraiment dommage de devoir obliger à installer le dernier SDK pour devoir compiler un programme aussi simple.
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par nicolas66
    Je trouve ca vraiment dommage de devoir obliger à installer le dernier SDK pour devoir compiler un programme aussi simple.
    Euh, DirectX 7 date de 1999, ce qui lui fait 7 ans d'âge maintenant. A l'échelle informatique, c'est déjà très ancien. Et on est aussi très loin du dernier SDK (qui lui-même date de 2003 si je ne m'abuse) !!

    Par ailleurs, être encore sous Win9x à l'heure actuelle ne signifie pas forcément qu'on n'a pas au moins DirectX 7 installé. De toute façon, avant Win 98 SE, DirectX n'était pas inclus, il fallait l'installer en plus.

    Sinon, je suis retombé (presque) par hasard sur une vieille doc de DirectX 6.1 et il s'avère que c'est possible, avec l'interface IDirectDraw4, d'obtenir les infos dont tu as besoin, en utilisant soit la fonction GetAvailableVidMem(), soit GetCaps() qui prend en argument une structure DDCAPS :

    DDCAPS
    The DDCAPS structure represents the capabilities of the hardware exposed through the DirectDraw object. This structure is used with the IDirectDraw4::GetCaps method.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _DDCAPS { 
        ...
        DWORD    dwVidMemTotal;           // total video memory
        DWORD    dwVidMemFree;            // total free video memory
        ...
    } DDCAPS,FAR* LPDDCAPS;
    dwVidMemTotal
    Total amount of display memory on the device, in bytes, less memory reserved for the primary surface and any private data structures reserved by the driver. (This value is the same as the total video memory reported by the IDirectDraw4::GetAvailableVidMem method.)

    dwVidMemFree
    Free display memory. This value equals the value in dwVidMemTotal, less any memory currently allocated by the application for surfaces. Unlike the GetAvailableVidMem method, which reports the memory available for a particular type of surface (like a texture), this value reflects the memory available for any type of surface.
    Voilà, j'espère que tu pourras t'en sortir avec ça.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  14. #14
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    En fait je crois que jvais pas trop me casser la tête et prendre le premier morceau de code. Merci pour tes conseils en tout cas
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/10/2014, 18h53
  2. Taille totale
    Par djunityfr dans le forum Linux
    Réponses: 2
    Dernier message: 26/03/2006, 10h52
  3. Mémoire vidéo (texte)
    Par julson dans le forum Assembleur
    Réponses: 17
    Dernier message: 20/04/2005, 12h31
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20

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