radv: ignore other blend targets if dual-source blending is enabled
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 19 Nov 2020 11:00:23 +0000 (12:00 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 20 Nov 2020 09:15:34 +0000 (09:15 +0000)
Using more blend targets than specified by maxFragmentDualSrcAttachments
is invalid per the Vulkan spec.

I'm usually not a fan to workaround game bugs inside the driver but
it's really easy for us to ignore MRT1+ in the driver and that
prevents wrong behaviour.

Cc: 20.2, 20.3
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7684>

src/amd/vulkan/radv_pipeline.c

index 875a941..77b7cce 100644 (file)
@@ -555,8 +555,10 @@ radv_pipeline_compute_spi_color_formats(const struct radv_pipeline *pipeline,
        /* The output for dual source blending should have the same format as
         * the first output.
         */
-       if (blend->mrt0_is_dual_src)
+       if (blend->mrt0_is_dual_src) {
+               assert(!(col_format >> 4));
                col_format |= (col_format & 0xf) << 4;
+       }
 
        blend->spi_shader_col_format = col_format;
        blend->col_format_is_int8 = is_int8;
@@ -684,6 +686,12 @@ radv_pipeline_init_blend_state(const struct radv_pipeline *pipeline,
                        if (!att->colorWriteMask)
                                continue;
 
+                       /* Ignore other blend targets if dual-source blending
+                        * is enabled to prevent wrong behaviour.
+                        */
+                       if (blend.mrt0_is_dual_src)
+                               continue;
+
                        blend.cb_target_mask |= (unsigned)att->colorWriteMask << (4 * i);
                        blend.cb_target_enabled_4bit |= 0xfu << (4 * i);
                        if (!att->blendEnable) {