Commit b6be1435c5fa3d23311ff5411b2e2bd7393d9ad5

Sam Lantinga 2013-09-28T14:06:20

Moved D3D_LoadDLL and SDL_Direct3D9GetAdapterIndex to SDL_windowswindow.c at Jorgen's insistence. That file is wrapped in a more appropriate define check so it will work if somebody builds a binary without D3D support. Added a reference to SDL_Direct3D9GetAdapterIndex to SDL_test_common.c so SDL will fail to compile if the new symbol isn't included properly. CR: Jorgen

diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c
index d99057e..0248b21 100644
--- a/src/render/direct3d/SDL_render_d3d.c
+++ b/src/render/direct3d/SDL_render_d3d.c
@@ -28,11 +28,13 @@
 #include "SDL_hints.h"
 #include "SDL_loadso.h"
 #include "SDL_syswm.h"
+#include "SDL_system.h"
 #include "../SDL_sysrender.h"
-#include "../../video/SDL_sysvideo.h"
-#include "../../video/windows/SDL_windowsmodes.h"
 #include <stdio.h>
 
+#include "../../video/SDL_sysvideo.h"
+#include "../../video/windows/SDL_windowswindow.h"
+
 #if SDL_VIDEO_RENDER_D3D
 #define D3D_DEBUG_INFO
 #include <d3d9.h>
@@ -533,72 +535,6 @@ D3D_ActivateRenderer(SDL_Renderer * renderer)
     return 0;
 }
 
-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;
-	}
-}
-
-
-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" );
-		} 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;
-	}
-}
-
-
 SDL_Renderer *
 D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
 {
diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c
index e0ff376..05d72a2 100644
--- a/src/test/SDL_test_common.c
+++ b/src/test/SDL_test_common.c
@@ -701,7 +701,9 @@ SDLTest_CommonInit(SDLTest_CommonState * state)
             SDL_DisplayMode mode;
             int bpp;
             Uint32 Rmask, Gmask, Bmask, Amask;
-
+#if SDL_VIDEO_DRIVER_WINDOWS
+			int adapterIndex = 0;
+#endif
             n = SDL_GetNumVideoDisplays();
             fprintf(stderr, "Number of displays: %d\n", n);
             for (i = 0; i < n; ++i) {
@@ -754,6 +756,12 @@ SDLTest_CommonInit(SDLTest_CommonState * state)
                         }
                     }
                 }
+
+#if SDL_VIDEO_DRIVER_WINDOWS
+				/* Print the adapter index */
+				adapterIndex = SDL_Direct3D9GetAdapterIndex( i );
+				fprintf( stderr, "Adapter Index: %d", adapterIndex );
+#endif
             }
         }
 
diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c
index c28da52..f7e1b37 100644
--- a/src/video/windows/SDL_windowswindow.c
+++ b/src/video/windows/SDL_windowswindow.c
@@ -22,10 +22,15 @@
 
 #if SDL_VIDEO_DRIVER_WINDOWS
 
+#include "../../core/windows/SDL_windows.h"
+
 #include "SDL_assert.h"
+#include "SDL_system.h"
 #include "../SDL_sysvideo.h"
 #include "../SDL_pixels_c.h"
 #include "../../events/SDL_keyboard_c.h"
+#include "../../video/SDL_sysvideo.h"
+#include "../../video/windows/SDL_windowsmodes.h"
 
 #include "SDL_windowsvideo.h"
 #include "SDL_windowswindow.h"
@@ -36,6 +41,9 @@
 /* This is included after SDL_windowsvideo.h, which includes windows.h */
 #include "SDL_syswm.h"
 
+#define D3D_DEBUG_INFO
+#include <d3d9.h>
+
 /* Windows CE compatibility */
 #ifndef SWP_NOCOPYBITS
 #define SWP_NOCOPYBITS 0
@@ -683,6 +691,74 @@ void WIN_OnWindowEnter(_THIS, SDL_Window * window)
 #endif /* WM_MOUSELEAVE */
 }
 
+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;
+	}
+}
+
+
+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;
+	}
+}
+
+
+
 #endif /* SDL_VIDEO_DRIVER_WINDOWS */
 
 /* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h
index e85c201..08e6186 100644
--- a/src/video/windows/SDL_windowswindow.h
+++ b/src/video/windows/SDL_windowswindow.h
@@ -36,6 +36,8 @@ typedef struct
     struct SDL_VideoData *videodata;
 } SDL_WindowData;
 
+typedef struct IDirect3D9 IDirect3D9;
+
 extern int WIN_CreateWindow(_THIS, SDL_Window * window);
 extern int WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data);
 extern void WIN_SetWindowTitle(_THIS, SDL_Window * window);
@@ -57,6 +59,7 @@ extern void WIN_DestroyWindow(_THIS, SDL_Window * window);
 extern SDL_bool WIN_GetWindowWMInfo(_THIS, SDL_Window * window,
                                     struct SDL_SysWMinfo *info);
 extern void WIN_OnWindowEnter(_THIS, SDL_Window * window);
+extern SDL_bool D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface );
 
 #endif /* _SDL_windowswindow_h */