Fix adapter forcing breaking wasm builds (#20054)
# Objective - Appease @mockersf ## Solution - Gate out enumerate_adapters usage on wasm and warn if `WGPU_FORCE_FALLBACK_ADAPTER` is somehow used.
This commit is contained in:
parent
cfb679a752
commit
b3032e06bd
@ -7,7 +7,7 @@ use bevy_tasks::ComputeTaskPool;
|
|||||||
use bevy_utils::WgpuWrapper;
|
use bevy_utils::WgpuWrapper;
|
||||||
pub use graph_runner::*;
|
pub use graph_runner::*;
|
||||||
pub use render_device::*;
|
pub use render_device::*;
|
||||||
use tracing::{debug, error, info, info_span, trace, warn};
|
use tracing::{debug, error, info, info_span, warn};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
diagnostic::{internal::DiagnosticsRecorder, RecordDiagnostics},
|
diagnostic::{internal::DiagnosticsRecorder, RecordDiagnostics},
|
||||||
@ -145,6 +145,33 @@ const GPU_NOT_FOUND_ERROR_MESSAGE: &str = if cfg!(target_os = "linux") {
|
|||||||
"Unable to find a GPU! Make sure you have installed required drivers!"
|
"Unable to find a GPU! Make sure you have installed required drivers!"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(not(target_family = "wasm"))]
|
||||||
|
fn find_adapter_by_name(
|
||||||
|
instance: &Instance,
|
||||||
|
options: &WgpuSettings,
|
||||||
|
compatible_surface: Option<&wgpu::Surface<'_>>,
|
||||||
|
adapter_name: &str,
|
||||||
|
) -> Option<Adapter> {
|
||||||
|
for adapter in
|
||||||
|
instance.enumerate_adapters(options.backends.expect(
|
||||||
|
"The `backends` field of `WgpuSettings` must be set to use a specific adapter.",
|
||||||
|
))
|
||||||
|
{
|
||||||
|
tracing::trace!("Checking adapter: {:?}", adapter.get_info());
|
||||||
|
let info = adapter.get_info();
|
||||||
|
if let Some(surface) = compatible_surface {
|
||||||
|
if !adapter.is_surface_supported(surface) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.name.eq_ignore_ascii_case(adapter_name) {
|
||||||
|
return Some(adapter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
/// Initializes the renderer by retrieving and preparing the GPU instance, device and queue
|
/// Initializes the renderer by retrieving and preparing the GPU instance, device and queue
|
||||||
/// for the specified backend.
|
/// for the specified backend.
|
||||||
pub async fn initialize_renderer(
|
pub async fn initialize_renderer(
|
||||||
@ -153,36 +180,30 @@ pub async fn initialize_renderer(
|
|||||||
request_adapter_options: &RequestAdapterOptions<'_, '_>,
|
request_adapter_options: &RequestAdapterOptions<'_, '_>,
|
||||||
desired_adapter_name: Option<String>,
|
desired_adapter_name: Option<String>,
|
||||||
) -> (RenderDevice, RenderQueue, RenderAdapterInfo, RenderAdapter) {
|
) -> (RenderDevice, RenderQueue, RenderAdapterInfo, RenderAdapter) {
|
||||||
|
#[cfg(not(target_family = "wasm"))]
|
||||||
|
let mut selected_adapter = desired_adapter_name.and_then(|adapter_name| {
|
||||||
|
find_adapter_by_name(
|
||||||
|
instance,
|
||||||
|
options,
|
||||||
|
request_adapter_options.compatible_surface,
|
||||||
|
&adapter_name,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
#[cfg(target_family = "wasm")]
|
||||||
let mut selected_adapter = None;
|
let mut selected_adapter = None;
|
||||||
if let Some(adapter_name) = &desired_adapter_name {
|
|
||||||
debug!("Searching for adapter with name: {}", adapter_name);
|
|
||||||
for adapter in instance.enumerate_adapters(options.backends.expect(
|
|
||||||
"The `backends` field of `WgpuSettings` must be set to use a specific adapter.",
|
|
||||||
)) {
|
|
||||||
trace!("Checking adapter: {:?}", adapter.get_info());
|
|
||||||
let info = adapter.get_info();
|
|
||||||
if let Some(surface) = request_adapter_options.compatible_surface {
|
|
||||||
if !adapter.is_surface_supported(surface) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if info
|
#[cfg(target_family = "wasm")]
|
||||||
.name
|
if desired_adapter_name.is_some() {
|
||||||
.to_lowercase()
|
warn!("Choosing an adapter is not supported on wasm.");
|
||||||
.contains(&adapter_name.to_lowercase())
|
}
|
||||||
{
|
|
||||||
selected_adapter = Some(adapter);
|
if selected_adapter.is_none() {
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
debug!(
|
debug!(
|
||||||
"Searching for adapter with options: {:?}",
|
"Searching for adapter with options: {:?}",
|
||||||
request_adapter_options
|
request_adapter_options
|
||||||
);
|
);
|
||||||
selected_adapter = instance.request_adapter(request_adapter_options).await.ok();
|
selected_adapter = instance.request_adapter(request_adapter_options).await.ok();
|
||||||
};
|
}
|
||||||
|
|
||||||
let adapter = selected_adapter.expect(GPU_NOT_FOUND_ERROR_MESSAGE);
|
let adapter = selected_adapter.expect(GPU_NOT_FOUND_ERROR_MESSAGE);
|
||||||
let adapter_info = adapter.get_info();
|
let adapter_info = adapter.get_info();
|
||||||
|
Loading…
Reference in New Issue
Block a user