Skip to content

Commit

Permalink
Handle window resizing on the render thread in D3D11 and D3D12
Browse files Browse the repository at this point in the history
This prevents crashing when a separate thread is being used for rendering

Discussion and sample code in libsdl-org#8528
  • Loading branch information
slouken committed Nov 11, 2023
1 parent f66f61d commit 8438736
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
10 changes: 9 additions & 1 deletion src/render/direct3d11/SDL_render_d3d11.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ typedef struct
ID3D11SamplerState *nearestPixelSampler;
ID3D11SamplerState *linearSampler;
D3D_FEATURE_LEVEL featureLevel;
SDL_bool pixelSizeChanged;

/* Rasterizers */
ID3D11RasterizerState *mainRasterizer;
Expand Down Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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;
Expand Down
10 changes: 9 additions & 1 deletion src/render/direct3d12/SDL_render_d3d12.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ typedef struct
ID3D12GraphicsCommandList2 *commandList;
DXGI_SWAP_EFFECT swapEffect;
UINT swapFlags;
SDL_bool pixelSizeChanged;

/* Descriptor heaps */
ID3D12DescriptorHeap *rtvDescriptorHeap;
Expand Down Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 8438736

Please sign in to comment.