gdk: Render/GPU can call SuspendX, document when to call SuspendComplete

This commit is contained in:
Ethan Lee
2026-02-25 09:20:25 -05:00
parent 49a8b4229b
commit 5770e013c2
4 changed files with 76 additions and 4 deletions

View File

@@ -562,10 +562,26 @@ static HRESULT D3D12_IssueBatch(D3D12_RenderData *data)
return result;
}
#ifdef SDL_PLATFORM_GDK
static bool SDLCALL D3D12_GDKEventFilter(void* userdata, SDL_Event* event)
{
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;
}
#endif
static void D3D12_DestroyRenderer(SDL_Renderer *renderer)
{
D3D12_RenderData *data = (D3D12_RenderData *)renderer->internal;
if (data) {
#ifdef SDL_PLATFORM_GDK
SDL_RemoveEventWatch(D3D12_GDKEventFilter, data);
#endif
D3D12_WaitForGPU(data);
D3D12_ReleaseAll(renderer);
SDL_free(data);
@@ -1112,6 +1128,10 @@ 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);
#ifdef SDL_PLATFORM_GDK
SDL_AddEventWatch(D3D12_GDKEventFilter, data);
#endif
done:
D3D_SAFE_RELEASE(d3dDevice);
return result;

View File

@@ -1562,6 +1562,20 @@ static void GPU_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
texture->internal = NULL;
}
#ifdef SDL_PLATFORM_GDK
static bool SDLCALL GPU_GDKEventFilter(void *userdata, SDL_Event *event)
{
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;
}
#endif
static void GPU_DestroyRenderer(SDL_Renderer *renderer)
{
GPU_RenderData *data = (GPU_RenderData *)renderer->internal;
@@ -1595,6 +1609,9 @@ 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);
}
}
@@ -1758,6 +1775,10 @@ 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)) {