From 0e16ee833060660318cc324cf99c9736f4d48499 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 3 Aug 2021 02:07:47 -0400 Subject: [PATCH] direct3d: Commit dirty viewport state before clearing. Otherwise you might have set the viewport to the full size of the render target in SDL's API but this change hasn't been transmitted to Direct3D yet by the time we attempt to clear. Fixes #4210. --- src/render/direct3d/SDL_render_d3d.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index 30d9b02f0..9e04e367d 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1318,6 +1318,7 @@ D3D_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *verti const SDL_Rect *viewport = &data->drawstate.viewport; const int backw = istarget ? renderer->target->w : data->pparams.BackBufferWidth; const int backh = istarget ? renderer->target->h : data->pparams.BackBufferHeight; + const SDL_bool viewport_unequal = ((viewport->x == 0) && (viewport->y == 0) && (viewport->w == backw) && (viewport->h == backh)) ? SDL_FALSE : SDL_TRUE; if (data->drawstate.cliprect_enabled || data->drawstate.cliprect_enabled_dirty) { IDirect3DDevice9_SetRenderState(data->device, D3DRS_SCISSORTESTENABLE, FALSE); @@ -1325,13 +1326,13 @@ D3D_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *verti } /* Don't reset the viewport if we don't have to! */ - if (!viewport->x && !viewport->y && (viewport->w == backw) && (viewport->h == backh)) { + if (!data->drawstate.viewport_dirty && !viewport_unequal) { IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0); } else { /* Clear is defined to clear the entire render target */ const D3DVIEWPORT9 wholeviewport = { 0, 0, backw, backh, 0.0f, 1.0f }; IDirect3DDevice9_SetViewport(data->device, &wholeviewport); - data->drawstate.viewport_dirty = SDL_TRUE; + data->drawstate.viewport_dirty = viewport_unequal; IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0); }