فهرست منبع

Fixed DirectX createSwapChain (#82)

Pascal Peridont 7 سال پیش
والد
کامیت
d064861da7
1فایلهای تغییر یافته به همراه18 افزوده شده و 15 حذف شده
  1. 18 15
      libs/directx/directx.cpp

+ 18 - 15
libs/directx/directx.cpp

@@ -36,7 +36,12 @@ static IDXGIFactory *GetDXGI() {
 }
 
 static void ReportDxError( HRESULT err, int line ) {
-	hl_error_msg(USTR("DXERROR %X line %d"),(DWORD)err,line);
+	if( err == DXGI_ERROR_DEVICE_REMOVED && driver ){
+		err = driver->device->GetDeviceRemovedReason();
+		hl_error_msg(USTR("DXGI_ERROR_DEVICE_REMOVED reason 0x%X line %d"),(DWORD)err,line);
+	}else{
+		hl_error_msg(USTR("DXERROR %X line %d"),(DWORD)err,line);
+	}
 }
 
 HL_PRIM dx_driver *HL_NAME(create)( HWND window, int format, int flags, int restrictLevel ) {
@@ -51,21 +56,12 @@ HL_PRIM dx_driver *HL_NAME(create)( HWND window, int format, int flags, int rest
 	};
 	static int maxLevels = sizeof(levels) / sizeof(D3D_FEATURE_LEVEL);
 	DWORD result;
-	dx_driver *d = (dx_driver*)hl_gc_alloc_noptr(sizeof(dx_driver));
-	ZeroMemory(d,sizeof(dx_driver));
-	if( restrictLevel >= maxLevels ) restrictLevel = maxLevels - 1;
-	d->init_flags = flags;
-	result = D3D11CreateDevice(NULL,D3D_DRIVER_TYPE_HARDWARE,NULL,flags,levels + restrictLevel,maxLevels - restrictLevel,D3D11_SDK_VERSION,&d->device,&d->feature,&d->context);
-	if( result == E_INVALIDARG ) // most likely no DX11.1 support, try again
-		result = D3D11CreateDevice(NULL,D3D_DRIVER_TYPE_HARDWARE,NULL,flags,NULL,0,D3D11_SDK_VERSION,&d->device,&d->feature,&d->context);
-
-	DXERR(result);
-
-	// create the SwapChain
 	DXGI_SWAP_CHAIN_DESC desc;
 	RECT r;
-	GetClientRect(window,&r);
-	ZeroMemory(&desc,sizeof(desc));
+	dx_driver *d = (dx_driver*)hl_gc_alloc_noptr(sizeof(dx_driver));
+	ZeroMemory(d,sizeof(dx_driver));
+	GetClientRect(window, &r);
+	ZeroMemory(&desc, sizeof(desc));
 	desc.BufferDesc.Width = r.right;
 	desc.BufferDesc.Height = r.bottom;
 	desc.BufferDesc.Format = (DXGI_FORMAT)format;
@@ -74,7 +70,14 @@ HL_PRIM dx_driver *HL_NAME(create)( HWND window, int format, int flags, int rest
 	desc.BufferCount = 1;
 	desc.Windowed = true;
 	desc.OutputWindow = window;
-	DXERR( GetDXGI()->CreateSwapChain(d->device,&desc,&d->swapchain) );
+	if( restrictLevel >= maxLevels ) restrictLevel = maxLevels - 1;
+	d->init_flags = flags;
+	result = D3D11CreateDeviceAndSwapChain(NULL,D3D_DRIVER_TYPE_HARDWARE,NULL,flags,levels + restrictLevel,maxLevels - restrictLevel,D3D11_SDK_VERSION,&desc,&d->swapchain,&d->device,&d->feature,&d->context);
+	if( result == E_INVALIDARG ) // most likely no DX11.1 support, try again
+		result = D3D11CreateDeviceAndSwapChain(NULL,D3D_DRIVER_TYPE_HARDWARE,NULL,flags,NULL,0,D3D11_SDK_VERSION, &desc, &d->swapchain, &d->device, &d->feature, &d->context);
+
+	DXERR(result);
+
 	driver = d;
 	return d;
 }