mirror of
				https://github.com/Ryujinx/SDL.git
				synced 2025-11-04 15:34:58 +00:00 
			
		
		
		
	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
 | 
			
		||||
   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__ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    *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;
 | 
			
		||||
		}
 | 
			
		||||
        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;
 | 
			
		||||
	}
 | 
			
		||||
        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;
 | 
			
		||||
    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 (!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);
 | 
			
		||||
		}
 | 
			
		||||
                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);
 | 
			
		||||
        /* free up the D3D stuff we inited */
 | 
			
		||||
        IDirect3D9_Release(pD3D);
 | 
			
		||||
        SDL_UnloadObject(pD3DDLL);
 | 
			
		||||
 | 
			
		||||
		return adapterIndex;
 | 
			
		||||
	}
 | 
			
		||||
        return adapterIndex;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define CINTERFACE
 | 
			
		||||
| 
						 | 
				
			
			@ -250,84 +250,98 @@ SDL_Direct3D9GetAdapterIndex( int displayIndex )
 | 
			
		|||
#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 );
 | 
			
		||||
    *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;
 | 
			
		||||
		}
 | 
			
		||||
        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;
 | 
			
		||||
	}
 | 
			
		||||
        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;
 | 
			
		||||
    SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex);
 | 
			
		||||
    void *pDXGIDLL;
 | 
			
		||||
    IDXGIFactory *pDXGIFactory;
 | 
			
		||||
    IDXGIAdapter *pDXGIAdapter;
 | 
			
		||||
    IDXGIOutput* pDXGIOutput;
 | 
			
		||||
    int nAdapter = 0, nOutput = 0;
 | 
			
		||||
    char *displayName;
 | 
			
		||||
 | 
			
		||||
	*adapterIndex = -1;
 | 
			
		||||
	*outputIndex = -1;
 | 
			
		||||
    if (!adapterIndex) {
 | 
			
		||||
        SDL_InvalidParamError("adapterIndex");
 | 
			
		||||
        return SDL_FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) {
 | 
			
		||||
		SDL_SetError("Unable to create DXGI interface");
 | 
			
		||||
	} else {
 | 
			
		||||
		SDL_DisplayData *pData = (SDL_DisplayData *)SDL_GetDisplayDriverData(displayIndex);
 | 
			
		||||
    if (!outputIndex) {
 | 
			
		||||
        SDL_InvalidParamError("outputIndex");
 | 
			
		||||
        return SDL_FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
    *adapterIndex = -1;
 | 
			
		||||
    *outputIndex = -1;
 | 
			
		||||
 | 
			
		||||
						if(!SDL_strcmp(outputName, displayName)) {
 | 
			
		||||
							*adapterIndex = nAdapter;
 | 
			
		||||
							*outputIndex = nOutput;
 | 
			
		||||
						}
 | 
			
		||||
    if (!pData) {
 | 
			
		||||
        SDL_SetError("Invalid display index");
 | 
			
		||||
        return SDL_FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
						SDL_free( outputName );
 | 
			
		||||
					}
 | 
			
		||||
    if (!DXGI_LoadDLL(&pDXGIDLL, &pDXGIFactory)) {
 | 
			
		||||
        SDL_SetError("Unable to create DXGI interface");
 | 
			
		||||
        return SDL_FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
					IDXGIOutput_Release( pDXGIOutput );
 | 
			
		||||
					nOutput++;
 | 
			
		||||
				}
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
				IDXGIAdapter_Release( pDXGIAdapter );
 | 
			
		||||
				nAdapter++;
 | 
			
		||||
			}
 | 
			
		||||
			SDL_free(displayName);
 | 
			
		||||
		}
 | 
			
		||||
    /* free up the DXGI factory */
 | 
			
		||||
    IDXGIFactory_Release(pDXGIFactory);
 | 
			
		||||
    SDL_UnloadObject(pDXGIDLL);
 | 
			
		||||
 | 
			
		||||
		/* free up the D3D stuff we inited */
 | 
			
		||||
		IDXGIFactory_AddRef( pDXGIFactory );
 | 
			
		||||
		SDL_UnloadObject(pDXGIDLL);
 | 
			
		||||
	}
 | 
			
		||||
    if (*adapterIndex == -1) {
 | 
			
		||||
        return SDL_FALSE;
 | 
			
		||||
    } else {
 | 
			
		||||
        return SDL_TRUE;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* SDL_VIDEO_DRIVER_WINDOWS */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue