From 0cc79c9c1ebfa201f5d6b47c030b1856cb19ca3d Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 11 Jan 2022 13:38:45 -0800 Subject: [PATCH] d3d12: When no framebuffer attachments are present, the viewport must be clamped to framebuffer size GL has separate no-attachment framebuffer size parameters, but D3D uses the viewport. Clamp the viewport dimensions to lie within GL's default framebuffer sizes. Reviewed-by: Boris Brezillon Part-of: --- src/gallium/drivers/d3d12/d3d12_context.cpp | 4 ++++ src/gallium/drivers/d3d12/d3d12_draw.cpp | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index 9e2144135bd..95ec07abae6 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -1356,7 +1356,9 @@ d3d12_set_framebuffer_state(struct pipe_context *pctx, struct d3d12_context *ctx = d3d12_context(pctx); int samples = -1; + bool prev_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf; util_copy_framebuffer_state(&d3d12_context(pctx)->fb, state); + bool new_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf; ctx->gfx_pipeline_state.num_cbufs = state->nr_cbufs; ctx->gfx_pipeline_state.has_float_rtv = false; @@ -1383,6 +1385,8 @@ d3d12_set_framebuffer_state(struct pipe_context *pctx, ctx->gfx_pipeline_state.samples = MAX2(samples, 1); ctx->state_dirty |= D3D12_DIRTY_FRAMEBUFFER; + if (!prev_cbufs_or_zsbuf || !new_cbufs_or_zsbuf) + ctx->state_dirty |= D3D12_DIRTY_VIEWPORT; } static void diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp index f8d778c2600..cef00097c01 100644 --- a/src/gallium/drivers/d3d12/d3d12_draw.cpp +++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp @@ -1004,16 +1004,21 @@ d3d12_draw_vbo(struct pipe_context *pctx, } if (ctx->cmdlist_dirty & D3D12_DIRTY_VIEWPORT) { - if (ctx->need_zero_one_depth_range) { - D3D12_VIEWPORT viewports[PIPE_MAX_VIEWPORTS]; - for (unsigned i = 0; i < ctx->num_viewports; ++i) { - viewports[i] = ctx->viewports[i]; + D3D12_VIEWPORT viewports[PIPE_MAX_VIEWPORTS]; + for (unsigned i = 0; i < ctx->num_viewports; ++i) { + viewports[i] = ctx->viewports[i]; + if (ctx->need_zero_one_depth_range) { viewports[i].MinDepth = 0.0f; viewports[i].MaxDepth = 1.0f; } - ctx->cmdlist->RSSetViewports(ctx->num_viewports, viewports); - } else - ctx->cmdlist->RSSetViewports(ctx->num_viewports, ctx->viewports); + if (ctx->fb.nr_cbufs == 0 && !ctx->fb.zsbuf) { + viewports[i].TopLeftX = MAX2(0.0f, viewports[i].TopLeftX); + viewports[i].TopLeftY = MAX2(0.0f, viewports[i].TopLeftY); + viewports[i].Width = MIN2(ctx->fb.width, viewports[i].Width); + viewports[i].Height = MIN2(ctx->fb.height, viewports[i].Height); + } + } + ctx->cmdlist->RSSetViewports(ctx->num_viewports, viewports); } if (ctx->cmdlist_dirty & D3D12_DIRTY_SCISSOR) {