diff options
| author | 3gg <3gg@shellblade.net> | 2024-05-04 16:51:29 -0700 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2024-05-04 16:51:29 -0700 |
| commit | 8222bfe56d4dabe8d92fc4b25ea1b0163b16f3e1 (patch) | |
| tree | 763389e42276035ac134d94eb1dc32293b88d807 /src/contrib/SDL-2.30.2/docs/README-winrt.md | |
Initial commit.
Diffstat (limited to 'src/contrib/SDL-2.30.2/docs/README-winrt.md')
| -rw-r--r-- | src/contrib/SDL-2.30.2/docs/README-winrt.md | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/src/contrib/SDL-2.30.2/docs/README-winrt.md b/src/contrib/SDL-2.30.2/docs/README-winrt.md new file mode 100644 index 0000000..f4a9117 --- /dev/null +++ b/src/contrib/SDL-2.30.2/docs/README-winrt.md | |||
| @@ -0,0 +1,519 @@ | |||
| 1 | WinRT | ||
| 2 | ===== | ||
| 3 | |||
| 4 | This port allows SDL applications to run on Microsoft's platforms that require | ||
| 5 | use of "Windows Runtime", aka. "WinRT", APIs. Microsoft may, in some cases, | ||
| 6 | refer to them as either "Windows Store", or for Windows 10, "UWP" apps. | ||
| 7 | |||
| 8 | In the past, SDL has supported Windows RT 8.x, Windows Phone, etc, but in | ||
| 9 | modern times this port is focused on UWP apps, which run on Windows 10, | ||
| 10 | and modern Xbox consoles. | ||
| 11 | |||
| 12 | |||
| 13 | Requirements | ||
| 14 | ------------ | ||
| 15 | |||
| 16 | * Microsoft Visual C++ (aka Visual Studio) 2019. | ||
| 17 | - Free, "Community" or "Express" editions may be used, so long as they | ||
| 18 | include support for either "Windows Store" or "Windows Phone" apps. | ||
| 19 | "Express" versions marked as supporting "Windows Desktop" development | ||
| 20 | typically do not include support for creating WinRT apps, to note. | ||
| 21 | (The "Community" editions of Visual C++ do, however, support both | ||
| 22 | desktop/Win32 and WinRT development). | ||
| 23 | * A valid Microsoft account - This requirement is not imposed by SDL, but | ||
| 24 | rather by Microsoft's Visual C++ toolchain. This is required to launch or | ||
| 25 | debug apps. | ||
| 26 | |||
| 27 | |||
| 28 | Status | ||
| 29 | ------ | ||
| 30 | |||
| 31 | Here is a rough list of what works, and what doesn't: | ||
| 32 | |||
| 33 | * What works: | ||
| 34 | * compilation via Visual C++ 2019. | ||
| 35 | * compile-time platform detection for SDL programs. The C/C++ #define, | ||
| 36 | `__WINRT__`, will be set to 1 (by SDL) when compiling for WinRT. | ||
| 37 | * GPU-accelerated 2D rendering, via SDL_Renderer. | ||
| 38 | * OpenGL ES 2, via the ANGLE library (included separately from SDL) | ||
| 39 | * software rendering, via either SDL_Surface (optionally in conjunction with | ||
| 40 | SDL_GetWindowSurface() and SDL_UpdateWindowSurface()) or via the | ||
| 41 | SDL_Renderer APIs | ||
| 42 | * threads | ||
| 43 | * timers (via SDL_GetTicks(), SDL_AddTimer(), SDL_GetPerformanceCounter(), | ||
| 44 | SDL_GetPerformanceFrequency(), etc.) | ||
| 45 | * file I/O via SDL_RWops | ||
| 46 | * mouse input (unsupported on Windows Phone) | ||
| 47 | * audio, via SDL's WASAPI backend (if you want to record, your app must | ||
| 48 | have "Microphone" capabilities enabled in its manifest, and the user must | ||
| 49 | not have blocked access. Otherwise, capture devices will fail to work, | ||
| 50 | presenting as a device disconnect shortly after opening it.) | ||
| 51 | * .DLL file loading. Libraries *MUST* be packaged inside applications. Loading | ||
| 52 | anything outside of the app is not supported. | ||
| 53 | * system path retrieval via SDL's filesystem APIs | ||
| 54 | * game controllers. Support is provided via the SDL_Joystick and | ||
| 55 | SDL_GameController APIs, and is backed by Microsoft's XInput API. Please | ||
| 56 | note, however, that Windows limits game-controller support in UWP apps to, | ||
| 57 | "Xbox compatible controllers" (many controllers that work in Win32 apps, | ||
| 58 | do not work in UWP, due to restrictions in UWP itself.) | ||
| 59 | * multi-touch input | ||
| 60 | * app events. SDL_APP_WILLENTER* and SDL_APP_DIDENTER* events get sent out as | ||
| 61 | appropriate. | ||
| 62 | * window events | ||
| 63 | * using Direct3D 11.x APIs outside of SDL. Non-XAML / Direct3D-only apps can | ||
| 64 | choose to render content directly via Direct3D, using SDL to manage the | ||
| 65 | internal WinRT window, as well as input and audio. (Use | ||
| 66 | SDL_GetWindowWMInfo() to get the WinRT 'CoreWindow', and pass it into | ||
| 67 | IDXGIFactory2::CreateSwapChainForCoreWindow() as appropriate.) | ||
| 68 | |||
| 69 | * What partially works: | ||
| 70 | * keyboard input. Most of WinRT's documented virtual keys are supported, as | ||
| 71 | well as many keys with documented hardware scancodes. Converting | ||
| 72 | SDL_Scancodes to or from SDL_Keycodes may not work, due to missing APIs | ||
| 73 | (MapVirtualKey()) in Microsoft's Windows Store / UWP APIs. | ||
| 74 | * SDLmain. WinRT uses a different signature for each app's main() function. | ||
| 75 | SDL-based apps that use this port must compile in SDL_winrt_main_NonXAML.cpp | ||
| 76 | (in `SDL\src\main\winrt\`) directly in order for their C-style main() | ||
| 77 | functions to be called. | ||
| 78 | |||
| 79 | * What doesn't work: | ||
| 80 | * compilation with anything other than Visual C++ | ||
| 81 | * programmatically-created custom cursors. These don't appear to be supported | ||
| 82 | by WinRT. Different OS-provided cursors can, however, be created via | ||
| 83 | SDL_CreateSystemCursor() (unsupported on Windows Phone) | ||
| 84 | * SDL_WarpMouseInWindow() or SDL_WarpMouseGlobal(). This are not currently | ||
| 85 | supported by WinRT itself. | ||
| 86 | * joysticks and game controllers that either are not supported by | ||
| 87 | Microsoft's XInput API, or are not supported within UWP apps (many | ||
| 88 | controllers that work in Win32, do not work in UWP, due to restrictions in | ||
| 89 | UWP itself). | ||
| 90 | * turning off VSync when rendering on Windows Phone. Attempts to turn VSync | ||
| 91 | off on Windows Phone result either in Direct3D not drawing anything, or it | ||
| 92 | forcing VSync back on. As such, SDL_RENDERER_PRESENTVSYNC will always get | ||
| 93 | turned-on on Windows Phone. This limitation is not present in non-Phone | ||
| 94 | WinRT (such as Windows 8.x), where turning off VSync appears to work. | ||
| 95 | * probably anything else that's not listed as supported | ||
| 96 | |||
| 97 | |||
| 98 | |||
| 99 | Upgrade Notes | ||
| 100 | ------------- | ||
| 101 | |||
| 102 | #### SDL_GetPrefPath() usage when upgrading WinRT apps from SDL 2.0.3 | ||
| 103 | |||
| 104 | SDL 2.0.4 fixes two bugs found in the WinRT version of SDL_GetPrefPath(). | ||
| 105 | The fixes may affect older, SDL 2.0.3-based apps' save data. Please note | ||
| 106 | that these changes only apply to SDL-based WinRT apps, and not to apps for | ||
| 107 | any other platform. | ||
| 108 | |||
| 109 | 1. SDL_GetPrefPath() would return an invalid path, one in which the path's | ||
| 110 | directory had not been created. Attempts to create files there | ||
| 111 | (via fopen(), for example), would fail, unless that directory was | ||
| 112 | explicitly created beforehand. | ||
| 113 | |||
| 114 | 2. SDL_GetPrefPath(), for non-WinPhone-based apps, would return a path inside | ||
| 115 | a WinRT 'Roaming' folder, the contents of which get automatically | ||
| 116 | synchronized across multiple devices. This process can occur while an | ||
| 117 | application runs, and can cause existing save-data to be overwritten | ||
| 118 | at unexpected times, with data from other devices. (Windows Phone apps | ||
| 119 | written with SDL 2.0.3 did not utilize a Roaming folder, due to API | ||
| 120 | restrictions in Windows Phone 8.0). | ||
| 121 | |||
| 122 | |||
| 123 | SDL_GetPrefPath(), starting with SDL 2.0.4, addresses these by: | ||
| 124 | |||
| 125 | 1. making sure that SDL_GetPrefPath() returns a directory in which data | ||
| 126 | can be written to immediately, without first needing to create directories. | ||
| 127 | |||
| 128 | 2. basing SDL_GetPrefPath() off of a different, non-Roaming folder, the | ||
| 129 | contents of which do not automatically get synchronized across devices | ||
| 130 | (and which require less work to use safely, in terms of data integrity). | ||
| 131 | |||
| 132 | Apps that wish to get their Roaming folder's path can do so either by using | ||
| 133 | SDL_WinRTGetFSPathUTF8(), SDL_WinRTGetFSPathUNICODE() (which returns a | ||
| 134 | UCS-2/wide-char string), or directly through the WinRT class, | ||
| 135 | Windows.Storage.ApplicationData. | ||
| 136 | |||
| 137 | |||
| 138 | |||
| 139 | Setup, High-Level Steps | ||
| 140 | ----------------------- | ||
| 141 | |||
| 142 | The steps for setting up a project for an SDL/WinRT app looks like the | ||
| 143 | following, at a high-level: | ||
| 144 | |||
| 145 | 1. create a new Visual C++ project using Microsoft's template for a, | ||
| 146 | "Direct3D App". | ||
| 147 | 2. remove most of the files from the project. | ||
| 148 | 3. make your app's project directly reference SDL/WinRT's own Visual C++ | ||
| 149 | project file, via use of Visual C++'s "References" dialog. This will setup | ||
| 150 | the linker, and will copy SDL's .dll files to your app's final output. | ||
| 151 | 4. adjust your app's build settings, at minimum, telling it where to find SDL's | ||
| 152 | header files. | ||
| 153 | 5. add files that contains a WinRT-appropriate main function, along with some | ||
| 154 | data to make sure mouse-cursor-hiding (via SDL_ShowCursor(SDL_DISABLE) calls) | ||
| 155 | work properly. | ||
| 156 | 6. add SDL-specific app code. | ||
| 157 | 7. build and run your app. | ||
| 158 | |||
| 159 | |||
| 160 | Setup, Detailed Steps | ||
| 161 | --------------------- | ||
| 162 | |||
| 163 | ### 1. Create a new project ### | ||
| 164 | |||
| 165 | Create a new project using one of Visual C++'s templates for a plain, non-XAML, | ||
| 166 | "Direct3D App" (XAML support for SDL/WinRT is not yet ready for use). If you | ||
| 167 | don't see one of these templates, in Visual C++'s 'New Project' dialog, try | ||
| 168 | using the textbox titled, 'Search Installed Templates' to look for one. | ||
| 169 | |||
| 170 | |||
| 171 | ### 2. Remove unneeded files from the project ### | ||
| 172 | |||
| 173 | In the new project, delete any file that has one of the following extensions: | ||
| 174 | |||
| 175 | - .cpp | ||
| 176 | - .h | ||
| 177 | - .hlsl | ||
| 178 | |||
| 179 | When you are done, you should be left with a few files, each of which will be a | ||
| 180 | necessary part of your app's project. These files will consist of: | ||
| 181 | |||
| 182 | - an .appxmanifest file, which contains metadata on your WinRT app. This is | ||
| 183 | similar to an Info.plist file on iOS, or an AndroidManifest.xml on Android. | ||
| 184 | - a few .png files, one of which is a splash screen (displayed when your app | ||
| 185 | launches), others are app icons. | ||
| 186 | - a .pfx file, used for code signing purposes. | ||
| 187 | |||
| 188 | |||
| 189 | ### 3. Add references to SDL's project files ### | ||
| 190 | |||
| 191 | SDL/WinRT can be built in multiple variations, spanning across three different | ||
| 192 | CPU architectures (x86, x64, and ARM) and two different configurations | ||
| 193 | (Debug and Release). WinRT and Visual C++ do not currently provide a means | ||
| 194 | for combining multiple variations of one library into a single file. | ||
| 195 | Furthermore, it does not provide an easy means for copying pre-built .dll files | ||
| 196 | into your app's final output (via Post-Build steps, for example). It does, | ||
| 197 | however, provide a system whereby an app can reference the MSVC projects of | ||
| 198 | libraries such that, when the app is built: | ||
| 199 | |||
| 200 | 1. each library gets built for the appropriate CPU architecture(s) and WinRT | ||
| 201 | platform(s). | ||
| 202 | 2. each library's output, such as .dll files, get copied to the app's build | ||
| 203 | output. | ||
| 204 | |||
| 205 | To set this up for SDL/WinRT, you'll need to run through the following steps: | ||
| 206 | |||
| 207 | 1. open up the Solution Explorer inside Visual C++ (under the "View" menu, then | ||
| 208 | "Solution Explorer") | ||
| 209 | 2. right click on your app's solution. | ||
| 210 | 3. navigate to "Add", then to "Existing Project..." | ||
| 211 | 4. find SDL/WinRT's Visual C++ project file and open it, in the `VisualC-WinRT` | ||
| 212 | directory. | ||
| 213 | 5. once the project has been added, right-click on your app's project and | ||
| 214 | select, "References..." | ||
| 215 | 6. click on the button titled, "Add New Reference..." | ||
| 216 | 7. check the box next to SDL | ||
| 217 | 8. click OK to close the dialog | ||
| 218 | 9. SDL will now show up in the list of references. Click OK to close that | ||
| 219 | dialog. | ||
| 220 | |||
| 221 | Your project is now linked to SDL's project, insofar that when the app is | ||
| 222 | built, SDL will be built as well, with its build output getting included with | ||
| 223 | your app. | ||
| 224 | |||
| 225 | |||
| 226 | ### 4. Adjust Your App's Build Settings ### | ||
| 227 | |||
| 228 | Some build settings need to be changed in your app's project. This guide will | ||
| 229 | outline the following: | ||
| 230 | |||
| 231 | - making sure that the compiler knows where to find SDL's header files | ||
| 232 | - **Optional for C++, but NECESSARY for compiling C code:** telling the | ||
| 233 | compiler not to use Microsoft's C++ extensions for WinRT development. | ||
| 234 | - **Optional:** telling the compiler not generate errors due to missing | ||
| 235 | precompiled header files. | ||
| 236 | |||
| 237 | To change these settings: | ||
| 238 | |||
| 239 | 1. right-click on the project | ||
| 240 | 2. choose "Properties" | ||
| 241 | 3. in the drop-down box next to "Configuration", choose, "All Configurations" | ||
| 242 | 4. in the drop-down box next to "Platform", choose, "All Platforms" | ||
| 243 | 5. in the left-hand list, expand the "C/C++" section | ||
| 244 | 6. select "General" | ||
| 245 | 7. edit the "Additional Include Directories" setting, and add a path to SDL's | ||
| 246 | "include" directory | ||
| 247 | 8. **Optional: to enable compilation of C code:** change the setting for | ||
| 248 | "Consume Windows Runtime Extension" from "Yes (/ZW)" to "No". If you're | ||
| 249 | working with a completely C++ based project, this step can usually be | ||
| 250 | omitted. | ||
| 251 | 9. **Optional: to disable precompiled headers (which can produce | ||
| 252 | 'stdafx.h'-related build errors, if setup incorrectly:** in the left-hand | ||
| 253 | list, select "Precompiled Headers", then change the setting for "Precompiled | ||
| 254 | Header" from "Use (/Yu)" to "Not Using Precompiled Headers". | ||
| 255 | 10. close the dialog, saving settings, by clicking the "OK" button | ||
| 256 | |||
| 257 | |||
| 258 | ### 5. Add a WinRT-appropriate main function, and a blank-cursor image, to the app. ### | ||
| 259 | |||
| 260 | A few files should be included directly in your app's MSVC project, specifically: | ||
| 261 | 1. a WinRT-appropriate main function (which is different than main() functions on | ||
| 262 | other platforms) | ||
| 263 | 2. a Win32-style cursor resource, used by SDL_ShowCursor() to hide the mouse cursor | ||
| 264 | (if and when the app needs to do so). *If this cursor resource is not | ||
| 265 | included, mouse-position reporting may fail if and when the cursor is | ||
| 266 | hidden, due to possible bugs/design-oddities in Windows itself.* | ||
| 267 | |||
| 268 | To include these files for C/C++ projects: | ||
| 269 | |||
| 270 | 1. right-click on your project (again, in Visual C++'s Solution Explorer), | ||
| 271 | navigate to "Add", then choose "Existing Item...". | ||
| 272 | 2. navigate to the directory containing SDL's source code, then into its | ||
| 273 | subdirectory, 'src/main/winrt/'. Select, then add, the following files: | ||
| 274 | - `SDL_winrt_main_NonXAML.cpp` | ||
| 275 | - `SDL2-WinRTResources.rc` | ||
| 276 | - `SDL2-WinRTResource_BlankCursor.cur` | ||
| 277 | 3. right-click on the file `SDL_winrt_main_NonXAML.cpp` (as listed in your | ||
| 278 | project), then click on "Properties...". | ||
| 279 | 4. in the drop-down box next to "Configuration", choose, "All Configurations" | ||
| 280 | 5. in the drop-down box next to "Platform", choose, "All Platforms" | ||
| 281 | 6. in the left-hand list, click on "C/C++" | ||
| 282 | 7. change the setting for "Consume Windows Runtime Extension" to "Yes (/ZW)". | ||
| 283 | 8. click the OK button. This will close the dialog. | ||
| 284 | |||
| 285 | **NOTE: C++/CX compilation is currently required in at least one file of your | ||
| 286 | app's project. This is to make sure that Visual C++'s linker builds a 'Windows | ||
| 287 | Metadata' file (.winmd) for your app. Not doing so can lead to build errors.** | ||
| 288 | |||
| 289 | For non-C++ projects, you will need to call SDL_WinRTRunApp from your language's | ||
| 290 | main function, and generate SDL2-WinRTResources.res manually by using `rc` via | ||
| 291 | the Developer Command Prompt and including it as a <Win32Resource> within the | ||
| 292 | first <PropertyGroup> block in your Visual Studio project file. | ||
| 293 | |||
| 294 | ### 6. Add app code and assets ### | ||
| 295 | |||
| 296 | At this point, you can add in SDL-specific source code. Be sure to include a | ||
| 297 | C-style main function (ie: `int main(int argc, char *argv[])`). From there you | ||
| 298 | should be able to create a single `SDL_Window` (WinRT apps can only have one | ||
| 299 | window, at present), as well as an `SDL_Renderer`. Direct3D will be used to | ||
| 300 | draw content. Events are received via SDL's usual event functions | ||
| 301 | (`SDL_PollEvent`, etc.) If you have a set of existing source files and assets, | ||
| 302 | you can start adding them to the project now. If not, or if you would like to | ||
| 303 | make sure that you're setup correctly, some short and simple sample code is | ||
| 304 | provided below. | ||
| 305 | |||
| 306 | |||
| 307 | #### 6.A. ... when creating a new app #### | ||
| 308 | |||
| 309 | If you are creating a new app (rather than porting an existing SDL-based app), | ||
| 310 | or if you would just like a simple app to test SDL/WinRT with before trying to | ||
| 311 | get existing code working, some working SDL/WinRT code is provided below. To | ||
| 312 | set this up: | ||
| 313 | |||
| 314 | 1. right click on your app's project | ||
| 315 | 2. select Add, then New Item. An "Add New Item" dialog will show up. | ||
| 316 | 3. from the left-hand list, choose "Visual C++" | ||
| 317 | 4. from the middle/main list, choose "C++ File (.cpp)" | ||
| 318 | 5. near the bottom of the dialog, next to "Name:", type in a name for your | ||
| 319 | source file, such as, "main.cpp". | ||
| 320 | 6. click on the Add button. This will close the dialog, add the new file to | ||
| 321 | your project, and open the file in Visual C++'s text editor. | ||
| 322 | 7. Copy and paste the following code into the new file, then save it. | ||
| 323 | |||
| 324 | ```c | ||
| 325 | #include <SDL.h> | ||
| 326 | |||
| 327 | int main(int argc, char **argv) | ||
| 328 | { | ||
| 329 | SDL_DisplayMode mode; | ||
| 330 | SDL_Window * window = NULL; | ||
| 331 | SDL_Renderer * renderer = NULL; | ||
| 332 | SDL_Event evt; | ||
| 333 | SDL_bool keep_going = SDL_TRUE; | ||
| 334 | |||
| 335 | if (SDL_Init(SDL_INIT_VIDEO) != 0) { | ||
| 336 | return 1; | ||
| 337 | } else if (SDL_GetCurrentDisplayMode(0, &mode) != 0) { | ||
| 338 | return 1; | ||
| 339 | } else if (SDL_CreateWindowAndRenderer(mode.w, mode.h, SDL_WINDOW_FULLSCREEN, &window, &renderer) != 0) { | ||
| 340 | return 1; | ||
| 341 | } | ||
| 342 | |||
| 343 | while (keep_going) { | ||
| 344 | while (SDL_PollEvent(&evt)) { | ||
| 345 | if ((evt.type == SDL_KEYDOWN) && (evt.key.keysym.sym == SDLK_ESCAPE)) { | ||
| 346 | keep_going = SDL_FALSE; | ||
| 347 | } | ||
| 348 | } | ||
| 349 | |||
| 350 | SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); | ||
| 351 | SDL_RenderClear(renderer); | ||
| 352 | SDL_RenderPresent(renderer); | ||
| 353 | } | ||
| 354 | |||
| 355 | SDL_Quit(); | ||
| 356 | return 0; | ||
| 357 | } | ||
| 358 | ``` | ||
| 359 | |||
| 360 | #### 6.B. Adding code and assets #### | ||
| 361 | |||
| 362 | If you have existing code and assets that you'd like to add, you should be able | ||
| 363 | to add them now. The process for adding a set of files is as such. | ||
| 364 | |||
| 365 | 1. right click on the app's project | ||
| 366 | 2. select Add, then click on "New Item..." | ||
| 367 | 3. open any source, header, or asset files as appropriate. Support for C and | ||
| 368 | C++ is available. | ||
| 369 | |||
| 370 | Do note that WinRT only supports a subset of the APIs that are available to | ||
| 371 | Win32-based apps. Many portions of the Win32 API and the C runtime are not | ||
| 372 | available. | ||
| 373 | |||
| 374 | A list of unsupported C APIs can be found at | ||
| 375 | <http://msdn.microsoft.com/en-us/library/windows/apps/jj606124.aspx> | ||
| 376 | |||
| 377 | General information on using the C runtime in WinRT can be found at | ||
| 378 | <https://msdn.microsoft.com/en-us/library/hh972425.aspx> | ||
| 379 | |||
| 380 | A list of supported Win32 APIs for WinRT apps can be found at | ||
| 381 | <http://msdn.microsoft.com/en-us/library/windows/apps/br205757.aspx>. To note, | ||
| 382 | the list of supported Win32 APIs for Windows Phone 8.0 is different. | ||
| 383 | That list can be found at | ||
| 384 | <http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662956(v=vs.105).aspx> | ||
| 385 | |||
| 386 | |||
| 387 | ### 7. Build and run your app ### | ||
| 388 | |||
| 389 | Your app project should now be setup, and you should be ready to build your app. | ||
| 390 | To run it on the local machine, open the Debug menu and choose "Start | ||
| 391 | Debugging". This will build your app, then run your app full-screen. To switch | ||
| 392 | out of your app, press the Windows key. Alternatively, you can choose to run | ||
| 393 | your app in a window. To do this, before building and running your app, find | ||
| 394 | the drop-down menu in Visual C++'s toolbar that says, "Local Machine". Expand | ||
| 395 | this by clicking on the arrow on the right side of the list, then click on | ||
| 396 | Simulator. Once you do that, any time you build and run the app, the app will | ||
| 397 | launch in window, rather than full-screen. | ||
| 398 | |||
| 399 | |||
| 400 | #### 7.A. Running apps on older, ARM-based, "Windows RT" devices #### | ||
| 401 | |||
| 402 | **These instructions do not include Windows Phone, despite Windows Phone | ||
| 403 | typically running on ARM processors.** They are specifically for devices | ||
| 404 | that use the "Windows RT" operating system, which was a modified version of | ||
| 405 | Windows 8.x that ran primarily on ARM-based tablet computers. | ||
| 406 | |||
| 407 | To build and run the app on ARM-based, "Windows RT" devices, you'll need to: | ||
| 408 | |||
| 409 | - install Microsoft's "Remote Debugger" on the device. Visual C++ installs and | ||
| 410 | debugs ARM-based apps via IP networks. | ||
| 411 | - change a few options on the development machine, both to make sure it builds | ||
| 412 | for ARM (rather than x86 or x64), and to make sure it knows how to find the | ||
| 413 | Windows RT device (on the network). | ||
| 414 | |||
| 415 | Microsoft's Remote Debugger can be found at | ||
| 416 | <https://msdn.microsoft.com/en-us/library/hh441469.aspx>. Please note | ||
| 417 | that separate versions of this debugger exist for different versions of Visual | ||
| 418 | C++, one each for MSVC 2015, 2013, and 2012. | ||
| 419 | |||
| 420 | To setup Visual C++ to launch your app on an ARM device: | ||
| 421 | |||
| 422 | 1. make sure the Remote Debugger is running on your ARM device, and that it's on | ||
| 423 | the same IP network as your development machine. | ||
| 424 | 2. from Visual C++'s toolbar, find a drop-down menu that says, "Win32". Click | ||
| 425 | it, then change the value to "ARM". | ||
| 426 | 3. make sure Visual C++ knows the hostname or IP address of the ARM device. To | ||
| 427 | do this: | ||
| 428 | 1. open the app project's properties | ||
| 429 | 2. select "Debugging" | ||
| 430 | 3. next to "Machine Name", enter the hostname or IP address of the ARM | ||
| 431 | device | ||
| 432 | 4. if, and only if, you've turned off authentication in the Remote Debugger, | ||
| 433 | then change the setting for "Require Authentication" to No | ||
| 434 | 5. click "OK" | ||
| 435 | 4. build and run the app (from Visual C++). The first time you do this, a | ||
| 436 | prompt will show up on the ARM device, asking for a Microsoft Account. You | ||
| 437 | do, unfortunately, need to log in here, and will need to follow the | ||
| 438 | subsequent registration steps in order to launch the app. After you do so, | ||
| 439 | if the app didn't already launch, try relaunching it again from within Visual | ||
| 440 | C++. | ||
| 441 | |||
| 442 | |||
| 443 | Troubleshooting | ||
| 444 | --------------- | ||
| 445 | |||
| 446 | #### Build fails with message, "error LNK2038: mismatch detected for 'vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker'" | ||
| 447 | |||
| 448 | Try adding the following to your linker flags. In MSVC, this can be done by | ||
| 449 | right-clicking on the app project, navigating to Configuration Properties -> | ||
| 450 | Linker -> Command Line, then adding them to the Additional Options | ||
| 451 | section. | ||
| 452 | |||
| 453 | * For Release builds / MSVC-Configurations, add: | ||
| 454 | |||
| 455 | /nodefaultlib:vccorlib /nodefaultlib:msvcrt vccorlib.lib msvcrt.lib | ||
| 456 | |||
| 457 | * For Debug builds / MSVC-Configurations, add: | ||
| 458 | |||
| 459 | /nodefaultlib:vccorlibd /nodefaultlib:msvcrtd vccorlibd.lib msvcrtd.lib | ||
| 460 | |||
| 461 | |||
| 462 | #### Mouse-motion events fail to get sent, or SDL_GetMouseState() fails to return updated values | ||
| 463 | |||
| 464 | This may be caused by a bug in Windows itself, whereby hiding the mouse | ||
| 465 | cursor can cause mouse-position reporting to fail. | ||
| 466 | |||
| 467 | SDL provides a workaround for this, but it requires that an app links to a | ||
| 468 | set of Win32-style cursor image-resource files. A copy of suitable resource | ||
| 469 | files can be found in `src/main/winrt/`. Adding them to an app's Visual C++ | ||
| 470 | project file should be sufficient to get the app to use them. | ||
| 471 | |||
| 472 | |||
| 473 | #### SDL's Visual Studio project file fails to open, with message, "The system can't find the file specified." | ||
| 474 | |||
| 475 | This can be caused for any one of a few reasons, which Visual Studio can | ||
| 476 | report, but won't always do so in an up-front manner. | ||
| 477 | |||
| 478 | To help determine why this error comes up: | ||
| 479 | |||
| 480 | 1. open a copy of Visual Studio without opening a project file. This can be | ||
| 481 | accomplished via Windows' Start Menu, among other means. | ||
| 482 | 2. show Visual Studio's Output window. This can be done by going to VS' | ||
| 483 | menu bar, then to View, and then to Output. | ||
| 484 | 3. try opening the SDL project file directly by going to VS' menu bar, then | ||
| 485 | to File, then to Open, then to Project/Solution. When a File-Open dialog | ||
| 486 | appears, open the SDL project (such as the one in SDL's source code, in its | ||
| 487 | directory, VisualC-WinRT/UWP_VS2015/). | ||
| 488 | 4. after attempting to open SDL's Visual Studio project file, additional error | ||
| 489 | information will be output to the Output window. | ||
| 490 | |||
| 491 | If Visual Studio reports (via its Output window) that the project: | ||
| 492 | |||
| 493 | "could not be loaded because it's missing install components. To fix this launch Visual Studio setup with the following selections: | ||
| 494 | Microsoft.VisualStudio.ComponentGroup.UWP.VC" | ||
| 495 | |||
| 496 | ... then you will need to re-launch Visual Studio's installer, and make sure that | ||
| 497 | the workflow for "Universal Windows Platform development" is checked, and that its | ||
| 498 | optional component, "C++ Universal Windows Platform tools" is also checked. While | ||
| 499 | you are there, if you are planning on targeting UWP / Windows 10, also make sure | ||
| 500 | that you check the optional component, "Windows 10 SDK (10.0.10240.0)". After | ||
| 501 | making sure these items are checked as-appropriate, install them. | ||
| 502 | |||
| 503 | Once you install these components, try re-launching Visual Studio, and re-opening | ||
| 504 | the SDL project file. If you still get the error dialog, try using the Output | ||
| 505 | window, again, seeing what Visual Studio says about it. | ||
| 506 | |||
| 507 | |||
| 508 | #### Game controllers / joysticks aren't working! | ||
| 509 | |||
| 510 | Windows only permits certain game controllers and joysticks to work within | ||
| 511 | WinRT / UWP apps. Even if a game controller or joystick works in a Win32 | ||
| 512 | app, that device is not guaranteed to work inside a WinRT / UWP app. | ||
| 513 | |||
| 514 | According to Microsoft, "Xbox compatible controllers" should work inside | ||
| 515 | UWP apps, potentially with more working in the future. This includes, but | ||
| 516 | may not be limited to, Microsoft-made Xbox controllers and USB adapters. | ||
| 517 | (Source: https://social.msdn.microsoft.com/Forums/en-US/9064838b-e8c3-4c18-8a83-19bf0dfe150d/xinput-fails-to-detect-game-controllers?forum=wpdevelop) | ||
| 518 | |||
| 519 | |||
