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:
parent
f66f61de01
commit
843873626c
2 changed files with 18 additions and 2 deletions
|
@ -138,6 +138,7 @@ typedef struct
|
||||||
ID3D11SamplerState *nearestPixelSampler;
|
ID3D11SamplerState *nearestPixelSampler;
|
||||||
ID3D11SamplerState *linearSampler;
|
ID3D11SamplerState *linearSampler;
|
||||||
D3D_FEATURE_LEVEL featureLevel;
|
D3D_FEATURE_LEVEL featureLevel;
|
||||||
|
SDL_bool pixelSizeChanged;
|
||||||
|
|
||||||
/* Rasterizers */
|
/* Rasterizers */
|
||||||
ID3D11RasterizerState *mainRasterizer;
|
ID3D11RasterizerState *mainRasterizer;
|
||||||
|
@ -1036,8 +1037,10 @@ void D3D11_Trim(SDL_Renderer *renderer)
|
||||||
|
|
||||||
static void D3D11_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
|
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) {
|
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;
|
D3D11_RenderData *rendererData = (D3D11_RenderData *)renderer->driverdata;
|
||||||
const int viewportRotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
const int viewportRotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
||||||
|
|
||||||
|
if (rendererData->pixelSizeChanged) {
|
||||||
|
D3D11_UpdateForWindowSizeChange(renderer);
|
||||||
|
rendererData->pixelSizeChanged = SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (rendererData->currentViewportRotation != viewportRotation) {
|
if (rendererData->currentViewportRotation != viewportRotation) {
|
||||||
rendererData->currentViewportRotation = viewportRotation;
|
rendererData->currentViewportRotation = viewportRotation;
|
||||||
rendererData->viewportDirty = SDL_TRUE;
|
rendererData->viewportDirty = SDL_TRUE;
|
||||||
|
|
|
@ -174,6 +174,7 @@ typedef struct
|
||||||
ID3D12GraphicsCommandList2 *commandList;
|
ID3D12GraphicsCommandList2 *commandList;
|
||||||
DXGI_SWAP_EFFECT swapEffect;
|
DXGI_SWAP_EFFECT swapEffect;
|
||||||
UINT swapFlags;
|
UINT swapFlags;
|
||||||
|
SDL_bool pixelSizeChanged;
|
||||||
|
|
||||||
/* Descriptor heaps */
|
/* Descriptor heaps */
|
||||||
ID3D12DescriptorHeap *rtvDescriptorHeap;
|
ID3D12DescriptorHeap *rtvDescriptorHeap;
|
||||||
|
@ -1386,8 +1387,10 @@ static HRESULT D3D12_UpdateForWindowSizeChange(SDL_Renderer *renderer)
|
||||||
|
|
||||||
static void D3D12_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
|
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) {
|
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;
|
D3D12_RenderData *rendererData = (D3D12_RenderData *)renderer->driverdata;
|
||||||
const int viewportRotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
|
const int viewportRotation = D3D12_GetRotationForCurrentRenderTarget(renderer);
|
||||||
|
|
||||||
|
if (rendererData->pixelSizeChanged) {
|
||||||
|
D3D12_UpdateForWindowSizeChange(renderer);
|
||||||
|
rendererData->pixelSizeChanged = SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (rendererData->currentViewportRotation != viewportRotation) {
|
if (rendererData->currentViewportRotation != viewportRotation) {
|
||||||
rendererData->currentViewportRotation = viewportRotation;
|
rendererData->currentViewportRotation = viewportRotation;
|
||||||
rendererData->viewportDirty = SDL_TRUE;
|
rendererData->viewportDirty = SDL_TRUE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue