mirror of https://github.com/encounter/SDL.git
SDL_DXGIGetOutputInfo() checks input parameters and returns a boolean value whether or not it succeeded.
This commit is contained in:
parent
fc9e3a69b7
commit
03afd0de40
|
@ -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__ */
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue