Description
The macOS Apple Silicon editor from the r1-alpha8-nightly-08sep26 nightly crashes on every launch, a couple of frames after the window opens and before the editor UI is ever visible. wgpu rejects the pbr_opaque_mesh_pipeline layout because the fragment stage binds 20 samplers, while Metal on Apple GPUs reports max_samplers_per_shader_stage = 16. renzora_runtime then treats it as an unrecoverable render error and panics at crates/renzora_runtime/src/lib.rs:751.
The r1-alpha7 notes already say macOS builds have issues, so this may be the known one; filing it with the exact error and hardware in case it helps.
The bevy PBR pipeline is built with all the optional StandardMaterial texture extensions (transmission, multi-layer/clearcoat, anisotropy, specular). Each texture carries its own sampler, and together with the view bind group samplers (shadow, environment map) that overshoots Metal's 16-per-stage limit. The engine's own CodeShaderMaterial already shares a single sampler across texture slots "for the Metal sampler-limit rationale", but bevy's stock StandardMaterial pipeline has no such mitigation. Vulkan/DX12 allow far more samplers per stage, which is presumably why Windows/Linux are unaffected.
Steps to Reproduce
- Download
macos-arm64.zip from r1-alpha8-nightly-08sep26 and unzip it.
- Clear quarantine (
xattr -dr com.apple.quarantine macos-arm64/).
- Launch
Renzora Engine.app (double-click, or run Contents/MacOS/renzora from a terminal).
- Window appears, then a macOS crash alert pops up ~10 s later.
Reproduced twice in a row, identical crash report both times. No project was opened; this is the default startup scene. The sdk.tar.zst setup step never ran (or was not needed), the crash happens before that.
Expected Behavior
Editor starts on Apple Silicon.
Actual Behavior
Panic: Unrecoverable GPU render error (Validation) — Too many bindings of type Samplers in Stage ShaderStages(FRAGMENT), limit is 16, count was 20.
Environment
- OS: macOS 26.5.2 (build 25F84)
- GPU: Apple M1 Pro (integrated, Metal 4). Log says:
integrated/software adapter detected (Apple M1 Pro) — the editor will suggest the Low graphics tier
- Rust version: rustc 1.91.1 (ed61e7d7e 2025-11-07) — installed but not relevant, crash is before any compilation
- Engine version:
r1-alpha8-nightly-08sep26 (78e0dd2), macos-arm64.zip, Info.plist says 0.2.0
- Run mode: editor (
Renzora Engine.app)
Logs / Screenshots
~/.renzora/crashes/last_crash.txt
=== CRASH REPORT ===
Timestamp: 2026-09-08 15:01:23 UTC
Error: Unrecoverable GPU render error (Validation): Validation Error
Caused by:
In Device::create_pipeline_layout
Too many bindings of type Samplers in Stage ShaderStages(FRAGMENT), limit is 16, count was 20. Check the limit `max_samplers_per_shader_stage` passed to `Adapter::request_device`
Location: crates/renzora_runtime/src/lib.rs:751:14
=== BACKTRACE ===
0: <std::backtrace::Backtrace>::create
1: __mh_execute_header
2: std::panicking::panic_with_hook
3: std::panicking::panic_handler::{closure#0}
4: std::sys::backtrace::__rust_end_short_backtrace::<std::panicking::panic_handler::{closure#0}, !>
5: __rustc::rust_begin_unwind
6: core::panicking::panic_fmt
7: __mh_execute_header
8: <bevy_render::render_resource::texture::DefaultImageSamplerDescriptor as bevy_ecs::component::Component>::register_required_components
9: <bevy_gizmos::global::GlobalGizmosPlugin as bevy_app::plugin::Plugin>::build
10: <bevy_render::render_resource::texture::DefaultImageSamplerDescriptor as bevy_ecs::component::Component>::register_required_components
11: <bevy_render::extract_plugin::ExtractPlugin as bevy_app::plugin::Plugin>::build
12: <bevy_gizmos::global::GlobalGizmosPlugin as bevy_app::plugin::Plugin>::build
13: bevy_app::sub_app::SubApps::update
14: <bevy_winit::state::WinitAppRunnerState as winit::application::ApplicationHandler<bevy_winit::WinitUserEvent>>::about_to_wait
15: <bevy_winit::state::WinitAppRunnerState as winit::application::ApplicationHandler<bevy_winit::WinitUserEvent>>::resumed
16: <winit::platform_impl::macos::event_handler::EventHandler::set::ClearOnDrop as core::ops::drop::Drop>::drop
17: winit::platform_impl::macos::app_state::ApplicationDelegate::new
18: winit::platform_impl::macos::app_state::_::<impl objc2::top_level_traits::ClassType for winit::platform_impl::macos::app_state::ApplicationDelegate>::class
19: <unknown>
20: <unknown>
21: <unknown>
22: <unknown>
23: <unknown>
24: <unknown>
25: <unknown>
26: <unknown>
27: <unknown>
28: <unknown>
29: <unknown>
30: <unknown>
31: <bevy_winit::state::WinitAppRunnerState as winit::application::ApplicationHandler<bevy_winit::WinitUserEvent>>::resumed
32: bevy_winit::system::create_monitors
33: <bevy_winit::state::WinitAppRunnerState as winit::application::ApplicationHandler<bevy_winit::WinitUserEvent>>::resumed
34: bevy_app::app::App::run
35: __mh_execute_header
36: __mh_execute_header
37: __mh_execute_header
38: std::rt::lang_start_internal
39: __mh_execute_header
=== END CRASH REPORT ===
Console output (stdout/stderr, ANSI stripped, ~20 repeated `renzora::net` lines removed)
2026-09-08T15:00:29.446329Z INFO bevy_render::renderer: AdapterInfo { name: "Apple M1 Pro", vendor: 0, device: 0, device_type: IntegratedGpu, device_pci_bus_id: "", driver: "", driver_info: "", backend: Metal, subgroup_min_size: 4, subgroup_max_size: 64, transient_saves_memory: true }
2026-09-08T15:00:29.926294Z INFO renzora_runtime: [runtime] integrated/software adapter detected (Apple M1 Pro) — the editor will suggest the Low graphics tier
2026-09-08T15:00:29.926484Z INFO renzora_runtime: [runtime] foundation: RuntimePlugin
2026-09-08T15:00:30.261588Z INFO renzora_scene: [scene] teardown for project switch: despawned 3 entities
2026-09-08T15:00:30.262763Z INFO renzora_input: [InputPlugin] Using default input map (7 actions)
2026-09-08T15:00:30.282912Z INFO renzora_physics: [Physics] Pausing physics simulation
2026-09-08T15:00:30.283897Z INFO renzora_editor_framework::camera: [editor] Spawning UI camera
2026-09-08T15:00:30.283945Z INFO renzora_viewport: [viewport] setup_viewport — creating 4 render targets
2026-09-08T15:00:30.837009Z INFO renzora_audio::runtime: [audio] backend `renzora_audio` on `MacBook Pro Speakers` at 48000 Hz
2026-09-08T15:00:30.851463Z INFO renzora_net::pump: [net] client `ureq` ready (renzora-http/0.1.0)
2026-09-08T15:00:38.722587Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error
Caused by:
In Device::create_pipeline_layout
Too many bindings of type Samplers in Stage ShaderStages(FRAGMENT), limit is 16, count was 20. Check the limit `max_samplers_per_shader_stage` passed to `Adapter::request_device`
2026-09-08T15:00:38.722938Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error
Caused by:
In Device::create_render_pipeline, label = 'pbr_opaque_mesh_pipeline'
PipelineLayout with '' label is invalid
2026-09-08T15:00:40.498097Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error
Caused by:
In a CommandEncoder
In a set_pipeline command
RenderPipeline with 'pbr_opaque_mesh_pipeline' label is invalid
2026-09-08T15:00:40.500018Z ERROR bevy_render::error_handler: Caught rendering error: Validation Error
Caused by:
In Queue::submit
In a set_pipeline command
RenderPipeline with 'pbr_opaque_mesh_pipeline' label is invalid
2026-09-08 17:00:40.515 renzora[48703:403789] CFUserNotificationDisplayAlert: called from main application thread, will block waiting for a response.
thread 'main' (403789) panicked at crates/renzora_runtime/src/lib.rs:751:14:
Unrecoverable GPU render error (Validation): Validation Error
Caused by:
In Device::create_pipeline_layout
Too many bindings of type Samplers in Stage ShaderStages(FRAGMENT), limit is 16, count was 20. Check the limit `max_samplers_per_shader_stage` passed to `Adapter::request_device`
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
2026-09-08T15:00:45.182476Z ERROR winit::platform_impl::macos::event_handler: tried to run event handler, but no handler was set
Additional Context
- Also seen in the log, probably unrelated: right after startup,
renzora::net logs a burst of a request was made with no frame loop running — renzora_net::fetch blocks its own thread and cannot be called from a system or from Plugin::build. Spawn a thread. (about 20 times in one second, plus 2 earlier). Looks like marketplace/update checks firing from a system during boot.
SolariPlugin loaded but GPU ray tracing is unavailable — Solari is inert — expected on this hardware, mentioned only for completeness.
- No workaround found: the material texture features are compile-time, and
~/.renzora/settings.toml has no knob that avoids the pipeline. renderer_backend = "auto" (Metal is the only option on macOS anyway).
- Happy to test a fixed nightly on this machine.
Description
The macOS Apple Silicon editor from the
r1-alpha8-nightly-08sep26nightly crashes on every launch, a couple of frames after the window opens and before the editor UI is ever visible. wgpu rejects thepbr_opaque_mesh_pipelinelayout because the fragment stage binds 20 samplers, while Metal on Apple GPUs reportsmax_samplers_per_shader_stage = 16.renzora_runtimethen treats it as an unrecoverable render error and panics atcrates/renzora_runtime/src/lib.rs:751.The r1-alpha7 notes already say macOS builds have issues, so this may be the known one; filing it with the exact error and hardware in case it helps.
The bevy PBR pipeline is built with all the optional StandardMaterial texture extensions (transmission, multi-layer/clearcoat, anisotropy, specular). Each texture carries its own sampler, and together with the view bind group samplers (shadow, environment map) that overshoots Metal's 16-per-stage limit. The engine's own
CodeShaderMaterialalready shares a single sampler across texture slots "for the Metal sampler-limit rationale", but bevy's stockStandardMaterialpipeline has no such mitigation. Vulkan/DX12 allow far more samplers per stage, which is presumably why Windows/Linux are unaffected.Steps to Reproduce
macos-arm64.zipfromr1-alpha8-nightly-08sep26and unzip it.xattr -dr com.apple.quarantine macos-arm64/).Renzora Engine.app(double-click, or runContents/MacOS/renzorafrom a terminal).Reproduced twice in a row, identical crash report both times. No project was opened; this is the default startup scene. The
sdk.tar.zstsetup step never ran (or was not needed), the crash happens before that.Expected Behavior
Editor starts on Apple Silicon.
Actual Behavior
Panic:
Unrecoverable GPU render error (Validation)—Too many bindings of type Samplers in Stage ShaderStages(FRAGMENT), limit is 16, count was 20.Environment
integrated/software adapter detected (Apple M1 Pro) — the editor will suggest the Low graphics tierr1-alpha8-nightly-08sep26(78e0dd2),macos-arm64.zip, Info.plist says 0.2.0Renzora Engine.app)Logs / Screenshots
~/.renzora/crashes/last_crash.txt
Console output (stdout/stderr, ANSI stripped, ~20 repeated `renzora::net` lines removed)
Additional Context
renzora::netlogs a burst ofa request was made with no frame loop running — renzora_net::fetch blocks its own thread and cannot be called from a system or from Plugin::build. Spawn a thread.(about 20 times in one second, plus 2 earlier). Looks like marketplace/update checks firing from a system during boot.SolariPlugin loaded but GPU ray tracing is unavailable — Solari is inert— expected on this hardware, mentioned only for completeness.~/.renzora/settings.tomlhas no knob that avoids the pipeline.renderer_backend = "auto"(Metal is the only option on macOS anyway).