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:
parent
7fe08535df
commit
6f8089d35c
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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,
|
||||||
}))],
|
}))],
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user