Skip to content

macOS (Apple Silicon): editor crashes at startup — pbr_opaque_mesh_pipeline binds 20 fragment samplers, Metal limit is 16 #107

Description

@maximetinu

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

  1. Download macos-arm64.zip from r1-alpha8-nightly-08sep26 and unzip it.
  2. Clear quarantine (xattr -dr com.apple.quarantine macos-arm64/).
  3. Launch Renzora Engine.app (double-click, or run Contents/MacOS/renzora from a terminal).
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions