Skip to content
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

nannou_isf progress, Update isf_demo.rs with basic GUI #684

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

mitchmindtree
Copy link
Member

@mitchmindtree mitchmindtree commented Dec 4, 2020

Edit: This is getting pretty close now. Most things are setup, you can select between different shaders (though a couple crash and some panic), hotloading appears to work, the standard uniforms appear to work nicely (only tested TIME so far) and a start has been made on dynamically populating widgets based on the selected ISF shader.

TODO

  • Handle condition where there are no input data uniforms. In this case, we have to omit the input data uniform buffer entirely, as wgpu does not support empty uniform buffers. This should be considered in both the GLSL shader string creation, as well as the pipeline layout creration.
  • Add support to IsfPipeline for updating input data for uniforms. Currently, these are updated once upon loading and then are never updated again. We need a way to allow for updating these values, while also ensuring that we don't have to recreate the uniform buffer every frame. Perhaps we can store a clone of the IsfData inputs in the state that they were last used to create their associated uniform buffer. This way we can compare the current state of the inputs on each call to encode_update and only update the uniform buffer if necessary.
  • Add widgets for remaining unhandled IsfInputData variants in isf_demo.rs. See the end of the gui function in the isf_demo.rs for suggestions on which widgets to use.
  • Provide access to parsed ISF input info such as min, max, default, etc to gui function where widgets are instantiated. Currently, only the values are stored in the IsfInputData variants. We should either 1. also store the bounds and whatever other info is necessary in the IsfInputData variants or 2. Store the loaded isf::Inputs separately but provide a method for yielding both zipped together (might be less practical due to the need for matching on both IsfInputData and isf::InputType variants side-by-side).
  • Solve segfault that is currently known to occur when attempting to load the Test - Bool or Test - Color shaders. See nannou_isf progress, Update isf_demo.rs with basic GUI #684 (comment).

OP

Thanks to @KeyboardSounds for mentioning the state of the nannou_isf
crate in gfx-rs/naga#682 - I was reminded that I have a branch lying around which
made a bit more progress!

The isf_demo.rs example now provides a small GUI window with a list of
shader paths read from the assets/isf directory. You can select
between them to load an ISF pipeline for that shader. Once selected, the
GUI should show whether the ISF descriptor, fragment and vertex shaders
were parsed successfully. If everything was parsed successfully, a new
ISF pipeline is loaded for the selected ISF shader. From this point, you
should be able to edit the selected shader and have it automatically
hotload the result when you save the file from your editor.

Currently, the assets/isf directory contains a bunch of test shaders
provided by the vidvox crew along with the original implementation. I'm
not sure exactly what each should look like yet. Most fail to load
still, though I don't quite remember how much of this is due to certain
parts still being unimplemented in nannou_isf, and which parts are
bugs in wgpu 0.5 (more likely the former!). There's a lot that goes on
in the ISF pipeline, and little testing has been done so far, so I'm
glad it's working as well as it does currently. I won't get a chance to
dive much deeper for another month or two, but if you're interested in
contributing to nannou_isf, doing some investigating into this could
be a really nice way to do so while learning how wgpu works! It may be
worth landing gfx-rs/naga#665 first as wgpu 0.6 has quite a bit more validation
and error checking going on which could be useful to debug crashes that
otherwise might be quite confusing in 0.5.

@mitchmindtree
Copy link
Member Author

mitchmindtree commented Apr 17, 2021

Rebased onto gfx-rs/naga#726.

It seems that the IsfUniforms is now laid out nicely, and I can mess around with animation using the TIME uniform in hotloaded glsl.

However, when switching between the different shaders in the isf_demo.rs GUI I get an occasional segfault.

Thread 1 "isf_demo" received signal SIGSEGV, Segmentation fault.
0x00007f9b5cb54d74 in anv_nir_lower_ycbcr_textures () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
(gdb) backtrace
#0  0x00007f9b5cb54d74 in anv_nir_lower_ycbcr_textures () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
gfx-rs/naga#1  0x00007f9b5cb58f61 in anv_pipeline_lower_nir () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
gfx-rs/naga#2  0x00007f9b5cb59b86 in anv_pipeline_compile_graphics () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
gfx-rs/naga#3  0x00007f9b5cb5b4db in anv_graphics_pipeline_init () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
gfx-rs/wgpu#4301  0x00007f9b5cc08dfb in gen12_CreateGraphicsPipelines () from /nix/store/v6zyaslvymy3pgwqmy7pwn4nhy8a9bkg-mesa-20.3.4-drivers/lib/libvulkan_intel.so
gfx-rs/wgpu#4302  0x000055b710616097 in ash::vk::features::DeviceFnV1_0::create_graphics_pipelines (self=0x55b7137677a8, device=..., pipeline_cache=..., create_info_count=1, p_create_infos=0x7ffdf976aa80, p_allocator=0x0, p_pipelines=0x7ffdf976b550)
    at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/ash-0.31.0/src/vk/features.rs:5075
