gpu: Xbox fixes for swapchain presentation

This commit is contained in:
Ethan Lee
2024-12-20 14:56:21 -05:00
parent f7580374a1
commit 7e8576fd19

View File

@@ -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));