multisampling abfragen



  • Hallo an Alle,

    ich hab folgendes Problem ich will alle möglichen Multisampling Varianten meiner Grafikkarte abfragen. Was auch prima klappt. Doch wenn ich versuche das Multisampling mit d3dDevice->reset(parameters) anzuschalten. Krieg ich nur nichts sagende Fehlermeldungen, wie "einer der Parameter hat eine falschen wert". Wobei das nicht auf alle werte zutrifft. Ausschalten und 2 faches Multisampling klappt, aber wenn ich 6 faches Multisampling anschalte funktioniert es nicht.

    Ich teste das auf einer radeon 9600 und im windows mode der grafikmodus ist D3DFMT_X8R8G8B8. Ich weiß nicht was für ein check ich vergessen hab.

    HRESULT ret;
    DWORD quality;
    for(int i = 0; i < 16; i++)
    {
        if( SUCCEEDED(ret = pD3D->CheckDeviceMultiSampleType( pCaps->AdapterOrdinal, 
                                        pCaps->DeviceType, BackBufferFormat, 
                                        windowed, i, quality ) ) )
                 ret = pD3D->CheckDeviceMultiSampleType( pCaps->AdapterOrdinal, 
                                        pCaps->DeviceType, DepthBufferFormat, 
                                        windowed, i, &quality );
            switch(ret)
            {
                case D3D_OK:
                    MultiSampleArray.add(i, quality);
                    break;
                case D3DERR_INVALIDCALL:
                    break;
                default:
                    throw(error, "bla");
            }
        }
    }
    


  • 1. beim ersten aufruf von CheckDeviceMultiSampletype übergibst du einen DWORD statt DWORD* pointer (siehe quality) [compiler? mecker mecker? schweigt dieser mieser compiler oder wie??]

    2. du übergibst 2 mal quality=> da werden evtl 2 veschiedene werte reingeschrieben!
    Und dabei ist das zweite wert evtl größer als das erste, du benutzt es aber trotzdem: zB. kannst du für ZStencil 6 qualitätsstufen verwenden, für Backbuffer jedoch nur 2, versuchst es trotzdem mit 6! Da kann der fehler stecken. Sonst fällt mir erstma nichts ein...

    edit: ausserdem würd ich ma "i" in D3DMULTISAMPLE_TYPE casten, macht evtl nichts aus, sieht aber trotzdem schöner aus, und man weis, wo was wozu gehört und was bedeutet..



  • danke für die Antwort wert es gleich morgen früh ausprobieren.

    greetz mosta

    Aber wieso sollte ein DWORD_PTR pointer verwenden, könntest du das bitte weiter ausführen (LINK)?



  • so, wart ma, habe direkt aus meiner 99.87654% funktionierenden initialisierungfunktion mal n stück rausgerissen, hab die funktion schon zeimlich oft getestet, die scheint zu funktionieren, hier also ein aussschnitt:

    DWORD backBufferQualityLevels;        //ZWEI unterschiedliche quality levels!!!
    DWORD zStencilQualityLevels;
    //acceptable MultiSapmpleTypes have got values from 0 to 16
    for(int msType=0; msType<MULTISAMPLE_TYPE_COUNT; msType++){
        //check multisample type with BackBufferFormat
        if(SUCCEEDED(pD3D->CheckDeviceMultiSampleType(
                            AdapterID, 
                            D3DDEVTYPE_HAL,        //REF sucks anyway
                            BackBufferFormat,
                            TRUE,
                            *((D3DMULTISAMPLE_TYPE*)(&msType)),
                            &backBufferQualityLevels))){
    	//check if there is at least one quality level
    	if(backBufferQualityLevels>0){
    	    //continue the check with the ZStencilFormat
    	    if(SUCCEEDED(pD3D->CheckDeviceMultiSampleType(
                                AdapterID,
    			D3DDEVTYPE_HAL,
    			ZStencilFormat,
    			TRUE,
    			*((D3DMULTISAMPLE_TYPE*)(&msType)),
    			&zStencilQualityLevels))){
    		if(zStencilQualityLevels>0){
    		    //type possible
                      }
    	    }
    	}
        }
    }
    

    also, ich hab da noch jeweils zur sicherheit überprüft, ob mindestens eine qualitätsstufe verfügbar ist. Vielleicht ist es überflüssig, aber schaden kanns nicht... 🤡

    achte nicht auf MULTISAMPLE_TYPE_COUNT, das gibts nur in meinem code. Ausserdem musst du statt "TRUE" "windowed" da einsetzen (ich habs halt bissl unflexibel gemacht, war eh für vollbildanwendungen gedacht)

    hoffe, es hilft. ansonsten den debugger anwerfen, d3d in debug mode versetzen, und gugn, was da sonst noch rauskommt 👍

    edit: verdammt, die scheisklammer sind wieder mal voll verrutscht, ist n bisschen unübersichtlich geworden 🙄



  • Ich hab das ganze jetzt mal genauer untersucht. Ich bekomme folgende werte ausgelesen:

    multisampling type: 0 quality: 0
    multisampling type: 1 quality: 0
    multisampling type: 1 quality: 1
    multisampling type: 1 quality: 2
    multisampling type: 2 quality: 0
    multisampling type: 4 quality: 0
    multisampling type: 6 quality: 0

    die auch vollkommen richtig ist, wenn ich aber versuche multisampling anzuschalten bekomme ich folgende Fehlermeldung:

    device error: -2005530519 The device has been lost but can be reset at this time.
    reset failed : The method call is invalid. For example, a method's parameter may have an invalid value.

    hatt jmd. noch einen anderen hinweis woran das liegen kann?



  • hab den Fehler gefunden. Ich hab das D3DPRESENTFLAG_LOCKABLE_BACKBUFFER flag angeschaltet was bei meiner GrafikKarte dazu führt das ich das Multisampling nicht anschalten kann. Der Lockable backbuffer wird dazu benutzt um Screenshots zu machen. Muss mit jetzt also ne Lösung ausdenken um das Problem zu umgehen.

    gruß mosta



  • sowas ist echt ätzend 🙄 , ich blick da auch nicht so wirklich durch, hab deswegn in meinem programm einfach überall alles auf _DISCARD gesetzt, damit gibts die wenigsten probleme, (glaub ich [?]) 🤡


Anmelden zum Antworten