Re: WinRT changes for review
David Ludwig <[email protected]>
| Newsgroups | gmane.comp.lib.sdl |
|---|---|
| Message-ID | <CAGDc1f=5tK+cnhBfuuMRm-u-JEB1iBhYyycozKrob6Y5X5z16A@mail.gmail.com> |
Thanks for the patch. I have a few questions and comments about it: 1. regarding DPI, the diagonal-DPI computation looks odd to me. Is this returning the same values that the SDL's Win32 backend would return? 2. regarding buffer-count: any thoughts on if that were moved into a hint? 3. for remembering window-fullscreen, does SDL need to be modified in order to support that? Could that be handled via app code, or via an extension library? Cheers, -- David L. On Sun, Oct 2, 2016 at 5:20 AM, hardcoredaniel <[email protected]> wrote: > Hi, > > I have experimented with WinRT a little and want to publish my changes. > Below is the diff. > > These are the changes: > > 1) Added a hint to enable saving the fullscreen preference of an app. > Default is disabled. > 2) Use triple-buffering instead of double-buffering. We discussed this > before, not sure whether and how to apply it. > 3) Experimental code to query display densities. Because I have no idea > what to do with the "diagonal DPI" value, I tried to put the scaling factor > in. > > Any feedback is welcome! > > Regards, > > Daniel > > ------------------------- > > diff -Naur SDL_snapshot/include/SDL_hints.h SDL_merged/include/SDL_hints.h > --- SDL_snapshot/include/SDL_hints.h 2016-10-02 09:27:31.000000000 > +0200 > +++ SDL_merged/include/SDL_hints.h 2016-10-02 09:41:18.000000000 +0200 > @@ -689,6 +689,20 @@ > #define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" > > /** > + * \brief A hint to control whether the system shall remember the > preferred fullscreen mode. > + * > + * This hint will work for WinRT only. > + * > + * The variable can be set to the following values: > + * "0" - No action. System does not remember whether the app > wants to run in fullscreen. > + * "1" - Remember preferred app setting (fullscreen or windowed). > + * > + * The default is "0". > + * > + */ > +#define SDL_HINT_WINRT_REMEMBER_WINDOW_FULLSCREEN_PREFERENCE > "SDL_WINRT_REMEMBER_WINDOW_FULLSCREEN_PREFERENCE" > + > +/** > * \brief An enumeration of hint priorities > */ > typedef enum > diff -Naur SDL_snapshot/src/render/direct3d11/SDL_render_d3d11.c > SDL_merged/src/render/direct3d11/SDL_render_d3d11.c > --- SDL_snapshot/src/render/direct3d11/SDL_render_d3d11.c 2016-10-02 > 09:27:31.000000000 +0200 > +++ SDL_merged/src/render/direct3d11/SDL_render_d3d11.c 2016-10-02 > 09:58:08.000000000 +0200 > @@ -1437,7 +1437,7 @@ > swapChainDesc.SampleDesc.Count = 1; /* Don't use multi-sampling. */ > swapChainDesc.SampleDesc.Quality = 0; > swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; > - swapChainDesc.BufferCount = 2; /* Use double-buffering to minimize > latency. */ > + swapChainDesc.BufferCount = 3; /* Use triple-buffering to minimize > latency. */ > #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP > swapChainDesc.Scaling = DXGI_SCALING_STRETCH; /* On phone, only > stretch and aspect-ratio stretch scaling are allowed. */ > swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; /* On phone, no > swap effects are supported. */ > diff -Naur SDL_snapshot/src/video/winrt/SDL_winrtvideo.cpp > SDL_merged/src/video/winrt/SDL_winrtvideo.cpp > --- SDL_snapshot/src/video/winrt/SDL_winrtvideo.cpp 2016-10-02 > 09:27:31.000000000 +0200 > +++ SDL_merged/src/video/winrt/SDL_winrtvideo.cpp 2016-10-02 > 10:10:31.000000000 +0200 > @@ -67,7 +67,8 @@ > #include "SDL_winrtmouse_c.h" > #include "SDL_main.h" > #include "SDL_system.h" > -//#include "SDL_log.h" > +#include "SDL_hints.h" > +#include "SDL_log.h" > > > /* Initialization/Query functions */ > @@ -83,6 +84,7 @@ > static void WINRT_SetWindowFullscreen(_THIS, SDL_Window * window, > SDL_VideoDisplay * display, SDL_bool fullscreen); > static void WINRT_DestroyWindow(_THIS, SDL_Window * window); > static SDL_bool WINRT_GetWindowWMInfo(_THIS, SDL_Window * window, > SDL_SysWMinfo * info); > +static int WINRT_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, > float * ddpi, float * hdpi, float * vdpi); > > > /* Misc functions */ > @@ -148,6 +150,7 @@ > device->PumpEvents = WINRT_PumpEvents; > device->GetWindowWMInfo = WINRT_GetWindowWMInfo; > device->SuspendScreenSaver = WINRT_SuspendScreenSaver; > + device->GetDisplayDPI = WINRT_GetDisplayDPI; > > #if NTDDI_VERSION >= NTDDI_WIN10 > device->HasScreenKeyboardSupport = WINRT_HasScreenKeyboardSupport; > @@ -729,14 +732,33 @@ > #if NTDDI_VERSION >= NTDDI_WIN10 > SDL_WindowData * data = (SDL_WindowData *)window->driverdata; > bool isWindowActive = WINRT_IsCoreWindowActive(data- > >coreWindow.Get()); > + bool rememberMode = false; > + > + const char *hint = SDL_GetHint(SDL_HINT_WINRT_ > REMEMBER_WINDOW_FULLSCREEN_PREFERENCE); > + if (hint) { > + if (*hint == '1') { > + rememberMode = true; > + } > + } > + > if (isWindowActive) { > if (fullscreen) { > - if (!data->appView->IsFullScreenMode) { > - data->appView->TryEnterFullScreenMode(); // TODO, > WinRT: return failure (to caller?) from TryEnterFullScreenMode() > - } > + if (!data->appView->IsFullScreenMode) { > + if (data->appView->TryEnterFullScreenMode() == true) { > + if (rememberMode == true) { > + data->appView->PreferredLaunchWindowingMode = > ApplicationViewWindowingMode::FullScreen; > + } > + } else { > + // TODO, WinRT: return failure (to caller?) from > TryEnterFullScreenMode() > + } > + } > } else { > if (data->appView->IsFullScreenMode) { > data->appView->ExitFullScreenMode(); > + > + if (rememberMode == true) { > + data->appView->PreferredLaunchWindowingMode = > ApplicationViewWindowingMode::Auto; > + } > } > } > } > @@ -837,6 +859,90 @@ > } > } > > +int > +WINRT_GetDisplayDPI(_THIS, SDL_VideoDisplay * sdl_display, float * ddpi, > float * hdpi, float * vdpi) > +{ > + DisplayInformation ^ inf = DisplayInformation::GetForCurrentView(); > + > + *hdpi = inf->RawDpiX; > + *vdpi = inf->RawDpiY; > + switch (inf->ResolutionScale) > + { > + case ResolutionScale::Scale100Percent: > + *ddpi = 100; > + break; > + > + case ResolutionScale::Scale120Percent: > + *ddpi = 120; > + break; > + > + case ResolutionScale::Scale125Percent: > + *ddpi = 125; > + break; > + > + case ResolutionScale::Scale140Percent: > + *ddpi = 140; > + break; > + > + case ResolutionScale::Scale150Percent: > + *ddpi = 150; > + break; > + > + case ResolutionScale::Scale160Percent: > + *ddpi = 160; > + break; > + > + case ResolutionScale::Scale175Percent: > + *ddpi = 175; > + break; > + > + case ResolutionScale::Scale180Percent: > + *ddpi = 180; > + break; > + > + case ResolutionScale::Scale200Percent: > + *ddpi = 200; > + break; > + > + case ResolutionScale::Scale225Percent: > + *ddpi = 225; > + break; > + > + case ResolutionScale::Scale250Percent: > + *ddpi = 250; > + break; > + > + case ResolutionScale::Scale300Percent: > + *ddpi = 300; > + break; > + > + case ResolutionScale::Scale350Percent: > + *ddpi = 350; > + break; > + > + case ResolutionScale::Scale400Percent: > + *ddpi = 400; > + break; > + > + case ResolutionScale::Scale450Percent: > + *ddpi = 450; > + break; > + > + case ResolutionScale::Scale500Percent: > + *ddpi = 500; > + break; > + > + case ResolutionScale::Invalid: > + default: > + *ddpi = 0; > + } > + // *ddpi = inf->ResolutionScale; > + > + SDL_Log("Densities: H=%.1f V=%.1f D=%.1f\n", *hdpi, *vdpi, *ddpi); > + > + return 0; > +} > + > #endif /* SDL_VIDEO_DRIVER_WINRT */ > > /* vi: set ts=4 sw=4 expandtab: */ > > > _______________________________________________ > SDL mailing list > [email protected] > http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org > > _______________________________________________ SDL mailing list [email protected] http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org