From 03afd0de4090b8fe5839a84650a273febfe61eb2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 18 Apr 2014 12:43:04 -0700 Subject: [PATCH] SDL_DXGIGetOutputInfo() checks input parameters and returns a boolean value whether or not it succeeded. --- include/SDL_system.h | 2 +- src/dynapi/SDL_dynapi_procs.h | 2 +- src/video/windows/SDL_windowsvideo.c | 270 ++++++++++++++------------- 3 files changed, 144 insertions(+), 130 deletions(-) diff --git a/include/SDL_system.h b/include/SDL_system.h index fd929f7f98448..cf3937ae702f3 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -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 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__ */ diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h index 301aff38a6d11..ed0ea86e8c057 100644 --- a/src/dynapi/SDL_dynapi_procs.h +++ b/src/dynapi/SDL_dynapi_procs.h @@ -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_GetAssertionHandler,(void **a),(a),return) #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 diff --git a/src/video/windows/SDL_windowsvideo.c b/src/video/windows/SDL_windowsvideo.c index 503653bd6f5ea..c94d7b7fa2a8d 100644 --- a/src/video/windows/SDL_windowsvideo.c +++ b/src/video/windows/SDL_windowsvideo.c @@ -182,67 +182,67 @@ WIN_VideoQuit(_THIS) SDL_bool D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface ) { - *pD3DDLL = SDL_LoadObject("D3D9.DLL"); - if (*pD3DDLL) { - IDirect3D9 *(WINAPI * D3DCreate) (UINT SDKVersion); - - D3DCreate = - (IDirect3D9 * (WINAPI *) (UINT)) SDL_LoadFunction(*pD3DDLL, - "Direct3DCreate9"); - if (D3DCreate) { - *pDirect3D9Interface = D3DCreate(D3D_SDK_VERSION); - } - if (!*pDirect3D9Interface) { - SDL_UnloadObject(*pD3DDLL); - *pD3DDLL = NULL; - return SDL_FALSE; - } - - return SDL_TRUE; - } else { - *pDirect3D9Interface = NULL; - return SDL_FALSE; - } + *pD3DDLL = SDL_LoadObject("D3D9.DLL"); + if (*pD3DDLL) { + IDirect3D9 *(WINAPI * D3DCreate) (UINT SDKVersion); + + D3DCreate = + (IDirect3D9 * (WINAPI *) (UINT)) SDL_LoadFunction(*pD3DDLL, + "Direct3DCreate9"); + if (D3DCreate) { + *pDirect3D9Interface = D3DCreate(D3D_SDK_VERSION); + } + if (!*pDirect3D9Interface) { + SDL_UnloadObject(*pD3DDLL); + *pD3DDLL = NULL; + return SDL_FALSE; + } + + return SDL_TRUE; + } else { + *pDirect3D9Interface = NULL; + return SDL_FALSE; + } } int SDL_Direct3D9GetAdapterIndex( int displayIndex ) { - void *pD3DDLL; - IDirect3D9 *pD3D; - if (!D3D_LoadDLL(&pD3DDLL, &pD3D)) { - SDL_SetError("Unable to create Direct3D interface"); - return D3DADAPTER_DEFAULT; - } else { - SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); - int adapterIndex = D3DADAPTER_DEFAULT; - - if (!pData) { - SDL_SetError("Invalid display index"); - adapterIndex = -1; /* make sure we return something invalid */ - } else { - char *displayName = WIN_StringToUTF8(pData->DeviceName); - unsigned int count = IDirect3D9_GetAdapterCount(pD3D); - unsigned int i; - for (i=0; iDeviceName); + unsigned int count = IDirect3D9_GetAdapterCount(pD3D); + unsigned int i; + for (i=0; i SDL_bool -DXGI_LoadDLL( void **pDXGIDLL , IDXGIFactory **pDXGIFactory ) +DXGI_LoadDLL(void **pDXGIDLL, IDXGIFactory **pDXGIFactory) { - *pDXGIDLL = SDL_LoadObject("DXGI.DLL"); - if (*pDXGIDLL ) { - HRESULT (WINAPI *CreateDXGI)( REFIID riid, void **ppFactory ); - - CreateDXGI = - (HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL, - "CreateDXGIFactory"); - if (CreateDXGI) { - GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}}; - if( !SUCCEEDED( CreateDXGI( &dxgiGUID, (void**)pDXGIFactory ))) { - *pDXGIFactory = NULL; - } - } - if (!*pDXGIFactory) { - SDL_UnloadObject(*pDXGIDLL); - *pDXGIDLL = NULL; - return SDL_FALSE; - } - - return SDL_TRUE; - } else { - *pDXGIFactory = NULL; - return SDL_FALSE; - } + *pDXGIDLL = SDL_LoadObject("DXGI.DLL"); + if (!*pDXGIDLL) { + HRESULT (WINAPI *CreateDXGI)( REFIID riid, void **ppFactory ); + + CreateDXGI = + (HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL, + "CreateDXGIFactory"); + if (CreateDXGI) { + GUID dxgiGUID = {0x7b7166ec,0x21c7,0x44ae,{0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69}}; + if (!SUCCEEDED(CreateDXGI(&dxgiGUID, (void**)pDXGIFactory))) { + *pDXGIFactory = NULL; + } + } + if (!*pDXGIFactory) { + SDL_UnloadObject(*pDXGIDLL); + *pDXGIDLL = NULL; + return SDL_FALSE; + } + + return SDL_TRUE; + } else { + *pDXGIFactory = NULL; + return SDL_FALSE; + } } -void -SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ) +SDL_bool +SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex) { - void *pDXGIDLL; - IDXGIFactory *pDXGIFactory; - - *adapterIndex = -1; - *outputIndex = -1; - - if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) { - SDL_SetError("Unable to create DXGI interface"); - } else { - SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); - - if (!pData) { - SDL_SetError("Invalid display index"); - } 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)) { - *adapterIndex = nAdapter; - *outputIndex = nOutput; - } - - SDL_free( outputName ); - } - - IDXGIOutput_Release( pDXGIOutput ); - nOutput++; - } - - IDXGIAdapter_Release( pDXGIAdapter ); - nAdapter++; - } - SDL_free(displayName); - } - - /* free up the D3D stuff we inited */ - IDXGIFactory_AddRef( pDXGIFactory ); - SDL_UnloadObject(pDXGIDLL); - } + SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex); + void *pDXGIDLL; + IDXGIFactory *pDXGIFactory; + IDXGIAdapter *pDXGIAdapter; + IDXGIOutput* pDXGIOutput; + int nAdapter = 0, nOutput = 0; + char *displayName; + + if (!adapterIndex) { + SDL_InvalidParamError("adapterIndex"); + return SDL_FALSE; + } + + if (!outputIndex) { + SDL_InvalidParamError("outputIndex"); + return SDL_FALSE; + } + + *adapterIndex = -1; + *outputIndex = -1; + + if (!pData) { + SDL_SetError("Invalid display index"); + return SDL_FALSE; + } + + if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) { + SDL_SetError("Unable to create DXGI interface"); + return SDL_FALSE; + } + + displayName = WIN_StringToUTF8(pData->DeviceName); + 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); + + /* free up the DXGI factory */ + IDXGIFactory_Release(pDXGIFactory); + SDL_UnloadObject(pDXGIDLL); + + if (*adapterIndex == -1) { + return SDL_FALSE; + } else { + return SDL_TRUE; + } } #endif /* SDL_VIDEO_DRIVER_WINDOWS */