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

WIP: Metal backend #1287

Open
wants to merge 286 commits into
base: main
Choose a base branch
from
Open

WIP: Metal backend #1287

wants to merge 286 commits into from

Conversation

SamoZ256
Copy link
Contributor

@SamoZ256 SamoZ256 commented Aug 12, 2024

This PR implements a Metal backend for macOS. It should bring better performance compared to Vulkan, as well as fix some issues that wouldn't be possible with Vulkan due to MoltenVK limitations. I haven't tested many games, but those that I tried worked pretty well.

TODO:

  • sRGB
  • fix low resolution
  • proper present
  • fix black textures in sm3dw
  • buffer copies in a vertex shader
  • pipeline cache with binary archives
  • geometry shaders
  • GamePad screen in a separate window
  • fix texture readback
  • output shader
  • ImGui
  • Intel Macs support
  • proper surface copy
  • extend the shader hash
  • triangle fans
  • 1D shadow sampler emulation
  • instancing with mesh shaders
  • occlusion queries
  • async shader compilation
  • load pipeline binaries at startup
  • async pipeline compilation
  • accurate occlusion queries
  • fix CI
  • synchronize resource access manually
  • binary archives

Screenshots:

New Super Mario Bros U nsmbu_missing_geometry_fixed
Captain Toad Treasure Tracker captain_toad_lvl2_working
Super Mario 3D World sm3dw_water_fixed
Mario Kart 8 mk8_black_artifacts_fixed
The Legend of Zelda: Breath of the Wild botw
Super Mario Maker smm_missing_sprites_fixed

@cemu-project cemu-project deleted a comment from Squall-Leonhart Aug 12, 2024
@Exzap
Copy link
Member

Exzap commented Aug 12, 2024

Very impressive work so far! I did not expect anyone to take on adding a whole new renderer. From past experience when working on the OpenGL and Vulkan renderer I learned that the hardest problems come up at the end in regards to performance optimizations, weird API limitations which require workarounds or specifically for Metal: lack of geometry shaders. If the Metal backend gets past those problems into a fully functional state that is on par with the Vulkan renderer then we can talk about getting this merged and discuss any long term support plans. A proper full code review would also be necessary of course.

Looking forward to seeing this progress!

@Spritzerland
Copy link

this is some good work, thank you for it Samo

@SamoZ256
Copy link
Contributor Author

Metal 3 based? Metal 2 don't have the requirements for emulating geometry shaders.

The concern would be that adding a third renderer would eventually lead to code rot, with fixes hitting the 2 windows/linux compatible api's and not the macos one.

I don't think I use any Metal 3 functionality. Regarding geometry shaders, they could be emulated with compute shaders, though I would much rather use mesh shaders and give up on Metal 2 compatibility.

@deReeperJosh
Copy link
Contributor

Built again with the debug version - the duplicated frame issue has gone away so must have not had some of your latest commits in, I am still finding the game hangs around the same place on Metal, even with the screenshot implementation, log attached:
log.txt

@indianajson
Copy link

indianajson commented Nov 8, 2024

First of all, awesome work on this. We definitely needed a Metal implementation.

Seems the crash I mentioned earlier must have been an issue with my device, as it is now running the Metal engine smoothly. Awesome work!

@SamoZ256
Copy link
Contributor Author

SamoZ256 commented Nov 9, 2024

First of all, awesome work on this. We definitely needed a Metal implementation.

Seems the crash I mentioned earlier must have been an issue with my device, as it is now running the Metal engine smoothly. Awesome work!

Thanks! And exactly what game was crashing?

@SamoZ256
Copy link
Contributor Author

SamoZ256 commented Nov 9, 2024

Built again with the debug version - the duplicated frame issue has gone away so must have not had some of your latest commits in, I am still finding the game hangs around the same place on Metal, even with the screenshot implementation, log attached:

log.txt

Alright, good to hear that. I have no idea what could be causing the game to freeze though.

@indianajson
Copy link

Thanks! And exactly what game was crashing?

Paper Mario Color Splash. When I first launched the game using Metal FPS was 1-2 then when I got past the start screen it hard crashed (macOS froze), but after the restart I tried it again with Vulkan and it was fine so I decided to risk it and suddenly Metal was working. Still not sure if it was my device or Cemu.

@PotionBelt
Copy link

Amazing work on this project! I'm on an M1 MacBook Pro and gave your Metal backend a go with Wind Waker HD.

In general, things are much snappier than Vulkan with no graphical weirdness I can see, though the areas with many particles e.g. Dragonroost Island are still very choppy / low framerate (fluctuates between 8-15fps on my system). Other places with the same issue include the purple sparkles on the title screen and bomb explosion particles, which also tank the framerate.

Is there a fix for this in the pipeline? Would be happy to keep testing.

@SamoZ256
Copy link
Contributor Author

SamoZ256 commented Nov 10, 2024

Amazing work on this project! I'm on an M1 MacBook Pro and gave your Metal backend a go with Wind Waker HD.

In general, things are much snappier than Vulkan with no graphical weirdness I can see, though the areas with many particles e.g. Dragonroost Island are still very choppy / low framerate (fluctuates between 8-15fps on my system). Other places with the same issue include the purple sparkles on the title screen and bomb explosion particles, which also tank the framerate.

Is there a fix for this in the pipeline? Would be happy to keep testing.

Thank you for your feedback!

I have heard about the frame drop in Wind Waker HD. I don’t know if there is much I can do about it, but if you would make a frame capture (guide: https://github.com/SamoZ256/cemu-frame-capture), I could take a look at it and see if I could make a hack specifically for this game to improve it.

Also, is the frame rate better than Vulkan in the areas with many particles?

@PotionBelt
Copy link

PotionBelt commented Nov 11, 2024

Amazing work on this project! I'm on an M1 MacBook Pro and gave your Metal backend a go with Wind Waker HD.
In general, things are much snappier than Vulkan with no graphical weirdness I can see, though the areas with many particles e.g. Dragonroost Island are still very choppy / low framerate (fluctuates between 8-15fps on my system). Other places with the same issue include the purple sparkles on the title screen and bomb explosion particles, which also tank the framerate.
Is there a fix for this in the pipeline? Would be happy to keep testing.

Thank you for your feedback!

I have heard about the frame drop in Wind Waker HD. I don’t know if there is much I can do about it, but if you would make a frame capture (guide: https://github.com/SamoZ256/cemu-frame-capture), I could take a look at it and see if I could make a hack specifically for this game to improve it.

Also, is the frame rate better than Vulkan in the areas with many particles?

Any workaround would be amazing! Have Discord DM'd you the frame captures.

The frame rate is perhaps very slightly better in the particle-heavy areas on Dragonroost Island. With Vulkan that area is more like 8-13fps.

@darkuser89
Copy link

log.txt

thanks for the hard work. Unfortunately, Mario Kart doesn't start the second time

@SamoZ256
Copy link
Contributor Author

log.txt

thanks for the hard work. Unfortunately, Mario Kart doesn't start the second time

Hi! This could probably (temporarily) be solved by clearing the shader cache. Also, make sure you are on the latest testing release.

@SamoZ256
Copy link
Contributor Author

For anyone wanting to report game status/issues, please use this guide: https://github.com/SamoZ256/cemu-metal-game-compatibility.

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.

8 participants