Did it! Also I added support for emscripten in wgpu/wgpu-native, and soon
it will be possible to use it with SDL/gflw. Want to add tutorial about it.

This article is about linking Vangers (1998) and vange-rs (wgpu renderer)
https://caiiiycuk.medium.com/vangers-3d-example-of-using-emscripten-in-rust-720ee8099d72

чт, 27 янв. 2022 г. в 18:16, 'Ingvar Stepanyan' via emscripten-discuss <
emscripten-discuss@googlegroups.com>:

> Ah sorry, I see you tried and said it doesn't work even with `extern "C"`
> in the issue description. That's odd, it definitely should.
>
> On Thu, 27 Jan 2022 at 11:11, Ingvar Stepanyan <rrever...@google.com>
> wrote:
>
>> But it's not a bug. As I said, you just need to add "C" to your `extern`,
>> because right now you're exposing it from Rust via C FFI, but declaring it
>> as a C++ symbol on the other side.
>>
>> On Thu, 27 Jan 2022 at 02:32, Александр Гурьянов <caiiiy...@gmail.com>
>> wrote:
>>
>>> Filled this bug:
>>> https://github.com/emscripten-core/emscripten/issues/16123
>>>
>>> чт, 27 янв. 2022 г. в 02:42, 'Ingvar Stepanyan' via emscripten-discuss <
>>> emscripten-discuss@googlegroups.com>:
>>>
>>>> I think it should be `extern *"C"* int32_t rv_api_1;` on the C++ side,
>>>> otherwise normal mangling rules apply and it's looking up (or, this case,
>>>> declaring) a namespaced variable.
>>>>
>>>> On Wednesday, 26 January 2022 at 19:31:18 UTC s...@google.com wrote:
>>>>
>>>>> Is it valid to simply do `extern int32_t rv_api_1;` in C to refer to a
>>>>> rust variable?  Does that address of `rv_api_1` on the C side look 
>>>>> correct?
>>>>>
>>>>> Does `pub static rv_api_1: i32 = 1;` in rust generate a static
>>>>> initializer function or is it simply static memory (like it would be in
>>>>> C/C++)?
>>>>>
>>>>> Assuming it is generating a ctor then there are a couple of things
>>>>> that could be going on.   Are you sure your static ctors have been run?
>>>>> i.e. where is your code running?  Is it inside of main?
>>>>>  Disassembling your final binary should show all static ctors being called
>>>>> from the `__wasm_call_ctors` function.
>>>>>
>>>>> cheers,
>>>>> sam
>>>>>
>>>>>
>>>>> On Wed, Jan 26, 2022 at 10:24 AM Александр Гурьянов <caii...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Okay, I think I almost did the same in Rust what Alon described.
>>>>>> vanger-rs now compiles as static library (.a) with emscripten triple. I 
>>>>>> use
>>>>>> this static library to link with original C++ game. So I have *.o files
>>>>>> from vangers, and librusty_vangers.a (which provides rendering on wgpu). 
>>>>>> I
>>>>>> link them with emcc, and it produce wasm  without any error!
>>>>>>
>>>>>> Also I do the same with native build - it works fine.
>>>>>>
>>>>>> However, when I tries to run it fails with assertion.
>>>>>>
>>>>>> On RUST side I have the following code:
>>>>>> #[no_mangle]
>>>>>> pub static rv_api_1: i32 = 1;
>>>>>>
>>>>>> On C++ side I have the following code:
>>>>>> extern int32_t rv_api_1;
>>>>>> // ...
>>>>>> if(rv_api_1 != 1){
>>>>>>         printf("Invalid libvangers_ffi version expected 1, actual
>>>>>> %d\n", rv_api_1);
>>>>>>         // abort();
>>>>>> }
>>>>>>
>>>>>> When I run it, I have following output:
>>>>>> Invalid libvangers_ffi version expected 1, actual 0
>>>>>>
>>>>>> For me it looks like static initializer from RUST didn't run. Because
>>>>>> if I comment the abort(); seems integration works fine. Native build 
>>>>>> works
>>>>>> correctly...
>>>>>> Do you have any idea why so?
>>>>>>
>>>>>> ср, 19 янв. 2022 г. в 00:36, Alon Zakai <alon...@gmail.com>:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Jan 14, 2022 at 11:08 AM Александр Гурьянов <
>>>>>>> caii...@gmail.com> wrote:
>>>>>>>
>>>>>>>> Let's look closer to my case. I ported C++ game Vangers to the web (
>>>>>>>> https://www.gamepix.com/play/vangers). Vangers community did big
>>>>>>>> work to integrate vange-rs (rust 3d render, based on wgpu) and Vangers
>>>>>>>> game. It works as follow:
>>>>>>>> 1. Vange-rs provide c ffi interface
>>>>>>>> 2. Vange-rs compiled with rust to static library
>>>>>>>> 3. Vangers linked with Vanger-rs to executable
>>>>>>>>
>>>>>>>> Now I want to port  vangers + (vange-rs render) to the web. wgpu
>>>>>>>> didn't support wasm32-unknown-emscripten, I added experimental support 
>>>>>>>> for
>>>>>>>> emscripten and it works. BUT, wgpu is developing to fast, so my changes
>>>>>>>> become outdated very fast :)
>>>>>>>>
>>>>>>>> When I implement support for emscripten, I only disabling
>>>>>>>> wasm32-unknown rules and uses native code paths everywhere. So, it's 
>>>>>>>> little
>>>>>>>> bit strange, to work with emscripten you need to disable workarounds 
>>>>>>>> for
>>>>>>>> wasm32. emscripten emulates native platform, so code that correctly 
>>>>>>>> uses
>>>>>>>> posix system should work also in emscripten.
>>>>>>>>
>>>>>>>> Maybe there is any way to just use native static library and link
>>>>>>>> it with emscripten? Like this:
>>>>>>>> 1. Compile vange-rs static library (with native triple)
>>>>>>>> 2. Compile vangers project with emscripten
>>>>>>>> 3. Link 1+2 with emscripten
>>>>>>>>
>>>>>>>>
>>>>>>> (1) would compile to x86, though, I think? We have to have wasm to
>>>>>>> link with emscripten.
>>>>>>>
>>>>>>>
>>>>>>>> for (1.) I can't use emscripten triple because of #[cfg] rules for
>>>>>>>> wasm32 target, they select wrong code path (non-native).
>>>>>>>>
>>>>>>>>
>>>>>>> Hmm, I don't know enough rust to know what fixing that would mean...
>>>>>>>
>>>>>>> Overall for an emscripten port I think we would want to use a native
>>>>>>> build as much as possible? That is, ideally you would *not* use
>>>>>>> vange-rs/WebGPU, but one of the native rendering paths (OpenGL of some
>>>>>>> flavor? Or perhaps they have Dawn/WebGPU support?). And you would need 
>>>>>>> to
>>>>>>> tell rust to use the emscripten triple while doing so.
>>>>>>>
>>>>>>> That should work, in theory. If it doesn't and Rust has some issues
>>>>>>> with how it invokes emcc to link, then the workaround could be what I
>>>>>>> mentioned for Zig and C before: get Rust to link to a static library, 
>>>>>>> and
>>>>>>> then run emcc manually on that.
>>>>>>>
>>>>>>> (Alternatively, in theory someone could look into supporting
>>>>>>> wasm-bindgen + emscripten.)
>>>>>>>
>>>>>>> - Alon
>>>>>>>
>>>>>>>
>>>>>>>> пт, 14 янв. 2022 г. в 07:54, Alon Zakai <alon...@gmail.com>:
>>>>>>>>
>>>>>>>>> Thanks, good to know at least 2 people would read a post about
>>>>>>>>> this :) I'll try to find time for it.
>>>>>>>>>
>>>>>>>>> About Rust, I haven't had time to look into it yet. My general
>>>>>>>>> hope is that the same model as for C and Zig could work:
>>>>>>>>>
>>>>>>>>> 1. Tell Rust to use the emscripten wasm triple.
>>>>>>>>> 2. Tell Rust to compile to object files (or a static library,
>>>>>>>>> basically), and *not* to link them.
>>>>>>>>> 3. The user runs emcc on those object files, linking them.
>>>>>>>>>
>>>>>>>>> The nice thing in this model is that C/Zig/Rust does not need to
>>>>>>>>> be aware of emcc at all here (aside from telling LLVM to use the 
>>>>>>>>> emscripten
>>>>>>>>> triple). And it's easy to do this, at least in C and Zig (although 
>>>>>>>>> there
>>>>>>>>> are some subtle ABI questions).
>>>>>>>>>
>>>>>>>>> This is actually the main thing I wanted to do before writing the
>>>>>>>>> post - ideally I'd have a Rust demo alongside C and Zig - so if 
>>>>>>>>> someone
>>>>>>>>> figures that out, let me know!
>>>>>>>>>
>>>>>>>>> - Alon
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thu, Jan 13, 2022 at 2:06 AM Александр Гурьянов <
>>>>>>>>> caii...@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> +1 for blog post. Not clear how I can use it with rust, e.g. can
>>>>>>>>>> I compile static lib with target --wasm32-unknown-unknown and then 
>>>>>>>>>> link
>>>>>>>>>> using emscripten? The main problem with RUST is that it even can't 
>>>>>>>>>> compile
>>>>>>>>>> with --wasm32-unknown-emscipten (because of lib dependencies that not
>>>>>>>>>> support emscripten)
>>>>>>>>>>
>>>>>>>>>> чт, 13 янв. 2022 г. в 16:46, Floh <flo...@gmail.com>:
>>>>>>>>>>
>>>>>>>>>>> That's a very useful gist, Alon! I think that blog post would be
>>>>>>>>>>> much appreciated by a lot of people who like to tinker with other 
>>>>>>>>>>> languages
>>>>>>>>>>> :)
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, 12 January 2022 at 19:32:04 UTC+1
>>>>>>>>>>> alon...@gmail.com wrote:
>>>>>>>>>>>
>>>>>>>>>>>> On Sat, Dec 25, 2021 at 6:02 AM Floh <flo...@gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Ah, language and toolchain interoperability, one of my
>>>>>>>>>>>>> favourite topics ;)
>>>>>>>>>>>>>
>>>>>>>>>>>>> Zig has nearly the same problems as Rust: it allows to compile
>>>>>>>>>>>>> to WASM, it has both a WASI and Emscripten target, with the WASI 
>>>>>>>>>>>>> target
>>>>>>>>>>>>> working out of the box, but I gave up on the Emscripten target 
>>>>>>>>>>>>> because I
>>>>>>>>>>>>> just couldn't get it to work.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I wrote up a demo of Zig + Emscripten here:
>>>>>>>>>>>>
>>>>>>>>>>>> https://gist.github.com/kripken/58c0e640227fe5bac9e7b30100a2a1d3
>>>>>>>>>>>>
>>>>>>>>>>>> That uses GLES3 and Asyncify from Emscripten, so it's a small
>>>>>>>>>>>> program but it uses interesting features.
>>>>>>>>>>>>
>>>>>>>>>>>> The gist also shows using C in the same way, where Emscripten
>>>>>>>>>>>> is just the linker, not the frontend.
>>>>>>>>>>>>
>>>>>>>>>>>> I've been meaning to do the same with Rust and write a blogpost
>>>>>>>>>>>> about all 3 but haven't found the time...
>>>>>>>>>>>>
>>>>>>>>>>>> - Alon
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> IMHO it would be great if the Javascript shims and interop
>>>>>>>>>>>>> could be somehow split out of the Emscripten SDK into a separate, 
>>>>>>>>>>>>> smaller
>>>>>>>>>>>>> "webapi-wasm-tools" SDK which could be better integrated with 
>>>>>>>>>>>>> other
>>>>>>>>>>>>> language toolchains. The goal should be that other programming 
>>>>>>>>>>>>> languages
>>>>>>>>>>>>> can benefit from the work that went into the Emscripten SDK to 
>>>>>>>>>>>>> access web
>>>>>>>>>>>>> APIs like WebGL, WebGPU, WebAudio etc... up to "EM_JS()" 
>>>>>>>>>>>>> functionality,
>>>>>>>>>>>>> instead of having to duplicate this work, or requiring a separate
>>>>>>>>>>>>> installation of the whole Emscripten SDK.
>>>>>>>>>>>>>
>>>>>>>>>>>>> There's a very promising project
>>>>>>>>>>>>> https://github.com/schellingb/wajic by Bernhard Schelling
>>>>>>>>>>>>> which has the same goals and which was used to port Mattias 
>>>>>>>>>>>>> Gustavsson's
>>>>>>>>>>>>> DOS-like library to the web:
>>>>>>>>>>>>> https://mattiasgustavsson.com/wasm/
>>>>>>>>>>>>>
>>>>>>>>>>>>> Anyway... just my 2 cents :)
>>>>>>>>>>>>> -Floh.
>>>>>>>>>>>>> On Friday, 24 December 2021 at 15:16:23 UTC+1 caiiiycuk wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi! Just want to share my experiment with using Rust and
>>>>>>>>>>>>>> WebAssembly. I tried to port Vange-rs project (rust + wgpu) to 
>>>>>>>>>>>>>> browser. I
>>>>>>>>>>>>>> used emscripten and unknown platforms. Both finally works, but 
>>>>>>>>>>>>>> have lot of
>>>>>>>>>>>>>> obstacles. I am very sad about support level of emscripten in 
>>>>>>>>>>>>>> Rust, hope it
>>>>>>>>>>>>>> will change at some day.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> https://caiiiycuk.medium.com/vange-rs-webassembly-in-rust-498e2f960a04
>>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>>
>>>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>>>>> Google Groups "emscripten-discuss" group.
>>>>>>>>>>>>> To unsubscribe from this group and stop receiving emails from
>>>>>>>>>>>>> it, send an email to emscripten-disc...@googlegroups.com.
>>>>>>>>>>>>>
>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/99cc45ea-2307-4551-94b8-ecff9ad965a0n%40googlegroups.com
>>>>>>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/99cc45ea-2307-4551-94b8-ecff9ad965a0n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>> .
>>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>>> Google Groups "emscripten-discuss" group.
>>>>>>>>>>> To unsubscribe from this group and stop receiving emails from
>>>>>>>>>>> it, send an email to emscripten-disc...@googlegroups.com.
>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/9e88b4b5-f110-4d90-a630-1c282a1febffn%40googlegroups.com
>>>>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/9e88b4b5-f110-4d90-a630-1c282a1febffn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>> .
>>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> You received this message because you are subscribed to the
>>>>>>>>>> Google Groups "emscripten-discuss" group.
>>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>>> send an email to emscripten-disc...@googlegroups.com.
>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVFgNcSPR-KFe35yg%2BU9NXFpG7U_Y5G0APbkZRf5UM2%2B8w%40mail.gmail.com
>>>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVFgNcSPR-KFe35yg%2BU9NXFpG7U_Y5G0APbkZRf5UM2%2B8w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>>> Groups "emscripten-discuss" group.
>>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>> send an email to emscripten-disc...@googlegroups.com.
>>>>>>>>> To view this discussion on the web visit
>>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpRH1%2BxWEaTbjTvnk5kE5W4XwUjHefP8g1psk-pUvxVAtg%40mail.gmail.com
>>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpRH1%2BxWEaTbjTvnk5kE5W4XwUjHefP8g1psk-pUvxVAtg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "emscripten-discuss" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to emscripten-disc...@googlegroups.com.
>>>>>>>> To view this discussion on the web visit
>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEBtYrS_8fFYz9fmWoQNUwWqjXah%2B9f0cdZ4Jjd2%2BxVGQ%40mail.gmail.com
>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEBtYrS_8fFYz9fmWoQNUwWqjXah%2B9f0cdZ4Jjd2%2BxVGQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "emscripten-discuss" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to emscripten-disc...@googlegroups.com.
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpTmf%3DjhApcxA%3DoW6G_eOTDLLwyPyJbduWQnJqWBQj8EqA%40mail.gmail.com
>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpTmf%3DjhApcxA%3DoW6G_eOTDLLwyPyJbduWQnJqWBQj8EqA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "emscripten-discuss" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to emscripten-disc...@googlegroups.com.
>>>>>>
>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEOxJmiieN552iJW2M7SQK9kOoQTu8--iVNQFmB8rCz_w%40mail.gmail.com
>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEOxJmiieN552iJW2M7SQK9kOoQTu8--iVNQFmB8rCz_w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "emscripten-discuss" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to emscripten-discuss+unsubscr...@googlegroups.com.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/emscripten-discuss/3b1ec71f-be17-4c3e-b74a-69a7ba867e42n%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/emscripten-discuss/3b1ec71f-be17-4c3e-b74a-69a7ba867e42n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "emscripten-discuss" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to emscripten-discuss+unsubscr...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVGN0%2Bd%3DN-%2BRHs%3Dj-Hc3c-cu%3D4VRNTsY4zGiR6q2p4xBGQ%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVGN0%2Bd%3DN-%2BRHs%3Dj-Hc3c-cu%3D4VRNTsY4zGiR6q2p4xBGQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>
>>
>> --
>> Regards,
>> Ingvar.
>>
>
>
> --
> Regards,
> Ingvar.
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to emscripten-discuss+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/emscripten-discuss/CADdUJT8Da4wG0XYfvy20fJs7VECP8dvHvWLJcc5sGxrJ3Qfc9A%40mail.gmail.com
> <https://groups.google.com/d/msgid/emscripten-discuss/CADdUJT8Da4wG0XYfvy20fJs7VECP8dvHvWLJcc5sGxrJ3Qfc9A%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to emscripten-discuss+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVFfwfN35VwgHFYxqvGMtGka%3DmpQqW_qDNkz%2BSNnGyoTMQ%40mail.gmail.com.

Reply via email to