1

D3D11CreateDeviceAndSwapChain() に問題がありました。前のスレッドで解決策を見つけたと思ったので、すでに解決済みとしてマークしました。[スワップ チェーンの作成に失敗しました

誤って HRESULT を boolean として返したとき、自分をだましたようです...

私は一日中この問題と戦ってきましたが、まだ理解していません。入力と出力に関するデバッグ情報の束を以下に示します...

1] null 以外の vAdapter で UNKNOWN を使用するようにアドバイスを受ける: Debug Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%201.png

2] null のままにし、タイプ HARDWARE を使用して DX サンプルをたどる: Debug Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%202.png

誰かが問題を特定するには写真で十分かもしれませんが、それ以外の場合は次のようにコーディングします。

//      This is some relevant stuff [anything referenced] in the class.

Graphics(){
    selectedVAdapter=NULL;
    deviceInterface=NULL;
    deviceContext=NULL;
    swapChain=NULL;
}

bool initDevice(HWND &hWnd){
    HRESULT success=S_OK;

    D3D_FEATURE_LEVEL featureLevels[]={
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
    };
    uint featuresSize=ARRAYSIZE(featureLevels);

    D3D_DRIVER_TYPE driverTypes[]={
        D3D_DRIVER_TYPE_UNKNOWN, // Needed for manual vid adapter setting
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    uint driversSize=ARRAYSIZE(driverTypes);

    refreshVideoAdapters();
    setVideoAdapter();

    //setSampleQuality();

    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = settings.bufferCount;
    sd.BufferDesc.Width = settings.width;
    sd.BufferDesc.Height = settings.height;
    sd.BufferDesc.Format = settings.colorDepth;
    sd.BufferDesc.RefreshRate.Numerator = settings.rateNumerator;
    sd.BufferDesc.RefreshRate.Denominator = settings.rateDenominator;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd;
    sd.SampleDesc.Count = settings.sampleCount;
    sd.SampleDesc.Quality = settings.sampleQuality;
    sd.Windowed = !settings.fullScreen;

    uint flag=0;
    #ifdef _DEBUG
        flag|=D3D11_CREATE_DEVICE_DEBUG;
    #endif

    for(uint i=0; i<driversSize; i++){ // SwapChain: http://msdn.microsoft.com/en-us/library/ff476083%28v=vs.85%29.aspx
        D3D_DRIVER_TYPE driver=driverTypes[i];
        success=D3D11CreateDeviceAndSwapChain(
            //NULL,
            selectedVAdapter, driver, NULL, flag,
            featureLevels, featuresSize, D3D11_SDK_VERSION, &sd,
            &swapChain, &deviceInterface, &selectedFeatureLevel, &deviceContext);
        if(SUCCEEDED(success)) break;
    }

    return SUCCEEDED(success);
}

//      Methods to manage video adapters
void refreshVideoAdapters(){
    IDXGIAdapter1* pAdapter;
    IDXGIFactory1* pFactory=NULL;

    uint lastID=0;
    if(selectedVAdapter){
        DXGI_ADAPTER_DESC1* desc=NULL;
        selectedVAdapter->GetDesc1(desc);
        lastID=desc->DeviceId;
        releaseVideoAdapters();
    }

    if(FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) return;

    for(uint i=0; pFactory->EnumAdapters1(i, &pAdapter)!=DXGI_ERROR_NOT_FOUND; i++){
        vAdapters.push_back(pAdapter);

        if(lastID){
            DXGI_ADAPTER_DESC1* desc=NULL;
            pAdapter->GetDesc1(desc);
            if(lastID==desc->DeviceId){
                selectedVAdapter=pAdapter;
                lastID=0;
            }
        }
    }

    if(pFactory) pFactory->Release();
}
void releaseVideoAdapters(){
    for(uint i=0; i<vAdapters.size(); i++){
        vAdapters[i]->Release();
        vAdapters[i]=NULL;
    }
    vAdapters.clear();
    selectedVAdapter=NULL;
}
IDXGIAdapter1* getVideoAdapter(){return selectedVAdapter;}
bool setVideoAdapter(uint num=0){
    if(num<vAdapters.size()){
        selectedVAdapter=vAdapters[num];
        return 1;
    }
    return 0;
}

// Member vars
private:
SettingsGraphicsDevice settings;

D3D_FEATURE_LEVEL selectedFeatureLevel;

vector<IDXGIAdapter1*> vAdapters;
IDXGIAdapter1* selectedVAdapter;

ID3D11Device* deviceInterface;
ID3D11DeviceContext* deviceContext;
IDXGISwapChain* swapChain;

そのコードからの設定構造体:

struct SettingsGraphicsDevice{
    uint width, height;
    bool fullScreen, vsync;
    uint rateNumerator;
    uint rateDenominator;
    uint bufferCount;
    uint sampleCount, sampleQuality;
    DXGI_FORMAT colorDepth;
    float minDist, maxDist;

    SettingsGraphicsDevice(){
        width=height=0;
        fullScreen=0;
        vsync=0;

        rateNumerator=0;
        rateDenominator=1;
        bufferCount=1;
        sampleCount=1, sampleQuality=0;
        colorDepth=DXGI_FORMAT_R8G8B8A8_UINT;

        minDist=0.1f;
        maxDist=1000.0f;
    }

};

読んでくれてありがとう。今回は解決策が見つかることを願っています。

4

2 に答える 2

1

私のコメントからコピーして貼り付けます:「また、コードをざっと見てみると、DXGI_FORMAT_R8G8B8A8_UNORM を使用していることがわかりますが、現在、それが正しいモードかどうかはわかりません。」. わかりましたので、今は答えています:-)

ええ、フォーマット... DXGI_FORMAT はかなり大きな列挙ですが、多くの場合、特定のフォーマットのみが許可されます。フルスクリーンかどうかに関係なく、特定の形式のみが表示できることは驚くべきことではありません。

ドキュメントから (いつものように) 使用した値、具体的にはDXGI_MODE_DESCの説明のリストを取得しました。実際に blt-block 転送スワップチェーンを作成しているかどうかはわかりませんが、これらの値は最初から適切であると判断し、機能レベル 9 は気にしませんが、かなり安全に思えました:- )

あなたのコードがヌルアダプターで動作するように見える理由がわかりません。紛らわしいと思います。たぶん、デバッグランタイムがそれをキャッチしたでしょうか?

于 2012-09-29T09:41:02.393 に答える
0

そのカラー モード [DXGI_FORMAT_R8G8B8A8_UNORM] への切り替えが機能しました。私は今 S_OK を取得します。機能しない場合、他のカラー モードが存在するのはなぜですか?

于 2012-09-28T18:15:33.573 に答える