Module: Mesa Branch: master Commit: 369f9d225db1c44bb1e942f4ad8fefd871b8cf28 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=369f9d225db1c44bb1e942f4ad8fefd871b8cf28
Author: Yannik Marek <[email protected]> Date: Mon Feb 8 15:11:37 2021 -0500 turnip: fix alpha to coverage in no color and unused attachment cases In cases where the alpha coverage is enabled but the color attachment is either unused or absent there should be a dummy mrt to make the draw behave correctly. Reviewed-by: Samuel Iglesias Gonsálvez <[email protected]> Reviewed-by: Matt Turner <[email protected]> Signed-off-by: Yannik Marek <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8952> --- src/freedreno/ci/deqp-freedreno-a630-fails.txt | 4 --- src/freedreno/vulkan/tu_pipeline.c | 34 ++++++++++++++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/freedreno/ci/deqp-freedreno-a630-fails.txt b/src/freedreno/ci/deqp-freedreno-a630-fails.txt index 7fd140aeb83..e6bbf23b132 100644 --- a/src/freedreno/ci/deqp-freedreno-a630-fails.txt +++ b/src/freedreno/ci/deqp-freedreno-a630-fails.txt @@ -98,10 +98,6 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_always_g dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_greater_equal_greater,Fail dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.depth_compare_greater_equal_greater_then_equal,Fail dEQP-VK.pipeline.framebuffer_attachment.diff_attachments_2d_19x27_32x32_ms,Fail -dEQP-VK.pipeline.multisample.alpha_to_coverage_no_color_attachment.samples_2.alpha_opaque,Fail -dEQP-VK.pipeline.multisample.alpha_to_coverage_no_color_attachment.samples_4.alpha_opaque,Fail -dEQP-VK.pipeline.multisample.alpha_to_coverage_unused_attachment.samples_2.alpha_invisible,Fail -dEQP-VK.pipeline.multisample.alpha_to_coverage_unused_attachment.samples_4.alpha_invisible,Fail dEQP-VK.pipeline.push_descriptor.compute.binding0_numcalls2_combined_image_sampler,Crash dEQP-VK.pipeline.push_descriptor.compute.binding0_numcalls2_sampled_image,Crash dEQP-VK.pipeline.push_descriptor.compute.binding0_numcalls2_sampler,Crash diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 3e1b9189df2..4ddd50f95dc 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -262,6 +262,7 @@ struct tu_pipeline_builder VkSampleCountFlagBits samples; bool use_color_attachments; bool use_dual_src_blend; + bool alpha_to_coverage; uint32_t color_attachment_count; VkFormat color_attachment_formats[MAX_RTS]; VkFormat depth_attachment_format; @@ -1331,7 +1332,7 @@ tu6_emit_fs_outputs(struct tu_cs *cs, const struct ir3_shader_variant *fs, uint32_t mrt_count, bool dual_src_blend, uint32_t render_components, - bool is_s8_uint) + bool no_earlyz) { uint32_t smask_regid, posz_regid, stencilref_regid; @@ -1379,7 +1380,7 @@ tu6_emit_fs_outputs(struct tu_cs *cs, enum a6xx_ztest_mode zmode; - if (fs->no_earlyz || fs->has_kill || fs->writes_pos || fs->writes_stencilref || is_s8_uint) { + if (fs->no_earlyz || fs->has_kill || fs->writes_pos || fs->writes_stencilref || no_earlyz) { zmode = A6XX_LATE_Z; } else { zmode = A6XX_EARLY_Z; @@ -1530,20 +1531,36 @@ tu6_emit_program(struct tu_cs *cs, builder->device->physical_device->gpu_id == 650); tu6_emit_vpc_varying_modes(cs, fs); + bool no_earlyz = builder->depth_attachment_format == VK_FORMAT_S8_UINT; + uint32_t mrt_count = builder->color_attachment_count; + uint32_t render_components = builder->render_components; + + if (builder->alpha_to_coverage) { + /* alpha to coverage can behave like a discard */ + no_earlyz = true; + /* alpha value comes from first mrt */ + render_components |= 0xf; + if (!mrt_count) { + mrt_count = 1; + /* Disable memory write for dummy mrt because it doesn't get set otherwise */ + tu_cs_emit_regs(cs, A6XX_RB_MRT_CONTROL(0, .component_enable = 0)); + } + } + if (fs) { tu6_emit_fs_inputs(cs, fs); - tu6_emit_fs_outputs(cs, fs, builder->color_attachment_count, + tu6_emit_fs_outputs(cs, fs, mrt_count, builder->use_dual_src_blend, - builder->render_components, - builder->depth_attachment_format == VK_FORMAT_S8_UINT); + render_components, + no_earlyz); } else { /* TODO: check if these can be skipped if fs is disabled */ struct ir3_shader_variant dummy_variant = {}; tu6_emit_fs_inputs(cs, &dummy_variant); - tu6_emit_fs_outputs(cs, &dummy_variant, builder->color_attachment_count, + tu6_emit_fs_outputs(cs, &dummy_variant, mrt_count, builder->use_dual_src_blend, - builder->render_components, - builder->depth_attachment_format == VK_FORMAT_S8_UINT); + render_components, + no_earlyz); } if (gs || hs) { @@ -2860,6 +2877,7 @@ tu_pipeline_builder_init_graphics( builder->samples = VK_SAMPLE_COUNT_1_BIT; } else { builder->samples = create_info->pMultisampleState->rasterizationSamples; + builder->alpha_to_coverage = create_info->pMultisampleState->alphaToCoverageEnable; const uint32_t a = subpass->depth_stencil_attachment.attachment; builder->depth_attachment_format = (a != VK_ATTACHMENT_UNUSED) ? _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