gfx-rs/wgpu#4300  0x000055b7105862a9 in gfx_backend_vulkan::device::{{impl}}::create_graphics_pipeline (self=0x55b713709328, desc=0x7ffdf976d8a0, cache=...) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/gfx-backend-vulkan-0.7.0/src/device.rs:774
gfx-rs/naga#7  0x000055b710006beb in wgpu_core::device::Device<gfx_backend_vulkan::Backend>::create_render_pipeline<gfx_backend_vulkan::Backend,wgpu_core::hub::IdentityManagerFactory> (self=0x55b713709328, self_id=..., desc=0x7ffdf976f7d0, implicit_pipeline_ids=..., hub=0x55b713403148, token=0x7ffdf976ed88)
    at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-core-0.7.1/src/device/mod.rs:2247
gfx-rs/naga#8  0x000055b70feb1c64 in wgpu_core::hub::Global<wgpu_core::hub::IdentityManagerFactory>::device_create_render_pipeline<wgpu_core::hub::IdentityManagerFactory,gfx_backend_vulkan::Backend> (self=0x55b713403020, device_id=..., desc=0x7ffdf976f7d0, id_in=..., implicit_pipeline_ids=...)
    at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-core-0.7.1/src/device/mod.rs:3856
gfx-rs/naga#9  0x000055b71001ff09 in wgpu::backend::direct::{{impl}}::device_create_render_pipeline (self=0x55b713403020, device=0x55b7136e11c8, desc=0x7ffdf9770010) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.1/src/backend/direct.rs:1034
gfx-rs/naga#10 0x000055b71018bfbd in wgpu::Device::create_render_pipeline (self=0x55b7136e11c0, desc=0x7ffdf9770010) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/wgpu-0.7.1/src/lib.rs:1559
gfx-rs/naga#11 0x000055b70f557f42 in nannou::wgpu::render_pipeline_builder::build (builder=..., layout=0x7ffdf9771758, device=0x55b7136e11c0) at /home/mindtree/programming/rust/nannou/nannou/src/wgpu/render_pipeline_builder.rs:559
gfx-rs/naga#12 0x000055b70f5575fd in nannou::wgpu::render_pipeline_builder::RenderPipelineBuilder::build (self=..., device=0x55b7136e11c0) at /home/mindtree/programming/rust/nannou/nannou/src/wgpu/render_pipeline_builder.rs:479
gfx-rs/naga#13 0x000055b70f3836a7 in nannou_isf::pipeline::create_render_pipeline (device=0x55b7136e11c0, layout=0x7ffdf9771758, vs_mod=0x7ffdf9771268, fs_mod=0x7ffdf97712f8, dst_format=wgpu_types::TextureFormat::Rgba16Float, sample_count=4) at /home/mindtree/programming/rust/nannou/nannou_isf/src/pipeline.rs:940
gfx-rs/naga#14 0x000055b70f381b5c in nannou_isf::pipeline::IsfPipeline::new (device=0x55b7136e11c0, encoder=0x7ffdf9771cc8, vs_path=..., fs_path=..., dst_format=wgpu_types::TextureFormat::Rgba16Float, dst_texture_size=..., dst_sample_count=4, images_path=0x7f9aa8003120)
    at /home/mindtree/programming/rust/nannou/nannou_isf/src/pipeline.rs:600
