zink: don't render with multisampling when it is disabled

Previously zink ignored whether multisampling was enabled and rendered
with mulisampling whenever the target buffer had multiple samples.

This change now will only render with multisampling when it is enabled
and will use a lowering pass to make sure this case is handled correcly.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22626>
This commit is contained in:
antonino 2023-04-21 13:25:33 +02:00 committed by Marge Bot
parent 14d5892609
commit a004825266
3 changed files with 8 additions and 4 deletions

View file

@ -3556,6 +3556,9 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs,
if (zink_fs_key_base(key)->force_dual_color_blend && nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DATA1)) { if (zink_fs_key_base(key)->force_dual_color_blend && nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DATA1)) {
NIR_PASS_V(nir, lower_dual_blend); NIR_PASS_V(nir, lower_dual_blend);
} }
if (zink_fs_key_base(key)->single_sample) {
NIR_PASS_V(nir, nir_lower_single_sampled);
}
if (zink_fs_key_base(key)->coord_replace_bits) if (zink_fs_key_base(key)->coord_replace_bits)
NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key_base(key)->coord_replace_bits, false, false); NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key_base(key)->coord_replace_bits, false, false);
if (zink_fs_key_base(key)->point_coord_yinvert) if (zink_fs_key_base(key)->point_coord_yinvert)

View file

@ -637,8 +637,9 @@ zink_draw(struct pipe_context *pctx,
VKCTX(CmdSetLineStippleEnableEXT)(batch->state->cmdbuf, rast_state->hw_state.line_stipple_enable); VKCTX(CmdSetLineStippleEnableEXT)(batch->state->cmdbuf, rast_state->hw_state.line_stipple_enable);
} }
if ((BATCH_CHANGED || ctx->sample_mask_changed) && screen->have_full_ds3) { if ((BATCH_CHANGED || ctx->sample_mask_changed) && screen->have_full_ds3) {
VKCTX(CmdSetRasterizationSamplesEXT)(batch->state->cmdbuf, (VkSampleCountFlagBits)(ctx->gfx_pipeline_state.rast_samples + 1)); uint8_t samples = ctx->gfx_pipeline_state.multisample ? ctx->gfx_pipeline_state.rast_samples + 1 : 1;
VKCTX(CmdSetSampleMaskEXT)(batch->state->cmdbuf, (VkSampleCountFlagBits)(ctx->gfx_pipeline_state.rast_samples + 1), &ctx->gfx_pipeline_state.sample_mask); VKCTX(CmdSetRasterizationSamplesEXT)(batch->state->cmdbuf, (VkSampleCountFlagBits)(samples));
VKCTX(CmdSetSampleMaskEXT)(batch->state->cmdbuf, (VkSampleCountFlagBits)(samples), &ctx->gfx_pipeline_state.sample_mask);
ctx->sample_mask_changed = false; ctx->sample_mask_changed = false;
} }
if ((BATCH_CHANGED || ctx->blend_state_changed) && screen->have_full_ds3) { if ((BATCH_CHANGED || ctx->blend_state_changed) && screen->have_full_ds3) {

View file

@ -114,7 +114,7 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
VkPipelineMultisampleStateCreateInfo ms_state = {0}; VkPipelineMultisampleStateCreateInfo ms_state = {0};
ms_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; ms_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
ms_state.rasterizationSamples = state->rast_samples + 1; ms_state.rasterizationSamples = state->multisample ? state->rast_samples + 1 : 1;
if (state->blend_state) { if (state->blend_state) {
ms_state.alphaToCoverageEnable = state->blend_state->alpha_to_coverage; ms_state.alphaToCoverageEnable = state->blend_state->alpha_to_coverage;
if (state->blend_state->alpha_to_one && !screen->info.feats.features.alphaToOne) { if (state->blend_state->alpha_to_one && !screen->info.feats.features.alphaToOne) {
@ -508,7 +508,7 @@ zink_create_gfx_pipeline_output(struct zink_screen *screen, struct zink_gfx_pipe
} }
ms_state.alphaToOneEnable = state->blend_state->alpha_to_one; ms_state.alphaToOneEnable = state->blend_state->alpha_to_one;
} }
ms_state.rasterizationSamples = state->rast_samples + 1; ms_state.rasterizationSamples = state->multisample ? state->rast_samples + 1 : 1;
/* "If pSampleMask is NULL, it is treated as if the mask has all bits set to 1." /* "If pSampleMask is NULL, it is treated as if the mask has all bits set to 1."
* - Chapter 27. Rasterization * - Chapter 27. Rasterization
* *