|
@@ -182,152 +182,166 @@ 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; i<count; i++) { |
|
|
D3DADAPTER_IDENTIFIER9 id; |
|
|
IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &id); |
|
|
|
|
|
if (SDL_strcmp(id.DeviceName, displayName) == 0) { |
|
|
adapterIndex = i; |
|
|
break; |
|
|
} |
|
|
} |
|
|
SDL_free(displayName); |
|
|
} |
|
|
|
|
|
/* free up the D3D stuff we inited */ |
|
|
IDirect3D9_Release(pD3D); |
|
|
SDL_UnloadObject(pD3DDLL); |
|
|
|
|
|
return adapterIndex; |
|
|
} |
|
|
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; i<count; i++) { |
|
|
D3DADAPTER_IDENTIFIER9 id; |
|
|
IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &id); |
|
|
|
|
|
if (SDL_strcmp(id.DeviceName, displayName) == 0) { |
|
|
adapterIndex = i; |
|
|
break; |
|
|
} |
|
|
} |
|
|
SDL_free(displayName); |
|
|
} |
|
|
|
|
|
/* free up the D3D stuff we inited */ |
|
|
IDirect3D9_Release(pD3D); |
|
|
SDL_UnloadObject(pD3DDLL); |
|
|
|
|
|
return adapterIndex; |
|
|
} |
|
|
} |
|
|
|
|
|
#define CINTERFACE |
|
|
#define COBJMACROS |
|
|
#include <dxgi.h> |
|
|
|
|
|
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 */ |
|
|