From 6944194d2b41df5d41f28c1efe735827c6e91848 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sat, 27 Oct 2012 22:48:04 -0400 Subject: [PATCH] WinRT: created a skeleton for a video driver, using a copy of the dummy driver for a base --- VisualC/SDL/SDL_VS2012_WinRT.vcxproj | 6 + include/SDL_config_windowsrt.h | 3 +- src/video/SDL_sysvideo.h | 3 + src/video/SDL_video.c | 3 + src/video/windowsrt/SDL_winrtevents.c | 41 ++++++ src/video/windowsrt/SDL_winrtevents_c.h | 27 ++++ src/video/windowsrt/SDL_winrtframebuffer.c | 94 +++++++++++++ src/video/windowsrt/SDL_winrtframebuffer_c.h | 27 ++++ src/video/windowsrt/SDL_winrtvideo.c | 137 +++++++++++++++++++ src/video/windowsrt/SDL_winrtvideo.h | 30 ++++ 10 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 src/video/windowsrt/SDL_winrtevents.c create mode 100644 src/video/windowsrt/SDL_winrtevents_c.h create mode 100644 src/video/windowsrt/SDL_winrtframebuffer.c create mode 100644 src/video/windowsrt/SDL_winrtframebuffer_c.h create mode 100644 src/video/windowsrt/SDL_winrtvideo.c create mode 100644 src/video/windowsrt/SDL_winrtvideo.h diff --git a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj index 687b462ea..e8cb1f0c8 100644 --- a/VisualC/SDL/SDL_VS2012_WinRT.vcxproj +++ b/VisualC/SDL/SDL_VS2012_WinRT.vcxproj @@ -125,6 +125,9 @@ true true + + + @@ -234,6 +237,9 @@ + + + {aeaea3a2-d4e6-45b1-8ec6-53d84287fc14} diff --git a/include/SDL_config_windowsrt.h b/include/SDL_config_windowsrt.h index f8c2df300..3f12a130c 100644 --- a/include/SDL_config_windowsrt.h +++ b/include/SDL_config_windowsrt.h @@ -169,7 +169,8 @@ typedef unsigned int uintptr_t; #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. diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index ae260c91b..056173cd5 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -327,6 +327,9 @@ extern VideoBootStrap DirectFB_bootstrap; #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 diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 24c72dcde..6198a0cdb 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -63,6 +63,9 @@ static VideoBootStrap *bootstrap[] = { #if SDL_VIDEO_DRIVER_WINDOWS &WINDOWS_bootstrap, #endif +#if SDL_VIDEO_DRIVER_WINRT + &WINRT_bootstrap, +#endif #if SDL_VIDEO_DRIVER_BWINDOW &BWINDOW_bootstrap, #endif diff --git a/src/video/windowsrt/SDL_winrtevents.c b/src/video/windowsrt/SDL_winrtevents.c new file mode 100644 index 000000000..d774f05b1 --- /dev/null +++ b/src/video/windowsrt/SDL_winrtevents.c @@ -0,0 +1,41 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */ diff --git a/src/video/windowsrt/SDL_winrtevents_c.h b/src/video/windowsrt/SDL_winrtevents_c.h new file mode 100644 index 000000000..afbd6862c --- /dev/null +++ b/src/video/windowsrt/SDL_winrtevents_c.h @@ -0,0 +1,27 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */ diff --git a/src/video/windowsrt/SDL_winrtframebuffer.c b/src/video/windowsrt/SDL_winrtframebuffer.c new file mode 100644 index 000000000..2426eac0f --- /dev/null +++ b/src/video/windowsrt/SDL_winrtframebuffer.c @@ -0,0 +1,94 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */ diff --git a/src/video/windowsrt/SDL_winrtframebuffer_c.h b/src/video/windowsrt/SDL_winrtframebuffer_c.h new file mode 100644 index 000000000..d6531cfd0 --- /dev/null +++ b/src/video/windowsrt/SDL_winrtframebuffer_c.h @@ -0,0 +1,27 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */ diff --git a/src/video/windowsrt/SDL_winrtvideo.c b/src/video/windowsrt/SDL_winrtvideo.c new file mode 100644 index 000000000..c6b84a300 --- /dev/null +++ b/src/video/windowsrt/SDL_winrtvideo.c @@ -0,0 +1,137 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */ diff --git a/src/video/windowsrt/SDL_winrtvideo.h b/src/video/windowsrt/SDL_winrtvideo.h new file mode 100644 index 000000000..6490b31e0 --- /dev/null +++ b/src/video/windowsrt/SDL_winrtvideo.h @@ -0,0 +1,30 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + 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: */