SDL_DXGIGetOutputInfo() checks input parameters and returns a boolean value whether or not it succeeded.

This commit is contained in:
Sam Lantinga 2014-04-18 12:43:04 -07:00
parent fc9e3a69b7
commit 03afd0de40
3 changed files with 128 additions and 114 deletions

View file

@ -59,7 +59,7 @@ extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer *
These can be passed to EnumAdapters and EnumOutputs respectively to get the objects These can be passed to EnumAdapters and EnumOutputs respectively to get the objects
required to create a DX10 or DX11 device and swap chain. required to create a DX10 or DX11 device and swap chain.
*/ */
extern DECLSPEC void SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex );
#endif /* __WIN32__ */ #endif /* __WIN32__ */

View file

@ -604,5 +604,5 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_HasAVX,(void),(),return)
SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetDefaultAssertionHandler,(void),(),return) SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetDefaultAssertionHandler,(void),(),return)
SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetAssertionHandler,(void **a),(a),return) SDL_DYNAPI_PROC(SDL_AssertionHandler,SDL_GetAssertionHandler,(void **a),(a),return)
#ifdef __WIN32__ #ifdef __WIN32__
SDL_DYNAPI_PROC(void,SDL_DXGIGetOutputInfo,(int a,int *b, int *c),(a,b,c),) SDL_DYNAPI_PROC(SDL_bool,SDL_DXGIGetOutputInfo,(int a,int *b, int *c),(a,b,c),return)
#endif #endif

View file

