render: Add Suspend/Resume calls for GDK support

This commit is contained in:
Ethan Lee
2026-03-04 20:26:54 -05:00
parent 0c57e99b4a
commit ee5c5cf755
12 changed files with 108 additions and 34 deletions

View File

@@ -6347,3 +6347,23 @@ void SDL_DestroyGPURenderState(SDL_GPURenderState *state)
SDL_free(state->storage_buffers);
SDL_free(state);
}
#ifdef SDL_PLATFORM_GDK
void SDLCALL SDL_GDKSuspendRenderer(SDL_Renderer *renderer)
{
CHECK_RENDERER_MAGIC(renderer,);
if (renderer->GDKSuspendRenderer != NULL) {
renderer->GDKSuspendRenderer(renderer);
}
}
void SDLCALL SDL_GDKResumeRenderer(SDL_Renderer *renderer)
{
CHECK_RENDERER_MAGIC(renderer,);
if (renderer->GDKResumeRenderer != NULL) {
renderer->GDKResumeRenderer(renderer);
}
}
#endif /* SDL_PLATFORM_GDK */

View File

@@ -280,6 +280,11 @@ struct SDL_Renderer
bool (*AddVulkanRenderSemaphores)(SDL_Renderer *renderer, Uint32 wait_stage_mask, Sint64 wait_semaphore, Sint64 signal_semaphore);
#ifdef SDL_PLATFORM_GDK
void (*GDKSuspendRenderer)(SDL_Renderer *renderer);
void (*GDKResumeRenderer)(SDL_Renderer *renderer);
#endif
// The current renderer info
const char *name;
SDL_PixelFormat *texture_formats;

View File

@@ -563,25 +563,25 @@ static HRESULT D3D12_IssueBatch(D3D12_RenderData *data)
}
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
static bool SDLCALL D3D12_GDKEventFilter(void* userdata, SDL_Event* event)
static void D3D12_GDKSuspendRenderer(SDL_Renderer *renderer)
{
D3D12_RenderData *data = (D3D12_RenderData *)userdata;
if (event->type == SDL_EVENT_DID_ENTER_BACKGROUND) {
data->commandQueue->SuspendX(0);
} else if (event->type == SDL_EVENT_WILL_ENTER_FOREGROUND) {
data->commandQueue->ResumeX();
}
return true;
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
data->commandQueue->SuspendX(0);
}
static void D3D12_GDKResumeRenderer(SDL_Renderer *renderer)
{
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
data->commandQueue->ResumeX();
}
#endif
static void D3D12_DestroyRenderer(SDL_Renderer *renderer)
{
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
if (data) {
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
SDL_RemoveEventWatch(D3D12_GDKEventFilter, data);
#endif
D3D12_WaitForGPU(data);
D3D12_ReleaseAll(renderer);
SDL_free(data);
@@ -1128,10 +1128,6 @@ static HRESULT D3D12_CreateDeviceResources(SDL_Renderer *renderer)
SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_DEVICE_POINTER, data->d3dDevice);
SDL_SetPointerProperty(props, SDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER, data->commandQueue);
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
SDL_AddEventWatch(D3D12_GDKEventFilter, data);
#endif
done:
D3D_SAFE_RELEASE(d3dDevice);
return result;
@@ -3517,6 +3513,10 @@ bool D3D12_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_Proper
renderer->DestroyTexture = D3D12_DestroyTexture;
renderer->DestroyRenderer = D3D12_DestroyRenderer;
renderer->SetVSync = D3D12_SetVSync;
#if defined(SDL_PLATFORM_XBOXONE) || defined(SDL_PLATFORM_XBOXSERIES)
renderer->GDKSuspendRenderer = D3D12_GDKSuspendRenderer;
renderer->GDKResumeRenderer = D3D12_GDKResumeRenderer;
#endif
renderer->internal = data;
D3D12_InvalidateCachedState(renderer);

View File

@@ -1563,17 +1563,19 @@ static void GPU_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
}
#ifdef SDL_PLATFORM_GDK
static bool SDLCALL GPU_GDKEventFilter(void *userdata, SDL_Event *event)
static void GPU_GDKSuspendRenderer(SDL_Renderer *renderer)
{
GPU_RenderData *data = (GPU_RenderData *)userdata;
SDL_assert(!data->external_device);
if (event->type == SDL_EVENT_DID_ENTER_BACKGROUND) {
SDL_GDKSuspendGPU(data->device);
} else if (event->type == SDL_EVENT_WILL_ENTER_FOREGROUND) {
SDL_GDKResumeGPU(data->device);
}
return true;
GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
SDL_GDKSuspendGPU(data->device);
}
static void GPU_GDKResumeRenderer(SDL_Renderer *renderer)
{
GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
SDL_GDKResumeGPU(data->device);
}
#endif
static void GPU_DestroyRenderer(SDL_Renderer *renderer)
@@ -1609,9 +1611,6 @@ static void GPU_DestroyRenderer(SDL_Renderer *renderer)
if (data->device) {
GPU_ReleaseShaders(&data->shaders, data->device);
if (!data->external_device) {
#ifdef SDL_PLATFORM_GDK
SDL_RemoveEventWatch(GPU_GDKEventFilter, data);
#endif
SDL_DestroyGPUDevice(data->device);
}
}
@@ -1722,6 +1721,10 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
renderer->DestroyTexture = GPU_DestroyTexture;
renderer->DestroyRenderer = GPU_DestroyRenderer;
renderer->SetVSync = GPU_SetVSync;
#ifdef SDL_PLATFORM_GDK
renderer->GDKSuspendRenderer = GPU_GDKSuspendRenderer;
renderer->GDKResumeRenderer = GPU_GDKResumeRenderer;
#endif
renderer->internal = data;
renderer->window = window;
renderer->name = GPU_RenderDriver.name;
@@ -1775,10 +1778,6 @@ static bool GPU_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SDL_P
if (!data->device) {
return false;
}
#ifdef SDL_PLATFORM_GDK
SDL_AddEventWatch(GPU_GDKEventFilter, data);
#endif
}
if (!GPU_InitShaders(&data->shaders, data->device)) {