Skip to content

Commit df24cd3

Browse files
bevy_render: disable GpuPreprocessingSupport for GL backend (#19355)
# Objective Fixes a crash when running with CPU rendered lavapipe, which could be fixed by manually setting ```rs app.sub_app_mut(RenderApp).insert_resource(GpuPreprocessingSupport { max_supported_mode: GpuPreprocessingMode::None, }); ``` ```rs wgpu error: Validation Error Caused by: In Device::create_compute_pipeline, label = 'downsample depth first phase pipeline' Internal error: WGSL `textureLoad` from depth textures is not supported in GLSL Encountered a panic in system `bevy_render::render_resource::pipeline_cache::PipelineCache::process_pipeline_queue_system` ``` ## Solution Automatically disable gpu preprocessing when running with the GL backend. ## Testing I ran the breakout example through `libTAS` which (among other things) forces software rendering. Running breakout with just ```rs .add_plugins(DefaultPlugins.set(RenderPlugin { render_creation: bevy_render::settings::RenderCreation::Automatic(WgpuSettings { backends: Some(Backends::GL), ..default() }), ..default() })) ``` fails with `gpu_core::device::global: surface configuration failed: incompatible window kind` so gl isn't fully supported yet, but it's a step in the right direction.
1 parent d4e059c commit df24cd3

File tree

5 files changed

+23
-20
lines changed

5 files changed

+23
-20
lines changed

crates/bevy_pbr/src/light_probe/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ use bevy_render::{
2323
extract_instances::ExtractInstancesPlugin,
2424
render_asset::RenderAssets,
2525
render_resource::{DynamicUniformBuffer, Sampler, ShaderType, TextureView},
26-
renderer::{RenderAdapter, RenderDevice, RenderQueue},
26+
renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue},
2727
settings::WgpuFeatures,
2828
sync_world::RenderEntity,
2929
texture::{FallbackImage, GpuImage},
3030
view::ExtractedView,
31-
Extract, ExtractSchedule, Render, RenderApp, RenderSystems,
31+
Extract, ExtractSchedule, Render, RenderApp, RenderSystems, WgpuWrapper,
3232
};
3333
use bevy_shader::load_shader_library;
3434
use bevy_transform::{components::Transform, prelude::GlobalTransform};
@@ -718,8 +718,10 @@ pub(crate) fn binding_arrays_are_usable(
718718
render_device: &RenderDevice,
719719
render_adapter: &RenderAdapter,
720720
) -> bool {
721+
let adapter_info = RenderAdapterInfo(WgpuWrapper::new(render_adapter.get_info()));
722+
721723
!cfg!(feature = "shader_format_glsl")
722-
&& bevy_render::get_adreno_model(render_adapter).is_none_or(|model| model > 610)
724+
&& bevy_render::get_adreno_model(&adapter_info).is_none_or(|model| model > 610)
723725
&& render_device.limits().max_storage_textures_per_shader_stage
724726
>= (STANDARD_MATERIAL_FRAGMENT_SHADER_MIN_TEXTURE_BINDINGS + MAX_VIEW_LIGHT_PROBES)
725727
as u32

crates/bevy_render/src/batching/gpu_preprocessing.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ use crate::{
3333
ViewSortedRenderPhases,
3434
},
3535
render_resource::{Buffer, GpuArrayBufferable, RawBufferVec, UninitBufferVec},
36-
renderer::{RenderAdapter, RenderDevice, RenderQueue},
36+
renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue},
3737
sync_world::MainEntity,
3838
view::{ExtractedView, NoIndirectDrawing, RetainedViewEntity},
39+
wgpu_wrapper::WgpuWrapper,
3940
Render, RenderApp, RenderDebugFlags, RenderSystems,
4041
};
4142