@ -182,67 +182,67 @@ WIN_VideoQuit(_THIS)
SDL_bool SDL_bool
D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface ) D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface )
{ {
*pD3DDLL = SDL_LoadObject("D3D9.DLL"); *pD3DDLL = SDL_LoadObject("D3D9.DLL");
if (*pD3DDLL) { if (*pD3DDLL) {
IDirect3D9 *(WINAPI * D3DCreate) (UINT SDKVersion); IDirect3D9 *(WINAPI * D3DCreate) (UINT SDKVersion);
D3DCreate = D3DCreate =
(IDirect3D9 * (WINAPI *) (UINT)) SDL_LoadFunction(*pD3DDLL, (IDirect3D9 * (WINAPI *) (UINT)) SDL_LoadFunction(*pD3DDLL,
"Direct3DCreate9"); "Direct3DCreate9");
if (D3DCreate) { if (D3DCreate) {
*pDirect3D9Interface = D3DCreate(D3D_SDK_VERSION); *pDirect3D9Interface = D3DCreate(D3D_SDK_VERSION);
} }
if (!*pDirect3D9Interface) { if (!*pDirect3D9Interface) {
SDL_UnloadObject(*pD3DDLL); SDL_UnloadObject(*pD3DDLL);
*pD3DDLL = NULL; *pD3DDLL = NULL;
return SDL_FALSE; return SDL_FALSE;
} }
return SDL_TRUE; return SDL_TRUE;
} else { } else {
*pDirect3D9Interface = NULL; *pDirect3D9Interface = NULL;
return SDL_FALSE; return SDL_FALSE;
} }
} }
int int
SDL_Direct3D9GetAdapterIndex( int displayIndex ) SDL_Direct3D9GetAdapterIndex( int displayIndex )
{ {
void *pD3DDLL; void *pD3DDLL;
IDirect3D9 *pD3D; IDirect3D9 *pD3D;
if (!D3D_LoadDLL(&pD3DDLL, &pD3D)) { if (!D3D_LoadDLL(&pD3DDLL, &pD3D)) {
SDL_SetError("Unable to create Direct3D interface"); SDL_SetError("Unable to create Direct3D interface");
return D3DADAPTER_DEFAULT; return D3DADAPTER_DEFAULT;
} else { } else {
SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex);
int adapterIndex = D3DADAPTER_DEFAULT; int adapterIndex = D3DADAPTER_DEFAULT;
if (!pData) { if (!pData) {
SDL_SetError("Invalid display index"); SDL_SetError("Invalid display index");
adapterIndex = -1; /* make sure we return something invalid */ adapterIndex = -1; /* make sure we return something invalid */
} else { } else {
char *displayName = WIN_StringToUTF8(pData->DeviceName); char *displayName = WIN_StringToUTF8(pData->DeviceName);
unsigned int count = IDirect3D9_GetAdapterCount(pD3D); unsigned int count = IDirect3D9_GetAdapterCount(pD3D);
unsigned int i; unsigned int i;
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
D3DADAPTER_IDENTIFIER9 id; D3DADAPTER_IDENTIFIER9 id;
IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &id); IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &id);
if (SDL_strcmp(id.DeviceName, displayName) == 0) { if (SDL_strcmp(id.DeviceName, displayName) == 0) {
adapterIndex = i; adapterIndex = i;
break; break;
} }
} }
SDL_free(displayName); SDL_free(displayName);
} }
/* free up the D3D stuff we inited */ /* free up the D3D stuff we inited */
IDirect3D9_Release(pD3D); IDirect3D9_Release(pD3D);
SDL_UnloadObject(pD3DDLL); SDL_UnloadObject(pD3DDLL);
return adapterIndex; return adapterIndex;
} }
} }
#define CINTERFACE #define CINTERFACE
@ -250,84 +250,98 @@ SDL_Direct3D9GetAdapterIndex( int displayIndex )
#include <dxgi.h> #include <dxgi.h>
SDL_bool SDL_bool
DXGI_LoadDLL( void **pDXGIDLL , IDXGIFactory **pDXGIFactory ) DXGI_LoadDLL(void **pDXGIDLL, IDXGIFactory **pDXGIFactory)
{ {
*pDXGIDLL = SDL_LoadObject("DXGI.DLL"); *pDXGIDLL = SDL_LoadObject("DXGI.DLL");
if (*pDXGIDLL ) { if (!*pDXGIDLL) {
HRESULT (WINAPI *CreateDXGI)( REFIID riid, void **ppFactory ); HRESULT (WINAPI *CreateDXGI)( REFIID riid, void **ppFactory );
CreateDXGI = CreateDXGI =
(HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL, (HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL,
"CreateDXGIFactory"); "CreateDXGIFactory");
if (CreateDXGI) { if (CreateDXGI) {
GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}}; GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}};
if( !SUCCEEDED( CreateDXGI( &dxgiGUID, (void**)pDXGIFactory ))) { if (!SUCCEEDED(CreateDXGI(&dxgiGUID, (void**)pDXGIFactory))) {
*pDXGIFactory = NULL; *pDXGIFactory = NULL;
} }
} }
if (!*pDXGIFactory) { if (!*pDXGIFactory) {
SDL_UnloadObject(*pDXGIDLL); SDL_UnloadObject(*pDXGIDLL);
*pDXGIDLL = NULL; *pDXGIDLL = NULL;
return SDL_FALSE; return SDL_FALSE;
} }
return SDL_TRUE; return SDL_TRUE;
} else { } else {
*pDXGIFactory = NULL; *pDXGIFactory = NULL;
return SDL_FALSE; return SDL_FALSE;
} }
} }
void SDL_bool
SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ) SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex)
{ {
void *pDXGIDLL; SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex);
IDXGIFactory *pDXGIFactory; void *pDXGIDLL;
IDXGIFactory *pDXGIFactory;
IDXGIAdapter *pDXGIAdapter;
IDXGIOutput* pDXGIOutput;
int nAdapter = 0, nOutput = 0;
char *displayName;
*adapterIndex = -1; if (!adapterIndex) {
*outputIndex = -1; SDL_InvalidParamError("adapterIndex");
return SDL_FALSE;
}
if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) { if (!outputIndex) {
SDL_SetError("Unable to create DXGI interface"); SDL_InvalidParamError("outputIndex");
} else { return SDL_FALSE;
SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); }
if (!pData) { *adapterIndex = -1;
SDL_SetError("Invalid display index"); *outputIndex = -1;
} else {
char *displayName = WIN_StringToUTF8(pData->DeviceName);
int nAdapter = 0, nOutput = 0;
IDXGIAdapter* pDXGIAdapter;
while ( *adapterIndex == -1 && IDXGIFactory_EnumAdapters(pDXGIFactory, nAdapter, &pDXGIAdapter) != DXGI_ERROR_NOT_FOUND ) {
IDXGIOutput* pDXGIOutput;
while ( *adapterIndex == -1 && IDXGIAdapter_EnumOutputs(pDXGIAdapter, nOutput, &pDXGIOutput) != DXGI_ERROR_NOT_FOUND ) {
DXGI_OUTPUT_DESC outputDesc;
if (SUCCEEDED(IDXGIOutput_GetDesc(pDXGIOutput, &outputDesc))) {
char *outputName = WIN_StringToUTF8(outputDesc.DeviceName);
if(!SDL_strcmp(outputName, displayName)) { if (!pData) {
*adapterIndex = nAdapter; SDL_SetError("Invalid display index");
*outputIndex = nOutput; return SDL_FALSE;
} }
SDL_free( outputName ); if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) {
} SDL_SetError("Unable to create DXGI interface");
return SDL_FALSE;
}
IDXGIOutput_Release( pDXGIOutput ); displayName = WIN_StringToUTF8(pData->DeviceName);
nOutput++; while (*adapterIndex == -1 && SUCCEEDED(IDXGIFactory_EnumAdapters(pDXGIFactory, nAdapter, &pDXGIAdapter))) {
} while (*adapterIndex == -1 && SUCCEEDED(IDXGIAdapter_EnumOutputs(pDXGIAdapter, nOutput, &pDXGIOutput))) {
DXGI_OUTPUT_DESC outputDesc;
if (SUCCEEDED(IDXGIOutput_GetDesc(pDXGIOutput, &outputDesc))) {
char *outputName = WIN_StringToUTF8(outputDesc.DeviceName);
if (SDL_strcmp(outputName, displayName) == 0) {
*adapterIndex = nAdapter;
*outputIndex = nOutput;
}
SDL_free( outputName );
}
IDXGIOutput_Release(pDXGIOutput);
nOutput++;
}
IDXGIAdapter_Release(pDXGIAdapter);
nAdapter++;
}
SDL_free(displayName);
IDXGIAdapter_Release( pDXGIAdapter ); /* free up the DXGI factory */
nAdapter++; IDXGIFactory_Release(pDXGIFactory);
} SDL_UnloadObject(pDXGIDLL);
SDL_free(displayName);
}
/* free up the D3D stuff we inited */ if (*adapterIndex == -1) {
IDXGIFactory_AddRef( pDXGIFactory ); return SDL_FALSE;
SDL_UnloadObject(pDXGIDLL); } else {
} return SDL_TRUE;
}
} }
#endif /* SDL_VIDEO_DRIVER_WINDOWS */ #endif /* SDL_VIDEO_DRIVER_WINDOWS */