Grafikkartenenumerationsdialog



  • Hallo.

    Ich will mir einen Grafikkartenenumerationsdialog schreiben, also einen Dialog, der zum Anfang meiner Anwendung aufgeblendet wird, in der man die Grafikkarte sowie die Einstellungen der Grafikkarte setzen kann.

    Ich habe dafür mal ein bisschen gesurft und habe schliesslich etwas gefunden, was aus 3 Strukturen aufgebaut ist, allerdings verstehe ich den Aufbau der Strukturen bzw. den Sinn des Aufbaus nicht.

    Vielleicht kann mir ja einer da mal helfen und mir sagen wieso das so sinn macht / oder auch keinen sinn macht. Ich poste das ganze mal.

    BTW: Ich befinde mich immer noch im Begriffswirrwarr mit diesen Begriffen wie Device, Adapter, FormatBuffer, Backbuffer usw.

    typedef struct MACINITINFO 
    {
    	unsigned int             mc_int_adapter_id;         
    	D3DDEVTYPE               mc_d3d_type;               
    	bool                     mc_b_windowed;             
    	D3DFORMAT                mc_d3d_pixelformat;        
        D3DFORMAT                mc_d3d_backbufferformat;   
        D3DFORMAT                mc_d3d_stencilformat  ;     
    	unsigned int             mc_vertexprocessing;       
        D3DMULTISAMPLE_TYPE      mc_multisample;            
    
    };
    
    typedef struct MACDEVICEINFO
    {
    	unsigned int             md_int_adapter_id;   
    	D3DDEVTYPE               md_d3d_devtype;                
    	D3DCAPS9                 md_d3d_caps;                   
        MACINITINFO              md_d3d_combination[80];        
        unsigned int             md_int_combi_count;          
    
    };
    
    typedef struct MACADAPTERINFO
    {
    	D3DADAPTER_IDENTIFIER9   d3dAdapterIdentifier;
    	unsigned int             ma_int_adapter_id;                   
    	D3DDISPLAYMODE           ma_d3d_displaymode[150];                
    	unsigned int             ma_int_dmode_count;                     
    	unsigned int             ma_int_device_count;                    
    	MACDEVICEINFO            ma_deviceinfo[3];                       
    };
    

    Gruß Para 😃



  • hast du das schon gelesen ?
    http://www.zfx.info/Tutorials.php?ID=78



  • das habe ich angefangen, allerdings würde ich gerne darauf verzichten, Konstanten festzulegen, um die Anzahl der Maximalen Adapter und Devices usw. festzulegen. Stattdessen würde ich die lieber dynamisch zur Anzahl bestimmen lassen und daraus den Speicher reservieren.

    Oder ist das nicht möglich bzw. zu kompliziert?! Also das Problem ist das ich nicht weiss ob die Begrenzung sinnvoll ist: Heute hat man noch 1 Grafikkarte im Board, manche haben schon 2. Vielleicht haben wir in 2 Jahren 10. Ausserdem ist mir nicht einleuchtend, wie man abschätzen kann wie viele Devices man dann braucht.

    Gruß Para



  • Parapiler schrieb:

    Heute hat man noch 1 Grafikkarte im Board, manche haben schon 2. Vielleicht haben wir in 2 Jahren 10.

    Bist Du irgendwie paranoid oder so?!?! 😕

    Mal im Ernst: Die Tutorials reservieren meistens 20x Adapterplatz. Dann checkst Du, wie viele es wirklich sind und füllst das Ding. Da würde ich nichtmal 'ne if-Abfrage reinbauen, 20 Adapter hat auch in 10 Jahren kein Mensch drin!!
    Wenn das Ding nachher ausgewählt ist, kannst Du das Teil wieder löschen. Fertig.
    Die paar Bytes dürften keinem weh tun.
    Oder willst Du 'ne 3D-Anwendung für 'nen 8 MB-Rechner bauen?!?



  • ja und was ist mit den devices?!

    sagen wir mal ich habe 2 grafikkarten drin.... gehen wir mal in windows gucken welche auflösungen so angeboten werden.... nagut sagen wir mal wir picken uns die besten 4 raus, dann sind wir schon bei 8. Gehen wir davon aus das Die Farbtiefe auch noch reinspielt sind wir schon bei 3 weiteren für 8, 16 und 32 bei 8 * 3 = 24 Devices. Nehme ich jetzt noch an das das ganze noch in 2 Windowmodes aufgeteilt werden kann, bin ich bei 48 usw.

    Ich weiss doch gar nicht was danach noch kommt... Wo soll ich denn da die Grenze setzten?! Also die 40 sind da ja jetzt schon zu tief. Und je nach dem wie groß der Datentyp ist geht ziemlich viel Performance flutschen....



  • Ich habe grade mal in den Samples des DX SDK geschaut die machen das allerdings auch dynamisch:

    struct D3DAdapterInfo
    {
        int AdapterOrdinal;
        D3DADAPTER_IDENTIFIER9 AdapterIdentifier;
        CArrayList* pDisplayModeList; // List of D3DDISPLAYMODEs
        CArrayList* pDeviceInfoList; // List of D3DDeviceInfo pointers
        ~D3DAdapterInfo( void );
    };
    

    aber naja... ich verstehe nicht welche Strukturen welche Elemente sinnvollerweise haben sollten.

    Gruß Para



  • Parapiler schrieb:

    Und je nach dem wie groß der Datentyp ist geht ziemlich viel Performance flutschen....

    Performance bei 'nem "Grafikkartenauswahldialog"??? 😕

    Zudem würde ich 8 Bit-Auflösungen gar nicht mehr anbieten. Entweder 16 oder 32 Bit (bzw. richtigerweise 24 Bit). 💡

    Wo ist das Problem, nachdem Du das D3D Objekt kreiert hast,
    mit
    IDirect3D9::GetAdapterCount Method (Returns the number of adapters on the system)
    bzw.
    IDirect3D9::GetAdapterModeCount Method (Returns the number of display modes available on this adapter)
    die Anzahl rauszufinden?



  • Macht's doch nicht so kompliziert. Einfach std::list oder std::vector benutzen, und gut ist...

    Bye, TGGC \-/





  • was haltet ihr eigendlich von der Lösung hier:

    typedef const enum VERTEXPROCESSING
    {
    	SOFTWARE_VP,
    	MIXED_VP,
    	HARDWARE_VP,
    	PURE_HARDWARE_VP
    };
    
    typedef struct MACDEVICECOMBINATION
    {
    	int adapter; 
    	bool windowed;  
    	D3DFORMAT adapterFormat;                 
    	D3DFORMAT backbufferFormat;                                         
    	D3DDEVTYPE DeviceTyp;                                                 
    	std::vector<D3DFORMAT*> ptr_stencilFormat;      
    	std::vector<D3DMULTISAMPLE_TYPE*> ptr_multisampleTypes;
    	std::vector<int> multisample_quality;
    	std::vector<VERTEXPROCESSING*> vertex_processing;
    	std::vector<D3DPRESENT_PARAMETERS> present_intervall;
    
    };
    
    typedef struct MACDEVICE
    {   
    	int adapter;                             //adapter id
    	D3DDEVTYPE devtype;                      //hal, ref, sw
    	D3DCAPS9 d3d_caps;						 //caps
    	std::vector <MACDEVICECOMBINATION*>ptr_combo; //dialog combination
    };
    
    typedef struct MACADAPTER
    {
    	int adapter;									  //adapternr.
    	D3DADAPTER_IDENTIFIER9 adapterinfo;				  //Treiberinformationen
    	vector<D3DDISPLAYMODE*> displaymodes;             //Array von Moden
    	vector<MACDEVICE*> deviceinfo;                    //Array von Devicestrukturen
    };
    

    Bitte ehrliche Meinungen und Verbesserungsvorschlage 😃



  • Das ist keine Lösung sondern 4 typedefs.

    Bye, TGGC \-/



  • wow die hammer aussage....

    Ich weiss wohl selber das es typedefs sind.



  • Die Frage ist: Was ist überhaupt deine Frage?

    Willst du wissen,

    - wie du den Grafikkartenenumerationsdialog programmieren musst?
    - was die Begriffe in den Strukturen bedeuten?
    - wie die Strukturen aufeinander aufbauen?
    - warum gerade die jeweiligen Elemente in der jeweiligen Struktur sind?
    - ...

    Wenn du uns das mal gesagt hast, können wir dir vielleicht mit richtigen Antworten weiterhelfen...



  • Naja ich teils mal auf:

    Meine Frage war:

    * primär: Wie muss ich die Strukturen aufbauen, damit das Sinn ergibt. Ich habe im Netz die Strukturen von ganz oben gefunden, habe allerding mich im weiteren an der D3DEnumeration.h in den Samples des DXSDK 9 orientiert.

    * sekundär: Natürlich ist mir auch noch nicht 100 %ig klar, wie ich einen solchen Dialog vom Code her aufbauen (also wie ich den Dialog anzeige und Starte, das ist mir klar, allerdings nicht, wie ich jetzt an die Daten in der Grafikkarte komme und wie ich die Daten aktualisiere

    Meine Frage ist nun:

    * Die Strukturen, wie ich sie gepostet habe (von den Elementen her), ergeben die im Zusammenhang auf Frage 1 oben einen Sinn oder mache ich das besser anders (wenn anders: wie?! ) ?!

    * das mit dem Dialog bleibt, daran habe ich noch nix getan

    * Eine weitere Frage ist aufgekommen: Meine enumerationsklasse ist durch einen Eziger auf sich in meine d3d klasse eingebunden. Für die Enumeration muss ich ja d3d initalisieren (wegen dem d3d_device). Wo mache ich das am besten???

    Gruß Para



  • Klar, ich bin hier ja auch zuständig für die Hammer Aussagen. 😎

    Meine Frage ist nun:

    * Die Strukturen, wie ich sie gepostet habe (von den Elementen her), ergeben die im Zusammenhang auf Frage 1 oben einen Sinn oder mache ich das besser anders (wenn anders: wie?! ) ?!

    Wenn alles drin gespeichert ist, was du brauchst: ja.

    * das mit dem Dialog bleibt, daran habe ich noch nix getan

    Ahso, und das hat was mit mir zu tun?

    * Eine weitere Frage ist aufgekommen: Meine enumerationsklasse ist durch einen Eziger auf sich in meine d3d klasse eingebunden. Für die Enumeration muss ich ja d3d initalisieren (wegen dem d3d_device). Wo mache ich das am besten???

    Irgendwo Im Code bevor du anfängst zu enumerieren.

    BTW: Was ist ein Eziger? Sowas wie ein Singleton?

    Bye, TGGC \-/



  • waren das jetzt die richtigen Antworten die mir weiterhelfen?!

    Ich denke nicht. Also sagt mir was ich falsch mache, was ihr an meiner Frage nicht versteht oder warum ihr so ein Problem damit habt, ernsthaft die Fragen zu beantworten.

    Gruß Para



  • Die Strukturen sind so i.O., wenn du denn wirklich alle Infos dadrin brauchst.

    Wie du an die Infos rankommst, erfährst du in den beiden geposteten Links oder in der SDK Doku. Außerdem kannst du die Suche des Forums betätigen, da erst letztens der komplette Code zur Enumeration gepostet wurde.



  • hmmm also unter dem Stichwort Grafikkartenenumeration hatte ich keine Einträge gefunden, vielleicht habe ich es ja falsch geschrieben.

    Wenn jemand ganz zufällig den Link weiss, bitte posten.





  • Parapiler schrieb:

    Ich denke nicht.

    Ja, ich habe dein Problem auch schon erkannt.

    Bye, TGGC \-/


Anmelden zum Antworten