-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Fix the texture_binding_array
, specialized_mesh_pipeline
, and custom_shader_instancing
examples after the bindless change.
#16641
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
`custom_shader_instancing` examples after the bindless change. The bindless PR (bevyengine#16368) broke some examples: * `specialized_mesh_pipeline` and `custom_shader_instancing` failed because they expect to be able to render a mesh with no material, by overriding enough of the render pipeline to be able to do so. This PR fixes the issue by restoring the old behavior in which we extract meshes even if they have no material. * `texture_binding_array` broke because it doesn't implement `AsBindGroup::unprepared_bind_group`. This was tricky to fix because there's a very good reason why `texture_binding_array` doesn't implement that method: there's no sensible way to do so with `wgpu`'s current bindless API, due to its multiple levels of borrowed references. To fix the example, I split `MaterialBindGroup` into `MaterialBindlessBindGroup` and `MaterialNonBindlessBindGroup`, and allow direct custom implementations of `AsBindGroup::as_bind_group` for the latter type of bind groups. To opt in to the new behavior, return the `AsBindGroupError::CreateBindGroupDirectly` error from your `AsBindGroup::unprepared_bind_group` implementation, and Bevy will call your custom `AsBindGroup::as_bind_group` method as before.
fn init_custom(&mut self, bind_group: BindGroup, extra_data: M::Data) { | ||
match *self { | ||
MaterialBindGroup::Bindless(_) => { | ||
error!("Custom bind groups aren't supported in bindless mode"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dumb question (not asking for any changes), does limiting custom bind groups to non-bindless mean eg. custom materials (thinking about either an extended material, or maybe something like a full StandardMaterial
toon shader replacement?) won't benefit from bindless currently?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bindless works for any material as long as you write #[bindless]
on it; there's nothing specific to StandardMaterial
. (Actually, StandardMaterial
doesn't benefit from bindless yet; that's #16644.)
The restriction you quoted only applies in very unusual circumstances, basically only in the custom_shader_instancing
example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Examples are working on my system (windows amd 6800xt, tested dx12 and vulkan), code looks good, comments are great as always.
…stom_shader_instancing` examples after the bindless change. (bevyengine#16641) The bindless PR (bevyengine#16368) broke some examples: * `specialized_mesh_pipeline` and `custom_shader_instancing` failed because they expect to be able to render a mesh with no material, by overriding enough of the render pipeline to be able to do so. This PR fixes the issue by restoring the old behavior in which we extract meshes even if they have no material. * `texture_binding_array` broke because it doesn't implement `AsBindGroup::unprepared_bind_group`. This was tricky to fix because there's a very good reason why `texture_binding_array` doesn't implement that method: there's no sensible way to do so with `wgpu`'s current bindless API, due to its multiple levels of borrowed references. To fix the example, I split `MaterialBindGroup` into `MaterialBindlessBindGroup` and `MaterialNonBindlessBindGroup`, and allow direct custom implementations of `AsBindGroup::as_bind_group` for the latter type of bind groups. To opt in to the new behavior, return the `AsBindGroupError::CreateBindGroupDirectly` error from your `AsBindGroup::unprepared_bind_group` implementation, and Bevy will call your custom `AsBindGroup::as_bind_group` method as before. ## Migration Guide * Bevy will now unconditionally call `AsBindGroup::unprepared_bind_group` for your materials, so you must no longer panic in that function. Instead, return the new `AsBindGroupError::CreateBindGroupDirectly` error, and Bevy will fall back to calling `AsBindGroup::as_bind_group` as before.
The bindless PR (#16368) broke some examples:
specialized_mesh_pipeline
andcustom_shader_instancing
failed because they expect to be able to render a mesh with no material, by overriding enough of the render pipeline to be able to do so. This PR fixes the issue by restoring the old behavior in which we extract meshes even if they have no material.texture_binding_array
broke because it doesn't implementAsBindGroup::unprepared_bind_group
. This was tricky to fix because there's a very good reason whytexture_binding_array
doesn't implement that method: there's no sensible way to do so withwgpu
's current bindless API, due to its multiple levels of borrowed references. To fix the example, I splitMaterialBindGroup
intoMaterialBindlessBindGroup
andMaterialNonBindlessBindGroup
, and allow direct custom implementations ofAsBindGroup::as_bind_group
for the latter type of bind groups. To opt in to the new behavior, return theAsBindGroupError::CreateBindGroupDirectly
error from yourAsBindGroup::unprepared_bind_group
implementation, and Bevy will call your customAsBindGroup::as_bind_group
method as before.Migration Guide
AsBindGroup::unprepared_bind_group
for your materials, so you must no longer panic in that function. Instead, return the newAsBindGroupError::CreateBindGroupDirectly
error, and Bevy will fall back to callingAsBindGroup::as_bind_group
as before.