From 843873626c88c8cc4a9d23e01beb6512f5978dee Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 11 Nov 2023 12:49:53 -0800
Subject: [PATCH] Handle window resizing on the render thread in D3D11 and
D3D12
This prevents crashing when a separate thread is being used for rendering
Discussion and sample code in https://github.com/libsdl-org/SDL/issues/8528
---
src/render/direct3d11/SDL_render_d3d11.c | 10 +++++++++-
src/render/direct3d12/SDL_render_d3d12.c | 10 +++++++++-
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/render/direct3d11/SDL_render_d3d11.c b/src/render/direct3d11/SDL_render_d3d11.c
index c51803bf0dc6..5b3b10e8fb01 100644
--- a/src/render/direct3d11/SDL_render_d3d11.c
+++ b/src/render/direct3d11/SDL_render_d3d11.c
@@ -138,6 +138,7 @@ typedef struct
ID3D11SamplerState *nearestPixelSampler;
ID3D11SamplerState *linearSampler;
D3D_FEATURE_LEVEL featureLevel;
+ SDL_bool pixelSizeChanged;
/* Rasterizers */
ID3D11RasterizerState *mainRasterizer;
@@ -1036,8 +1037,10 @@ void D3D11_Trim(SDL_Renderer *renderer)
static void D3D11_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
{
+ D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
+
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
- D3D11_UpdateForWindowSizeChange(renderer);
+ data->pixelSizeChanged = SDL_TRUE;
}
}
@@ -2094,6 +2097,11 @@ static int D3D11_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
const int viewportRotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
+ if (rendererData->pixelSizeChanged) {
+ D3D11_UpdateForWindowSizeChange(renderer);
+ rendererData->pixelSizeChanged = SDL_FALSE;
+ }
+
if (rendererData->currentViewportRotation != viewportRotation) {
rendererData->currentViewportRotation = viewportRotation;
rendererData->viewportDirty = SDL_TRUE;
diff --git a/src/render/direct3d12/SDL_render_d3d12.c b/src/render/direct3d12/SDL_render_d3d12.c
index 32196c51b6b6..bda1fbe0feee 100644
--- a/src/render/direct3d12/SDL_render_d3d12.c
+++ b/src/render/direct3d12/SDL_render_d3d12.c
@@ -174,6 +174,7 @@ typedef struct
ID3D12GraphicsCommandList2 *commandList;
DXGI_SWAP_EFFECT swapEffect;
UINT swapFlags;
+ SDL_bool pixelSizeChanged;
/* Descriptor heaps */
ID3D12DescriptorHeap *rtvDescriptorHeap;
@@ -1386,8 +1387,10 @@ static HRESULT D3D12_UpdateForWindowSizeChange(SDL_Renderer *renderer)
static void D3D12_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
{
+ D3D12_RenderData *data = (D3D12_RenderData *)renderer->driverdata;
+
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
- D3D12_UpdateForWindowSizeChange(renderer);
+ data->pixelSizeChanged = SDL_TRUE;
}
}
@@ -2562,6 +2565,11 @@ static int D3D12_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->driverdata;
const int viewportRotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
+ if (rendererData->pixelSizeChanged) {
+ D3D12_UpdateForWindowSizeChange(renderer);
+ rendererData->pixelSizeChanged = SDL_FALSE;
+ }
+
if (rendererData->currentViewportRotation != viewportRotation) {
rendererData->currentViewportRotation = viewportRotation;
rendererData->viewportDirty = SDL_TRUE;