@@ -1104,9 +1105,9 @@ impl FromWorld for GpuPreprocessingSupport {
11041105
// - We filter out Adreno 730 and earlier GPUs (except 720, as it's newer
11051106
// than 730).
11061107
// - We filter out Mali GPUs with driver versions lower than 48.
1107-
fn is_non_supported_android_device(adapter: &RenderAdapter) -> bool {
1108-
crate::get_adreno_model(adapter).is_some_and(|model| model != 720 && model <= 730)
1109-
|| crate::get_mali_driver_version(adapter).is_some_and(|version| version < 48)
1108+
fn is_non_supported_android_device(adapter_info: &RenderAdapterInfo) -> bool {
1109+
crate::get_adreno_model(adapter_info).is_some_and(|model| model != 720 && model <= 730)
1110+
|| crate::get_mali_driver_version(adapter_info).is_some_and(|version| version < 48)
11101111
}
11111112

11121113
let culling_feature_support = device.features().contains(
@@ -1127,8 +1128,11 @@ impl FromWorld for GpuPreprocessingSupport {
11271128
.flags
11281129
.contains(DownlevelFlags::COMPUTE_SHADERS);
11291130

1131+
let adapter_info = RenderAdapterInfo(WgpuWrapper::new(adapter.get_info()));
1132+
11301133
let max_supported_mode = if device.limits().max_compute_workgroup_size_x == 0
1131-
|| is_non_supported_android_device(adapter)
1134+
|| is_non_supported_android_device(&adapter_info)
1135+
|| adapter_info.backend == wgpu::Backend::Gl
11321136
{
11331137
info!(
11341138
"GPU preprocessing is not supported on this device. \

crates/bevy_render/src/diagnostic/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use self::internal::{
1717
sync_diagnostics, DiagnosticsRecorder, Pass, RenderDiagnosticsMutex, WriteTimestamp,
1818
};
1919

20-
use super::{RenderDevice, RenderQueue};
20+
use crate::renderer::{RenderDevice, RenderQueue};
2121

2222
/// Enables collecting render diagnostics, such as CPU/GPU elapsed time per render pass,
2323
/// as well as pipeline statistics (number of primitives, number of shader invocations, etc).

crates/bevy_render/src/lib.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ use crate::{
8585
mesh::{MeshPlugin, MorphPlugin, RenderMesh},
8686
render_asset::prepare_assets,
8787
render_resource::{init_empty_bind_group_layout, PipelineCache},
88-
renderer::{render_system, RenderInstance},
88+
renderer::{render_system, RenderAdapterInfo, RenderInstance},
8989
settings::RenderCreation,
9090
storage::StoragePlugin,
9191
texture::TexturePlugin,
@@ -111,7 +111,6 @@ use render_asset::{
111111
extract_render_asset_bytes_per_frame, reset_render_asset_bytes_per_frame,
112112
RenderAssetBytesPerFrame, RenderAssetBytesPerFrameLimiter,
113113
};
114-
use renderer::{RenderAdapter, RenderDevice, RenderQueue};
115114
use settings::RenderResources;
116115
use std::sync::Mutex;
117116
use sync_world::{despawn_temporary_render_entities, entity_sync_system, SyncWorldPlugin};
@@ -589,16 +588,15 @@ fn apply_extract_commands(render_world: &mut World) {
589588
});
590589
}
591590

592-
/// If the [`RenderAdapter`] is a Qualcomm Adreno, returns its model number.
591+
/// If the [`RenderAdapterInfo`] is a Qualcomm Adreno, returns its model number.
593592
///
594593
/// This lets us work around hardware bugs.
595-
pub fn get_adreno_model(adapter: &RenderAdapter) -> Option<u32> {
594+
pub fn get_adreno_model(adapter_info: &RenderAdapterInfo) -> Option<u32> {
596595
if !cfg!(target_os = "android") {
597596
return None;
598597
}
599598

600-
let adapter_name = adapter.get_info().name;
601-
let adreno_model = adapter_name.strip_prefix("Adreno (TM) ")?;
599+
let adreno_model = adapter_info.name.strip_prefix("Adreno (TM) ")?;
602600

603601
// Take suffixes into account (like Adreno 642L).
604602
Some(
@@ -610,16 +608,15 @@ pub fn get_adreno_model(adapter: &RenderAdapter) -> Option<u32> {
610608
}
611609

612610
/// Get the Mali driver version if the adapter is a Mali GPU.
613-
pub fn get_mali_driver_version(adapter: &RenderAdapter) -> Option<u32> {
611+
pub fn get_mali_driver_version(adapter_info: &RenderAdapterInfo) -> Option<u32> {
614612
if !cfg!(target_os = "android") {
615613
return None;
616614
}
617615

618-
let driver_name = adapter.get_info().name;
619-
if !driver_name.contains("Mali") {
616+
if !adapter_info.name.contains("Mali") {
620617
return None;
621618
}
622-
let driver_info = adapter.get_info().driver_info;
619+
let driver_info = &adapter_info.driver_info;
623620
if let Some(start_pos) = driver_info.find("v1.r")
624621
&& let Some(end_pos) = driver_info[start_pos..].find('p')
625622
{

crates/bevy_render/src/render_resource/bind_group_layout.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define_atomic_id!(BindGroupLayoutId);
1212
/// which can be cloned as needed to workaround lifetime management issues. It may be converted
1313
/// from and dereferences to wgpu's [`BindGroupLayout`](wgpu::BindGroupLayout).
1414
///
15-
/// Can be created via [`RenderDevice::create_bind_group_layout`](crate::RenderDevice::create_bind_group_layout).
15+
/// Can be created via [`RenderDevice::create_bind_group_layout`](crate::renderer::RenderDevice::create_bind_group_layout).
1616
#[derive(Clone, Debug)]
1717
pub struct BindGroupLayout {
1818
id: BindGroupLayoutId,

0 commit comments

Comments
 (0)