From 7e8576fd1967b16e38b862bba7cddb92e54ea695 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Fri, 20 Dec 2024 14:56:21 -0500
Subject: [PATCH] gpu: Xbox fixes for swapchain presentation
---
src/gpu/d3d12/SDL_gpu_d3d12.c | 45 +++++++++++++++++++----------------
1 file changed, 25 insertions(+), 20 deletions(-)
diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index 9ab90010cd863..47612b7ca13ad 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/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));