diff --git a/src/gallium/frontends/nine/device9.c b/src/gallium/frontends/nine/device9.c index 91000f69edc..5dc5447b107 100644 --- a/src/gallium/frontends/nine/device9.c +++ b/src/gallium/frontends/nine/device9.c @@ -1995,6 +1995,8 @@ NineDevice9_SetRenderTarget( struct NineDevice9 *This, This->state.scissor.miny = 0; This->state.scissor.maxx = rt->desc.Width; This->state.scissor.maxy = rt->desc.Height; + nine_context_set_viewport(This, &This->state.viewport); + nine_context_set_scissor(This, &This->state.scissor); } if (This->state.rt[i] != NineSurface9(pRenderTarget)) diff --git a/src/gallium/frontends/nine/device9ex.c b/src/gallium/frontends/nine/device9ex.c index 3047657e95f..20c9c7d6f5a 100644 --- a/src/gallium/frontends/nine/device9ex.c +++ b/src/gallium/frontends/nine/device9ex.c @@ -222,6 +222,7 @@ NineDevice9Ex_ResetEx( struct NineDevice9Ex *This, D3DDISPLAYMODEEX *pFullscreenDisplayMode ) { HRESULT hr = D3D_OK; + float MinZ, MaxZ; unsigned i; DBG("This=%p pPresentationParameters=%p pFullscreenDisplayMode=%p\n", This, pPresentationParameters, pFullscreenDisplayMode); @@ -235,8 +236,17 @@ NineDevice9Ex_ResetEx( struct NineDevice9Ex *This, break; } + MinZ = This->base.state.viewport.MinZ; /* These are preserved */ + MaxZ = This->base.state.viewport.MaxZ; NineDevice9_SetRenderTarget( (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]); + This->base.state.viewport.MinZ = MinZ; + This->base.state.viewport.MaxZ = MaxZ; + nine_context_set_viewport(&This->base, &This->base.state.viewport); + + if (This->base.nswapchains && This->base.swapchains[0]->params.EnableAutoDepthStencil) + NineDevice9_SetDepthStencilSurface( + &This->base, (IDirect3DSurface9 *)This->base.swapchains[0]->zsbuf); return hr; } @@ -246,6 +256,7 @@ NineDevice9Ex_Reset( struct NineDevice9Ex *This, D3DPRESENT_PARAMETERS *pPresentationParameters ) { HRESULT hr = D3D_OK; + float MinZ, MaxZ; unsigned i; DBG("This=%p pPresentationParameters=%p\n", This, pPresentationParameters); @@ -257,13 +268,17 @@ NineDevice9Ex_Reset( struct NineDevice9Ex *This, break; } - nine_csmt_process(&This->base); - nine_device_state_clear((struct NineDevice9 *)This); - nine_context_clear(&This->base); - - NineDevice9_SetDefaultState((struct NineDevice9 *)This, TRUE); + MinZ = This->base.state.viewport.MinZ; /* These are preserved */ + MaxZ = This->base.state.viewport.MaxZ; NineDevice9_SetRenderTarget( (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]); + This->base.state.viewport.MinZ = MinZ; + This->base.state.viewport.MaxZ = MaxZ; + nine_context_set_viewport(&This->base, &This->base.state.viewport); + + if (This->base.nswapchains && This->base.swapchains[0]->params.EnableAutoDepthStencil) + NineDevice9_SetDepthStencilSurface( + &This->base, (IDirect3DSurface9 *)This->base.swapchains[0]->zsbuf); return hr; } diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 9cc4ba289e4..a30887db412 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -1851,19 +1851,7 @@ CSMT_ITEM_NO_WAIT(nine_context_set_render_target, const unsigned i = RenderTargetIndex; if (i == 0) { - context->viewport.X = 0; - context->viewport.Y = 0; - context->viewport.Width = rt->desc.Width; - context->viewport.Height = rt->desc.Height; - context->viewport.MinZ = 0.0f; - context->viewport.MaxZ = 1.0f; - - context->scissor.minx = 0; - context->scissor.miny = 0; - context->scissor.maxx = rt->desc.Width; - context->scissor.maxy = rt->desc.Height; - - context->changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE; + context->changed.group |= NINE_STATE_MULTISAMPLE; if (context->rt[0] && (context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) !=