Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Michael Sartain


Experienced C / C++ / x86 assembly graphics and systems programmer. 25+ years building and shipping products, most working on graphics and performance on projects spanning Windows, Linux, Mac OS, and Sony / Microsoft / Nintendo game consoles.


Valve Software and RAD Game Tools contractor (2016 - PRESENT)

  • Gpuvis primary developer (Linux GPU Trace Visualizer)
  • Linux trace-cmd (ftrace front-end) thread group id feature work, several bug fixes
  • Linux kernel ftrace tgid feature patches
  • SDL2 Linux realtimekit thread priority patches
  • Wrote RAD L2TP RADIUS two-factor vpn plugin (

Valve Software (2011 - 2016)

  • Ported Source 2 game engine code to 64-bit
    • 13+ year old 32-bit codebase shipped with over 15 games from 2004-2011
  • Developer on Dota 2
    • Performance optimization work, bug fixing
    • Convert network layer and game to use Google Protocol Buffers and Snappy
    • Wrote fog of war system working closely with primary game designer
    • Wrote FoW 2D viewer system, which also helped visualize entity bugs
    • Wrote replay system: scrubbing, debugging, jumping, broadcast, dvr features
    • Linux Dota 2 server optimizations, remote server debugging (Europe clusters, etc)
  • Founded Valve Linux team with co-workers Scott Ludwig and Rick Johnson
    • Interviewed, hired, and built team to 13 developers
    • Ported Steam, L4D2, TF2, Half Life, Portal, Portal 2, CS:GO, Day of Defeat to Linux
    • TF2 was first AAA title on Linux: Initial port ran at 6fps, with several 300ms stalls
    • Worked with NVIDIA, Intel, and AMD on Linux OpenGL graphics driver bugs and perf issues
    • Over 3,000 native games available on Steam Linux as of February, 2017
  • Developer on Portal 2, Team Fortress 2, CS:GO working on performance issues, debugging, optimization, and Linux server cluster stability
  • Virtual Reality graphics performance development work plus investigate and fix threading bugs
  • Contribute feature and bug fix patches to Linux LLDB Debugger
  • Contributed over 200 feature and bug fixes to cgdb (ncurses gdb frontend)

RAD Game Tools (2001 - 2011)

  • Ported Bink Video Codec to GameCube, Xbox, and PS2 consoles
  • Contracted with Bungie for Halo 2 optimization work
  • Primary developer with Michael Abrash on Pixomatic Software Renderer. Used in:
    • Unreal Tournament 2003/2004, Dungeon Siege, MS Flight Simulator, Lionheart, Medal of Honor, Sims 2, EA, Logitech, among many others. Sold to Intel in 2006.
  • RAD Developer on Intel Larrabee project
    • Worked closely with Dean Macri and Will Damon currently at Apple
  • Wrote d3d capture/playback graphics performance, debugger, and validation tool

Microsoft Xbox ATG Group (1999 - 2001)

  • Developer researching Xbox & NVIDIA NV2A performance characteristics with Michael Abrash
  • Wrote and optimized Xbox graphics samples and architecture white papers
  • Optimized Xbox graphics driver, investigated & fixed bugs
  • Wrote NV2A perf register sampling code which was used to create Xbox PIX tool
  • Worked with and contributed source to several companies optimizing launch title games:
    • Halo, Half-Life, Orange Box, Oddworld: Munch’s Oddysee

Microsoft Games (1996 - 1999)

  • Lead tech, graphics, and AI developer on NFL Fever 2000
    • First game started and developed internally at Microsoft
  • Integrated, tested, and fixed bugs with NFL Fever 2000 software renderer
  • Assisted Andy Glaister with GameOS features (Internal graphics debugging / profiling tool)
  • Optimization development work on Baseball, Crimson Skies, MechWarrior

Microsoft Mail Business Unit Senior Developer (1991 - 1996)

  • Microsoft Mail & Schedule+ (1992)
  • Windows 95 email client (1995)
  • Exchange Server v1.0 & v4.0 (1996)
  • Windows NT email client (1996)
  • Exchange Server v5.0 (1997)
  • Dev lead on Microsoft Highlander client team (~11 developers)
  • Wrote FileVer and NetWatch utilities which were added to Windows NT Resource Kit

Open Source Development Work

gpuvis - GPU Trace Visualizer, similar to GPUView on Windows

trace-cmd commits - utility for Linux ftrace

Linux kernel commits

  • 6d36ce2 tools lib traceevent: Add UL suffix to MISSING_EVENTS
  • 952a99c tools lib traceevent: Fix bad force_token escape sequence
  • 99c621d tracing: Add saved_tgids file to show cached pid to tgid mappings
  • 4da14d5 staging: greybus: firmware: Convert sscanf calls to strtoul
  • afb5fdf staging: greybus: firmware: Change long long unsigned to unsigned long long
  • 5099c4c staging: greybus: firmware: Remove extra braces from single line if
  • 0c38018 staging: greybus: firmware: Remove trailing semicolon from FW_TIMEOUT_DEFAULT

cgdb work - ncurses gdb frontend (over 200 feature & bug fix commits)

Valve Software Linux OpenGL Benchmarking tool

Minor usbview buffer over-read fix

Simple DirectMedia Layer (SDL2) patches

  • 2018-04-23 | Added support for adjusting thread priorities using Linux RealtimeKit.
  • 2013-02-14 | Clear relative mouse mode and restore when bringing up sdl message box.
  • 2013-02-05 | Add defines to disable setlocale and fork. Disable that code by default for now.
  • 2013-02-05 | Use left facing arrow instead of right facing arrow for system cursor.
  • 2012-11-19 | Add SDL_CreateSystemCursor for Windows and Linux.
  • 2012-10-11 | Add GLX_X_VISUAL_TYPE_EXT so created window will use DirectColor if available (instead of TrueColor).
  • 2012-10-11 | Add XInitThreads to X11_CreateDevice.
  • 2012-10-11 | Fix Colormap when using X11_SetWindowFullscreenViaWM() path.

Pixomatic features (DX9 compatible software renderer)

Dr. Dobbs optimizing Pixomatic articles (by Michael Abrash)

Random articles about projects I’ve contributed to

LLDB Debugger Commits

  • Merge RegisterContextPOSIX_x86_64 and RegisterContextPOSIX_i386 into RegisterContextPOSIX_x86
  • Re-enable test_convenience_registers_16bit_with_process_attach test for Linux.
  • Clean up RegisterContextPOSIX i386 code. Use 32-bit register enums without gaps on 64-bit hosts. Don't show 64-bit registers when debugging 32-bit
  • Remove unused local variable.
  • fix class/struct mismatch warning
  • Clean up RegisterContextPOSIX. Renamed to POSIXBreakpointProtocol. Will clean up header files and m_register_infos shortly.
  • Cleanup POSIX RegisterContext class hierarchies.
  • warning cleanup (use LLDB_INVALID_HOST_THREAD instead of NULL)
  • unused variable, typedef requires name warning cleanup
  • Round plt entsize to addralign
  • add register name to UnwindLog error message
  • A clang::Type::Decayed type to kill compile warning
  • add error checking and messages to 'target modules show-unwind' command
  • clean up about 22 warnings messages
  • Initialize m_leak member variable.
  • Fix Linux Host::GetCurrentThreadID() to return real tid (not pthread_t). This fixes threadname logging (--thread-name) Add "-t" to
  • Fix thread name updating in Linux. "thread list" should report correct names always now. Created new LinuxThread class inherited from POSIXThread
  • Optimize Host::GetThreadName() to read from /proc/$TID per Matt's suggestion.
  • Add format specifiers to various format ids so we can print thread ids in decimal on Linux and FreeBSD.
  • simple plugin now works with Linux fix assert in SetPluginInfo implement Linux ePathTypeLLDBSystemPlugins and ePathTypeLLDBUserPlugins implement
  • Fix Rendezvous breakpoint to only be set once, resolve addr in BreakpointLocationList::FindByAddress
  • Fix "source list -n printf" on Linux (printf is symbol alias for __printf)
  • Add silent option to command source. Patch from Matthew Sorrels
  • Use target DisplaySource if available so we can get mixed source and assembly.
  • Symbol prologue code checks if funciton lines up with symbol and uses function prologue code with line info if so.
  • Fix ObjectFileELF crc32 code used when no build id is present.
  • Add split symbol support to test makefile & add linux split symbol test case.
  • Split symbol support for ELF and Linux.
  • Add new files to CMakeLists.txt to fix cmake build error.
  • Add newer Linux AT_ defines from elf.h.
  • Remove extra modules.Append() as it causes dupes in the m_images array. (Used with image list, etc.)
  • Fix unitialized variable in AuxVector::GetEntryName() which crashed in AuxVector::DumpToLog
  • ObjectFileELF::GetModuleSpecifications on Linux should work now. Which means "platform process list" should work and list the architecture.
  • Add ${ansi.XX} parsing to lldb prompt, use-color setting, and -no-use-colors command line options.
  • Comment out ObjectFileELF::GetModuleSpecifications() function until I can debug where it's causing tests to fail.
  • Implement ObjectFileELF::GetModuleSpecifications(), and add PlatformLinux code to deal with unknown arch properties.


Michael Sartain Resume






No releases published


No packages published