WinRT: created a skeleton for a video driver, using a copy of the dummy driver for a base
authorDavid Ludwig <dludwig@pobox.com>
Sat, 27 Oct 2012 22:48:04 -0400
changeset 8327 bc51589f33dc
parent 8326 22db28fb8099
child 8328 88b08ad81bf7
WinRT: created a skeleton for a video driver, using a copy of the dummy driver for a base
VisualC/SDL/SDL_VS2012_WinRT.vcxproj
include/SDL_config_windowsrt.h
src/video/SDL_sysvideo.h
src/video/SDL_video.c
src/video/windowsrt/SDL_winrtevents.c
src/video/windowsrt/SDL_winrtevents_c.h
src/video/windowsrt/SDL_winrtframebuffer.c
src/video/windowsrt/SDL_winrtframebuffer_c.h
src/video/windowsrt/SDL_winrtvideo.c
src/video/windowsrt/SDL_winrtvideo.h
--- a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Sat Oct 27 22:27:51 2012 -0400
+++ b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj	Sat Oct 27 22:48:04 2012 -0400
@@ -125,6 +125,9 @@
       <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</CompileAsWinRT>
       <CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</CompileAsWinRT>
     </ClCompile>
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtevents.c" />
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtframebuffer.c" />
+    <ClCompile Include="..\..\src\video\windowsrt\SDL_winrtvideo.c" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\include\begin_code.h" />
@@ -234,6 +237,9 @@
     <ClInclude Include="..\..\src\video\windowsrt\DirectXHelper.h" />
     <ClInclude Include="..\..\src\video\windowsrt\SDLmain_WinRT_common.h" />
     <ClInclude Include="..\..\src\video\windowsrt\SDL_WinRTApp.h" />
+    <ClInclude Include="..\..\src\video\windowsrt\SDL_winrtevents_c.h" />
+    <ClInclude Include="..\..\src\video\windowsrt\SDL_winrtframebuffer_c.h" />
+    <ClInclude Include="..\..\src\video\windowsrt\SDL_winrtvideo.h" />
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{aeaea3a2-d4e6-45b1-8ec6-53d84287fc14}</ProjectGuid>
--- a/include/SDL_config_windowsrt.h	Sat Oct 27 22:27:51 2012 -0400
+++ b/include/SDL_config_windowsrt.h	Sat Oct 27 22:48:04 2012 -0400
@@ -169,7 +169,8 @@
 #define SDL_TIMERS_DISABLED	1
 
 /* Enable various video drivers */
-#define SDL_VIDEO_DRIVER_DUMMY	1
+#define SDL_VIDEO_DRIVER_WINRT	1
+#define SDL_VIDEO_DRIVER_DUMMY  1
 
 // TODO, WinRT: Get a Direct3D 11 based renderer working in SDL.
 
--- a/src/video/SDL_sysvideo.h	Sat Oct 27 22:27:51 2012 -0400
+++ b/src/video/SDL_sysvideo.h	Sat Oct 27 22:48:04 2012 -0400
@@ -327,6 +327,9 @@
 #if SDL_VIDEO_DRIVER_WINDOWS
 extern VideoBootStrap WINDOWS_bootstrap;
 #endif
+#if SDL_VIDEO_DRIVER_WINRT
+extern VideoBootStrap WINRT_bootstrap;
+#endif
 #if SDL_VIDEO_DRIVER_BWINDOW
 extern VideoBootStrap BWINDOW_bootstrap;
 #endif
--- a/src/video/SDL_video.c	Sat Oct 27 22:27:51 2012 -0400
+++ b/src/video/SDL_video.c	Sat Oct 27 22:48:04 2012 -0400
@@ -63,6 +63,9 @@
 #if SDL_VIDEO_DRIVER_WINDOWS
     &WINDOWS_bootstrap,
 #endif
