2016-09-28 5 views
1

MSDN sur IDirect3D9Ex::CreateDeviceEx dit:récemment IDirect3DDevice9 :: CreateDeviceEx parfois ne change pas la BackBufferFormat de D3DFMT_UNKNOWN

Si BackBufferFormat est égal à D3DFMT_UNKNOWN avant que la méthode est appelée, elle sera modifiée lorsque la méthode retourne.

Donc, cela devrait imprimer autre chose que format: 0 (aujourd'hui généralement format: 22 pour D3DFMT_X8R8G8B8):

#include <cstdio> 
#include <d3d9.h> 
#pragma comment(lib,"d3d9.lib") 
#pragma comment(lib,"User32.lib") 
int main(int argc, char **argv) 
{ 
    IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION); 
    if (!d3d) { 
     printf("No d3d!\n"); 
     return 0; 
    } 
    D3DPRESENT_PARAMETERS pp = {}; 
    pp.BackBufferWidth = 1; 
    pp.BackBufferHeight = 1; 
    pp.BackBufferFormat = D3DFMT_UNKNOWN; 
    pp.BackBufferCount = 1; 
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    pp.Windowed = TRUE; 
    IDirect3DDevice9* device = NULL; 
    HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &device); 
    if (FAILED(hr)) { 
     printf("Failed!\n"); 
     return 0; 
    } 
    printf("format: %i\n", pp.BackBufferFormat); 
    device->Release(); 
    d3d->Release(); 
} 

Et cela toujours travaillé dans mon expérience. Maintenant, récemment, cela ne fonctionne plus comme prévu. Il imprime format: 0. Pourquoi?

Cela a été observé sur certains PC Windows 10 pendant quelques jours récemment. Plus tard, il a magiquement recommencé à fonctionner. Est-ce que cela est peut-être lié à la mise à jour Windows 10 Anniversary?

Répondre

0

Je m'attendrais à imprimer 0 dans les cas où le HRESULT a retourné l'échec dans votre code. Essayez:

IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION); 
if (!d3d) 
    return false; 

...

HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
    GetDesktopWindow(), D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, 
    &device); 
if (FAILED(hr)) 
    return false; 
printf("format: %i\n", pp.BackBufferFormat); 

Le Direct3D 9 héritage API existe dans Windows 10 pour BackCompat. Il était déjà émulé dans Windows Vista. Direct3D9Ex expose plus du comportement «réel» de Windows moderne puisqu'il est conscient de DXGI, mais en général Direct3D 11 est le codepath principalement testé et utilisé par les logiciels modernes. En tant que tel, l'héritage Direct3D 9 continue à devenir un peu plus bizarre avec chaque version de Windows.

Notez que le "Runtime Developer" (alias Device Debug) pour Direct3D 9 ne sont pas pris en charge sur Windows 8.0, Windows 8.1 ou Windows 10.

En utilisant Direct3D 9 signifie aussi généralement l'utilisation du support D3DX dépréciée bibliothèque qui est uniquement disponible dans le end-of-life DirectX SDK. Le déploiement de D3DX nécessite l'utilisation de l'ancien package Redistribution DirectX Runtime End-User. Voir Living without D3DX et Not So Direct Setup

+0

J'ai modifié l'exemple de code dans la question en ajoutant vos suggestions. (Les contrôles étaient déjà l'application réelle.) Le 'HRESULT' n'indique aucun échec. Il imprime toujours 0 sur ces PC. (Et j'essaie déjà de passer en D3D11, mais WPF nécessite encore du D3D9 ...) – Peter

+0

Jetez un coup d'œil à [WPFDXInterop] (https://github.com/Microsoft/WPFDXInterop) –

+0

C'est sur ma liste TODO, Merci. Pour les logiciels existants, il serait toujours intéressant de savoir pourquoi 'BackBufferFormat' reste' 0' après l'installation de Win10. Des idées? Pourrait-il être une mise à jour du pilote ou une mise à jour Windows supplémentaire qui a résolu ce problème? – Peter