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
This commit is contained in:
Sam Lantinga 2023-11-11 12:49:53 -08:00
parent f66f61de01
commit 843873626c
2 changed files with 18 additions and 2 deletions

View file

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