+#if SDL_VIDEO_DRIVER_WINRT
+    &WINRT_bootstrap,
+#endif
 #if SDL_VIDEO_DRIVER_BWINDOW
     &BWINDOW_bootstrap,
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtevents.c	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,41 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+/* Being a null driver, there's no event stream. We just define stubs for
+   most of the API. */
+
+#include "../../events/SDL_events_c.h"
+
+#include "SDL_winrtvideo.h"
+#include "SDL_winrtevents_c.h"
+
+void
+WINRT_PumpEvents(_THIS)
+{
+    /* do nothing. */
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtevents_c.h	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,27 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#include "SDL_winrtvideo.h"
+
+extern void WINRT_PumpEvents(_THIS);
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtframebuffer.c	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,94 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+#include "../SDL_sysvideo.h"
+#include "SDL_winrtframebuffer_c.h"
+
+
+#define WINRT_SURFACE   "_SDL_WinRTSurface"
+
+int SDL_WINRT_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
+{
+    SDL_Surface *surface;
+    const Uint32 surface_format = SDL_PIXELFORMAT_RGB888;
+    int w, h;
+    int bpp;
+    Uint32 Rmask, Gmask, Bmask, Amask;
+
+    /* Free the old framebuffer surface */
+    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
+    if (surface) {
+        SDL_FreeSurface(surface);
+    }
+
+    /* Create a new one */
+    SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask);
+    SDL_GetWindowSize(window, &w, &h);
+    surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask);
+    if (!surface) {
+        return -1;
+    }
+
+    /* Save the info and return! */
+    SDL_SetWindowData(window, WINRT_SURFACE, surface);
+    *format = surface_format;
+    *pixels = surface->pixels;
+    *pitch = surface->pitch;
+    return 0;
+}
+
+int SDL_WINRT_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
+{
+    static int frame_number;
+    SDL_Surface *surface;
+
+    surface = (SDL_Surface *) SDL_GetWindowData(window, WINRT_SURFACE);
+    if (!surface) {
+        SDL_SetError("Couldn't find WinRT surface for window");
+        return -1;
+    }
+
+    /* Send the data to the display */
+    if (SDL_getenv("SDL_VIDEO_WINRT_SAVE_FRAMES")) {
+        char file[128];
+        SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
+                     SDL_GetWindowID(window), ++frame_number);
+        SDL_SaveBMP(surface, file);
+    }
+    return 0;
+}
+
+void SDL_WINRT_DestroyWindowFramebuffer(_THIS, SDL_Window * window)
+{
+    SDL_Surface *surface;
+
+    surface = (SDL_Surface *) SDL_SetWindowData(window, WINRT_SURFACE, NULL);
+    if (surface) {
+        SDL_FreeSurface(surface);
+    }
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtframebuffer_c.h	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,27 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+extern int SDL_WINRT_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
+extern int SDL_WINRT_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects);
+extern void SDL_WINRT_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtvideo.c	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,137 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#if SDL_VIDEO_DRIVER_WINRT
+
+/* WinRT SDL video driver implementation
+
+   Initial work on this was done by David Ludwig (dludwig@pobox.com), and
+   was based off of SDL's "dummy" video driver.
+ */
+
+#include "SDL_video.h"
+#include "SDL_mouse.h"
+#include "../SDL_sysvideo.h"
+#include "../SDL_pixels_c.h"
+#include "../../events/SDL_events_c.h"
+
+#include "SDL_winrtvideo.h"
+#include "SDL_winrtevents_c.h"
+#include "SDL_winrtframebuffer_c.h"
+
+#define WINRTVID_DRIVER_NAME "dummy"
+
+/* Initialization/Query functions */
+static int WINRT_VideoInit(_THIS);
+static int WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
+static void WINRT_VideoQuit(_THIS);
+
+/* WinRT driver bootstrap functions */
+
+static int
+WINRT_Available(void)
+{
+    const char *envr = SDL_getenv("SDL_VIDEODRIVER");
+    if ((envr) && (SDL_strcmp(envr, WINRTVID_DRIVER_NAME) == 0)) {
+        return (1);
+    }
+
+    return (0);
+}
+
+static void
+WINRT_DeleteDevice(SDL_VideoDevice * device)
+{
+    SDL_free(device);
+}
+
+static SDL_VideoDevice *
+WINRT_CreateDevice(int devindex)
+{
+    SDL_VideoDevice *device;
+
+    /* Initialize all variables that we clean on shutdown */
+    device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
+    if (!device) {
+        SDL_OutOfMemory();
+        if (device) {
+            SDL_free(device);
+        }
+        return (0);
+    }
+
+    /* Set the function pointers */
+    device->VideoInit = WINRT_VideoInit;
+    device->VideoQuit = WINRT_VideoQuit;
+    device->SetDisplayMode = WINRT_SetDisplayMode;
+    device->PumpEvents = WINRT_PumpEvents;
+    device->CreateWindowFramebuffer = SDL_WINRT_CreateWindowFramebuffer;
+    device->UpdateWindowFramebuffer = SDL_WINRT_UpdateWindowFramebuffer;
+    device->DestroyWindowFramebuffer = SDL_WINRT_DestroyWindowFramebuffer;
+
+    device->free = WINRT_DeleteDevice;
+
+    return device;
+}
+
+VideoBootStrap WINRT_bootstrap = {
+    WINRTVID_DRIVER_NAME, "SDL Windows RT video driver",
+    WINRT_Available, WINRT_CreateDevice
+};
+
+
+int
+WINRT_VideoInit(_THIS)
+{
+    SDL_DisplayMode mode;
+
+    /* Use a fake 32-bpp desktop mode */
+    mode.format = SDL_PIXELFORMAT_RGB888;
+    mode.w = 1024;
+    mode.h = 768;
+    mode.refresh_rate = 0;
+    mode.driverdata = NULL;
+    if (SDL_AddBasicVideoDisplay(&mode) < 0) {
+        return -1;
+    }
+
+    SDL_zero(mode);
+    SDL_AddDisplayMode(&_this->displays[0], &mode);
+
+    /* We're done! */
+    return 0;
+}
+
+static int
+WINRT_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
+{
+    return 0;
+}
+
+void
+WINRT_VideoQuit(_THIS)
+{
+}
+
+#endif /* SDL_VIDEO_DRIVER_WINRT */
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windowsrt/SDL_winrtvideo.h	Sat Oct 27 22:48:04 2012 -0400
@@ -0,0 +1,30 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "SDL_config.h"
+
+#ifndef _SDL_winrtvideo_h
+#define _SDL_winrtvideo_h
+
+#include "../SDL_sysvideo.h"
+
+#endif /* _SDL_winrtvideo_h */
+
+/* vi: set ts=4 sw=4 expandtab: */