gfx-rs/naga#15 0x000055b70f34887b in isf_demo::create_isf_state (shader_window=0x55b71374fd70, fs_path=..., images_path=0x7f9aa8003120) at /home/mindtree/programming/rust/nannou/examples/isf/isf_demo.rs:384
gfx-rs/naga#16 0x000055b70f346706 in isf_demo::gui (ui=0x7ffdf9777518, ids=0x7ffdf977ce70, state=...) at /home/mindtree/programming/rust/nannou/examples/isf/isf_demo.rs:259
gfx-rs/naga#17 0x000055b70f34559d in isf_demo::update (app=0x7ffdf977bca0, model=0x7ffdf977c240, update=...) at /home/mindtree/programming/rust/nannou/examples/isf/isf_demo.rs:139
gfx-rs/naga#18 0x000055b70f32a346 in nannou::app::apply_update<isf_demo::Model,nannou::event::Event> (app=0x7ffdf977bca0, model=0x7ffdf977c240, event_fn=..., update_fn=..., loop_state=0x7ffdf977ceb0, now=...) at /home/mindtree/programming/rust/nannou/nannou/src/app.rs:1372
gfx-rs/naga#19 0x000055b70f334427 in nannou::app::run_loop::{{closure}}::{{closure}}<isf_demo::Model,nannou::event::Event> (loop_state=0x7ffdf977ceb0) at /home/mindtree/programming/rust/nannou/nannou/src/app.rs:1104
gfx-rs/naga#20 0x000055b70f33228a in nannou::app::run_loop::{{closure}}<isf_demo::Model,nannou::event::Event> (event=..., event_loop_window_target=0x55b71339cda0, control_flow=0x7ffdf977b4a0) at /home/mindtree/programming/rust/nannou/nannou/src/app.rs:1109
gfx-rs/naga#21 0x000055b70f323594 in winit::platform_impl::platform::sticky_exit_callback<(),closure-0> (evt=..., target=0x55b71339cda0, control_flow=0x7ffdf977b4a0, callback=0x7ffdf977bca0) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.24.0/src/platform_impl/linux/mod.rs:736
gfx-rs/naga#22 0x000055b70f34de24 in winit::platform_impl::platform::x11::EventLoop<()>::run_return<(),closure-0> (self=0x7ffdf977d210, callback=...) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.24.0/src/platform_impl/linux/x11/mod.rs:303
gfx-rs/naga#23 0x000055b70f34f011 in winit::platform_impl::platform::x11::EventLoop<()>::run<(),closure-0> (self=..., callback=...) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.24.0/src/platform_impl/linux/x11/mod.rs:398
gfx-rs/naga#24 0x000055b70f32340e in winit::platform_impl::platform::EventLoop<()>::run<(),closure-0> (self=..., callback=...) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.24.0/src/platform_impl/linux/mod.rs:652
gfx-rs/naga#25 0x000055b70f34b7ba in winit::event_loop::EventLoop<()>::run<(),closure-0> (self=..., event_handler=...) at /home/mindtree/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.24.0/src/event_loop.rs:154
gfx-rs/naga#26 0x000055b70f331f6b in nannou::app::run_loop<isf_demo::Model,nannou::event::Event> (app=..., model=..., event_fn=..., update_fn=..., default_view=..., exit_fn=...) at /home/mindtree/programming/rust/nannou/nannou/src/app.rs:1089
gfx-rs/naga#27 0x000055b70f32ae21 in nannou::app::Builder<isf_demo::Model, nannou::event::Event>::run<isf_demo::Model,nannou::event::Event> (self=...) at /home/mindtree/programming/rust/nannou/nannou/src/app.rs:493
gfx-rs/naga#28 0x000055b70f3445c8 in isf_demo::main () at /home/mindtree/programming/rust/nannou/examples/isf/isf_demo.rs:10

Edit: It seems this same crash can be reliably reproduced when selecting the "Test - Color" shader.

This is probably because the IsfInputs still aren't laid out correctly - I'm hoping addressing this will give us a fix.

mitchmindtree added a commit to mitchmindtree/nannou that referenced this pull request Apr 21, 2021
It's time!

Notable changes include the update from wgpu 0.5 to 0.7 and a bunch of
bug fixes for graphics related stuff. See the `guide/src/changelog.md`
diff for a detailed list of the changes included in this release.

I think I mentioned on matrix that I was hoping to get nannou-org#684 into this
release, but then realised that `nannou_isf` is still unpublished
anyway, so we can publish it at 0.16 if/when those changes are ready.
Thanks to @KeyboardSounds for mentioning the state of the nannou_isf
crate in nannou-org#682 - I was reminded that I have a branch lying around which
made a bit more progress!

The `isf_demo.rs` example now provides a small GUI window with a list of
shader paths read from the `assets/isf` directory. You can select
between them to load an ISF pipeline for that shader. Once selected, the
GUI should show whether the ISF descriptor, fragment and vertex shaders
were parsed successfully. If everything was parsed successfully, a new
ISF pipeline is loaded for the selected ISF shader. From this point, you
should be able to edit the selected shader and have it automatically
hotload the result when you save the file from your editor.

Currently, the `assets/isf` directory contains a bunch of test shaders
provided by the vidvox crew along with the original implementation. I'm
not sure exactly what each should look like yet. Most fail to load
still, though I don't quite remember how much of this is due to certain
parts still being unimplemented in `nannou_isf`, and which parts are
bugs in wgpu 0.5 (more likely the former!). There's a lot that goes on
in the ISF pipeline, and little testing has been done so far, so I'm
glad it's working as well as it does currently. I won't get a chance to
dive much deeper for another month or two, but if you're interested in
contributing to `nannou_isf`, doing some investigating into this could
be a really nice way to do so while learning how wgpu works! It may be
worth landing nannou-org#665 first as wgpu 0.6 has quite a bit more validation
and error checking going on which could be useful to debug crashes that
otherwise might be quite confusing in 0.5.
Still crashing frequently/unpredicatbly when switching between some
shaders. Still need to fix name order of input uniforms.
Fixes an issue where a texture would be omitted from the bind group
layout if it was not yet loaded. This is not OK, as the shader code
likely references the texture, meaning something has to be there whether
or not it is loaded. To work around this, we now use a placeholder
texture.

We now properly compare the full list of texture descriptors when
checking whether or not the bind group and pipeline need to be
recreated. Previously we only checked the texture count, which means
that if a placeholder texture was replaced with an actual texture the
actual texture would never be loaded.
@mitchmindtree
Copy link
Member Author

OK, just updated this PR for wgpu 0.8!

The new validation layers helped to spot a couple of pretty serious errors related to the texture bindings which have now been fixed.

We're kind of blocked atm until we can resolve or workaround gfx-rs/wgpu#4341 as almost all the test shaders rely on these texture sampling "shorthand" functions which seem to be resulting in parser errors in the generated WGSL.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant