Inability to create a DirectX device and swapchain

I am having problems retrieving the swapchain and device from directx. additional information is in code

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"); } 

Below are all the values โ€‹โ€‹indicated after the completion of the method

 - &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]

Prior to Goz's answer, I checked further debugging details, and this is what was received

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

which I assume I did not add swapeffect attributes. I will do it and check it out

+4
source share
3 answers

Stupid to me. I previously mentioned in a comment that both books I read did not include the swapchain effect property. I knew that something was out, whether I included the swap chain or not.

But I also notice that both books reset the description of the swap chains. Make it safer to leave properties. So I added the following

 SecureZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); 

and it worked. Put it aside, I have to add a swapchain effect property. But for this reason, the book decided not to do this, I still do not understand.

+1
source

Do not try to pass a pointer to your HWND. You must pass HWND as not a pointer. Other than that, I don't see anything massive wrong.

This is what DXErrorLookup says about your error:

 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) 

So, have you considered using the debug version of DXGI to find out what the error is?

Btw my working initialization of the DX10 is as follows (Warning a lot of code!):

  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 ); 

Hope this helps!

0
source

The following code worked for me (I am using Microsoft Visual Studio Express 2012 for 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); 

So you can just try adding more attributes to swapChainDesc.

0
source

Source: https://habr.com/ru/post/1313601/


All Articles