|
@@ -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: */
|