From 615c935d114d477649a054ba9921a7d3b6871fdc Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 21 Nov 2024 12:59:41 -0500 Subject: [PATCH] events: Added SDL_RenderEvent. Fixes #11465. --- include/SDL3/SDL_events.h | 16 ++++++++++++++++ src/events/SDL_events.c | 13 +++++++++---- src/render/direct3d/SDL_render_d3d.c | 3 ++- src/render/direct3d11/SDL_render_d3d11.c | 3 ++- src/render/direct3d12/SDL_render_d3d12.c | 3 ++- src/render/vulkan/SDL_render_vulkan.c | 3 ++- src/test/SDL_test_common.c | 6 +++--- src/video/android/SDL_androidevents.c | 5 +++-- 8 files changed, 39 insertions(+), 13 deletions(-) diff --git a/include/SDL3/SDL_events.h b/include/SDL3/SDL_events.h index 5b3d475271..aa1691b951 100644 --- a/include/SDL3/SDL_events.h +++ b/include/SDL3/SDL_events.h @@ -704,6 +704,21 @@ typedef struct SDL_CameraDeviceEvent SDL_CameraID which; /**< SDL_CameraID for the device being added or removed or changing */ } SDL_CameraDeviceEvent; + +/** + * Renderer event structure (event.render.*) + * + * \since This struct is available since SDL 3.1.7. + */ +typedef struct SDL_RenderEvent +{ + SDL_EventType type; /**< SDL_EVENT_RENDER_TARGETS_RESET, SDL_EVENT_RENDER_DEVICE_RESET, SDL_EVENT_RENDER_DEVICE_LOST */ + Uint32 reserved; + Uint64 timestamp; /**< In nanoseconds, populated using SDL_GetTicksNS() */ + SDL_WindowID windowID; /**< The window containing the renderer in question. */ +} SDL_RenderEvent; + + /** * Touch finger event structure (event.tfinger.*) * @@ -980,6 +995,7 @@ typedef union SDL_Event SDL_PenMotionEvent pmotion; /**< Pen motion event data */ SDL_PenButtonEvent pbutton; /**< Pen button event data */ SDL_PenAxisEvent paxis; /**< Pen axis event data */ + SDL_RenderEvent render; /**< Render event data */ SDL_DropEvent drop; /**< Drag and drop event data */ SDL_ClipboardEvent clipboard; /**< Clipboard event data */ diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 55e518382d..e6253ff072 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -450,10 +450,15 @@ static void SDL_LogEvent(const SDL_Event *event) break; SDL_EVENT_CASE(SDL_EVENT_CLIPBOARD_UPDATE) break; - SDL_EVENT_CASE(SDL_EVENT_RENDER_TARGETS_RESET) - break; - SDL_EVENT_CASE(SDL_EVENT_RENDER_DEVICE_RESET) - break; + +#define SDL_RENDEREVENT_CASE(x) \ + case x: \ + SDL_strlcpy(name, #x, sizeof(name)); \ + (void)SDL_snprintf(details, sizeof(details), " (timestamp=%u event=%s windowid=%u)", \ + (uint)event->display.timestamp, name, (uint)event->render.windowID); \ + break + SDL_RENDEREVENT_CASE(SDL_EVENT_RENDER_TARGETS_RESET); + SDL_RENDEREVENT_CASE(SDL_EVENT_RENDER_DEVICE_RESET); #define SDL_DISPLAYEVENT_CASE(x) \ case x: \ diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index e757de082a..ec79455b79 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1559,8 +1559,9 @@ static bool D3D_Reset(SDL_Renderer *renderer) // Let the application know that render targets were reset { SDL_Event event; + SDL_zero(event); event.type = SDL_EVENT_RENDER_TARGETS_RESET; - event.common.timestamp = 0; + event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer)); SDL_PushEvent(&event); } diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c index c14346ff3f..5c2b5419b9 100644 --- a/src/render/direct3d11/SDL_render_d3d11.c +++ b/src/render/direct3d11/SDL_render_d3d11.c @@ -1084,8 +1084,9 @@ static bool D3D11_HandleDeviceLost(SDL_Renderer *renderer) // Let the application know that the device has been reset or lost SDL_Event event; + SDL_zero(event); event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST; - event.common.timestamp = 0; + event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer)); SDL_PushEvent(&event); return recovered; diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c index 5511433504..7e0d846c83 100644 --- a/src/render/direct3d12/SDL_render_d3d12.c +++ b/src/render/direct3d12/SDL_render_d3d12.c @@ -1459,8 +1459,9 @@ static bool D3D12_HandleDeviceLost(SDL_Renderer *renderer) // Let the application know that the device has been reset or lost SDL_Event event; + SDL_zero(event); event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST; - event.common.timestamp = 0; + event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer)); SDL_PushEvent(&event); return recovered; diff --git a/src/render/vulkan/SDL_render_vulkan.c b/src/render/vulkan/SDL_render_vulkan.c index 2ccad3e080..c1cc521e72 100644 --- a/src/render/vulkan/SDL_render_vulkan.c +++ b/src/render/vulkan/SDL_render_vulkan.c @@ -2519,8 +2519,9 @@ static bool VULKAN_HandleDeviceLost(SDL_Renderer *renderer) // Let the application know that the device has been reset or lost SDL_Event event; + SDL_zero(event); event.type = recovered ? SDL_EVENT_RENDER_DEVICE_RESET : SDL_EVENT_RENDER_DEVICE_LOST; - event.common.timestamp = 0; + event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer)); SDL_PushEvent(&event); return recovered; diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c index b434be4949..ffa417bec9 100644 --- a/src/test/SDL_test_common.c +++ b/src/test/SDL_test_common.c @@ -1899,13 +1899,13 @@ void SDLTest_PrintEvent(const SDL_Event *event) break; case SDL_EVENT_RENDER_TARGETS_RESET: - SDL_Log("SDL EVENT: render targets reset"); + SDL_Log("SDL EVENT: render targets reset in window %" SDL_PRIu32, event->render.windowID); break; case SDL_EVENT_RENDER_DEVICE_RESET: - SDL_Log("SDL EVENT: render device reset"); + SDL_Log("SDL EVENT: render device reset in window %" SDL_PRIu32, event->render.windowID); break; case SDL_EVENT_RENDER_DEVICE_LOST: - SDL_Log("SDL EVENT: render device lost"); + SDL_Log("SDL EVENT: render device lost in window %" SDL_PRIu32, event->render.windowID); break; case SDL_EVENT_TERMINATING: diff --git a/src/video/android/SDL_androidevents.c b/src/video/android/SDL_androidevents.c index 0ffe38f6f8..40511bc34a 100644 --- a/src/video/android/SDL_androidevents.c +++ b/src/video/android/SDL_androidevents.c @@ -36,15 +36,16 @@ static void android_egl_context_restore(SDL_Window *window) { if (window) { - SDL_Event event; SDL_WindowData *data = window->internal; SDL_GL_MakeCurrent(window, NULL); if (!SDL_GL_MakeCurrent(window, (SDL_GLContext)data->egl_context)) { // The context is no longer valid, create a new one data->egl_context = (EGLContext)SDL_GL_CreateContext(window); SDL_GL_MakeCurrent(window, (SDL_GLContext)data->egl_context); + SDL_Event event; + SDL_zero(event); event.type = SDL_EVENT_RENDER_DEVICE_RESET; - event.common.timestamp = 0; + event.render.windowID = SDL_GetWindowID(SDL_GetRenderWindow(renderer)); SDL_PushEvent(&event); } data->backup_done = false;