probleme mit D3DPRESENT_PARAMETERS für IDirect3DDevice9 [ERLEDIGT]



  • Ahoi leute!
    Ich habe probleme bei der erstellung von IDirect3DDevice9, obwohl ich meiner meinung nach alles in der D3DPRESENT_PARAMETERS struktur richtig ausgefüllt habe (bzw. habe von funktionen ausfüllen lassen, die alles [ich hoffe, ich hab nichts vergessen] doppelt und dreifach überprüfen).
    Wenn ich HRESULT von der CreateDevice() funktion überprüfe, bekomme ich D3DERR_INVALIDCALL, D3DERR_NOTAVAILABLE und obendrauf noch D3DERR_OUTOFVIDEOMEMORY, würde aber gerne etwas konkreteres darüber erfahren, was dieser funktion eigentlich nicht gepasst hat, DXGetErrDescription9() hat irgendwie gar nichts genützt, es sagt mir auch nur welche fehler aufgetreten sind, aber nicht warum.
    Gibt es irgendeine möglichkeit zu erfahren, was da eigentlich schiefging?

    sry, hab bei der suche irgendwie nicht wirklich was gefunden, was mir geholfen hätte, dachte eigentlich, dass ich mit GetErrDescription weiterkommen würde, war leider nicht der fall.

    vielen dank im voraus, wäre für tipps und link's sehr dankbar.

    mfg, andrey



  • zeig ma deine present-parameter
    und schalt die debug-ausgabe von D3D ein und start dein programm im Debugmodus, dann kommen da fehlermeldungen in der debugausgabe



  • also... öhm... hab mir nur gedacht, dass es evtl dran liegen kann, dass ich irgendwelche inakzeptable parameter ohne einen test einfach so eingegeben hab, obwohl es von der graka nicht unterstützt wird... hier liste ich einfach auf, was ich alles überprüft habe:

    1. -zuerst habe ich alle adapter nacheinander ausgewählt, habe überprüft, ob sie D3DDEVTYPE_HAL unterstützten (anwendung braucht unbedingt 3D beschleunigung)

    2. -dann habe ich den aktuellen displayMode abgefragt, habe mit CheckDeviceFormat() und CheckDeviceType() überprüft, ob das aktuelle DisplayMode.Format mit HAL kompatibel ist

    3. -falls das der fall war, habe ich den adapter ausgewählt

    4. - ⚠ ich habe manuell die Auflösung auf 800x600 verändert (größe des deviceWindow) [kann es hier zu problemen führen???]

    5.- Fenstermodus=TRUE gesetzt

    6.- BackBuffer Format einfach aus DisplayMode.Format übernommen [optimale lösung, oder?]

    7.- dann habe ich das passende DepthStencilBuffer format mit CheckDeviceFormat() und CheckDepthStencilMatch() herausgesucht

    8. - ich will erstma kein multiSampling, deswegen habe ich multiSampleType auf D3DMULTISAMPLETYPE_NONE und qualitätsstufe auf 0 gesetzt

    9. als flags übergebe ich der funktion nur D3DCREATE_HARDWARE_VERTEXPROCESSING [⚠ ohne irgendwas zu überprüfen, ,uss ich doch auch nicht, oder?]

    10. nja, die Caps-Struktur habe ich auch rübergeladen, mit GetDeviceCaps(), allerdings habe ich von dieser struktur keinen gebrauch gemacht, war das vielleicht der fehler?

    wenn ihr mir sagen könntet, was ich noch alles hätte überprüfen müssen 😕 , wäre ich sehr dankbar!



  • @maxi:
    wie schalte ich das in den debug modus um? 😕
    ich mein, das ist doch kein fehler im programmcode, sondern ein fehler beim erstellen einer interface, werden denn da auch fehlermeldungen ausgegeben 😕 ...
    wenn ja, verrat ma bitte, was ich tun muss, damit diese fehlermeldungen ausgegeben werden, ich habs irgendwie ned gerafft 🙄

    danke schonmal 👍



  • hier sind die werte, die das programm erhält:

    //BackBuffer
        D3DPresentParameters.BackBufferWidth			=(UINT)(800);        
        D3DPresentParameters.BackBufferHeight			=(UINT)(600);    
        D3DPresentParameters.BackBufferFormat			=D3DFMT_X8R8G8B8;
        D3DPresentParameters.BackBufferCount			=1; 
    							//always only one backBuffer
        D3DPresentParameters.MultiSampleType			=D3DMULTISAMPLETYPE_NONE;
        D3DPresentParameters.MultiSampleQuality			=0;
        D3DPresentParameters.SwapEffect				=D3DSWAPEFFECT_DISCARD;
    
        D3DPresentParameters.hDeviceWindow			=hTargetWindow;
        //des ist des 800x600große, leere "STATIC" child Fenster, wo reingezeichnet werden soll
    
        D3DPresentParameters.Windowed				=TRUE;
        D3DPresentParameters.EnableAutoDepthStencil		=TRUE; //sure
        D3DPresentParameters.AutoDepthStencilFormat	=D3DFMT_D24X8;
        D3DPresentParameters.Flags			=D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    
        D3DPresentParameters.FullScreen_RefreshRateInHz	=60;
        D3DPresentParameters.PresentationInterval		=parameters.bWindowed?
           D3DPRESENT_INTERVAL_IMMEDIATE :
           D3DPRESENT_INTERVAL_ONE;
    

    Also, im originalcode sieht es so aus (parameter werden von 5 verschiedenen funktionen festgelegt, die die optimalen formate auswählen etc):

    //BackBuffer
    D3DPresentParameters.BackBufferWidth			=parameters.DisplayMode.Width;
    	D3DPresentParameters.BackBufferHeight			=parameters.DisplayMode.Height;
        D3DPresentParameters.BackBufferFormat			=parameters.BackBufferFormat;
        D3DPresentParameters.BackBufferCount			=1; 
    													//always only one backBuffer
        D3DPresentParameters.MultiSampleType			=parameters.MultiSampleType;
        D3DPresentParameters.MultiSampleQuality			=parameters.MultiSampleQuality;
        D3DPresentParameters.SwapEffect					=D3DSWAPEFFECT_DISCARD;
    													//necessary for multisampling		
        D3DPresentParameters.hDeviceWindow				=hTargetWindow;
        D3DPresentParameters.Windowed					=parameters.bWindowed;
        D3DPresentParameters.EnableAutoDepthStencil		=TRUE; //sure
        D3DPresentParameters.AutoDepthStencilFormat		=parameters.DepthStencilBufferFormat;
        D3DPresentParameters.Flags						=D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    													//necessary for multisampling=(?)
        D3DPresentParameters.FullScreen_RefreshRateInHz	=parameters.DisplayMode.RefreshRate;
        D3DPresentParameters.PresentationInterval		=parameters.bWindowed? 
    													D3DPRESENT_INTERVAL_IMMEDIATE :
    													D3DPRESENT_INTERVAL_ONE;
    

    @maxi: so hier ist der code, fallen dir irgendwelche grobe fehler auf?



  • naja, ich kenn mich da auch nich so aus... aber versuch mal die fullscreen_refrehrate auf 0 oder so zu stellen. Gibts da ein default-makro? Und das nimm ma das Flag d3dpresentflag_disard_depthstencil raus. Versuch mal ein anderes stencil-format, mit 16bit depthbuffer

    debug stellt man so an: systemsteuerung -> DirectX (wenn es directX nich gibt, musst du nochn son redistributable ackage oder so ziehn, weiß jetzt nich genau, wie das heißt.) JEdenfalls unter DirectX kannst dann bei D3D einstelln UseDebugRuntime und da kannst du auch das Debug-Level einstelln. Die Ausgaben kommen dann bei VC da unten raus, wo auch der compiler meldungen ausgibt.



  • Maxi schrieb:

    naja, ich kenn mich da auch nich so aus... aber versuch mal die fullscreen_refrehrate auf 0 oder so zu stellen. Gibts da ein default-makro?

    Jo, das war's bei mir neulich. Für Windowed einfach Default verwenden, dann klappt's.



  • *oh my god* wenn das jetzt nur an dieser blöden refresh-rate lag, lach ich mich †o† !!! 😃 Danke leutz, werde es gleich ausprobieren!



  • dann frag ich mich aber, wozu man überhaupt noch den aktuellen DisplayMode abfragen soll, auflösung wird verändert, refresh rate auf default gestellt, könnte man doch gleich das ganze in GetAdapterBackBufferFormat() oder sowas umfunktionieren, und nicht des RAM mit irgendwelchen unnötigen strukturen vollstopfen :p



  • hmmmmm...
    😕
    nnein, so einfach wars leider doch nicht! Habs zwar durch D3DPRESENT_RATE_DEFAULT ersetzt, krig aber nach wie vor dieselben fehlermeldungen an den kopf geworfen 😞 😞 😞
    ööööhhhhhh....
    noch irgendwelche ideen? 🙄



  • Maxi schrieb:

    fullscreen_refrehrate auf 0

    Die anwendung soll ja nicht im vollbildmodus laufen...

    @maxi:
    übrigens, des Direct3D habe ich jetzt auf debug umgestellt, es spuckt trotzdem keine fehlermeldungen raus 😮
    so ein mist, wie soll ich dem programm helfen, wenn es mir ned sagen kann, wo es "wehtut"? 🙄
    es muss doch irgendeinen weg geben, festzustellen WAS dieser CreateDevice() Methode nicht passt!!!
    Zu hülf!!! 😮 😮 😮



  • Öhm... kann des sein, dass D3DCREATE_HARDWARE_VERTEXPROCESSING doch nicht sogut wie von jeder grafikkarte unterstützt wird?
    weis einer, wo man bei den CAPS9 danach guggn soll???? omfg, da sind ja um die 70 elemente drinne, das dauert doch ne ewigkeit, bis man des durchgesucht hat... solche unterpunkte wie "vertexprocessing" sind mir leider auch noch nicht aufgefallen, naja, egal, ich suche fleissig weiter! 🙄 👍
    die lösung des problems ist 100% irgendwo dadrinne... 70 parameter... jeder jeweils aus 32 flags... heheheh, wird n langer abend, wenn ich pech hab 😃
    beeindrückend des struktürchen^^ aber zumindest richtig schön strukturiert 😃



  • welche ide hast du? musst natürlich im debugmodus komnpilieren und dann auch im debugmodus starten, also bei vc mit F5, dann kommen da eigentlihc immer meldungen, auch wenns keine fehler gibt. Hast nich nur die debugversion eingeschlatet sondern auch das debug-lebvel hochgeschraubt?



  • jup, alles gleich aufs höchste debug level gestellt... ich versuch grad ma das ganze project bei den einstellungen nochma zu compilen, k?
    danke nochma 🤡 👍



  • hmmmm... ne, sry, maxi, DX schweigt nach wie vor, wie ein guter partisan uf nem verhör^^ :p njo, egal, werd schon mit dem problemchen auch ohne debug hilfe klarkommen, frage ist: wie_lange_dauerts_?



  • Öhm... zurück zu VertexProcessingCaps... (aaahhh, wie lustig ich immer diese double- und triplepostings finde= sry leutz, ich weis, ist ne schlechte angewohnheit :p )
    Also, hab jetzt die VertexProcessingCaps in der struktur gefunden, aber da steht nix von D3DCREATE_HARDWARE_VERTEXPROCESSING oder sowas, sondern irgendwelches anderes, zweifellos absolut nützliches, zeug. Bringt mich leider keinen centimeter weiter... 😮

    wie krig ich denn jez raus, ob ich ne HARDWARE_VERTEXPROCESSING schnittstelle erzeugen kann? 😕

    etwa 27 sekunden später:

    if (caps.VertexProcessingCaps == 0) 
            vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    

    hab jetzt in nem tut sowas gefunden... öööhm, ist mir allein aus der dokumentation nicht klar geworden, dass der ganze Cap==0 ist, wenn kein HARDWARE_VERTEXPROCESSING unterstützt wird....



  • hhe, wiist ihr was? ich glaube, es denkt sich leichter, wenn man seine fragen aufschreibt^^ ich glaub ich versuch mich ma in einem .txt dokument auszutoben, und nicht das schöne forum hier vollzumüllen 😃
    THX ALL!
    ...
    (19 sec später)
    ...
    Übrigens, hat jetzt funktioniert, also, immer schön üebrprüfen, ob HARDWARE_VERTEXPROCESSING verfügbar ist!!! thread=[ERLEDIGT]


Log in to reply