Fix UI corruption for AMD gpus with Vulkan (#9169)

# Objective

Fixes #8894 
Fixes #7944 

## Solution

The UI pipeline's `MultisampleState::count` is set to 1 whereas the
`MultisampleState::count` for the camera's ViewTarget is taken from the
`Msaa` resource, and corruption occurs when these two values are
different.

This PR solves the problem by setting `MultisampleState::count` for the
UI pipeline to the value from the Msaa resource too.

I don't know much about Bevy's rendering internals or graphics hardware,
so maybe there is a better solution than this. UI MSAA was probably
disabled for a good reason (performance?).

## Changelog
* Enabled multisampling for the UI pipeline.
This commit is contained in:
ickshonpe 2023-07-19 08:29:14 +01:00 committed by GitHub
parent 7fe08535df
commit 6f8089d35c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 3 deletions

View File

@ -3,6 +3,7 @@ mod render_pass;
use bevy_core_pipeline::{core_2d::Camera2d, core_3d::Camera3d}; use bevy_core_pipeline::{core_2d::Camera2d, core_3d::Camera3d};
use bevy_hierarchy::Parent; use bevy_hierarchy::Parent;
use bevy_render::view::Msaa;
use bevy_render::{ExtractSchedule, Render}; use bevy_render::{ExtractSchedule, Render};
use bevy_window::{PrimaryWindow, Window}; use bevy_window::{PrimaryWindow, Window};
pub use pipeline::*; pub use pipeline::*;
@ -801,6 +802,7 @@ pub fn queue_uinodes(
ui_batches: Query<(Entity, &UiBatch)>, ui_batches: Query<(Entity, &UiBatch)>,
mut views: Query<(&ExtractedView, &mut RenderPhase<TransparentUi>)>, mut views: Query<(&ExtractedView, &mut RenderPhase<TransparentUi>)>,
events: Res<SpriteAssetEvents>, events: Res<SpriteAssetEvents>,
msaa: Res<Msaa>,
) { ) {
// If an image has changed, the GpuImage has (probably) changed // If an image has changed, the GpuImage has (probably) changed
for event in &events.images { for event in &events.images {
@ -826,7 +828,10 @@ pub fn queue_uinodes(
let pipeline = pipelines.specialize( let pipeline = pipelines.specialize(
&pipeline_cache, &pipeline_cache,
&ui_pipeline, &ui_pipeline,
UiPipelineKey { hdr: view.hdr }, UiPipelineKey {
hdr: view.hdr,
msaa_samples: msaa.samples(),
},
); );
for (entity, batch) in &ui_batches { for (entity, batch) in &ui_batches {
image_bind_groups image_bind_groups

View File

@ -62,6 +62,7 @@ impl FromWorld for UiPipeline {
#[derive(Clone, Copy, Hash, PartialEq, Eq)] #[derive(Clone, Copy, Hash, PartialEq, Eq)]
pub struct UiPipelineKey { pub struct UiPipelineKey {
pub hdr: bool, pub hdr: bool,
pub msaa_samples: u32,
} }
impl SpecializedRenderPipeline for UiPipeline { impl SpecializedRenderPipeline for UiPipeline {
@ -117,7 +118,7 @@ impl SpecializedRenderPipeline for UiPipeline {
}, },
depth_stencil: None, depth_stencil: None,
multisample: MultisampleState { multisample: MultisampleState {
count: 1, count: key.msaa_samples,
mask: !0, mask: !0,
alpha_to_coverage_enabled: false, alpha_to_coverage_enabled: false,
}, },

View File

@ -72,7 +72,7 @@ impl Node for UiPassNode {
}; };
let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor { let mut render_pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
label: Some("ui_pass"), label: Some("ui_pass"),
color_attachments: &[Some(target.get_unsampled_color_attachment(Operations { color_attachments: &[Some(target.get_color_attachment(Operations {
load: LoadOp::Load, load: LoadOp::Load,
store: true, store: true,
}))], }))],