Fixed a crash on Windows Phone 8 that occurred after rotating a device
authorDavid Ludwig <dludwig@pobox.com>
Sat, 15 Mar 2014 13:27:18 -0400
changeset 8620 a27695b26b57
parent 8619 a4538a64b9bb
child 8621 5252788cb448
Fixed a crash on Windows Phone 8 that occurred after rotating a device This changeset prevents IDXGISwapChain::ResizeBuffers from being invoked on Windows Phone 8, a function that isn't available on the platform (but is available on other Windows platforms). The call would fail, which ultimately led to a crash. This changeset also attempts to make sure that the D3D11 swap chain is created at the correct size, when using Windows Phone 8. Still TODO: make sure rotation-querying works across relevant Windows platforms (that support Direct3D 11.x).
src/render/direct3d11/SDL_render_d3d11.c
--- a/src/render/direct3d11/SDL_render_d3d11.c	Sat Mar 15 10:37:40 2014 -0400
+++ b/src/render/direct3d11/SDL_render_d3d11.c	Sat Mar 15 13:27:18 2014 -0400
@@ -1438,30 +1438,24 @@
     ID3D11Texture2D *backBuffer = NULL;
     HRESULT result = S_OK;
     int w, h;
-    BOOL swapDimensions;
 
     /* Release the previous render target view */
     D3D11_ReleaseMainRenderTargetView(renderer);
 
-    /* The width and height of the swap chain must be based on the window's
-     * landscape-oriented width and height. If the window is in a portrait
-     * rotation, the dimensions must be reversed.
+    /* The width and height of the swap chain must be based on the display's
+     * non-rotated size.
      */
     SDL_GetWindowSize(renderer->window, &w, &h);
     data->rotation = D3D11_GetCurrentRotation();
-
-#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
-    swapDimensions = FALSE;
-#else
-    swapDimensions = D3D11_IsDisplayRotated90Degrees(data->rotation);
-#endif
-    if (swapDimensions) {
+    if (D3D11_IsDisplayRotated90Degrees(data->rotation)) {
         int tmp = w;
         w = h;
         h = tmp;
     }
 
     if (data->swapChain) {
+        /* IDXGISwapChain::ResizeBuffers is not available on Windows Phone 8. */
+#if !defined(__WINRT__) || (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP)
         /* If the swap chain already exists, resize it. */
         result = IDXGISwapChain_ResizeBuffers(data->swapChain,
             0,
@@ -1473,6 +1467,7 @@
             WIN_SetErrorFromHRESULT(__FUNCTION__ ", IDXGISwapChain::ResizeBuffers", result);
             goto done;
         }
+#endif
     } else {
         result = D3D11_CreateSwapChain(renderer, w, h);
         if (FAILED(result)) {