не удалось создать устройство DirectX и swapchain - PullRequest
4 голосов
/ 23 июня 2010

У меня проблемы с получением swapchain и устройства из directx.дополнительная информация находится в коде

void GXDX::StartUp(HWND* mainWindow,int w, int h)
{

    //width and height are members of GXDX

    width = w; //contains the width
    height = h; //contains the height

    this->mainWindow = mainWindow; // Is a handle to the main window. it is usually something 
                                   //like : unusual -735313406 

    ID3D10Texture2D *backBufferSurface;

    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    swapChainDesc.BufferCount = 2;
    swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
    swapChainDesc.BufferDesc.Width = width;
    swapChainDesc.BufferDesc.Height = height;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.OutputWindow = *mainWindow;
    swapChainDesc.Windowed = TRUE;

    D3D10_DRIVER_TYPE driverType = D3D10_DRIVER_TYPE_HARDWARE;

    HRESULT hr = D3D10CreateDeviceAndSwapChain(NULL,driverType,NULL,0,
        D3D10_SDK_VERSION, &swapChainDesc,&swapChain,&dxDevice);

    if(FAILED(hr))//Error is here
        throw GXVideoException(L"Problems retrieving directX device");
}

Ниже приведены все значения, указанные после завершения метода

-       &dxDevice   0x00e74b04  ID3D10Device * *
-           0x00000000  ID3D10Device *
-       IUnknown    {...}   IUnknown
        __vfptr CXX0030: Error: expression cannot be evaluated  
-       &swapChain  0x00e74b08  IDXGISwapChain * *
-           0x00000000  IDXGISwapChain *
-       IDXGIDeviceSubObject    {...}   IDXGIDeviceSubObject
-       IDXGIObject {...}   IDXGIObject
-       IUnknown    {...}   IUnknown
        __vfptr CXX0030: Error: expression cannot be evaluated  
-       &swapChainDesc  0x002df90c {BufferDesc={...} SampleDesc={...} BufferUsage=0xcccccccc ...}   DXGI_SWAP_CHAIN_DESC *
-       BufferDesc  {Width=0x00000320 Height=0x00000258 RefreshRate={...} ...}  DXGI_MODE_DESC
        Width   800 unsigned int
        Height  600 unsigned int
-       RefreshRate {Numerator=60 Denominator=1 }   DXGI_RATIONAL
        Numerator   60  unsigned int
        Denominator 1   unsigned int
        Format  DXGI_FORMAT_R8G8B8A8_UNORM  DXGI_FORMAT
        ScanlineOrdering    -858993460  DXGI_MODE_SCANLINE_ORDER
        Scaling -858993460  DXGI_MODE_SCALING
-       SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
        Count   1   unsigned int
        Quality 0   unsigned int
        BufferUsage 3435973836  unsigned int
        BufferCount 2   unsigned int
-       OutputWindow    0x008b08ca {unused=-665779669 } HWND__ *
        unused  -665779669  int
        Windowed    1   int
        SwapEffect  -858993460  DXGI_SWAP_EFFECT
        Flags   3435973836  unsigned int
        driverType  D3D10_DRIVER_TYPE_HARDWARE  D3D10_DRIVER_TYPE
        hr  0x887a0001  HRESULT
