瀏覽代碼

gpu: Xbox fixes for swapchain presentation

Ethan Lee 4 月之前
父節點
當前提交
7e8576fd19
共有 1 個文件被更改,包括 25 次插入20 次删除
  1. 25 20
      src/gpu/d3d12/SDL_gpu_d3d12.c

+ 25 - 20
src/gpu/d3d12/SDL_gpu_d3d12.c

@@ -6374,6 +6374,9 @@ static bool D3D12_INTERNAL_CreateSwapchain(
     SDL_SyncWindow(windowData->window);
     SDL_GetWindowSizeInPixels(windowData->window, &width, &height);
 
+    // Min swapchain image count is 2
+    windowData->swapchainTextureCount = SDL_clamp(renderer->allowedFramesInFlight, 2, 3);
+
     // Create the swapchain textures
     SDL_zero(createInfo);
     createInfo.type = SDL_GPU_TEXTURETYPE_2D;
@@ -8691,26 +8694,6 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
             CHECK_D3D12_ERROR_AND_RETURN("Could not create D3D12Device", NULL);
         }
 
-        res = renderer->device->SetFrameIntervalX(
-            NULL,
-            D3D12XBOX_FRAME_INTERVAL_60_HZ,
-            renderer->allowedFramesInFlight - 1,
-            D3D12XBOX_FRAME_INTERVAL_FLAG_NONE);
-        if (FAILED(res)) {
-            D3D12_INTERNAL_DestroyRenderer(renderer);
-            CHECK_D3D12_ERROR_AND_RETURN("Could not get set frame interval", NULL);
-        }
-
-        res = renderer->device->ScheduleFrameEventX(
-            D3D12XBOX_FRAME_EVENT_ORIGIN,
-            0,
-            NULL,
-            D3D12XBOX_SCHEDULE_FRAME_EVENT_FLAG_NONE);
-        if (FAILED(res)) {
-            D3D12_INTERNAL_DestroyRenderer(renderer);
-            CHECK_D3D12_ERROR_AND_RETURN("Could not schedule frame events", NULL);
-        }
-
         s_Device = renderer->device;
     }
 #else
@@ -8980,6 +8963,28 @@ static SDL_GPUDevice *D3D12_CreateDevice(bool debugMode, bool preferLowPower, SD
     // Blit resources
     D3D12_INTERNAL_InitBlitResources(renderer);
 
+#if (defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES))
+    res = renderer->device->SetFrameIntervalX(
+        NULL,
+        D3D12XBOX_FRAME_INTERVAL_60_HZ,
+        renderer->allowedFramesInFlight - 1,
+        D3D12XBOX_FRAME_INTERVAL_FLAG_NONE);
+    if (FAILED(res)) {
+        D3D12_INTERNAL_DestroyRenderer(renderer);
+        CHECK_D3D12_ERROR_AND_RETURN("Could not get set frame interval", NULL);
+    }
+
+    res = renderer->device->ScheduleFrameEventX(
+        D3D12XBOX_FRAME_EVENT_ORIGIN,
+        0,
+        NULL,
+        D3D12XBOX_SCHEDULE_FRAME_EVENT_FLAG_NONE);
+    if (FAILED(res)) {
+        D3D12_INTERNAL_DestroyRenderer(renderer);
+        CHECK_D3D12_ERROR_AND_RETURN("Could not schedule frame events", NULL);
+    }
+#endif
+
     // Create the SDL_GPU Device
     result = (SDL_GPUDevice *)SDL_calloc(1, sizeof(SDL_GPUDevice));