-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Emscripten's webgpu.h is behind the standard and Dawn implementations #23432
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
Comments
For the moment we won't be bringing any new changes into Emscripten's WebGPU bindings because we don't want to continuously make breaking changes on every Emscripten release. However we are currently working on an updated fork which lives in Dawn. You can use this fork along with regular Emscripten - it's a big pain right now but it's possible. See: |
@kainino0x Now that you can write contrib ports in Emscripten, wouldn't it make sense to have a You can also have the port not be a contrib port at all meaning it is a port that anybody can use (simply) without being part of Emscripten. Like I did for ImGui. This port file could live in the Dawn project. I don't know the internals of Dawn or why it was chosen to have an Emscripten fork which lives in Dawn. I am just pointing out that there is a new mechanism (Emscripten ports) that is available... I am very familiar with Emscripten contrib/external ports, since I am the one who implemented the feature, so don't hesitate to reach out if you need help/guidance... |
I wasn't aware of emscripten-ports! Regardless of that, we actually just started talking to sbc100 about this topic, we might end up maintaining the bindings as a library outside of emscripten instead. The reason we did it in Emscripten to start was that it relied on a lot of internal things. We need a stableish interface between emscripten and js libraries, and a stableish interface for TBA, and thank you for your offer! |
FYI: I'm working on updating the code and documentation in Dawn for how to use emdawnwebgpu (our fork). It's much easier with Emscripten 4.0.3+! https://dawn-review.googlesource.com/c/dawn/+/227335/4/src/emdawnwebgpu/README.md |
At the end of that process should we delete the webgpu support from emscripten? (we can still test it via some kind of vendoring, or add it as a "port") |
I am not sure what is the plan (it is hard to follow this thread and a link to the diff of an upcoming README file change is not really helping) but I hope that no matter the solution, there continues to be an easy way to use WebGPU from Emscripten. I really don't want to have to clone an external project and use CMake to build WebGPU especially that now Emscripten has support for integrating external projects, not maintained in Emscripten (contrib ports). I am hoping that Dawn/WebGPU can at the very minimum be offered as a contrib port (and I reiterate what I stated in a previous message, that I am more than happy to provide help and guidance...) |
I've been working on producing a "packageable" version of emdawnwebgpu that can be easily used by just linking into an emscripten build. Once that's done I should be able to point to updated docs that actually make sense :) I'll give an update here when that's ready - so I can get help figuring out how this package should be provided to people (I don't know how "ports" work). |
Those readme changes I linked to have been updated and landed, so there are at least (partial) instructions on how to use emdawnwebgpu: I'm still working on making pre-packaged releases of emdawnwebgpu. Basically what that's going to look like is something like:
where For maintenance reasons it seems easier for this to be totally separate from Emscripten, rather than a port. A bunch of these files are generated (not checked into Dawn) so it's not possible to point directly at Dawn's source. But I'm curious if you think it would be better to add it to the ports. It will be easier to install, but it seems you will only be able to use the version pinned in Emscripten? At least, the contrib ports that exist now seem to pin a version. |
@kainino0x I still think that having it as a port would still be very beneficial: the README that you published is quite involved with lots of steps, including complicated instructions to download and build Dawn. Using the port would be as simple as The fact that the Dawn version is pinned to Emscripten version is not really a problem. This is how SDL, GLFW, (etc...) ports work. Upgrading Emscripten for the new version of Dawn now becomes trivial. If you want to use a different version you can always copy the port file and use it directly since now Emscripten allow non built-in ports. You mention that there are files that are generated and not checked in into Dawn. I do not know how Dawn gets released (when there is a new version), but if you could automatically publish a zip file containing all the necessary files to build Dawn for Emscripten (both generated and checked in) that would be the best approach. Maybe this is what you are talking about when you say: I'm still working on making pre-packaged releases of emdawnwebgp I am doing exactly this for the GLFW port: ![]() and then in the port, the downloaded artifact is simply: TAG = '3.4.0.20250305'
HASH = 'd5d1496cf1e05a640c182584a09ed0b43c8d6c42386513e5c2b1e05a2289854a0a0abe085e0a8b64c3a484836a8e63dc5ddb683ce4d2899fccbbf89536d58ee1'
ZIP_URL = f'https://github.com/pongasoft/emscripten-glfw/releases/download/v{TAG}/emscripten-glfw3-{TAG}.zip' I will spend some time looking at a first pass at the Emscripten Dawn port if I can follow your instructions. |
We certainly want emscripten users to be able to use WebGPU APIs with as little friction as possible. There are various ways we could achieve that without having to maintain emdawn directly in the emscirpten tree. I think a "port" is likely the best option. We might also want to consider using a git submodule, but I'm not sure that would be any better. I think having emscripten default to particular pinned version is fine (good even) as long as we document some way to experiment to non-pinned version too. |
Ports do sound extremely convenient. As long as there is some easy way to use a non-pinned version, I'm OK with having a pinned default. The bindings are definitely still buggy so for the near-term future, people will commonly need the latest version, ideally without having to upgrade their whole toolchain. |
Dawn doesn't have any releases (pre-built or otherwise), but since we need to provide pre-built files for emdawnwebgpu, yes, that's my plan - upload packages like the one described above, either as zips on the github releases page, or in some git repository. |
Awesome. When you do that let me know and I can take a pass at writing the (contrib?) port for Emscripten or help @sbc100 if he would prefer to do it himself. I can think of a couple of ways on how to allow changing the pinned version. |
@kainino0x and I had a quick VC meeting today and it sounds like a port is going to be the way to go. They might even just go with an external port (e.g: |
Any updates on that? Any hints how to make this work? |
The plan is for emdawn to maintain an out-of-tree emscripten port. The goal is to make this trivial/easy to use from emscripten directly, but it almost certainly will not work with old emscripten version like 3.0.56. I would advice you to petition the dotnet folks to update their emscripten version. |
Thanks for the reply. I just found that dotnet is actually using 3.1.56 where ports should be working. I‘d be happy to help with testing things when you have the port ready. |
3.1.56 is still a year old. I would imagine that emdawn will require a current (e.g. 4.0.0+) version.. but that still remains to be seen. |
Hey @sbc100, any advances with the emdawn port? |
I believe @kainino0x is working on it right now. I'll make sure we update this issue if / when stuff lands here. |
Apologies, I had other important work the past few weeks. I will be working on it this week. |
@eliemichel thanks for the report, totally didn't realize that. Filed https://crbug.com/412395835 |
Update!
|
Nice! What's the minimum version of emscripten that is needed to use these? (in particular to automatically get the |
@eliemichel This will be available when 4.0.8 is released. I do not know if there is a way from within the port to be able to know the version of Emscripten and as a result handle different behavior. In its latest iteration, @kainino0x implemented it like this (detecting if the As far as I am concerned, as I mentioned (and posted) previously, I have a version of the port that behaves more like a port, which means you only need the port file which downloads the necessary artifact as oppose to having to download the artifact manually and have the port file refers to local files (which is backward and not the real intention of ports). I will release this version of the port once 4.0.8 is released and will update this thread when I do. I wished the deprecation of WebGPU in Emscripten would lead to a contrib port so that people could simply install the latest version of Emscripten and still be able to use WebGPU (if the issue is the tag version that changes every day, the tag could be made a parameter of the port FWIW: |
That think there there are still plans to perhaps do that in the future once the port seems stable. The nice thing about starting off with the port being external is that it can all be maintained in a single repo without kai (or someone working on dawn) having to constantly update emscripten. We will see how the cost / benefit plays out over time. |
+1, we definitely might still do it in the future once the new bindings are more polished. I was thinking of maybe doing it around the same time we fully remove the old implementation from Emscripten. I also had a thought that maybe a real port could handle ONLY the downloading, then pull all the flags and stuff from the package's |
@kainino0x a port is just a python script. The zip file that gets downloaded by the port has full access to the content of the download (that is how the file |
As promised, since Emscripten 4.0.8 has been released, I have now released my version of the WebGPU port that behaves more like a traditional port. You can find it at emscripten-ports. A few points:
|
I know, the thing I wasn't sure about was whether we could trigger the download early enough for all of the hooks. IIRC something, I think it was |
As far as I can tell,
|
I've been thinking about how we can make out-of-tree ports work better. How about something like this:
That would then be shorthand the current manual steps of the downloading and extracting the zip file and then using then embedded the .py file from the zip file file. We could even just maybe just call it |
Folks who use Folks who want more control can do the manual download and |
@sbc100 I personally like the idea very much. I assume you meant Since I worked on the port system, let me know if you want me to look at a possible way of implementing the changes. Be more than happy to. |
Yes, I think this would help for your glfw port maybe? Since it would allow you to keep the glfw3.py logic alongside the upstream code. If you would to take a crack an implementing what I described above that would be great. I would basically mean two different types of port files: (I think using yaml perhaps doesn't actually work since we don't want to take a dependency on pyyaml). |
It looks like we could possibly use And maybe once we depend on python 3.11 we could even use toml! |
I will take a look at it. I created a new ticket (#24260) for it. |
Hello, Unfortunately i coudn't make emdawn port working. -- Looking for sys/types.h pycache was created in the port's folder. So it definitely compiled the py file during the build process... I'm using emsdk 4.0.8. |
It doesn't work on Windows because I totally forgot to test on Windows. Bug is https://crbug.com/415850603, please star it. |
Never mind, it works fine on Windows. These are two separate issues. Continuing discussion of this one in #24253 for now even though it's closed. |
Is it possible to update to a recent version of webgpu_cpp.h?
I am specifically interested in missing templated async functions.
like in the Buffer class.
The text was updated successfully, but these errors were encountered: