From 47701d47e7919b369d19d5a0e234d92c8eb01476 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 3 Nov 2020 16:37:10 +1000 Subject: [PATCH] llvmpipe: respect the sample mask in non-multisample flag This partly revert 50987644 llvmpipe: don't use sample mask with 0 samples since Vulkan wants this behaviour. Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/drivers/llvmpipe/lp_state_fs.c | 6 ++++++ src/gallium/drivers/llvmpipe/lp_state_fs.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index c57f2d4e6ee..baea9130c89 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -1030,6 +1030,11 @@ generate_fs_loop(struct gallivm_state *gallivm, assert(smaski >= 0); output_smask = LLVMBuildLoad(builder, outputs[smaski][0], "smask"); output_smask = LLVMBuildBitCast(builder, output_smask, smask_bld.vec_type, ""); + if (!key->multisample && key->no_ms_sample_mask_out) { + output_smask = lp_build_and(&smask_bld, output_smask, smask_bld.one); + output_smask = lp_build_cmp(&smask_bld, PIPE_FUNC_NOTEQUAL, output_smask, smask_bld.zero); + lp_build_mask_update(&mask, output_smask); + } if (key->min_samples > 1) { /* only the bit corresponding to this sample is to be used. */ @@ -3989,6 +3994,7 @@ make_variant_key(struct llvmpipe_context *lp, key->flatshade = lp->rasterizer->flatshade; key->multisample = lp->rasterizer->multisample; + key->no_ms_sample_mask_out = lp->rasterizer->no_ms_sample_mask_out; if (lp->active_occlusion_queries && !lp->queries_disabled) { key->occlusion_count = TRUE; } diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.h b/src/gallium/drivers/llvmpipe/lp_state_fs.h index 4dd48db356e..ad28b4f6c7f 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.h +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.h @@ -84,6 +84,7 @@ struct lp_fragment_shader_variant_key unsigned resource_1d:1; unsigned depth_clamp:1; unsigned multisample:1; + unsigned no_ms_sample_mask_out:1; enum pipe_format zsbuf_format; enum pipe_format cbuf_format[PIPE_MAX_COLOR_BUFS];