FNA on Consoles: The Next Generation
This post has been archived.
Where the Heck Has flibit Been?
It's a new year! Finally! And a special one too: While I celebrated my 10th anniversary as an independent developer in 2021, this year happens to contain the 10th anniversary as the lead on FNA. In fact, January 8 is the exact date that I made my first FNA commit! I've been working on an XNA reimplementation for a whole decade! Might not be as big a milestone as, say, the original SDL maintainers, but it's my milestone :)
But, as the title suggests, this is more an overview of last year and where this year will be headed. I felt it necessary to keep people informed since I was so vocal about the future, so this will be a quick summary of what's been going on since that time. I did my best to trim the fat from this, because let's face it: Nobody cares what I'm doing or what's happening to me if it's not involving new products.
To start: I was completely right in that Valve's messaging made life extremely hard for native developers, for no reason, and to date they still have made no effort to correct it. Between late December '21 and early June '22, I made $0.00 on native Linux ports because no new customers were coming in, and previous customers with new games were "told to use Proton," with the meaning behind that phrase ranging from figurative to quite literal, from a variety of sources. Most of that period was spent trying to prevent Valve from erasing my catalog, as seemed to be their goal right as the Deck launched (after which they were caught and then lied about policy changes they hadn't made yet) as well as looking for a way to wind down the company. It was very very clear at that point that I was done for and that everyone who had the power to help was responsible for the situation to begin with, so that's it right? I can only assume Feral's winding down their Linux publishing as well (Total War aside).
The second half of the year is where things get a little less depressing: I'd talked to many friends/colleagues about getting out of the business, and thus likely not doing any programming anymore since, as few people know, I was not a programmer before my porting career! The way I saw it, I'd go back to just knowing how programs are built and limiting my experience to personal use only. Basically everyone I spoke to disagreed and said I should try programming at a company (or something like that). I strongly disliked the idea of enterprise programming, so I was pretty ready to ignore that until a weird thing happened.
Long story short, I ended up taking on a AAA contract from August to December of 2022. It didn't involve porting of any kind, but did let me use my system-level expertise a little bit, and while I still think getting out of programming is the best option for me should things continue to go south, I'm still very happy that I took the job, for a multitude of reasons. To start, it was truly a breath of fresh air; the team I worked with and the problems we were working on were great. It also gave me a lot to think about; even things as simple as build stability (i.e. "how do we actually know that what we have actually works") were so different from what I was used to! I've already integrated some of those lessons into FNA and I'm still working out how else to apply what I learned from that job.
In fact, I would likely have stuck around longer had something important not happened: The Deck's momentum kind of stalled in the background. Yes, they got a lot of orders and it was very popular this holiday season, but note the word "background". Allow me to explain:
Valve's promise was something to the tune of "zero-effort porting" and they basically told everybody not to make Linux versions. They historically have always overpromised and underdelivered, but that doesn't keep everyone from buying into the hype anyway. So for the first half of the year, the real question for native developers was: If this thing actually succeeds, are they going to actually commit to that promise, or will it just fizzle as so many megacorporate promises do?
As developers have found out, the answer was resoundingly the latter: The Deck Verified program is still an absolute mess and developers are finding that A: Valve are not actually looking at your game unless it's in the top 5 sellers or is a AAA flavor-of-the-month, and B: when relinquishing that responsibility to Valve, it means you can't look at it either; if Proton breaks your game, good luck fixing it (and good luck explaining to customers over and over that it's not the game and not your fault). Ultimately, even though developers were told not to make the effort to make a Linux version, they were ultimately all forced to make the effort to support the game on Linux, whether they wanted to or not, or risk having Valve ruin their customer satisfaction rate (and not their own since Valve is completely and totally infallible as we all know).
Personally I would have just taken Humble Bundle's lesson and given devs a larger cut of all sales including Windows sales if they made a native version that was good, but I'm not whichever fictional, overly-aggressive political mastermind that came up with... whatever all of that was.
In any case, Valve's failure to deliver has worked out for the rest of us: I have customers again (though there are still some that I'll probably never get back), and I've been able to combine console port work in a way that will ensure more native Linux versions get made. Valve have still made zero effort to rebuild the bridge they burned, so right now my work is not really considered support for their platform rather than just out of spite; I should make it clear that I do not think this uptick in work is because of the new platform as much as the headaches that it has caused, headaches that Valve said would not happen (and the voices of reason were continuously shot down). I know fanboys will try and turn this into a game of 5D Chess, even when there are still issues like major data loss bugs that actively punish developers for making native versions, but oh well.
Of course, with a new decade ahead and a new landscape for native games, I had to do something to refresh not just my outlook, but also my work environment. I generally avoid spending money on things because in most cases, and especially for donations, I treat basically every penny I make as restricted funds, so as not to trivialize anyone's contributions. As an example: I recently acquired a PinePhone since that will be a critical tool for not just Wayland/PipeWire work, but also SDL_ActionSet, which is the main thing that sponsorship funds are supporting right now. I love the idea of a Linux phone but that'll have to wait until SDL works properly on it.
But that AAA gig... it's a long story but the main detail is that having a Real Job sure is different from the indie life! So if I'm going to be continuing my work on native games, now going up against the company that was most likely to support that work, I'm going to have to be sure I can deliver on that. Or as Bender puts it, "if I'm not going to catch a fish, I might as well not catch a big fish."
Quite a jump from a 2600K/GTX770! (On that note, if Liam sees this: That replacement GPU saved me at an important time for SDL Wayland work, so thanks again for sending that over, it's officially part of the QA lab now!)
So anyway, if you have a game that you work on and want a native Linux version, give me a call. Or, if you're a customer that wants one, feel free to send the developer this page. I'm definitely equipped for another 10 years of work now!
flibitBuild
Want to replicate my build machine? Grab CentOS 7 and have a look...
# Update base install before doing anything else
yum update
# Add EPEL
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# Add SCL
yum install centos-release-scl
# All the base build tools!
yum install bzip2 bzip2-devel chrpath cmake cmake3 freetype-devel gcc-c++ \
git gtk3-devel hg libcxx-devel libstdc++-static libusbx-devel \
libuuid-devel libvorbis-devel libxml2-devel lzma-sdk-devel meson \
ocl-icd-devel openal-soft-devel opencl-headers openssl-devel patch \
perl-IPC-Cmd svn unix2dos yum-utils yum-plugin-copr zlib-static
# SDL2 dependencies
yum-builddep SDL2
# Coprs for MinGW as well as GCC 10, needed to build Clang/LLVM/osxcross
yum copr enable mlampe/devtoolset-10
yum copr enable alonid/mingw-epel7
yum install devtoolset-10 mingw32-* mingw64-*
# CMake3 by default
alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake 10 \
--slave /usr/local/bin/ctest ctest /usr/bin/ctest \
--slave /usr/local/bin/cpack cpack /usr/bin/cpack \
--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake \
--family cmake
alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake3 20 \
--slave /usr/local/bin/ctest ctest /usr/bin/ctest3 \
--slave /usr/local/bin/cpack cpack /usr/bin/cpack3 \
--slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake3 \
--family cmake
# Wayland updates
su -c 'yum remove wayland-devel wayland-protocols-devel'
curl -O https://gitlab.freedesktop.org/wayland/wayland/-/archive/1.19.0/wayland-1.19.0.tar.bz2
curl -O https://gitlab.freedesktop.org/wayland/wayland-protocols/-/archive/1.25/wayland-protocols-1.25.tar.bz2
curl -O https://gitlab.gnome.org/jadahl/libdecor/-/archive/0.1.0/libdecor-0.1.0.tar.bz2
tar xvfj wayland-1.19.0.tar.bz2
tar xvfj wayland-protocols-1.25.tar.bz2
tar xvfj libdecor-0.1.0.tar.bz2
mkdir wayland-1.19.0/flibitBuild
mkdir wayland-protocols-1.25/flibitBuild
mkdir libdecor-0.1.0/flibitBuild
cd wayland-1.19.0/flibitBuild
meson .. --libdir=lib -Ddocumentation=false
ninja
su -c 'ninja install'
cd ../../wayland-protocols-1.25/flibitBuild
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig" meson .. --libdir=lib
ninja
su -c 'ninja install'
cd ../../libdecor-0.1.0/flibitBuild
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig" meson .. --libdir=lib -Ddemo=false
ninja
su -c 'ninja install'
# PipeWire 0.3.42 (Highest version usable with meson)
curl -O https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/0.3.42/pipewire-0.3.42.tar.bz2
tar xvfj pipewire-0.3.42.tar.bz2
mkdir pipewire-0.3.42/flibitBuild
cd pipewire-0.3.42/flibitBuild
meson setup .. --libdir=lib -Dsession-managers= -Dpipewire-v4l2=disabled -Dv4l2=disabled -Draop=disabled
# Also:
# Configure SDL with PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure
# Modify unistd.h to change __block to anything but __block
# The CMake config provided by SDL2-mingw is terrible, delete the block
# that starts with "if(NOT TARGET SDL2::SDL2)".
# Be prepared to pass -std=gnu99 manually. A LOT.
# To enter Mac building mode (and to build osxcross itself):
# scl enable devtoolset-10 bash
Wait, a "plan"?
Well, this is a .plan file, so here's my TODO. Expect nothing from it, ever.
In Progress
Crash-landing lots of little things!
Waiting Room (2023)
SDL 3.0
- SDL_ActionSet is what sponsor resources are going towards
- SDL_StorageContainer is whenever I feel like it
- Wayland/PipeWire are waiting on external components
Codename DanishBootleg
- Sitting in cert now!
Codename TupTip
- A couple weeks after FNA 23.01
Super Hexagon Neo Part 2
- Someone's doing the merge, then I'll come in to finalize
Coding History
- On call throughout development
flibitEffect
- Licensing blockage, might get cancelled
VVVVVV 2.4
- Giving the localization project as much time as it wants
Waiting Room (Heat Death)
ScoreRush PC
- Need AppAdmin for publish, crosshair for mouse
Proteus "Neo" Rewrite
- Retirement project
Anodyne 1
- Retirement project