wsPublish Open-Sourced!
The year is 2013. FNA, back then known as MG-SDL2, was all the rage in the XNA world; developers were contacting me left and right to get Linux/Mac ports of their games to be put in Humble Bundles, Steam/GOG releases, etc. It would be the year that I shipped 15 games in a single 365-day period, my personal best so far.
Then in September I get an e-mail from Gennadii Potapov, the co-founder and CEO of General Arcade. Today they're known for the recently-released Metal Wolf Chaos XD (before you ask, no, I'm not working on a Linux version, go ask their publisher nicely about it), and many long-time GOG/Itch customers may recognize them for their SDL2 Gamepad Tool. Back in those days, they were known for their work on Shadow Warrior Classic Redux and Duke Nukem 3D: Megaton Edition (which Gearbox took down, so nowadays you can only get it by, say, sharing a USB drive).
"Hey, I know Duke3D," I thought. "But isn't that available for Linux already?"
I read the e-mail. It's an offer to work on a Steam Workshop publishing tool.
Wait, what? That's not my usual thing, but I've never worked on a Workshop game yet, so that sounds like fun! I wonder what Workshop is like and oh my god is this really how it's implemented in the SDK
Okay, OKAY. So let's be smart about this. The whole point of Workshop is to let customers upload their own content so people can play it, all in a quick seamless process. By content I mean stuff like mods, maps, junk like that. So ideally this would be integrated into the tools, right?
It's 2013. The Steamworks SDK license is pretty clear about distributing source referencing the SDK. Making a Workshop-capable editor means shipping a proprietary editor. For Duke3D. That'll go well...
Okay, enough clunky narration. After thinking about it for a while I decided it'd be smarter to just ship the Workshop goo as a closed binary, and let people develop the integration themselves. With that in mind, all I'd really have to do is just make a quick and dirty command-line tool that shows off how it works, provide the wsPublish header and cmdtool source code, and be on my merry way.
WOOPS, KIND OF FORGOT ABOUT THAT LAST PART DIDN'T I.
Other tools like this have been published in the past (such as the Workshop Uploader from Blendo Games, another client of mine), but AFAIK there isn't a portable, dependency-free, multiplatform tool yet. Tyler Glaiel asked about it just the other day!
Except oh wait, I wrote that like 6 years ago, I just never released it. Go me.
Nowadays the Steamworks SDK is everywhere and Steamworks.NET, in addition to crushing Steamworks# like a bug (rightfully), paved the way for making it acceptable to have Steamworks stuff on GitHub. I checked in with Gennadii last night (after a whole weekend of traveling and family wedding shenanigans, still not sure how I'm conscious right now) and made sure this was still good to go. I cleaned it up today, and you can now find the code and the entire revision log, dating all the way back to 2013, on GitHub:
https://github.com/flibitijibibo/wsPublish
It's super basic, and there are even a couple embarrassing TODO items in cmdtool, but hopefully now that this is easily available we can fix Workshop's most obvious issue for developers who just want basic user mod/map support.
If you're a developer integrating Steam Workshop into your game and you give wsPublish a try, let me know! Also, send General Arcade a nice message, it's very rare to be able to open-source stuff at all, even basic stuff like this, so let them know how cool they are!
SPIR-V Emitter for MojoShader (BETA)
After many months of development, primarily headed by Martin Krošlák, we're now ready to start testing a new SPIR-V shader emitter for MojoShader!
WTF is this?
FNA uses MojoShader for D3D9 shader support. Over the last 5 years, we've made numerous contributions to MojoShader, including full support for the Effects framework as well as various other features for simplified D3D9->OpenGL compatibility.
SPIR-V support is our next big contribution to MojoShader. SPIR-V is the official shader binary format for Vulkan, as well as an added shader format for OpenGL 4.6 (via ARB_gl_spirv).
This SPIR-V emitter is primarily focused on compatibility with ARB_gl_spirv, though there isn't much going on that would prevent this from being usable with Vulkan. We don't have a VulkanDevice yet, so for now this is purely for the extremely narrow subset of configurations out there that support OpenGL 4.6.
Who is this for?
If everything works perfectly, this is completely invisible to customers. It does not provide any benefits in performance or stability whatsoever. In fact, I plan to keep this turned off for the default OpenGLDevice once it's officially integrated, leaving it on only for the ModernGLDevice.
As far as I know, this feature is only supported on the following drivers:
- NVIDIA Windows/Linux
- Intel Windows/Linux (Mesa 2e8565be or newer)
- AMD Proprietary Windows/Linux
- radeonsi with a bunch of patches that haven't been merged yet
In reality, it's mostly for anyone who wants to try writing VulkanDevice. It's also for any of the Mesa developers who are working to get ARB_gl_spirv supported by radeonsi/i965/iris, or whatever other drivers are looking to finish OpenGL 4.6 compliance. As far as I know, basically nobody uses this feature, so I hope we can help provide some real-world data for the Mesa team to use!
I want to try this, where do I go?
I've prepared an issue tracker here:
https://github.com/FNA-XNA/MojoShader/issues/15
The repository is here if you want to see it:
https://bitbucket.org/krolli/mojoshader/src/spirv-rebased/
Who is responsible for this?
This has been worked on by a lot of people, all of which are not me! I basically just dumped some money into this (and not even that much, to be honest). This was made by many skilled developers, including Martin Krošlák, Caleb Cornett, Angus Holder, and Melker Narikka.
An extra shoutout to Baldur Karlsson who added ARB_gl_spirv support to RenderDoc extremely quickly after we asked for it! RenderDoc rules!
If you give this a try...
... thanks for your time! I'll be out of town this weekend (Aug 16-18) so don't feel too rushed to try it out.
Want a Linux game?
I'm now working my way back to just making native Linux games, slowly but surely. I have my own hit list as always, but I'm always looking for more projects! Now's a really good time to hit me up while it's on my mind. Don't forget, whether you're an indie developer or an independent developer, there's a good chance I can accommodate your needs!
Love, flibit
flibitijibibo.com
Bill's Hat
Turn a minimal Fedora installation into a SteamOS box!
1. Write Fedora Workstation NetInstall ISO to a USB drive
2. Boot USB image, install Minimal configuration with standard partition layout matching SteamOS'
3. Set root password, create a user called 'steam', set a password for it
4. Reboot, log in as root
5. A whole bunch of commands:
dnf group install hardware-support
dnf install Xorg xorg-x11-drv-evdev libglvnd-egl vulkan-loader.x86_64 vulkan-loader.i686 lightdm flatpak NetworkManager-wifi kernel-modules-extra bluez
dnf config-manager --add-repo=https://negativo17.org/repos/fedora-steam.repo
dnf install steam steamos-compositor steamos-modeswitch-inhibitor.x86_64 steamos-modeswitch-inhibitor.i686
setsebool -P allow_execheap 1
systemctl enable sshd.service
systemctl enable lightdm.service
systemctl set-default graphical.target
6. Edit /etc/lightdm/lightdm.conf:
pam-service=lightdm-autologin
pam-autologin-service=lightdm-autologin
user-session=steamos
autologin-user=steam
autologin-session=steamos
7. Create /var/lib/AccountsService/users/steam:
[User]
Session=steamos
XSession=steamos
Icon=/home/steam/.face
SystemAccount=false
8. Reboot, should work now!
9. Additional steps for NVIDIA users:
dnf config-manager --add-repo=https://negativo17.org/repos/fedora-nvidia.repo
dnf install kernel-devel dkms-nvidia nvidia-driver-libs.x86_64 nvidia-driver-libs.i686
reboot # Should be using the NVIDIA driver now!
Bill's Hat TODO
- Automate all this crap
- Steam in-home streaming firewall settings?
Wait, a "plan"?
Well, this is a .plan file, so here's my TODO. Expect nothing from it, ever.
In Progress
Proton Performance Analysis
Proteus 64-bit macOS
Shogun 64-bit
- Steam access...
DK BONGO QUEST
- Reinvestigate multi-joystick device support
Waiting Room
Codename FullCircle
- Need some backend access first...
Codename Swine
- Waiting for content completion
Codename CityVessel
- Not even finished yet, whatever
SDL_GetAudioDeviceSpec
- Oh god I don't even know dude
ScoreRush PC
- Graphics, AppAdmin, strings for PC settings, blah blah blah
Zeboyd Catalog
- Possibly no source, really just need AppAdmin access tbh
Codename SpinnyTokelau
- Assessment coming up in September
Codename FlyingFinger
- A bunch of non-dev stuff happens first
64-bit Panic
- Checking on Waveform, They Bleed Pixels
- Gotta rebuild all MojoSetup packages (F you Canonical)