-       this    0x00e74af0 {dxDevice=0x00000000 swapChain=0x00000000 }  GXDX * const
-       GXRenderer  {running=true width=0x00000320 height=0x00000258 ...}   GXRenderer
-       __vfptr 0x013277dc const GXDX::`vftable'    *
        [0] 0x0132110e GXDX::Render(void)   *
        [0x1]   0x013211d6 GXDX::StartUp(struct HWND__ * *,int,int) *
        [0x2]   0x01321041 GXDX::SetupScene(void)   *
        [0x3]   0x01321069 GXDX::DisplayScene(void) *
        running true    bool
        width   0x00000320  int
        height  0x00000258  int
-       mainWindow  0x0132a214 struct HWND__ * GXRenderManager::mainWindow {unused=0x008b08ca } HWND__ *
        unused  0x008b08ca  int
-       dxDevice    0x00000000  ID3D10Device *
+       IUnknown    {...}   IUnknown
-       swapChain   0x00000000  IDXGISwapChain *
-       IDXGIDeviceSubObject    {...}   IDXGIDeviceSubObject
-       IDXGIObject {...}   IDXGIObject
-       IUnknown    {...}   IUnknown
        __vfptr CXX0030: Error: expression cannot be evaluated  

[EDIT]

До ответа Гоза, япроверил дальнейшие подробности отладки, и это то, что было получено

DXGI Error: IDXGIFactory::CreateSwapChain: SwapEffect is unknown.

, которое, я предполагаю, я не добавил атрибуты swapeffect.Я сделаю это и проверю

Ответы [ 3 ]

1 голос
/ 23 июня 2010

Глупый я.ранее я упоминал в комментарии, что обе книги, которые я читал, не содержат свойства эффекта свопчейна.Я знал, что что-то не так, независимо от того, включил я цепочку обмена или нет.

Но я также заметил, что обе книги обнулили описание цепочки обмена.Делая это более безопасным, чтобы оставить свойства.Поэтому я добавил следующее

SecureZeroMemory(&swapChainDesc, sizeof(swapChainDesc));

и все заработало.Оставьте в стороне это, я все еще должен добавить свойство эффекта swapchain.Но из-за причины книга решила не делать этого, я еще не понял.

0 голосов
/ 04 августа 2013

Следующий код работал для меня (я использую Microsoft Visual Studio Express 2012 для Windows Desktop)

DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;

swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;

swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 1;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.Windowed = true;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

swapChainDesc.Flags = 0; 

ID3D11Device *pDevice = 0;
ID3D11DeviceContext *pContext = 0;
IDXGISwapChain *pSwapChain = 0;
HRESULT result;

result = D3D11CreateDeviceAndSwapChain(NULL, driverType, NULL, D3D11_CREATE_DEVICE_SINGLETHREADED, featureLevel, totalFeatureLevel, D3D11_SDK_VERSION, &swapChainDesc, &pSwapChain, &pDevice, &currentFeatureLevel, &pContext);

Так что вы можете просто попробовать добавить больше атрибутов в swapChainDesc.

0 голосов
/ 23 июня 2010

Старайтесь не передавать указатель на ваш HWND. Вы должны передать HWND как не указатель. Кроме этого я не вижу ничего в корне неправильного.

Вот что DXErrorLookup говорит о вашей ошибке:

HRESULT: 0x887a0001 (2289696769)
Name: DXGI_ERROR_INVALID_CALL
Description: The application has made an erroneous API call that it had enough 
information to avoid. This error is intended to denote that the application should be 
altered to avoid the error. Use of the debug version of the DXGI.DLL will provide run-
time debug output with further information.
Severity code: Failed
Facility Code: FACILITY_DXGI (2170)
Error Code: 0x0001 (1)

Итак, вы рассматривали возможность использования отладочной версии DXGI, чтобы увидеть, в чем ошибка?

Между прочим, моя рабочая инициализация DX10 выглядит следующим образом (Предупреждение: много кода!)

    HRESULT hr  = S_OK;

    // Wrong init params passed in.
    if ( pParams->paramSize != sizeof( D3D10InitParams ) )
        return false;

    // Upgrade the initparams to the correct version
    mInitParams = *(D3D10InitParams*)pParams;

    // Create factory.
    IDXGIFactory* pFactory  = NULL;
    if ( FAILED( CreateDXGIFactory( __uuidof( IDXGIFactory ), (void**)&pFactory ) ) )
    {
        return false;
    }

    if ( FAILED( pFactory->MakeWindowAssociation( mInitParams.hWnd, 0 ) ) )
    {
        return false;
    }

    HWND hTemp;
    pFactory->GetWindowAssociation( &hTemp );

    // Enumerate adapters.
    unsigned int count  = 0;
    IDXGIAdapter * pAdapter;
    std::vector<IDXGIAdapter*> vAdapters;
    while( pFactory->EnumAdapters( count, &pAdapter ) != DXGI_ERROR_NOT_FOUND )
    {
        vAdapters.push_back( pAdapter );
        count++;
    }

    unsigned int selectedAdapter    = mInitParams.display;
    if ( vAdapters.size() > 1 )
    {
        // Need to handle multiple available adapters.
    }

    // Release all other adapters.
    count   = 0;
    unsigned int max    = (unsigned int)vAdapters.size();
    while( count < max )
    {
        if ( count != selectedAdapter )
        {
            vAdapters[count]->Release();
        }
        count++;
    }

    // Device should support all basic DX10 features.
    // Caps does not support enough basic features.
    //if ( !CheckCaps( &caps ) )
    //  return false;

    // Create the D3D 10 device.
    DXGI_MODE_DESC dxgiModeDesc;
    dxgiModeDesc.Width                      = mInitParams.width;
    dxgiModeDesc.Height                     = mInitParams.height;
    dxgiModeDesc.RefreshRate.Numerator      = (mInitParams.refreshRate == 0) ? 60 : mInitParams.refreshRate;
    dxgiModeDesc.RefreshRate.Denominator    = 1;
    dxgiModeDesc.Format                     = DXGI_FORMAT_R8G8B8A8_UNORM;
    dxgiModeDesc.ScanlineOrdering           = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
    dxgiModeDesc.Scaling                    = DXGI_MODE_SCALING_CENTERED;

    DXGI_SAMPLE_DESC dxgiSampleDesc;
    dxgiSampleDesc.Count            = 1;
    dxgiSampleDesc.Quality          = 0;

    //DXGI_USAGE dxgiUsage;
    //dxgiUsage.

    DXGI_SWAP_CHAIN_DESC dxgiSwapChainDesc;
    dxgiSwapChainDesc.BufferDesc    = dxgiModeDesc;
    dxgiSwapChainDesc.SampleDesc    = dxgiSampleDesc;
    dxgiSwapChainDesc.BufferUsage   = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    dxgiSwapChainDesc.BufferCount   = 2;
    dxgiSwapChainDesc.OutputWindow  = mInitParams.hWnd;
    dxgiSwapChainDesc.Windowed      = mInitParams.windowed;
    dxgiSwapChainDesc.SwapEffect    = DXGI_SWAP_EFFECT_DISCARD;
    dxgiSwapChainDesc.Flags         = 0;//DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

    // Set the device as a debug device when compiled for debug.
#ifdef _DEBUG
    unsigned int flags  = D3D10_CREATE_DEVICE_DEBUG;
#else
    unsigned int flags  = 0;
#endif

    mpAdapter   = vAdapters[selectedAdapter];
    // Create the device and swap chain.
    if ( FAILED( D3D10CreateDeviceAndSwapChain( mpAdapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, flags, D3D10_SDK_VERSION, &dxgiSwapChainDesc, &mpSwapChain, &mpDevice ) ) )
    {
        return false;
    }

    // Get the back buffer.
    ID3D10Texture2D* pBuffer    = NULL;
    if ( FAILED( mpSwapChain->GetBuffer( 0, __uuidof( ID3D10Texture2D ), (void**)&pBuffer ) ) )
    {
        return false;
    }

    // Create the default render target view.
    hr = mpDevice->CreateRenderTargetView( pBuffer, NULL, &mDefaultRenderTarget );
    pBuffer->Release();
    if ( FAILED( hr ) )
    {
        return false;
    }

      // Create depth stencil texture
    D3D10_TEXTURE2D_DESC descDepth;
    descDepth.Width                 = mInitParams.width;
    descDepth.Height                = mInitParams.height;
    descDepth.MipLevels             = 1;
    descDepth.ArraySize             = 1;
    descDepth.Format                = DXGI_FORMAT_D24_UNORM_S8_UINT;
    descDepth.SampleDesc.Count      = 1;
    descDepth.SampleDesc.Quality    = 0;
    descDepth.Usage                 = D3D10_USAGE_DEFAULT;
    descDepth.BindFlags             = D3D10_BIND_DEPTH_STENCIL;
    descDepth.CPUAccessFlags        = 0;
    descDepth.MiscFlags             = 0;
    if ( FAILED( mpDevice->CreateTexture2D( &descDepth, NULL, &mpDepthStencilTex ) ) )
    {
        return false;
    }

    // Create the depth stencil view
    D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;
    descDSV.Format              = descDepth.Format;
    descDSV.ViewDimension       = D3D10_DSV_DIMENSION_TEXTURE2D;
    descDSV.Texture2D.MipSlice  = 0;
    if ( FAILED( mpDevice->CreateDepthStencilView( mpDepthStencilTex, &descDSV, &mDefaultDepthStencilTarget ) ) )
    {
        return false;
    }

    // Set the default render targets.
    mpDevice->OMSetRenderTargets( 1, &mDefaultRenderTarget, mDefaultDepthStencilTarget );

    mpEffectDevice  = new D3D10EffectStateDevice( GetDevice() );

    // Set the default render states.
    SetupRenderStates();

    // Set the default viewport.
    D3D10_VIEWPORT d3d10ViewPort;
    d3d10ViewPort.Width     = mInitParams.width;
    d3d10ViewPort.Height    = mInitParams.height;
    d3d10ViewPort.TopLeftX  = 0;
    d3d10ViewPort.TopLeftY  = 0;
    d3d10ViewPort.MinDepth  = 0.0f;
    d3d10ViewPort.MaxDepth  = 1.0f;

    GetDevice()->RSSetViewports( 1, &d3d10ViewPort );

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...