docs(twitter): add 27 new NOTimothyLottes threads (Jul 2026 Linux dev bringup)

Processed 38 URLs from the user's list. 1 was already in the corpus
(2072194202851549432). 9 were duplicates within the new batch (same
post IDs at different anchor URLs); removed those. This commit
contains the 27 unique new threads.

Content spans the Jul 2026 era and is mostly Lottes's Linux
development environment bringup work:
- 1674757854471806977: 'Nothing Oriented Programming' (NOP) philosophy
- 1990260050485797063: reversed projection matrices
- 2030722033286328426: STP conspiracy theory
- 2058166883044516181: 'crap-o-grammers' C++ bloat-ware critique
- 2060191401883619479: relevant timestamp article
- 2060730425929080874: CPU clock code (TSC)
- 2061123768429211767: no-debugger-debug + mmap log pre-history
- 2061416116694442141: Windows thread priority
- 2061933917137932437: mmap'd page file
- 2061937134756380682: Windows HIGHEST_PRIORITY_CLASS
- 2062031187023982879: back running 640x480 on VGA CRTs
- 2064858927829745887: on Linux now (SteamOS)
- 2065804972378243476: nanorc done + iPhone font issue
- 2065832746757341482: cross compilation up
- 2065872197147578751: @axelgneiting bypassing libc
- 2066184005632786736: Linux mlockall
- 2070337342854832468: why not pselect/ppoll/epoll_pwait2
- 2070734717825986566: deterrant to ALSA = parsing through snd_pcm_open
- 2071415096304193820: aplay to actually play a wave file
- 2071706805114216559: 'ALSA hell month continues'
- 2071937360288235902: Linux thread priority code
- 2072135292115427728: Linux doesn't allow priority increase by default
- 2072445315370590266: 'Wine workarounds - I could just detect'
- 2072506103401754653: snd_pcm_sw_params for ALSA
- 2072804183992922296: starting on WDM/KS audio for WIN32
- 2073096069529907441: re-trying WASAPI
- 2073110092447203466: CPP_(obj) for mmdeviceapi

Cleanup: removed 9 duplicate dirs (same posts at different anchor URLs),
script temp files, and the '1857803914604618029' which was already a
duplicate of '1857820858162753661' (mmap log canonical).
This commit is contained in:
ed
2026-08-01 15:49:22 -04:00
parent 8c93fba658
commit c3a9978d03
108 changed files with 4212 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

+110
View File
@@ -0,0 +1,110 @@
---
title: ""Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlig"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/1674757854471806977"
post_id: "1674757854471806977"
timestamp: "2023-06-30 12:32:42"
post_count: 19
reply_count: 15
repost_count: 41
like_count: 389
view_count: 54682
---
# @NOTimothyLottes — "Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlig
## Post 1 (2023-06-30 12:32:42)
"Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlightenment by writing as little possible code: no dynamic memory allocation, no thousand files of glue, no includes, no objects. Write nothing, be happy. Even applied it to the logo, zero effort.
![Media 1](./media/1674757854471806977_1.jpg)
## Post 2 (2023-06-30 13:16:02) — reply to Post 1
@NOTimothyLottes Would be nice to talk a full presentation about this topic, but people want me to show cool tech and pretty pixels instead. Maybe one day.
I will save your image for that day (if I get approval to use it), since Twitter search is super bad.
## Post 3 (2023-06-30 13:26:44) — reply to Post 1
@NOTimothyLottes $4e71
if you know, you know
## Post 4 (2023-06-30 13:40:22) — reply to Post 3
@leonard_coder ${EA, 1A, 3A, 5A, 7A, DA, or FA}
## Post 5 (2023-06-30 13:45:24) — reply to Post 2
@SebAaltonen "Approval", haha, sure it's covered under my favorite license
![Media 1](./media/1674776150671781888_1.png)
## Post 6 (2023-06-30 13:50:17) — reply to Post 1
@NOTimothyLottes I like this, given I never write code any more.
sadly i am still a grumpy git.
## Post 7 (2023-06-30 17:57:31) — reply to Post 1
@NOTimothyLottes Once in a while people need to be reminded to stop the bloat, understand the machine guts and be self aware about productive process
https://tonsky.me/blog/disenchantment/
## Post 8 (2023-06-30 21:04:44) — reply to Post 7
@_spolsh That was a fantastic read, thanks
## Post 9 (2023-07-01 02:06:21) — reply to Post 1
@NOTimothyLottes
![Media 1](./media/1674962613506297857_1.jpg)
## Post 10 (2023-07-01 02:39:25) — reply to Post 1
@NOTimothyLottes NOP is ideal.
## Post 11 (2023-07-01 04:19:23) — reply to Post 1
@NOTimothyLottes Best software is absense of it:
https://en.wikipedia.org/wiki/The_Mythical_Man-Month
## Post 12 (2023-07-01 05:57:46) — reply to Post 1
@NOTimothyLottes Folks, they're calling it "computer oriented programming". It's where you stop trying to impress peers and just tell the computer the best way to do things
## Post 13 (2023-07-01 08:12:40) — reply to Post 1
@NOTimothyLottes c++ to √c
## Post 14 (2023-07-01 08:30:57) — reply to Post 1
@NOTimothyLottes Many games used to be like that, at least the ones without dynamic content, mods, etc...
Most of the stuff I worked on on PSX and Dreamcast basically just loads big files with everything pre-allocated and aligned properly at the final location, ready to use.
## Post 15 (2023-07-01 10:27:31) — reply to Post 1
@NOTimothyLottes I was calling it "disoriented programming" just the other day.
https://x.com/PierreTerdiman/status/1673389650172321813?s=20
## Post 16 (2023-07-01 12:46:15) — reply to Post 1
@NOTimothyLottes Looks like a koala
![Media 1](./media/1675123653162196992_1.jpg)
## Post 17 (2023-07-01 14:30:43) — reply to Post 1
@NOTimothyLottes @Jonathan_Blow i designed a language Beads, which uses a graph DB, has no memory allocation, super modular, approaches this minimalism as close as humanly possible, but billable hour / job security seeking programmers refuse to try it
## Post 18 (2023-07-01 21:01:04) — reply to Post 1
@NOTimothyLottes Can teach it in abstinence-only programming classes!
## Post 19 (2023-07-09 17:04:16) — reply to Post 1
@NOTimothyLottes https://github.com/wyattscarpenter/wu
@@ -0,0 +1,318 @@
{
"root_post_id": "1674757854471806977",
"posts": [
{
"post_id": "1674757854471806977",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "\"Nothing Oriented Programming\" (NOP). Where the goal is to achieve minimal enlightenment by writing as little possible code: no dynamic memory allocation, no thousand files of glue, no includes, no objects. Write nothing, be happy. Even applied it to the logo, zero effort.",
"timestamp": "2023-06-30 12:32:42",
"media_urls": [
"https://pbs.twimg.com/media/Fz3vY5fXwAgEpzn?format=jpg&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 15,
"repost_count": 41,
"like_count": 389,
"view_count": 54682
}
},
{
"post_id": "1674768757867020289",
"author": "Sebastian Aaltonen",
"handle": "SebAaltonen",
"text": "@NOTimothyLottes Would be nice to talk a full presentation about this topic, but people want me to show cool tech and pretty pixels instead. Maybe one day.\n\nI will save your image for that day (if I get approval to use it), since Twitter search is super bad.",
"timestamp": "2023-06-30 13:16:02",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 19,
"view_count": 2939
}
},
{
"post_id": "1674771452799614976",
"author": "Arnaud Carré",
"handle": "leonard_coder",
"text": "@NOTimothyLottes $4e71\nif you know, you know",
"timestamp": "2023-06-30 13:26:44",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 6,
"view_count": 1556
}
},
{
"post_id": "1674774881093689346",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@leonard_coder ${EA, 1A, 3A, 5A, 7A, DA, or FA}",
"timestamp": "2023-06-30 13:40:22",
"media_urls": [],
"reply_to_id": "1674771452799614976",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 1319
}
},
{
"post_id": "1674776150671781888",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@SebAaltonen \"Approval\", haha, sure it's covered under my favorite license",
"timestamp": "2023-06-30 13:45:24",
"media_urls": [
"https://pbs.twimg.com/media/Fz3_kb8WYAMXvcT?format=png&name=orig"
],
"reply_to_id": "1674768757867020289",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 12,
"view_count": 1957
}
},
{
"post_id": "1674777379414179840",
"author": "Colin Riley 🎗",
"handle": "domipheus",
"text": "@NOTimothyLottes I like this, given I never write code any more.\nsadly i am still a grumpy git.",
"timestamp": "2023-06-30 13:50:17",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 947
}
},
{
"post_id": "1674839597853835285",
"author": "Michal Klos",
"handle": "_spolsh",
"text": "@NOTimothyLottes Once in a while people need to be reminded to stop the bloat, understand the machine guts and be self aware about productive process\nhttps://tonsky.me/blog/disenchantment/",
"timestamp": "2023-06-30 17:57:31",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 2,
"like_count": 34,
"view_count": 5025
}
},
{
"post_id": "1674886711707418624",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@_spolsh That was a fantastic read, thanks",
"timestamp": "2023-06-30 21:04:44",
"media_urls": [],
"reply_to_id": "1674839597853835285",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 1410
}
},
{
"post_id": "1674962613506297857",
"author": "Mike Acton",
"handle": "mike_acton",
"text": "@NOTimothyLottes",
"timestamp": "2023-07-01 02:06:21",
"media_urls": [
"https://pbs.twimg.com/media/Fz6pnsBaQAEtMIZ?format=jpg&name=orig"
],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 13,
"view_count": 2705
}
},
{
"post_id": "1674970938234875907",
"author": "Simon Nordon",
"handle": "SimonNordon",
"text": "@NOTimothyLottes NOP is ideal.",
"timestamp": "2023-07-01 02:39:25",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 513
}
},
{
"post_id": "1674996094265163782",
"author": "azeke",
"handle": "azeke1984",
"text": "@NOTimothyLottes Best software is absense of it:\n\nhttps://en.wikipedia.org/wiki/The_Mythical_Man-Month",
"timestamp": "2023-07-01 04:19:23",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 103
}
},
{
"post_id": "1675020853862359041",
"author": "Total Slack Holocaust",
"handle": "helpful_signage",
"text": "@NOTimothyLottes Folks, they're calling it \"computer oriented programming\". It's where you stop trying to impress peers and just tell the computer the best way to do things",
"timestamp": "2023-07-01 05:57:46",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 85
}
},
{
"post_id": "1675054802265423872",
"author": "ᓇᓄᖅ ❄️",
"handle": "claudiogonzalo",
"text": "@NOTimothyLottes c++ to √c",
"timestamp": "2023-07-01 08:12:40",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 285
}
},
{
"post_id": "1675059402280251395",
"author": "Dbug",
"handle": "DefenceForceOrg",
"text": "@NOTimothyLottes Many games used to be like that, at least the ones without dynamic content, mods, etc...\n\nMost of the stuff I worked on on PSX and Dreamcast basically just loads big files with everything pre-allocated and aligned properly at the final location, ready to use.",
"timestamp": "2023-07-01 08:30:57",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 4,
"view_count": 485
}
},
{
"post_id": "1675088736621559808",
"author": "Pierre Terdiman",
"handle": "PierreTerdiman",
"text": "@NOTimothyLottes I was calling it \"disoriented programming\" just the other day.\n\nhttps://x.com/PierreTerdiman/status/1673389650172321813?s=20",
"timestamp": "2023-07-01 10:27:31",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 724
}
},
{
"post_id": "1675123653162196992",
"author": "Aspar",
"handle": "asparagiii",
"text": "@NOTimothyLottes Looks like a koala",
"timestamp": "2023-07-01 12:46:15",
"media_urls": [
"https://pbs.twimg.com/media/Fz88Bk0WAAApDzL?format=jpg&name=orig"
],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 1,
"like_count": 3,
"view_count": 355
}
},
{
"post_id": "1675149939759017987",
"author": "Coding Fiend",
"handle": "CodingFiend",
"text": "@NOTimothyLottes @Jonathan_Blow i designed a language Beads, which uses a graph DB, has no memory allocation, super modular, approaches this minimalism as close as humanly possible, but billable hour / job security seeking programmers refuse to try it",
"timestamp": "2023-07-01 14:30:43",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 275
}
},
{
"post_id": "1675248176498987009",
"author": "Tim Sweeney",
"handle": "TimSweeneyEpic",
"text": "@NOTimothyLottes Can teach it in abstinence-only programming classes!",
"timestamp": "2023-07-01 21:01:04",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 8,
"view_count": 4462
}
},
{
"post_id": "1678087686404595712",
"author": "Wyatt S Carpenter",
"handle": "wyattscarpenter",
"text": "@NOTimothyLottes https://github.com/wyattscarpenter/wu",
"timestamp": "2023-07-09 17:04:16",
"media_urls": [],
"reply_to_id": "1674757854471806977",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 35
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/1674757854471806977"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1,56 @@
---
title: "I wish everyone would just adopt "reversed with infinite far" projection matrixe"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/1990260050485797063"
post_id: "1990260050485797063"
timestamp: "2025-11-17 03:25:47"
post_count: 9
reply_count: 5
repost_count: 2
like_count: 85
view_count: 6057
---
# @NOTimothyLottes — I wish everyone would just adopt "reversed with infinite far" projection matrixe
## Post 1 (2025-11-17 03:25:47)
I wish everyone would just adopt "reversed with infinite far" projection matrixes so I could only optimize for the fastest and highest precision option, but I'm guessing people haven't all migrated over :(
![Media 1](./media/1990260050485797063_1.png)
## Post 2 (2025-11-17 03:28:35) — reply to Post 1
Reversed is a significant improvement but it still has its limitations when doing planetary-scale rendering that needs good precision up both close and far away. Your options there are either a logarithmic depth buffer to linearize things (albeit losing early z), your own integer-based depth test system in compute shaders, or a stack of multiple frustums layered on top of one another.
## Post 3 (2025-11-17 03:31:41) — reply to Post 2
@AgileJebrim Yes for my non-tri stuff I'm log depth already. This is just for games, not simulation.
## Post 4 (2025-11-17 03:41:27) — reply to Post 3
Simulation can usually localize enough that reverse Z is good enough. Google Earth style geospatial visualization is where things get trickier.
Another option is to dynamically change the far plane, moving it closer as you get closer to the terrain and further back as you move further back. I dont think I tried this one but I imagine it requires a lot of tuning.
## Post 5 (2025-11-17 05:03:02) — reply to Post 1
@NOTimothyLottes I've never had real depth precision issues in our game ports but I guess I'd better just adopt and get used to reversed infinite projection cause it's objectively better. Promise to try it for our next project :)
## Post 6 (2025-11-17 05:06:11) — reply to Post 1
@NOTimothyLottes Many are still on OpenGLES and WebGL, which dont properly support inverse depth due to still using a -1 to 1 clip space. Not really a problem for inverse depth in its own, but does cause problems for infinite far depth.
## Post 7 (2025-11-18 16:26:49) — reply to Post 1
@NOTimothyLottes Infinite far doesnt apply to ortho, and many of editors/engines need to switch camera viewports. But its great for persp. Also too much code handing modeInv for normals, which is wrong and unneeded.
## Post 8 (2025-11-19 18:56:58) — reply to Post 1
@NOTimothyLottes I haven't really done graphics in a while, but I've never heard about infinite far nor reversed z, where can I read up on it more?
Some cursory googling didn't return anything useful on this topic.
## Post 9 (2025-11-20 03:47:56) — reply to Post 8
@stainless_code I put some docs (based on an old blog post) on projection matrix stuff inside STP source: https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.render-pipelines.core/Runtime/STP/Stp.hlsl - Documents the maths to take depth and 2 projections and get a static reprojection vector for example.
@@ -0,0 +1,152 @@
{
"root_post_id": "1990260050485797063",
"posts": [
{
"post_id": "1990260050485797063",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I wish everyone would just adopt \"reversed with infinite far\" projection matrixes so I could only optimize for the fastest and highest precision option, but I'm guessing people haven't all migrated over :(",
"timestamp": "2025-11-17 03:25:47",
"media_urls": [
"https://pbs.twimg.com/media/G57SXPJW8AAvEhh?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 5,
"repost_count": 2,
"like_count": 85,
"view_count": 6057
}
},
{
"post_id": "1990260754688172298",
"author": "Jebrim",
"handle": "AgileJebrim",
"text": "Reversed is a significant improvement but it still has its limitations when doing planetary-scale rendering that needs good precision up both close and far away. Your options there are either a logarithmic depth buffer to linearize things (albeit losing early z), your own integer-based depth test system in compute shaders, or a stack of multiple frustums layered on top of one another.",
"timestamp": "2025-11-17 03:28:35",
"media_urls": [],
"reply_to_id": "1990260050485797063",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 820
}
},
{
"post_id": "1990261535491723691",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@AgileJebrim Yes for my non-tri stuff I'm log depth already. This is just for games, not simulation.",
"timestamp": "2025-11-17 03:31:41",
"media_urls": [],
"reply_to_id": "1990260754688172298",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 589
}
},
{
"post_id": "1990263993236136239",
"author": "Jebrim",
"handle": "AgileJebrim",
"text": "Simulation can usually localize enough that reverse Z is good enough. Google Earth style geospatial visualization is where things get trickier.\n\nAnother option is to dynamically change the far plane, moving it closer as you get closer to the terrain and further back as you move further back. I dont think I tried this one but I imagine it requires a lot of tuning.",
"timestamp": "2025-11-17 03:41:27",
"media_urls": [],
"reply_to_id": "1990261535491723691",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 320
}
},
{
"post_id": "1990284522508927371",
"author": "Dmitrii Terekhov",
"handle": "terekhov_de",
"text": "@NOTimothyLottes I've never had real depth precision issues in our game ports but I guess I'd better just adopt and get used to reversed infinite projection cause it's objectively better. Promise to try it for our next project :)",
"timestamp": "2025-11-17 05:03:02",
"media_urls": [],
"reply_to_id": "1990260050485797063",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 344
}
},
{
"post_id": "1990285316054503566",
"author": "Ben Golus⚠️⭕",
"handle": "bgolus",
"text": "@NOTimothyLottes Many are still on OpenGLES and WebGL, which dont properly support inverse depth due to still using a -1 to 1 clip space. Not really a problem for inverse depth in its own, but does cause problems for infinite far depth.",
"timestamp": "2025-11-17 05:06:11",
"media_urls": [],
"reply_to_id": "1990260050485797063",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 1,
"like_count": 1,
"view_count": 689
}
},
{
"post_id": "1990818990059671922",
"author": "Alec Miller",
"handle": "Alecazam123",
"text": "@NOTimothyLottes Infinite far doesnt apply to ortho, and many of editors/engines need to switch camera viewports. But its great for persp. Also too much code handing modeInv for normals, which is wrong and unneeded.",
"timestamp": "2025-11-18 16:26:49",
"media_urls": [],
"reply_to_id": "1990260050485797063",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 85
}
},
{
"post_id": "1991219165978370275",
"author": "Yuriy Stets",
"handle": "stainless_code",
"text": "@NOTimothyLottes I haven't really done graphics in a while, but I've never heard about infinite far nor reversed z, where can I read up on it more?\nSome cursory googling didn't return anything useful on this topic.",
"timestamp": "2025-11-19 18:56:58",
"media_urls": [],
"reply_to_id": "1990260050485797063",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 85
}
},
{
"post_id": "1991352784529289269",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@stainless_code I put some docs (based on an old blog post) on projection matrix stuff inside STP source: https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.render-pipelines.core/Runtime/STP/Stp.hlsl - Documents the maths to take depth and 2 projections and get a static reprojection vector for example.",
"timestamp": "2025-11-20 03:47:56",
"media_urls": [],
"reply_to_id": "1991219165978370275",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 133
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/1990260050485797063"
}
@@ -0,0 +1,55 @@
---
title: "I'll add one conspiracy theory for everyone listening: After STP's source was ou"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2030722033286328426"
post_id: "2030722033286328426"
timestamp: "2026-03-08 19:07:16"
post_count: 10
reply_count: 3
repost_count: 3
like_count: 56
view_count: 6039
---
# @NOTimothyLottes — I'll add one conspiracy theory for everyone listening: After STP's source was ou
## Post 1 (2026-03-08 19:07:16)
I'll add one conspiracy theory for everyone listening: After STP's source was out there, DLSS4 'transformer' magically gained 'sharpness' but I don't believe it was from the ML model change at all, instead I think they just introduced the same error feedback mechanism in STP ...
## Post 2 (2026-03-08 19:09:05) — reply to Post 1
Specifically STP samples feedback at the position of the input pixels, and uses that difference as an error term estimating the amount of blur introduced, one can subtract out some amount of that 'error' to sharpen ...
## Post 3 (2026-03-08 19:12:21) — reply to Post 2
Of course that idea isn't strictly new either, fluid sims with advection use similar logic to sharpen. So I'm just another human building on the masters of the past. One can start to go beyond sharpening with this technique and get into local contrast adaption too ...
## Post 4 (2026-03-08 19:14:24) — reply to Post 3
One of the marketing points of DLSS4 was 'sharpness' but it didn't actually resolve details to a higher frequency than prior, instead it just gets to a higher contrast, and then they con the consumer with that ...
## Post 5 (2026-03-08 19:19:47) — reply to Post 4
Another trick one can employ, and something I used often as a pro photographer, was to deliberately thin or thicken features with sub-pixel precision during enlargement. Meaning you can take a 'feature' and thin it below source nyquist. And people go 'wow' it's detailed ...
## Post 6 (2026-03-08 19:23:20) — reply to Post 5
So for instance one can take a input (lower-resolution) feature and simultaneously increase it's contrast while reducing it's thickness (when enlarged) in an energy preserving way. Can use signal bounds to estimate how much contrast and thus thin-ness one can push the feature ...
## Post 7 (2026-03-08 19:24:31) — reply to Post 6
This gets easier with color signals because you can take the minimum bounds of the three channels, this is actually exactly what CAS does (just applied in a context without enlargement) ...
## Post 8 (2026-03-08 19:25:46) — reply to Post 7
Anyway all this stuff is easy to artistically shape analytically in shader code, and never needed any kind of ML to be implemented (in fact ML would be slow, because it cannot do max/min style logic!!!).
## Post 9 (2026-03-08 19:55:21) — reply to Post 1
@NOTimothyLottes Did they not just use more historical frames to get their samples and have a better model to compensate for the side effects?
## Post 10 (2026-03-08 20:09:19) — reply to Post 9
@gindi4711 Costs went up a lot so maybe. But cannot really add frames of context without getting costly. Secondary option is to store extra data in feedback sideband.
@@ -0,0 +1,166 @@
{
"root_post_id": "2030722033286328426",
"posts": [
{
"post_id": "2030722033286328426",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I'll add one conspiracy theory for everyone listening: After STP's source was out there, DLSS4 'transformer' magically gained 'sharpness' but I don't believe it was from the ML model change at all, instead I think they just introduced the same error feedback mechanism in STP ...",
"timestamp": "2026-03-08 19:07:16",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 3,
"like_count": 56,
"view_count": 6039
}
},
{
"post_id": "2030722489538543674",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Specifically STP samples feedback at the position of the input pixels, and uses that difference as an error term estimating the amount of blur introduced, one can subtract out some amount of that 'error' to sharpen ...",
"timestamp": "2026-03-08 19:09:05",
"media_urls": [],
"reply_to_id": "2030722033286328426",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 13,
"view_count": 1175
}
},
{
"post_id": "2030723314801357065",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Of course that idea isn't strictly new either, fluid sims with advection use similar logic to sharpen. So I'm just another human building on the masters of the past. One can start to go beyond sharpening with this technique and get into local contrast adaption too ...",
"timestamp": "2026-03-08 19:12:21",
"media_urls": [],
"reply_to_id": "2030722489538543674",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 11,
"view_count": 1125
}
},
{
"post_id": "2030723826993213805",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "One of the marketing points of DLSS4 was 'sharpness' but it didn't actually resolve details to a higher frequency than prior, instead it just gets to a higher contrast, and then they con the consumer with that ...",
"timestamp": "2026-03-08 19:14:24",
"media_urls": [],
"reply_to_id": "2030723314801357065",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 8,
"view_count": 820
}
},
{
"post_id": "2030725182671798689",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Another trick one can employ, and something I used often as a pro photographer, was to deliberately thin or thicken features with sub-pixel precision during enlargement. Meaning you can take a 'feature' and thin it below source nyquist. And people go 'wow' it's detailed ...",
"timestamp": "2026-03-08 19:19:47",
"media_urls": [],
"reply_to_id": "2030723826993213805",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 10,
"view_count": 752
}
},
{
"post_id": "2030726077312541100",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "So for instance one can take a input (lower-resolution) feature and simultaneously increase it's contrast while reducing it's thickness (when enlarged) in an energy preserving way. Can use signal bounds to estimate how much contrast and thus thin-ness one can push the feature ...",
"timestamp": "2026-03-08 19:23:20",
"media_urls": [],
"reply_to_id": "2030725182671798689",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 6,
"view_count": 712
}
},
{
"post_id": "2030726373124317233",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "This gets easier with color signals because you can take the minimum bounds of the three channels, this is actually exactly what CAS does (just applied in a context without enlargement) ...",
"timestamp": "2026-03-08 19:24:31",
"media_urls": [],
"reply_to_id": "2030726077312541100",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 5,
"view_count": 1328
}
},
{
"post_id": "2030726690721198381",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Anyway all this stuff is easy to artistically shape analytically in shader code, and never needed any kind of ML to be implemented (in fact ML would be slow, because it cannot do max/min style logic!!!).",
"timestamp": "2026-03-08 19:25:46",
"media_urls": [],
"reply_to_id": "2030726373124317233",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 9,
"view_count": 1263
}
},
{
"post_id": "2030734135338144038",
"author": "Gindi4711",
"handle": "gindi4711",
"text": "@NOTimothyLottes Did they not just use more historical frames to get their samples and have a better model to compensate for the side effects?",
"timestamp": "2026-03-08 19:55:21",
"media_urls": [],
"reply_to_id": "2030722033286328426",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 506
}
},
{
"post_id": "2030737650882113897",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@gindi4711 Costs went up a lot so maybe. But cannot really add frames of context without getting costly. Secondary option is to store extra data in feedback sideband.",
"timestamp": "2026-03-08 20:09:19",
"media_urls": [],
"reply_to_id": "2030734135338144038",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 458
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2030722033286328426"
}
@@ -0,0 +1,46 @@
---
title: "Most crap-o-grammers today in the user-space C++ bloat-ware domain have not real"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2058166883044516181"
post_id: "2058166883044516181"
timestamp: "2026-05-23 12:43:18"
post_count: 7
reply_count: 0
repost_count: 0
like_count: 1
view_count: 640
---
# @NOTimothyLottes — Most crap-o-grammers today in the user-space C++ bloat-ware domain have not real
## Post 1 (2026-05-23 12:13:57)
Another memorial weekend thought: for either
(a.) single use code - [majority of slopware]
(b.) cold cache code - [also typical of slopware]
the CPU loading the code is a significant amount of the burned memory bandwidth ...
## Post 2 (2026-05-23 12:19:37) — reply to Post 1
Meaning in C/C++ land where "programmers" (or rather slop-rammers) mostly sniff argument sloshing glue, moving to a scatter instead of gather based language with a single common "call" that just overreads all the register args, would likely be significantly faster ...
## Post 3 (2026-05-23 12:23:45) — reply to Post 2
The analog for the syscall side is to work from a 'tape' pointer read the 7 registers (syscall number in rax, and the 6 max args) always from a linear stream, but advance the read pointer by the number of actual registers used. So the overfetch is just a linear prefetch ...
## Post 4 (2026-05-23 12:26:06) — reply to Post 3
If working with only 32-bit args (see the MAP_32BIT comment), it would be efficient. Add a post-syscall address to call in the common syscall loop, the part that does post-syscall logic like scattering data to future argument read slots (aka the scatter part) ...
## Post 5 (2026-05-23 12:35:27) — reply to Post 4
Now if it was possible to uber-op the post call logic, meaning a fixed logic block that is just data configurable, that call goes away, and it's all probably executing instructions out of the cache (at some level) ...
## Post 6 (2026-05-23 12:37:42) — reply to Post 5
Effectively you'd have an 'initialization language' which is designed to workaround cold execution paths, but with linear CPU prefetch friendly data access for reads, and random scatter for stores (where latency don't matter) ...
## Post 7 (2026-05-23 12:43:18) — reply to Post 6
Most crap-o-grammers today in the user-space C++ bloat-ware domain have not really optimized for performance, rather they optimized for maximum bloat generation. Just add up how much the installed libraries weigh in MiB on a clean OS install.
@@ -0,0 +1,118 @@
{
"root_post_id": "2058166883044516181",
"posts": [
{
"post_id": "2058159498716463375",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Another memorial weekend thought: for either \n(a.) single use code - [majority of slopware]\n(b.) cold cache code - [also typical of slopware]\nthe CPU loading the code is a significant amount of the burned memory bandwidth ...",
"timestamp": "2026-05-23 12:13:57",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 8,
"view_count": 1679
}
},
{
"post_id": "2058160921462063183",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Meaning in C/C++ land where \"programmers\" (or rather slop-rammers) mostly sniff argument sloshing glue, moving to a scatter instead of gather based language with a single common \"call\" that just overreads all the register args, would likely be significantly faster ...",
"timestamp": "2026-05-23 12:19:37",
"media_urls": [],
"reply_to_id": "2058159498716463375",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 413
}
},
{
"post_id": "2058161964442866061",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "The analog for the syscall side is to work from a 'tape' pointer read the 7 registers (syscall number in rax, and the 6 max args) always from a linear stream, but advance the read pointer by the number of actual registers used. So the overfetch is just a linear prefetch ...",
"timestamp": "2026-05-23 12:23:45",
"media_urls": [],
"reply_to_id": "2058160921462063183",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 401
}
},
{
"post_id": "2058162553541300497",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "If working with only 32-bit args (see the MAP_32BIT comment), it would be efficient. Add a post-syscall address to call in the common syscall loop, the part that does post-syscall logic like scattering data to future argument read slots (aka the scatter part) ...",
"timestamp": "2026-05-23 12:26:06",
"media_urls": [],
"reply_to_id": "2058161964442866061",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 237
}
},
{
"post_id": "2058164906659066002",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Now if it was possible to uber-op the post call logic, meaning a fixed logic block that is just data configurable, that call goes away, and it's all probably executing instructions out of the cache (at some level) ...",
"timestamp": "2026-05-23 12:35:27",
"media_urls": [],
"reply_to_id": "2058162553541300497",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 188
}
},
{
"post_id": "2058165475033440643",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Effectively you'd have an 'initialization language' which is designed to workaround cold execution paths, but with linear CPU prefetch friendly data access for reads, and random scatter for stores (where latency don't matter) ...",
"timestamp": "2026-05-23 12:37:42",
"media_urls": [],
"reply_to_id": "2058164906659066002",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 666
}
},
{
"post_id": "2058166883044516181",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Most crap-o-grammers today in the user-space C++ bloat-ware domain have not really optimized for performance, rather they optimized for maximum bloat generation. Just add up how much the installed libraries weigh in MiB on a clean OS install.",
"timestamp": "2026-05-23 12:43:18",
"media_urls": [],
"reply_to_id": "2058165475033440643",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 640
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2058166883044516181"
}
@@ -0,0 +1,63 @@
---
title: "https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related re"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2060191401883619479"
post_id: "2060191401883619479"
timestamp: "2026-05-29 02:48:01"
post_count: 12
reply_count: 1
repost_count: 0
like_count: 5
view_count: 242
---
# @NOTimothyLottes — https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related re
## Post 1 (2026-05-29 02:28:17)
Took perhaps a 5 month vacation from at home programming, but getting back in the grove with 1hr/day. Polishing up my WIN32 and Linux system call interfaces. Perhaps working towards a demo of GPU-side audio and network processing.
## Post 2 (2026-05-29 02:39:47) — reply to Post 1
Today's topic was Sleep [crap] vs NtDelayExecution [good], does seem useful to be able to NtAlertThread while a thread is sleeping (an analog to signaling while nanosleeping on Linux).
## Post 3 (2026-05-29 02:43:22) — reply to Post 2
Futex users, there is the WakeByAddressAll and WaitOnAddress in Windows. But why use those when you can just directly call https://ntdoc.m417z.com/rtlwaitonaddress - but haven't tried that yet, and are the docs correct, why PLARGE_INTEGER for ms, when NtDelayExecution does the 100ns unit thing?
## Post 4 (2026-05-29 02:48:01) — reply to Post 3
https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related read, also I'm a little late to the https://ntdoc.m417z.com/system_hypervisor_user_shared_data party, but will have that sorted soon as well
## Post 5 (2026-05-29 02:52:57) — reply to Post 4
Other thought, I typically mmap an extra LOG file, and write via atomic to grab a fixed width line. No stdout. The log wraps around and exists for multiple executions or even parallel processes. It's the way to do it ... BUT ...
## Post 6 (2026-05-29 02:55:54) — reply to Post 5
... I think I'm going to just move the LOG file into the first N KiB of the CART file. So mmap'ed on CPU and GPU, and I can just bank on how "less" doesn't actually load the entire file while printing, so I can still see output on a console if needed for debug.
## Post 7 (2026-05-29 03:02:52) — reply to Post 6
And another random thought, can you force de-power the CPU by abusing the https://www.felixcloutier.com/x86/pause instruction for things that are not spin-loops :) Going to have to try this one at some point.
## Post 8 (2026-05-29 03:05:57) — reply to Post 7
Pushing data to GPU is really a no-brainer (write-combined stores), minus possibility of non-atomic write visibility, so I do simple stuff like always having a ring buffer of packets available where the GPU can validate each entry with a HASH, taking the latest valid one to use
## Post 9 (2026-05-29 03:09:32) — reply to Post 8
Also AMD exports non-cached memory in VK, so it's possible to poll on data the CPU pushes (via write combined stores to VRAM) on AMD a few times per frame even.
## Post 10 (2026-05-29 03:10:49) — reply to Post 9
The workaround for NVIDIA is if one wants to read N times per frame, then the CPU needs to duplicate the packet ring to N separate lines. Then the GPU is free to poll, but using separate cachelines each time.
## Post 11 (2026-05-29 03:14:46) — reply to Post 10
The route back for IO that needs to be routed through the CPU {audio out, network out} is a lot more unfun. AMD again has the nice uncached memory support, so that part is easy. NVIDIA well, would have to take the crappy mid-frame L2 writeback (likely) making CPU-read available
## Post 12 (2026-05-29 03:19:53) — reply to Post 11
Those who have tread here before with driver side logic (DMA transfers/etc) got screwed, Win+Linux driver idiots and their CPU interrupt based scheduling = completely useless. So getting the driver out of the picture is the way to go
@@ -0,0 +1,198 @@
{
"root_post_id": "2060191401883619479",
"posts": [
{
"post_id": "2060186437820010850",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Took perhaps a 5 month vacation from at home programming, but getting back in the grove with 1hr/day. Polishing up my WIN32 and Linux system call interfaces. Perhaps working towards a demo of GPU-side audio and network processing.",
"timestamp": "2026-05-29 02:28:17",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 1,
"like_count": 49,
"view_count": 3893
}
},
{
"post_id": "2060189329801003343",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Today's topic was Sleep [crap] vs NtDelayExecution [good], does seem useful to be able to NtAlertThread while a thread is sleeping (an analog to signaling while nanosleeping on Linux).",
"timestamp": "2026-05-29 02:39:47",
"media_urls": [],
"reply_to_id": "2060186437820010850",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 11,
"view_count": 707
}
},
{
"post_id": "2060190230838223346",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Futex users, there is the WakeByAddressAll and WaitOnAddress in Windows. But why use those when you can just directly call https://ntdoc.m417z.com/rtlwaitonaddress - but haven't tried that yet, and are the docs correct, why PLARGE_INTEGER for ms, when NtDelayExecution does the 100ns unit thing?",
"timestamp": "2026-05-29 02:43:22",
"media_urls": [],
"reply_to_id": "2060189329801003343",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 9,
"view_count": 654
}
},
{
"post_id": "2060191401883619479",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related read, also I'm a little late to the https://ntdoc.m417z.com/system_hypervisor_user_shared_data party, but will have that sorted soon as well",
"timestamp": "2026-05-29 02:48:01",
"media_urls": [],
"reply_to_id": "2060190230838223346",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 5,
"view_count": 242
}
},
{
"post_id": "2060192645582905577",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Other thought, I typically mmap an extra LOG file, and write via atomic to grab a fixed width line. No stdout. The log wraps around and exists for multiple executions or even parallel processes. It's the way to do it ... BUT ...",
"timestamp": "2026-05-29 02:52:57",
"media_urls": [],
"reply_to_id": "2060191401883619479",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 210
}
},
{
"post_id": "2060193385411969118",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "... I think I'm going to just move the LOG file into the first N KiB of the CART file. So mmap'ed on CPU and GPU, and I can just bank on how \"less\" doesn't actually load the entire file while printing, so I can still see output on a console if needed for debug.",
"timestamp": "2026-05-29 02:55:54",
"media_urls": [],
"reply_to_id": "2060192645582905577",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 212
}
},
{
"post_id": "2060195139696365679",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "And another random thought, can you force de-power the CPU by abusing the https://www.felixcloutier.com/x86/pause instruction for things that are not spin-loops :) Going to have to try this one at some point.",
"timestamp": "2026-05-29 03:02:52",
"media_urls": [],
"reply_to_id": "2060193385411969118",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 183
}
},
{
"post_id": "2060195914568851775",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Pushing data to GPU is really a no-brainer (write-combined stores), minus possibility of non-atomic write visibility, so I do simple stuff like always having a ring buffer of packets available where the GPU can validate each entry with a HASH, taking the latest valid one to use",
"timestamp": "2026-05-29 03:05:57",
"media_urls": [],
"reply_to_id": "2060195139696365679",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 5,
"view_count": 176
}
},
{
"post_id": "2060196816574882209",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Also AMD exports non-cached memory in VK, so it's possible to poll on data the CPU pushes (via write combined stores to VRAM) on AMD a few times per frame even.",
"timestamp": "2026-05-29 03:09:32",
"media_urls": [],
"reply_to_id": "2060195914568851775",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 182
}
},
{
"post_id": "2060197138923938169",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "The workaround for NVIDIA is if one wants to read N times per frame, then the CPU needs to duplicate the packet ring to N separate lines. Then the GPU is free to poll, but using separate cachelines each time.",
"timestamp": "2026-05-29 03:10:49",
"media_urls": [],
"reply_to_id": "2060196816574882209",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 239
}
},
{
"post_id": "2060198133905199300",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "The route back for IO that needs to be routed through the CPU {audio out, network out} is a lot more unfun. AMD again has the nice uncached memory support, so that part is easy. NVIDIA well, would have to take the crappy mid-frame L2 writeback (likely) making CPU-read available",
"timestamp": "2026-05-29 03:14:46",
"media_urls": [],
"reply_to_id": "2060197138923938169",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 4,
"view_count": 570
}
},
{
"post_id": "2060199422730871174",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Those who have tread here before with driver side logic (DMA transfers/etc) got screwed, Win+Linux driver idiots and their CPU interrupt based scheduling = completely useless. So getting the driver out of the picture is the way to go",
"timestamp": "2026-05-29 03:19:53",
"media_urls": [],
"reply_to_id": "2060198133905199300",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 4,
"view_count": 508
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2060191401883619479"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,41 @@
---
title: "Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that co"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2060730425929080874"
post_id: "2060730425929080874"
timestamp: "2026-05-30 14:29:54"
post_count: 6
reply_count: 3
repost_count: 0
like_count: 40
view_count: 4744
---
# @NOTimothyLottes — Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that co
## Post 1 (2026-05-30 14:29:54)
Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that conversion of clock counter diff to nanoseconds is simply a MUL instruction fetching the RDX high 64-bit result (of the 128-bit computed). But figuring out how to do the inline asm was a pain.
![Media 1](./media/2060730425929080874_1.png)
## Post 2 (2026-05-30 15:16:24) — reply to Post 1
Looks like NtQuerySystemInformation() with SystemHypervisorSharedPageInformation (aka 0xc5) gives 64-bit scalar for TSC that converts time to units of 10 MHz. So the smart way is to work in units of TSC, then do a subtraction of TSC terms, then MULHI to get {ms, us, or ns} time
## Post 3 (2026-05-30 15:59:17) — reply to Post 2
https://gist.github.com/pmttavara/6f06fc5c7679c07375483b06bb77430c - A great reference for getting TSC scaling multipliers on Linux and Windows
## Post 4 (2026-05-31 00:46:04) — reply to Post 1
@NOTimothyLottes If you do the multiply in uint128_t and then right-shift by 64 places, the compiler should do the right thing.
## Post 5 (2026-05-31 01:37:00) — reply to Post 4
@FUZxxl “Should” is exactly why I prefer the actual instruction instrinsics or just inline asm (which is what I use on C CPU land)
## Post 6 (2026-05-31 08:23:19) — reply to Post 5
@NOTimothyLottes Have fun with a solution that the compiler optimises worse and that is not portable.
@@ -0,0 +1,104 @@
{
"root_post_id": "2060730425929080874",
"posts": [
{
"post_id": "2060730425929080874",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that conversion of clock counter diff to nanoseconds is simply a MUL instruction fetching the RDX high 64-bit result (of the 128-bit computed). But figuring out how to do the inline asm was a pain.",
"timestamp": "2026-05-30 14:29:54",
"media_urls": [
"https://pbs.twimg.com/media/HJku0L4WkAAZk5a?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 0,
"like_count": 40,
"view_count": 4744
}
},
{
"post_id": "2060742129190568413",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Looks like NtQuerySystemInformation() with SystemHypervisorSharedPageInformation (aka 0xc5) gives 64-bit scalar for TSC that converts time to units of 10 MHz. So the smart way is to work in units of TSC, then do a subtraction of TSC terms, then MULHI to get {ms, us, or ns} time",
"timestamp": "2026-05-30 15:16:24",
"media_urls": [],
"reply_to_id": "2060730425929080874",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 6,
"view_count": 1060
}
},
{
"post_id": "2060752921092833490",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "https://gist.github.com/pmttavara/6f06fc5c7679c07375483b06bb77430c - A great reference for getting TSC scaling multipliers on Linux and Windows",
"timestamp": "2026-05-30 15:59:17",
"media_urls": [],
"reply_to_id": "2060742129190568413",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 11,
"view_count": 924
}
},
{
"post_id": "2060885487858880689",
"author": "Robert Clausecker",
"handle": "FUZxxl",
"text": "@NOTimothyLottes If you do the multiply in uint128_t and then right-shift by 64 places, the compiler should do the right thing.",
"timestamp": "2026-05-31 00:46:04",
"media_urls": [],
"reply_to_id": "2060730425929080874",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 253
}
},
{
"post_id": "2060898306851516562",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@FUZxxl “Should” is exactly why I prefer the actual instruction instrinsics or just inline asm (which is what I use on C CPU land)",
"timestamp": "2026-05-31 01:37:00",
"media_urls": [],
"reply_to_id": "2060885487858880689",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 125
}
},
{
"post_id": "2061000558698197386",
"author": "Robert Clausecker",
"handle": "FUZxxl",
"text": "@NOTimothyLottes Have fun with a solution that the compiler optimises worse and that is not portable.",
"timestamp": "2026-05-31 08:23:19",
"media_urls": [],
"reply_to_id": "2060898306851516562",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 27
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2060730425929080874"
}
@@ -0,0 +1,35 @@
---
title: "no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2061123768429211767"
post_id: "2061123768429211767"
timestamp: "2026-05-31 16:32:54"
post_count: 5
reply_count: 2
repost_count: 0
like_count: 9
view_count: 2974
---
# @NOTimothyLottes — no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-
## Post 1 (2026-05-31 16:32:54)
no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-width-height log file with an atomic for multi-thread|process messages - but even that seems too complexy ...
## Post 2 (2026-05-31 16:35:58) — reply to Post 1
moving to this >>> CART file is mmapped on CPU with mapped GPU access (no file IO) - background page walker to ensure OS won't page it out - beginning of CART file is a grid of 32-bit unsigned values - hex dumping that as my 'log file' - either to term or GPU render
## Post 3 (2026-05-31 16:37:34) — reply to Post 2
hits the easy to debug CPU or GPU stuff in the same framework (simply write and it just appears) - it's always a HEX dump, but can show decimal by pretending it's a 4-bit/character terminal with a hex font :)
## Post 4 (2026-05-31 22:01:24) — reply to Post 1
@NOTimothyLottes Here I am still debugging by looking at if a single LED turns on.
## Post 5 (2026-06-01 01:05:59) — reply to Post 4
@retrotink2 That plus an oscilloscope … this is the way
@@ -0,0 +1,86 @@
{
"root_post_id": "2061123768429211767",
"posts": [
{
"post_id": "2061123768429211767",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-width-height log file with an atomic for multi-thread|process messages - but even that seems too complexy ...",
"timestamp": "2026-05-31 16:32:54",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 9,
"view_count": 2974
}
},
{
"post_id": "2061124536729207080",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "moving to this >>> CART file is mmapped on CPU with mapped GPU access (no file IO) - background page walker to ensure OS won't page it out - beginning of CART file is a grid of 32-bit unsigned values - hex dumping that as my 'log file' - either to term or GPU render",
"timestamp": "2026-05-31 16:35:58",
"media_urls": [],
"reply_to_id": "2061123768429211767",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 569
}
},
{
"post_id": "2061124942968545433",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "hits the easy to debug CPU or GPU stuff in the same framework (simply write and it just appears) - it's always a HEX dump, but can show decimal by pretending it's a 4-bit/character terminal with a hex font :)",
"timestamp": "2026-05-31 16:37:34",
"media_urls": [],
"reply_to_id": "2061124536729207080",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 543
}
},
{
"post_id": "2061206435942511008",
"author": "Mike Chi",
"handle": "retrotink2",
"text": "@NOTimothyLottes Here I am still debugging by looking at if a single LED turns on.",
"timestamp": "2026-05-31 22:01:24",
"media_urls": [],
"reply_to_id": "2061123768429211767",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 7,
"view_count": 1667
}
},
{
"post_id": "2061252886453944549",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@retrotink2 That plus an oscilloscope … this is the way",
"timestamp": "2026-06-01 01:05:59",
"media_urls": [],
"reply_to_id": "2061206435942511008",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 107
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2061123768429211767"
}
@@ -0,0 +1,31 @@
---
title: "Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2061416116694442141"
post_id: "2061416116694442141"
timestamp: "2026-06-01 11:54:36"
post_count: 4
reply_count: 2
repost_count: 0
like_count: 10
view_count: 1196
---
# @NOTimothyLottes — Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the
## Post 1 (2026-06-01 11:54:36)
Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the (fake)"Realtime" class -BUT- apparently there is AvSetMmThreadCharacteristics() for "Pro Audio" and AvSetMmThreadPriority() which can bring up priority into realtime. Curious if games using today?
## Post 2 (2026-06-01 11:56:24) — reply to Post 1
Either way NtSetInformationThread() seems to be the way to just set {1-15} (non-realtime class) priority directly without the silly clamp(priorityClassBase+threadPriority,1,15) business
## Post 3 (2026-06-02 03:59:06) — reply to Post 1
@NOTimothyLottes I dont think your even suppose to change your threads priority in general anymore, it just messes with scheduling.
## Post 4 (2026-06-02 10:32:37) — reply to Post 3
@iamwhosiam Try using low latency pro audio tools and disabling the apps authorization for high priority scheduling
@@ -0,0 +1,70 @@
{
"root_post_id": "2061416116694442141",
"posts": [
{
"post_id": "2061416116694442141",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the (fake)\"Realtime\" class -BUT- apparently there is AvSetMmThreadCharacteristics() for \"Pro Audio\" and AvSetMmThreadPriority() which can bring up priority into realtime. Curious if games using today?",
"timestamp": "2026-06-01 11:54:36",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 10,
"view_count": 1196
}
},
{
"post_id": "2061416572627886473",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Either way NtSetInformationThread() seems to be the way to just set {1-15} (non-realtime class) priority directly without the silly clamp(priorityClassBase+threadPriority,1,15) business",
"timestamp": "2026-06-01 11:56:24",
"media_urls": [],
"reply_to_id": "2061416116694442141",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 3,
"view_count": 455
}
},
{
"post_id": "2061658841360589225",
"author": "Ant Toe Knee",
"handle": "iamwhosiam",
"text": "@NOTimothyLottes I dont think your even suppose to change your threads priority in general anymore, it just messes with scheduling.",
"timestamp": "2026-06-02 03:59:06",
"media_urls": [],
"reply_to_id": "2061416116694442141",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 31
}
},
{
"post_id": "2061757874297065775",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@iamwhosiam Try using low latency pro audio tools and disabling the apps authorization for high priority scheduling",
"timestamp": "2026-06-02 10:32:37",
"media_urls": [],
"reply_to_id": "2061658841360589225",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 26
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2061416116694442141"
}
@@ -0,0 +1,19 @@
---
title: "It's unfortunate there isn't an easy way to map the page file so that writes don"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2061933917137932437"
post_id: "2061933917137932437"
timestamp: "2026-06-02 22:12:09"
post_count: 1
reply_count: 0
repost_count: 1
like_count: 11
view_count: 1002
---
# @NOTimothyLottes — It's unfortunate there isn't an easy way to map the page file so that writes don
## Post 1 (2026-06-02 22:12:09)
It's unfortunate there isn't an easy way to map the page file so that writes don't automagically post to storage, meaning map then turn off flush until a time desired by the programmer.
@@ -0,0 +1,22 @@
{
"root_post_id": "2061933917137932437",
"posts": [
{
"post_id": "2061933917137932437",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "It's unfortunate there isn't an easy way to map the page file so that writes don't automagically post to storage, meaning map then turn off flush until a time desired by the programmer.",
"timestamp": "2026-06-02 22:12:09",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 1,
"like_count": 11,
"view_count": 1002
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2061933917137932437"
}
@@ -0,0 +1,23 @@
---
title: "For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_P"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2061937134756380682"
post_id: "2061937134756380682"
timestamp: "2026-06-02 22:24:56"
post_count: 2
reply_count: 1
repost_count: 0
like_count: 12
view_count: 1118
---
# @NOTimothyLottes — For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_P
## Post 1 (2026-06-02 22:24:56)
For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_PRIORITY_{IDLE,NORMAL,TIME_CRITICAL}. Which maps to {1, 13, 15} respectively. Then trying "Pro Audio" hack with AVRT to get whatever that gives in the 16-31 fake "realtime" bracket for highest.
## Post 2 (2026-06-02 22:27:06) — reply to Post 1
Linux mapping will be {SCHED_IDLE, SCHED_OTHER with 2 settings of nice} to match. Unfortunately SCHED_FIFO is locked out by default, but if the user blesses the right permissions will get better audio latency. Maybe pause/unpause will trigger auto latency re-adaption.
@@ -0,0 +1,38 @@
{
"root_post_id": "2061937134756380682",
"posts": [
{
"post_id": "2061937134756380682",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_PRIORITY_{IDLE,NORMAL,TIME_CRITICAL}. Which maps to {1, 13, 15} respectively. Then trying \"Pro Audio\" hack with AVRT to get whatever that gives in the 16-31 fake \"realtime\" bracket for highest.",
"timestamp": "2026-06-02 22:24:56",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 12,
"view_count": 1118
}
},
{
"post_id": "2061937679575429246",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Linux mapping will be {SCHED_IDLE, SCHED_OTHER with 2 settings of nice} to match. Unfortunately SCHED_FIFO is locked out by default, but if the user blesses the right permissions will get better audio latency. Maybe pause/unpause will trigger auto latency re-adaption.",
"timestamp": "2026-06-02 22:27:06",
"media_urls": [],
"reply_to_id": "2061937134756380682",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 5,
"view_count": 595
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2061937134756380682"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

@@ -0,0 +1,21 @@
---
title: "Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2062031187023982879"
post_id: "2062031187023982879"
timestamp: "2026-06-03 04:38:40"
post_count: 1
reply_count: 0
repost_count: 0
like_count: 29
view_count: 1679
---
# @NOTimothyLottes — Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i
## Post 1 (2026-06-03 04:38:40)
Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i60 for NTSC. Using my 'right' font. Fully decoupling from all system calls for time is working out great. And yes I'm using all the stuff I talked about in my Advanced Aliasing talk too (joy to code).
![Media 1](./media/2062031187023982879_1.png)
@@ -0,0 +1,24 @@
{
"root_post_id": "2062031187023982879",
"posts": [
{
"post_id": "2062031187023982879",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i60 for NTSC. Using my 'right' font. Fully decoupling from all system calls for time is working out great. And yes I'm using all the stuff I talked about in my Advanced Aliasing talk too (joy to code).",
"timestamp": "2026-06-03 04:38:40",
"media_urls": [
"https://pbs.twimg.com/media/HJ3Ny2wX0AAKFFv?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 29,
"view_count": 1679
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2062031187023982879"
}
@@ -0,0 +1,47 @@
---
title: "So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine "
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2064858927829745887"
post_id: "2064858927829745887"
timestamp: "2026-06-10 23:55:06"
post_count: 8
reply_count: 4
repost_count: 0
like_count: 7
view_count: 2234
---
# @NOTimothyLottes — So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine
## Post 1 (2026-06-10 23:55:06)
So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine (pre-installed). Need to re-learn enough to be able to make responsible choices on a new install. First up what init system to do? {openrc, runit, s6, or dinit}.
## Post 2 (2026-06-11 00:22:20) — reply to Post 1
@NOTimothyLottes My patience is this 🤏 thin with win11 right now, but Linux sounds like too much work, Mac is probably easier with more native software
## Post 3 (2026-06-11 00:36:20) — reply to Post 1
'dinit' is out (no C++ for me) - so runit wins by default [also future desire to run busybox, so it's the natural choice]
## Post 4 (2026-06-11 01:00:16) — reply to Post 1
@NOTimothyLottes fascinating to me how this challenge would have captivated me a couple decades ago but now i just wanna run away
## Post 5 (2026-06-11 01:06:28) — reply to Post 4
@mcnabbd Similar feelings. Used to build linux from scratch in the BIOS era, also ran FreeBSD/etc, just for fun. But things had been easier then. Now years of technical debt later, all my tolerance for complexity has been fully exhausted.
## Post 6 (2026-06-11 01:10:19) — reply to Post 1
Going to give artix-lxqt-runit variation a try. Mostly just a stop gap to see if I can actually get a bloated Linux system installed before a more serious effort with BuildRoot. First de-windows victim computer will be an AMD powered APU.
## Post 7 (2026-06-11 02:47:54) — reply to Post 6
Looks like the workaround for my locked UEFI secure boot Enabled on the second machine was to "Set Supervisor Password", afterwords I could disable secure boot and APM, but still no way to enable legacy BIOS "Boot Mode".
## Post 8 (2026-06-11 04:07:09) — reply to Post 7
Somewhat surprised, Artix using the graphical install just worked out of the box (AMD APU). Got confused post install when 'top' shows 'Xorg' instead of 'XLibre' but the package manager says XLibre is installed.
@@ -0,0 +1,134 @@
{
"root_post_id": "2064858927829745887",
"posts": [
{
"post_id": "2064858927829745887",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine (pre-installed). Need to re-learn enough to be able to make responsible choices on a new install. First up what init system to do? {openrc, runit, s6, or dinit}.",
"timestamp": "2026-06-10 23:55:06",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 4,
"repost_count": 0,
"like_count": 7,
"view_count": 2234
}
},
{
"post_id": "2064865782870294858",
"author": "🕹️G🅰MESTUFFS🎮",
"handle": "RouaniJihad",
"text": "@NOTimothyLottes My patience is this 🤏 thin with win11 right now, but Linux sounds like too much work, Mac is probably easier with more native software",
"timestamp": "2026-06-11 00:22:20",
"media_urls": [],
"reply_to_id": "2064858927829745887",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 115
}
},
{
"post_id": "2064869304294641903",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "'dinit' is out (no C++ for me) - so runit wins by default [also future desire to run busybox, so it's the natural choice]",
"timestamp": "2026-06-11 00:36:20",
"media_urls": [],
"reply_to_id": "2064858927829745887",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 337
}
},
{
"post_id": "2064875327617396915",
"author": "Doug McNabb",
"handle": "mcnabbd",
"text": "@NOTimothyLottes fascinating to me how this challenge would have captivated me a couple decades ago but now i just wanna run away",
"timestamp": "2026-06-11 01:00:16",
"media_urls": [],
"reply_to_id": "2064858927829745887",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 187
}
},
{
"post_id": "2064876889177457052",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@mcnabbd Similar feelings. Used to build linux from scratch in the BIOS era, also ran FreeBSD/etc, just for fun. But things had been easier then. Now years of technical debt later, all my tolerance for complexity has been fully exhausted.",
"timestamp": "2026-06-11 01:06:28",
"media_urls": [],
"reply_to_id": "2064875327617396915",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 199
}
},
{
"post_id": "2064877857252291055",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Going to give artix-lxqt-runit variation a try. Mostly just a stop gap to see if I can actually get a bloated Linux system installed before a more serious effort with BuildRoot. First de-windows victim computer will be an AMD powered APU.",
"timestamp": "2026-06-11 01:10:19",
"media_urls": [],
"reply_to_id": "2064858927829745887",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 792
}
},
{
"post_id": "2064902414243631277",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Looks like the workaround for my locked UEFI secure boot Enabled on the second machine was to \"Set Supervisor Password\", afterwords I could disable secure boot and APM, but still no way to enable legacy BIOS \"Boot Mode\".",
"timestamp": "2026-06-11 02:47:54",
"media_urls": [],
"reply_to_id": "2064877857252291055",
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 0,
"like_count": 3,
"view_count": 828
}
},
{
"post_id": "2064922357186077053",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Somewhat surprised, Artix using the graphical install just worked out of the box (AMD APU). Got confused post install when 'top' shows 'Xorg' instead of 'XLibre' but the package manager says XLibre is installed.",
"timestamp": "2026-06-11 04:07:09",
"media_urls": [],
"reply_to_id": "2064902414243631277",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 419
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2064858927829745887"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

@@ -0,0 +1,82 @@
---
title: "Nanorc done and back to actual programming with the new font. The iPhone cannot "
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2065804972378243476"
post_id: "2065804972378243476"
timestamp: "2026-06-13 14:34:20"
post_count: 15
reply_count: 5
repost_count: 0
like_count: 23
view_count: 2435
---
# @NOTimothyLottes — Nanorc done and back to actual programming with the new font. The iPhone cannot
## Post 1 (2026-06-13 14:34:20)
Nanorc done and back to actual programming with the new font. The iPhone cannot seem to correctly capture a CRT anymore … and yes my _ is … and my ; is a 5 dot vertical line (prefer that for C/GLSL coding)
![Media 1](./media/2065804972378243476_1.jpg)
## Post 2 (2026-06-13 14:41:47) — reply to Post 1
Thankfully I can still dedecorate the term window to focus lines for useful content. Practically speaking I almost have a new language implemented in C via typedefs and macros … back to building and testing the native Linux system level interface
![Media 1](./media/2065806847634776401_1.jpg)
## Post 3 (2026-06-13 14:53:50) — reply to Post 2
Lubbers are invading my screen
![Media 1](./media/2065809876488503805_1.jpg)
## Post 4 (2026-06-13 17:26:52) — reply to Post 1
@NOTimothyLottes Why are you using CRT
## Post 5 (2026-06-13 17:33:27) — reply to Post 4
@quiveron_x Still the best display technology IMO. Low persistence, analog, variable resolution, smooth continuous blended signal, deep blacks, great contrast, etc.
## Post 6 (2026-06-13 17:38:55) — reply to Post 5
I completely agree, I asked because I was wondering if you were planning on doing something specific.
I think we gave up on them too early, they felt good to use, pleasant to look at, only negative side is they were too heavy. People obsessing over resolution don't realize if image is shit it doesn't matter if it's 4k or 8k
## Post 7 (2026-06-13 17:50:25) — reply to Post 1
@NOTimothyLottes you can use camac (free) to take raw photos on iphone without post-processing shit
## Post 8 (2026-06-13 19:02:00) — reply to Post 7
@eternalclassic_ Will have to try that thanks
## Post 9 (2026-06-13 19:58:56) — reply to Post 1
@NOTimothyLottes Hz sharing? I wonder if CRTs can be changed like 60 -> 59 Hz, and if that would correct it? I do not know whether any is correct, but I'd betcha there's some kinda thing there about that. Why would the iphone has .. no it's not mechanical, so I have no clue but that is a puzzle
## Post 10 (2026-06-14 08:16:56) — reply to Post 1
@NOTimothyLottes ohh what is that? a 2070SB?
## Post 11 (2026-06-14 15:33:59) — reply to Post 10
@mayemayey FP2141SB
## Post 12 (2026-06-14 16:40:53) — reply to Post 11
@NOTimothyLottes yep. that's a rebranded 2070sb haha. there's an hsync/vsync (~152khz, 254hz) overclocking tutorial if you ever feel daring enough to. 😉
## Post 13 (2026-06-14 20:44:08) — reply to Post 12
@mayemayey Those crazy refresh rates are long past diminishing returns though due to the fixed phosphor decay. Great display, only big flaw is the vertical nonlinearity at the extreme top and bottom.
## Post 14 (2026-06-15 06:11:27) — reply to Post 13
@NOTimothyLottes do you have any blurriness in the corners?
## Post 15 (2026-06-15 13:06:28) — reply to Post 14
@mayemayey It might if I ran it at peak resolutions but I mostly stick to higher refresh rates instead, so wouldnt notice.
@@ -0,0 +1,252 @@
{
"root_post_id": "2065804972378243476",
"posts": [
{
"post_id": "2065804972378243476",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Nanorc done and back to actual programming with the new font. The iPhone cannot seem to correctly capture a CRT anymore … and yes my _ is … and my ; is a 5 dot vertical line (prefer that for C/GLSL coding)",
"timestamp": "2026-06-13 14:34:20",
"media_urls": [
"https://pbs.twimg.com/media/HKs2q8RXQAAVsjN?format=jpg&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 5,
"repost_count": 0,
"like_count": 23,
"view_count": 2435
}
},
{
"post_id": "2065806847634776401",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Thankfully I can still dedecorate the term window to focus lines for useful content. Practically speaking I almost have a new language implemented in C via typedefs and macros … back to building and testing the native Linux system level interface",
"timestamp": "2026-06-13 14:41:47",
"media_urls": [
"https://pbs.twimg.com/media/HKs4YE5WMAAfe6G?format=jpg&name=orig"
],
"reply_to_id": "2065804972378243476",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 1,
"like_count": 7,
"view_count": 929
}
},
{
"post_id": "2065809876488503805",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Lubbers are invading my screen",
"timestamp": "2026-06-13 14:53:50",
"media_urls": [
"https://pbs.twimg.com/media/HKs7IJHWMAAwzVL?format=jpg&name=orig"
],
"reply_to_id": "2065806847634776401",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 3,
"view_count": 692
}
},
{
"post_id": "2065848389875458358",
"author": "Quiveron",
"handle": "quiveron_x",
"text": "@NOTimothyLottes Why are you using CRT",
"timestamp": "2026-06-13 17:26:52",
"media_urls": [],
"reply_to_id": "2065804972378243476",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 94
}
},
{
"post_id": "2065850045975474547",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@quiveron_x Still the best display technology IMO. Low persistence, analog, variable resolution, smooth continuous blended signal, deep blacks, great contrast, etc.",
"timestamp": "2026-06-13 17:33:27",
"media_urls": [],
"reply_to_id": "2065848389875458358",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 133
}
},
{
"post_id": "2065851423489937868",
"author": "Quiveron",
"handle": "quiveron_x",
"text": "I completely agree, I asked because I was wondering if you were planning on doing something specific.\nI think we gave up on them too early, they felt good to use, pleasant to look at, only negative side is they were too heavy. People obsessing over resolution don't realize if image is shit it doesn't matter if it's 4k or 8k",
"timestamp": "2026-06-13 17:38:55",
"media_urls": [],
"reply_to_id": "2065850045975474547",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 50
}
},
{
"post_id": "2065854318817816626",
"author": "eternal classic",
"handle": "eternalclassic_",
"text": "@NOTimothyLottes you can use camac (free) to take raw photos on iphone without post-processing shit",
"timestamp": "2026-06-13 17:50:25",
"media_urls": [],
"reply_to_id": "2065804972378243476",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 657
}
},
{
"post_id": "2065872329402442195",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@eternalclassic_ Will have to try that thanks",
"timestamp": "2026-06-13 19:02:00",
"media_urls": [],
"reply_to_id": "2065854318817816626",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 67
}
},
{
"post_id": "2065886660747796581",
"author": "OZ",
"handle": "winning_tactic",
"text": "@NOTimothyLottes Hz sharing? I wonder if CRTs can be changed like 60 -> 59 Hz, and if that would correct it? I do not know whether any is correct, but I'd betcha there's some kinda thing there about that. Why would the iphone has .. no it's not mechanical, so I have no clue but that is a puzzle",
"timestamp": "2026-06-13 19:58:56",
"media_urls": [],
"reply_to_id": "2065804972378243476",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 53
}
},
{
"post_id": "2066072383954288814",
"author": "Name cannot be blank",
"handle": "mayemayey",
"text": "@NOTimothyLottes ohh what is that? a 2070SB?",
"timestamp": "2026-06-14 08:16:56",
"media_urls": [],
"reply_to_id": "2065804972378243476",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 37
}
},
{
"post_id": "2066182371808776318",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@mayemayey FP2141SB",
"timestamp": "2026-06-14 15:33:59",
"media_urls": [],
"reply_to_id": "2066072383954288814",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 20
}
},
{
"post_id": "2066199206457495922",
"author": "Name cannot be blank",
"handle": "mayemayey",
"text": "@NOTimothyLottes yep. that's a rebranded 2070sb haha. there's an hsync/vsync (~152khz, 254hz) overclocking tutorial if you ever feel daring enough to. 😉",
"timestamp": "2026-06-14 16:40:53",
"media_urls": [],
"reply_to_id": "2066182371808776318",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 25
}
},
{
"post_id": "2066260423540675020",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@mayemayey Those crazy refresh rates are long past diminishing returns though due to the fixed phosphor decay. Great display, only big flaw is the vertical nonlinearity at the extreme top and bottom.",
"timestamp": "2026-06-14 20:44:08",
"media_urls": [],
"reply_to_id": "2066199206457495922",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 18
}
},
{
"post_id": "2066403191860732086",
"author": "Name cannot be blank",
"handle": "mayemayey",
"text": "@NOTimothyLottes do you have any blurriness in the corners?",
"timestamp": "2026-06-15 06:11:27",
"media_urls": [],
"reply_to_id": "2066260423540675020",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 9
}
},
{
"post_id": "2066507632307847327",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@mayemayey It might if I ran it at peak resolutions but I mostly stick to higher refresh rates instead, so wouldnt notice.",
"timestamp": "2026-06-15 13:06:28",
"media_urls": [],
"reply_to_id": "2066403191860732086",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 16
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2065804972378243476"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@@ -0,0 +1,30 @@
---
title: "Cross compilation is up. Just like on windows with GCC I have to disable all war"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2065832746757341482"
post_id: "2065832746757341482"
timestamp: "2026-06-13 16:24:42"
post_count: 3
reply_count: 2
repost_count: 1
like_count: 10
view_count: 1842
---
# @NOTimothyLottes — Cross compilation is up. Just like on windows with GCC I have to disable all war
## Post 1 (2026-06-13 16:24:42)
Cross compilation is up. Just like on windows with GCC I have to disable all warnings because there is no way to turn off “function called through a non-compatible type”. They obviously should have had warning IDs and an ID based disable.
![Media 1](./media/2065832746757341482_1.jpg)
![Media 2](./media/2065832746757341482_2.jpg)
## Post 2 (2026-06-13 16:28:22) — reply to Post 1
Found my first of perhaps many Wine “fix me”s looks like they didnt emulate NtQuerySystemInformation() for use to get the TSC time scalar. Also implies all PC devs do this wrong, else Valve would have had this implemented already.
## Post 3 (2026-06-13 21:30:40) — reply to Post 1
@NOTimothyLottes Interesting font, does it have a name?
@@ -0,0 +1,57 @@
{
"root_post_id": "2065832746757341482",
"posts": [
{
"post_id": "2065832746757341482",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Cross compilation is up. Just like on windows with GCC I have to disable all warnings because there is no way to turn off “function called through a non-compatible type”. They obviously should have had warning IDs and an ID based disable.",
"timestamp": "2026-06-13 16:24:42",
"media_urls": [
"https://pbs.twimg.com/media/HKtP7aQXsAAtJ5X?format=jpg&name=orig",
"https://pbs.twimg.com/media/HKtP7aTWEAAC_j4?format=jpg&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 1,
"like_count": 10,
"view_count": 1842
}
},
{
"post_id": "2065833669516816492",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Found my first of perhaps many Wine “fix me”s looks like they didnt emulate NtQuerySystemInformation() for use to get the TSC time scalar. Also implies all PC devs do this wrong, else Valve would have had this implemented already.",
"timestamp": "2026-06-13 16:28:22",
"media_urls": [],
"reply_to_id": "2065832746757341482",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 758
}
},
{
"post_id": "2065909746536747274",
"author": "Tom Keresztes",
"handle": "tomcr2100",
"text": "@NOTimothyLottes Interesting font, does it have a name?",
"timestamp": "2026-06-13 21:30:40",
"media_urls": [],
"reply_to_id": "2065832746757341482",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 75
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2065832746757341482"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 525 KiB

@@ -0,0 +1,25 @@
---
title: "@axelgneiting The glibc implementation would do that. I bypass libc and just do "
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2065872197147578751"
post_id: "2065872197147578751"
timestamp: "2026-06-13 19:01:28"
post_count: 2
reply_count: 0
repost_count: 0
like_count: 2
view_count: 198
---
# @NOTimothyLottes — @axelgneiting The glibc implementation would do that. I bypass libc and just do
## Post 1 (2026-06-13 16:54:17)
Interesting how on this Linux box, scheduling NOPs like nanosleep of 0 and futex waiting on an already set memory location … both take around 60 microseconds, cannot afford to do many of those per millisecond. Food for thought for high fps targets
## Post 2 (2026-06-13 19:01:28)
@axelgneiting The glibc implementation would do that. I bypass libc and just do it manually with perf_event_open syscall and mmap.
![Media 1](./media/2065872197147578751_1.jpg)
@@ -0,0 +1,40 @@
{
"root_post_id": "2065872197147578751",
"posts": [
{
"post_id": "2065840191340707905",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Interesting how on this Linux box, scheduling NOPs like nanosleep of 0 and futex waiting on an already set memory location … both take around 60 microseconds, cannot afford to do many of those per millisecond. Food for thought for high fps targets",
"timestamp": "2026-06-13 16:54:17",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 5,
"repost_count": 0,
"like_count": 14,
"view_count": 3434
}
},
{
"post_id": "2065872197147578751",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@axelgneiting The glibc implementation would do that. I bypass libc and just do it manually with perf_event_open syscall and mmap.",
"timestamp": "2026-06-13 19:01:28",
"media_urls": [
"https://pbs.twimg.com/media/HKtzz5RXcAA6CIX?format=jpg&name=orig"
],
"reply_to_id": "2065851939917906296",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 198
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2065872197147578751"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

@@ -0,0 +1,45 @@
---
title: "On Linux I do speculative pinning of CPU memory via mlockall. Learned that later"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2066184005632786736"
post_id: "2066184005632786736"
timestamp: "2026-06-14 15:40:29"
post_count: 7
reply_count: 3
repost_count: 0
like_count: 16
view_count: 1809
---
# @NOTimothyLottes — On Linux I do speculative pinning of CPU memory via mlockall. Learned that later
## Post 1 (2026-06-14 15:40:29)
On Linux I do speculative pinning of CPU memory via mlockall. Learned that later Linux actually allows some amount of pinned memory without admin. So this is succeeding on my new Artix box.
![Media 1](./media/2066184005632786736_1.jpg)
## Post 2 (2026-06-14 16:07:46) — reply to Post 1
@NOTimothyLottes Running in CRT or are you emulating scanlines in your editor?
## Post 3 (2026-06-15 09:29:47) — reply to Post 1
@NOTimothyLottes Also this font is cursed
## Post 4 (2026-06-15 10:18:32) — reply to Post 1
@NOTimothyLottes There is 0 chance you actually use this font. It's for the meme, right?
## Post 5 (2026-06-15 13:09:27) — reply to Post 4
@GrowlerEnjooyer Oh I definitely use this font, was designed to be extremely easy to visually parse for code.
## Post 6 (2026-06-15 13:19:48) — reply to Post 5
@NOTimothyLottes Bravo, well played Mr troll
## Post 7 (2026-06-15 16:21:24) — reply to Post 6
@GrowlerEnjooyer Not trolling, actually do use the font for my terminals on that dev box
@@ -0,0 +1,120 @@
{
"root_post_id": "2066184005632786736",
"posts": [
{
"post_id": "2066184005632786736",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "On Linux I do speculative pinning of CPU memory via mlockall. Learned that later Linux actually allows some amount of pinned memory without admin. So this is succeeding on my new Artix box.",
"timestamp": "2026-06-14 15:40:29",
"media_urls": [
"https://pbs.twimg.com/media/HKyPZnfWMAAv4qF?format=jpg&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 0,
"like_count": 16,
"view_count": 1809
}
},
{
"post_id": "2066190873235206299",
"author": "Fleißiges Lieschen",
"handle": "Social_Vulture",
"text": "@NOTimothyLottes Running in CRT or are you emulating scanlines in your editor?",
"timestamp": "2026-06-14 16:07:46",
"media_urls": [],
"reply_to_id": "2066184005632786736",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 124
}
},
{
"post_id": "2066453103344292290",
"author": "sadhu",
"handle": "sadhuIGI",
"text": "@NOTimothyLottes Also this font is cursed",
"timestamp": "2026-06-15 09:29:47",
"media_urls": [],
"reply_to_id": "2066184005632786736",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 3,
"view_count": 35
}
},
{
"post_id": "2066465370689732716",
"author": "EA-18G Growler Enjoyer",
"handle": "GrowlerEnjooyer",
"text": "@NOTimothyLottes There is 0 chance you actually use this font. It's for the meme, right?",
"timestamp": "2026-06-15 10:18:32",
"media_urls": [],
"reply_to_id": "2066184005632786736",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 60
}
},
{
"post_id": "2066508385600598172",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@GrowlerEnjooyer Oh I definitely use this font, was designed to be extremely easy to visually parse for code.",
"timestamp": "2026-06-15 13:09:27",
"media_urls": [],
"reply_to_id": "2066465370689732716",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 28
}
},
{
"post_id": "2066510991014432852",
"author": "EA-18G Growler Enjoyer",
"handle": "GrowlerEnjooyer",
"text": "@NOTimothyLottes Bravo, well played Mr troll",
"timestamp": "2026-06-15 13:19:48",
"media_urls": [],
"reply_to_id": "2066508385600598172",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 21
}
},
{
"post_id": "2066556689483002354",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@GrowlerEnjooyer Not trolling, actually do use the font for my terminals on that dev box",
"timestamp": "2026-06-15 16:21:24",
"media_urls": [],
"reply_to_id": "2066510991014432852",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 13
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2066184005632786736"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

@@ -0,0 +1,49 @@
---
title: "Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2070337342854832468"
post_id: "2070337342854832468"
timestamp: "2026-06-26 02:44:22"
post_count: 8
reply_count: 2
repost_count: 1
like_count: 16
view_count: 2149
---
# @NOTimothyLottes — Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can
## Post 1 (2026-06-26 02:44:22)
Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can amplify kernel transitions]. For UDP stuff blocking {sendmmsg,recvmmsg (with timeout)} amortizes out kernel transitions.
![Media 1](./media/2070337342854832468_1.png)
## Post 2 (2026-06-26 02:48:15) — reply to Post 1
sendmmsg/recvmmsg can only work with 1024 packets at a time unfortunately. Youve gotta loop them. While theyre surprisingly fairly deterministic in execution times, their throughput isnt the best. The Linux kernel takes far longer to process sending the packets out than my own code does to process the sim and build the packets in the first place lol.
## Post 3 (2026-06-26 03:07:37) — reply to Post 2
@AgileJebrim Yes 1024 max, so best case 1/1024 the syscall count (well factored). As for overhead, for a co-located server you could always hijack the network card driver and just move your server into it and run kernel side if you really wanted to.
## Post 4 (2026-06-26 03:08:39) — reply to Post 3
@NOTimothyLottes If you want to be locked in to a particular NIC yeah.
## Post 5 (2026-06-26 07:28:39) — reply to Post 4
@AgileJebrim @NOTimothyLottes You can use eBPF as a poor man's kernel bypass.
## Post 6 (2026-06-26 07:38:00) — reply to Post 1
@NOTimothyLottes Take a look at http://lalists.stanford.edu/lad/2001/Nov/0248.html
## Post 7 (2026-06-26 10:58:14) — reply to Post 5
@aepau2 @AgileJebrim Not that any of my source would pass their nanny tester. When I was younger and running my own business, I used to host my business website off of a really old laptop running an in-kernel web server that I wrote. It wasnt that hard to do long ago.
## Post 8 (2026-06-26 11:45:37) — reply to Post 7
@NOTimothyLottes @aepau2 eBPF doesnt support SIMD lol
@@ -0,0 +1,136 @@
{
"root_post_id": "2070337342854832468",
"posts": [
{
"post_id": "2070337342854832468",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can amplify kernel transitions]. For UDP stuff blocking {sendmmsg,recvmmsg (with timeout)} amortizes out kernel transitions.",
"timestamp": "2026-06-26 02:44:22",
"media_urls": [
"https://pbs.twimg.com/media/HLtP4RgWgAADbir?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 1,
"like_count": 16,
"view_count": 2149
}
},
{
"post_id": "2070338320765165758",
"author": "Jebrim",
"handle": "AgileJebrim",
"text": "sendmmsg/recvmmsg can only work with 1024 packets at a time unfortunately. Youve gotta loop them. While theyre surprisingly fairly deterministic in execution times, their throughput isnt the best. The Linux kernel takes far longer to process sending the packets out than my own code does to process the sim and build the packets in the first place lol.",
"timestamp": "2026-06-26 02:48:15",
"media_urls": [],
"reply_to_id": "2070337342854832468",
"quote_of_id": null,
"metrics": {
"reply_count": 4,
"repost_count": 0,
"like_count": 7,
"view_count": 469
}
},
{
"post_id": "2070343193963397129",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@AgileJebrim Yes 1024 max, so best case 1/1024 the syscall count (well factored). As for overhead, for a co-located server you could always hijack the network card driver and just move your server into it and run kernel side if you really wanted to.",
"timestamp": "2026-06-26 03:07:37",
"media_urls": [],
"reply_to_id": "2070338320765165758",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 192
}
},
{
"post_id": "2070343454048039360",
"author": "Jebrim",
"handle": "AgileJebrim",
"text": "@NOTimothyLottes If you want to be locked in to a particular NIC yeah.",
"timestamp": "2026-06-26 03:08:39",
"media_urls": [],
"reply_to_id": "2070343193963397129",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 109
}
},
{
"post_id": "2070408887455420544",
"author": "aeesz4",
"handle": "aepau2",
"text": "@AgileJebrim @NOTimothyLottes You can use eBPF as a poor man's kernel bypass.",
"timestamp": "2026-06-26 07:28:39",
"media_urls": [],
"reply_to_id": "2070343454048039360",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 51
}
},
{
"post_id": "2070411240514420892",
"author": "Lee Revell",
"handle": "BigP4P4Smurf",
"text": "@NOTimothyLottes Take a look at http://lalists.stanford.edu/lad/2001/Nov/0248.html",
"timestamp": "2026-06-26 07:38:00",
"media_urls": [],
"reply_to_id": "2070337342854832468",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 42
}
},
{
"post_id": "2070461630165532941",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@aepau2 @AgileJebrim Not that any of my source would pass their nanny tester. When I was younger and running my own business, I used to host my business website off of a really old laptop running an in-kernel web server that I wrote. It wasnt that hard to do long ago.",
"timestamp": "2026-06-26 10:58:14",
"media_urls": [],
"reply_to_id": "2070408887455420544",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 102
}
},
{
"post_id": "2070473555070836962",
"author": "Jebrim",
"handle": "AgileJebrim",
"text": "@NOTimothyLottes @aepau2 eBPF doesnt support SIMD lol",
"timestamp": "2026-06-26 11:45:37",
"media_urls": [],
"reply_to_id": "2070461630165532941",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 76
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2070337342854832468"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,27 @@
---
title: "Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by b"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2070734717825986566"
post_id: "2070734717825986566"
timestamp: "2026-06-27 05:03:23"
post_count: 2
reply_count: 1
repost_count: 0
like_count: 11
view_count: 1624
---
# @NOTimothyLottes — Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by b
## Post 1 (2026-06-27 05:03:23)
Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by boiler plate and complexity. Tinyalsa isn't much better. Likely easier to think about this from perspective of devices that can be open()ed from /dev/snd. On my machine doesn't seem to hot plug
![Media 1](./media/2070734717825986566_1.png)
## Post 2 (2026-06-27 05:07:23) — reply to Post 1
Assuming 'p'&'c' are PLAYBACK & CAPTURE, so opening different devices (instead of both in one device). Then just have user provide a device, or have the API war-dial open() constructing possible devices to probe what is available 'pcmC{c}D{d}{p|c}'. Easier than listing files.
![Media 1](./media/2070735722043023873_1.png)
@@ -0,0 +1,42 @@
{
"root_post_id": "2070734717825986566",
"posts": [
{
"post_id": "2070734717825986566",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by boiler plate and complexity. Tinyalsa isn't much better. Likely easier to think about this from perspective of devices that can be open()ed from /dev/snd. On my machine doesn't seem to hot plug",
"timestamp": "2026-06-27 05:03:23",
"media_urls": [
"https://pbs.twimg.com/media/HLy5-C9XMAAfs_w?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 11,
"view_count": 1624
}
},
{
"post_id": "2070735722043023873",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Assuming 'p'&'c' are PLAYBACK & CAPTURE, so opening different devices (instead of both in one device). Then just have user provide a device, or have the API war-dial open() constructing possible devices to probe what is available 'pcmC{c}D{d}{p|c}'. Easier than listing files.",
"timestamp": "2026-06-27 05:07:23",
"media_urls": [
"https://pbs.twimg.com/media/HLy6SApX0AApPub?format=png&name=orig"
],
"reply_to_id": "2070734717825986566",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 502
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2070734717825986566"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -0,0 +1,25 @@
---
title: "Eventually figure out enough to get aplay to actually play a wave file, had to f"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2071415096304193820"
post_id: "2071415096304193820"
timestamp: "2026-06-29 02:06:58"
post_count: 2
reply_count: 1
repost_count: 0
like_count: 4
view_count: 1152
---
# @NOTimothyLottes — Eventually figure out enough to get aplay to actually play a wave file, had to f
## Post 1 (2026-06-29 02:06:58)
Eventually figure out enough to get aplay to actually play a wave file, had to find an explicitly stereo wav else it would refuse to just duplicate the mono channels. Basically the a'tools unfriendlyness mirrors that of ALSA. Still cannot understand 'boundary' ...
![Media 1](./media/2071415096304193820_1.png)
## Post 2 (2026-06-29 04:08:45) — reply to Post 1
No luck getting ALSA to play anything from my app. State is always 2 SNDRV_PCM_STATE_PREPARED, haven't been able to get it to run. If I try the start ioctl, then it errors with -EPIPE.
@@ -0,0 +1,40 @@
{
"root_post_id": "2071415096304193820",
"posts": [
{
"post_id": "2071415096304193820",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Eventually figure out enough to get aplay to actually play a wave file, had to find an explicitly stereo wav else it would refuse to just duplicate the mono channels. Basically the a'tools unfriendlyness mirrors that of ALSA. Still cannot understand 'boundary' ...",
"timestamp": "2026-06-29 02:06:58",
"media_urls": [
"https://pbs.twimg.com/media/HL8km6eWsAEq6xb?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 1152
}
},
{
"post_id": "2071445744389611593",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "No luck getting ALSA to play anything from my app. State is always 2 SNDRV_PCM_STATE_PREPARED, haven't been able to get it to run. If I try the start ioctl, then it errors with -EPIPE.",
"timestamp": "2026-06-29 04:08:45",
"media_urls": [],
"reply_to_id": "2071415096304193820",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 481
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2071415096304193820"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

@@ -0,0 +1,96 @@
---
title: "ALSA hell month continues: remember it might be "open source" but it is definite"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2071706805114216559"
post_id: "2071706805114216559"
timestamp: "2026-06-29 21:26:07"
post_count: 15
reply_count: 3
repost_count: 0
like_count: 21
view_count: 1713
---
# @NOTimothyLottes — ALSA hell month continues: remember it might be "open source" but it is definite
## Post 1 (2026-06-29 21:26:07)
ALSA hell month continues: remember it might be "open source" but it is definitely "closed documentation" [those docs are securely trapped in the minds of the authors]. Now that I have aplay playing a sound, it's time for garbage sifting through STRACE to see what is going on ...
![Media 1](./media/2071706805114216559_1.png)
## Post 2 (2026-06-29 21:42:37) — reply to Post 1
For devs working on linux, strace is a good friend, besides reverse engineering undocumented crap, it's useful to run on your own app as a bug test, like look what this idiot [me] did with nanosleep()
![Media 1](./media/2071710958397898929_1.png)
## Post 3 (2026-06-29 21:56:14) — reply to Post 2
In my ALSA interface I war-dial the possible /dev/snd/pcm devices instead of just listing the directory. It's a lot easier in source code.
![Media 1](./media/2071714384225681440_1.png)
## Post 4 (2026-06-29 21:56:48) — reply to Post 1
@NOTimothyLottes Have you actually reached out to said developers and offered to start a documentation effort/ask them some questions about things? It seems a little unfair to be rage posting about this all the time when the point is you (and me, and everyone) have the power to make it better.
## Post 5 (2026-06-29 22:02:25) — reply to Post 3
Using 'strace' showed another bug in my setting schedule priority code (I didn't yet validate that code and check for errors). Definitely my ALSA test app shows ZERO errors in ALSA system calls, but doesn't actually play anything. Broken without errors = crappy API.
![Media 1](./media/2071715941688258752_1.png)
## Post 6 (2026-06-29 22:04:37) — reply to Post 5
In theory a good API, SNDRV_PCM_IOCTL_PREPARE would fail if the next SNDRV_PCM_IOCTL_WRITEI_FRAMES wouldn't accept the write. And that WRITEI should also fail instead of pass and setting .result=0 (of the snd xferi structure).
## Post 7 (2026-06-29 22:07:22) — reply to Post 6
The best I can guess thus far is that the aplay app goes through some HW_REFINE ioctls before setting the HW_PARAMS, and perhaps the "magic missing thing" is in that process.
![Media 1](./media/2071717187623030935_1.png)
## Post 8 (2026-06-29 22:12:52) — reply to Post 4
@AlexABPerson Haha I could start that with an email: hello godly ALSA dev, as a vintage pee-on programmer from the stone age, I was trying to ignore your advice about using the user-space API and thus needing GPL, and instead using the undocumented IOCTLs of the kernel driver directly ...
## Post 9 (2026-06-29 22:19:03) — reply to Post 8
@AlexABPerson But on a serious note, I mostly shit post for the entertainment, because once in a while I actually learn something from a response. And often documenting the process might help someone else too ...
## Post 10 (2026-06-29 22:39:08) — reply to Post 7
Best docs on REFINE that I've found yet is indirectly through this. Note tinyalsa doesn't seem to use this interface other than through pcm_params_get(), not the interative process seen in aplay strace. Maybe because tinyalsa is for android (different drivers)
![Media 1](./media/2071725181576319370_1.jpg)
## Post 11 (2026-06-29 23:44:32) — reply to Post 9
@NOTimothyLottes That's fair, thank you for the honest reply! It *is* interesting to see a lot of these sorts of inner workings, and I definitely sympathise with the "I can't believe it works like this" feeling 😂 Stuff does have a tendency to get like that huh
## Post 12 (2026-06-30 00:56:46) — reply to Post 10
SNDRV_PCM_IOCTL_HW_REFINE
If send out a zeroed snd_pcm_hw_params, the ioctl will fail. There is a special magic sauce to the structure that must be initialized correctly before you can even fetch hardware parameters. It's high level skill in Obfuscation. See *_any( in ALSA src
![Media 1](./media/2071759816725311959_1.png)
## Post 13 (2026-06-30 00:59:34) — reply to Post 12
magiz/
clear snd_pcm_hw_params
set masks[0 ... 2].bits[0]=~0
set intervals[0 ... 11].max=~0
set rmask=~0
set info=~0
## Post 14 (2026-06-30 01:26:54) — reply to Post 13
The rmask and cmask use bit indexed by the DEFINE so
1<<SNDRV_PCM_HW_PARAM_{thing}
## Post 15 (2026-06-30 01:35:19) — reply to Post 14
Hats off to Abramo Bagnara of the ALSA project for the worst kernel system interface I have ever used in my life. This refinement required just to configure an audio device is a master class on the worst way to do something. And still have a few hours left in reverse engineering
@@ -0,0 +1,260 @@
{
"root_post_id": "2071706805114216559",
"posts": [
{
"post_id": "2071706805114216559",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "ALSA hell month continues: remember it might be \"open source\" but it is definitely \"closed documentation\" [those docs are securely trapped in the minds of the authors]. Now that I have aplay playing a sound, it's time for garbage sifting through STRACE to see what is going on ...",
"timestamp": "2026-06-29 21:26:07",
"media_urls": [
"https://pbs.twimg.com/media/HMAt1GiXAAAoahX?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 0,
"like_count": 21,
"view_count": 1713
}
},
{
"post_id": "2071710958397898929",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "For devs working on linux, strace is a good friend, besides reverse engineering undocumented crap, it's useful to run on your own app as a bug test, like look what this idiot [me] did with nanosleep()",
"timestamp": "2026-06-29 21:42:37",
"media_urls": [
"https://pbs.twimg.com/media/HMAx0PmW0AAdUAy?format=png&name=orig"
],
"reply_to_id": "2071706805114216559",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 362
}
},
{
"post_id": "2071714384225681440",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "In my ALSA interface I war-dial the possible /dev/snd/pcm devices instead of just listing the directory. It's a lot easier in source code.",
"timestamp": "2026-06-29 21:56:14",
"media_urls": [
"https://pbs.twimg.com/media/HMA1CA9XIAAwRAB?format=png&name=orig"
],
"reply_to_id": "2071710958397898929",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 286
}
},
{
"post_id": "2071714528635527401",
"author": "Alex Burrows",
"handle": "AlexABPerson",
"text": "@NOTimothyLottes Have you actually reached out to said developers and offered to start a documentation effort/ask them some questions about things? It seems a little unfair to be rage posting about this all the time when the point is you (and me, and everyone) have the power to make it better.",
"timestamp": "2026-06-29 21:56:48",
"media_urls": [],
"reply_to_id": "2071706805114216559",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 0,
"view_count": 62
}
},
{
"post_id": "2071715941688258752",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Using 'strace' showed another bug in my setting schedule priority code (I didn't yet validate that code and check for errors). Definitely my ALSA test app shows ZERO errors in ALSA system calls, but doesn't actually play anything. Broken without errors = crappy API.",
"timestamp": "2026-06-29 22:02:25",
"media_urls": [
"https://pbs.twimg.com/media/HMA2LibWMAAMW3O?format=png&name=orig"
],
"reply_to_id": "2071714384225681440",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 113
}
},
{
"post_id": "2071716495667708051",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "In theory a good API, SNDRV_PCM_IOCTL_PREPARE would fail if the next SNDRV_PCM_IOCTL_WRITEI_FRAMES wouldn't accept the write. And that WRITEI should also fail instead of pass and setting .result=0 (of the snd xferi structure).",
"timestamp": "2026-06-29 22:04:37",
"media_urls": [],
"reply_to_id": "2071715941688258752",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 131
}
},
{
"post_id": "2071717187623030935",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "The best I can guess thus far is that the aplay app goes through some HW_REFINE ioctls before setting the HW_PARAMS, and perhaps the \"magic missing thing\" is in that process.",
"timestamp": "2026-06-29 22:07:22",
"media_urls": [
"https://pbs.twimg.com/media/HMA3sGVXwAAVDMT?format=png&name=orig"
],
"reply_to_id": "2071716495667708051",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 216
}
},
{
"post_id": "2071718568899624987",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@AlexABPerson Haha I could start that with an email: hello godly ALSA dev, as a vintage pee-on programmer from the stone age, I was trying to ignore your advice about using the user-space API and thus needing GPL, and instead using the undocumented IOCTLs of the kernel driver directly ...",
"timestamp": "2026-06-29 22:12:52",
"media_urls": [],
"reply_to_id": "2071714528635527401",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 0,
"view_count": 59
}
},
{
"post_id": "2071720126966034812",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "@AlexABPerson But on a serious note, I mostly shit post for the entertainment, because once in a while I actually learn something from a response. And often documenting the process might help someone else too ...",
"timestamp": "2026-06-29 22:19:03",
"media_urls": [],
"reply_to_id": "2071718568899624987",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 31
}
},
{
"post_id": "2071725181576319370",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Best docs on REFINE that I've found yet is indirectly through this. Note tinyalsa doesn't seem to use this interface other than through pcm_params_get(), not the interative process seen in aplay strace. Maybe because tinyalsa is for android (different drivers)",
"timestamp": "2026-06-29 22:39:08",
"media_urls": [
"https://pbs.twimg.com/media/HMA-CDAXEAAw9ns?format=jpg&name=orig"
],
"reply_to_id": "2071717187623030935",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 0,
"view_count": 167
}
},
{
"post_id": "2071741638162956648",
"author": "Alex Burrows",
"handle": "AlexABPerson",
"text": "@NOTimothyLottes That's fair, thank you for the honest reply! It *is* interesting to see a lot of these sorts of inner workings, and I definitely sympathise with the \"I can't believe it works like this\" feeling 😂 Stuff does have a tendency to get like that huh",
"timestamp": "2026-06-29 23:44:32",
"media_urls": [],
"reply_to_id": "2071720126966034812",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 20
}
},
{
"post_id": "2071759816725311959",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "SNDRV_PCM_IOCTL_HW_REFINE\nIf send out a zeroed snd_pcm_hw_params, the ioctl will fail. There is a special magic sauce to the structure that must be initialized correctly before you can even fetch hardware parameters. It's high level skill in Obfuscation. See *_any( in ALSA src",
"timestamp": "2026-06-30 00:56:46",
"media_urls": [
"https://pbs.twimg.com/media/HMBePMXXwAE5_1M?format=png&name=orig"
],
"reply_to_id": "2071725181576319370",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 96
}
},
{
"post_id": "2071760520852410838",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "magiz/\nclear snd_pcm_hw_params\nset masks[0 ... 2].bits[0]=~0\nset intervals[0 ... 11].max=~0\nset rmask=~0\nset info=~0",
"timestamp": "2026-06-30 00:59:34",
"media_urls": [],
"reply_to_id": "2071759816725311959",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 101
}
},
{
"post_id": "2071767401411084399",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "The rmask and cmask use bit indexed by the DEFINE so \n1<<SNDRV_PCM_HW_PARAM_{thing}",
"timestamp": "2026-06-30 01:26:54",
"media_urls": [],
"reply_to_id": "2071760520852410838",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 344
}
},
{
"post_id": "2071769518246953293",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Hats off to Abramo Bagnara of the ALSA project for the worst kernel system interface I have ever used in my life. This refinement required just to configure an audio device is a master class on the worst way to do something. And still have a few hours left in reverse engineering",
"timestamp": "2026-06-30 01:35:19",
"media_urls": [],
"reply_to_id": "2071767401411084399",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 1,
"view_count": 322
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2071706805114216559"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@@ -0,0 +1,31 @@
---
title: "Working on the Linux thread priority code. Linux doesn't allow sched_attr.size t"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2071937360288235902"
post_id: "2071937360288235902"
timestamp: "2026-06-30 12:42:16"
post_count: 3
reply_count: 1
repost_count: 0
like_count: 10
view_count: 1212
---
# @NOTimothyLottes — Working on the Linux thread priority code. Linux doesn't allow sched_attr.size t
## Post 1 (2026-06-30 12:42:16)
Working on the Linux thread priority code. Linux doesn't allow sched_attr.size to be minimized to just what is required for the scheduling mode (my prior bug). So I statically allocate the structures already filled in and cacheline aligned ...
![Media 1](./media/2071937360288235902_1.png)
## Post 2 (2026-06-30 12:45:15) — reply to Post 1
Theory says: better for size, worse for perf! Global structure will miss the cache. The alternative is to allow the code to generate the structure on the stack, which is likely in cache, and burn a few more cachelines of code (which gets linear prefetch).
## Post 3 (2026-06-30 12:47:30) — reply to Post 2
Clearly the default linux won't allow my non-blessed user to get SCHED_FIFO, and it also seems like my nice(-20) SCHED_OTHER backup is also not allowed either. Damn. More stuff to workaround.
![Media 1](./media/2071938677584863448_1.png)
@@ -0,0 +1,58 @@
{
"root_post_id": "2071937360288235902",
"posts": [
{
"post_id": "2071937360288235902",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Working on the Linux thread priority code. Linux doesn't allow sched_attr.size to be minimized to just what is required for the scheduling mode (my prior bug). So I statically allocate the structures already filled in and cacheline aligned ...",
"timestamp": "2026-06-30 12:42:16",
"media_urls": [
"https://pbs.twimg.com/media/HMD_iq0XcAASnSn?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 10,
"view_count": 1212
}
},
{
"post_id": "2071938112175890466",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Theory says: better for size, worse for perf! Global structure will miss the cache. The alternative is to allow the code to generate the structure on the stack, which is likely in cache, and burn a few more cachelines of code (which gets linear prefetch).",
"timestamp": "2026-06-30 12:45:15",
"media_urls": [],
"reply_to_id": "2071937360288235902",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 5,
"view_count": 578
}
},
{
"post_id": "2071938677584863448",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Clearly the default linux won't allow my non-blessed user to get SCHED_FIFO, and it also seems like my nice(-20) SCHED_OTHER backup is also not allowed either. Damn. More stuff to workaround.",
"timestamp": "2026-06-30 12:47:30",
"media_urls": [
"https://pbs.twimg.com/media/HMEBJNuW4AE8JUV?format=png&name=orig"
],
"reply_to_id": "2071938112175890466",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 5,
"view_count": 484
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2071937360288235902"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,49 @@
---
title: "Linux by default doesn't allow any increase in scheduling priority. Users need t"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2072135292115427728"
post_id: "2072135292115427728"
timestamp: "2026-07-01 01:48:46"
post_count: 6
reply_count: 1
repost_count: 0
like_count: 3
view_count: 381
---
# @NOTimothyLottes — Linux by default doesn't allow any increase in scheduling priority. Users need t
## Post 1 (2026-07-01 01:45:40)
Working on the portable thread scheduling priority interface. Windows is a bit nicer by default, one can increase the scheduling priority without admin and there is a AvSetMmThreadCharacteristics() / AvSetMmThreadPriority() hack for "Pro Audio" scheduling needs.
## Post 2 (2026-07-01 01:48:46) — reply to Post 1
Linux by default doesn't allow any increase in scheduling priority. Users need to manually setup special user|group with elevated rights. Also system calls that try elevated scheduling don't clamp, instead they fail -EPREM if out of bounds. So all around a pain in the ass.
![Media 1](./media/2072135292115427728_1.png)
## Post 3 (2026-07-01 01:51:56) — reply to Post 2
I'm a little lazy right now and don't feel like trying SteamOS big picture mode to see what the default ulimits are. Curious what they allow.
## Post 4 (2026-07-01 02:36:48) — reply to Post 3
Linux priority workarounds
(a.) Use getrlimit() to get {soft,hard} limits
(b.) Use setrlimit() to set 'soft=hard' limit
(c.) Then set priority or nice based on new soft limit
![Media 1](./media/2072147378480566273_1.png)
![Media 2](./media/2072147378480566273_2.png)
## Post 5 (2026-07-01 02:38:20) — reply to Post 4
I don't do one-time global priority maximums, just in case someone sudo's higher priority hard limit dynamically it should pickup the new limit.
## Post 6 (2026-07-01 02:46:03) — reply to Post 5
Also while on setrlimit, I also bump up the RLIMIT_MEMLOCK to it's maximum just in case before the mlockall().
![Media 1](./media/2072149707107787035_1.png)
@@ -0,0 +1,109 @@
{
"root_post_id": "2072135292115427728",
"posts": [
{
"post_id": "2072134509089144888",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Working on the portable thread scheduling priority interface. Windows is a bit nicer by default, one can increase the scheduling priority without admin and there is a AvSetMmThreadCharacteristics() / AvSetMmThreadPriority() hack for \"Pro Audio\" scheduling needs.",
"timestamp": "2026-07-01 01:45:40",
"media_urls": [],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 1,
"like_count": 9,
"view_count": 1131
}
},
{
"post_id": "2072135292115427728",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Linux by default doesn't allow any increase in scheduling priority. Users need to manually setup special user|group with elevated rights. Also system calls that try elevated scheduling don't clamp, instead they fail -EPREM if out of bounds. So all around a pain in the ass.",
"timestamp": "2026-07-01 01:48:46",
"media_urls": [
"https://pbs.twimg.com/media/HMGz-64W4AABeaH?format=png&name=orig"
],
"reply_to_id": "2072134509089144888",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 381
}
},
{
"post_id": "2072136089070961073",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I'm a little lazy right now and don't feel like trying SteamOS big picture mode to see what the default ulimits are. Curious what they allow.",
"timestamp": "2026-07-01 01:51:56",
"media_urls": [],
"reply_to_id": "2072135292115427728",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 298
}
},
{
"post_id": "2072147378480566273",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Linux priority workarounds\n(a.) Use getrlimit() to get {soft,hard} limits\n(b.) Use setrlimit() to set 'soft=hard' limit\n(c.) Then set priority or nice based on new soft limit",
"timestamp": "2026-07-01 02:36:48",
"media_urls": [
"https://pbs.twimg.com/media/HMG-UCRXIAEKbdj?format=png&name=orig",
"https://pbs.twimg.com/media/HMG-zRxWwAAWtI4?format=png&name=orig"
],
"reply_to_id": "2072136089070961073",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 78
}
},
{
"post_id": "2072147765157638479",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I don't do one-time global priority maximums, just in case someone sudo's higher priority hard limit dynamically it should pickup the new limit.",
"timestamp": "2026-07-01 02:38:20",
"media_urls": [],
"reply_to_id": "2072147378480566273",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 318
}
},
{
"post_id": "2072149707107787035",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Also while on setrlimit, I also bump up the RLIMIT_MEMLOCK to it's maximum just in case before the mlockall().",
"timestamp": "2026-07-01 02:46:03",
"media_urls": [
"https://pbs.twimg.com/media/HMHBGTPXwAA_axg?format=png&name=orig"
],
"reply_to_id": "2072147765157638479",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 1,
"view_count": 307
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2072135292115427728"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

@@ -0,0 +1,36 @@
---
title: "Haha damn, I thought I had a great idea, for Wine workarounds, I could just dete"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2072445315370590266"
post_id: "2072445315370590266"
timestamp: "2026-07-01 22:20:42"
post_count: 4
reply_count: 3
repost_count: 0
like_count: 16
view_count: 2023
---
# @NOTimothyLottes — Haha damn, I thought I had a great idea, for Wine workarounds, I could just dete
## Post 1 (2026-07-01 22:20:42)
Haha damn, I thought I had a great idea, for Wine workarounds, I could just detect Wine (easy), and then make the associated Linux system call from inside Wine using inline asm! [no surprise, it doesn't work]
![Media 1](./media/2072445315370590266_1.png)
## Post 2 (2026-07-01 22:28:53) — reply to Post 1
https://gpfault.net/posts/drunk-exe.html - So it apparently is possible, likely I'm screwing up my register saves for the ABI differences ...
## Post 3 (2026-07-01 22:30:52) — reply to Post 1
@NOTimothyLottes the two truths ive come to accept in life
a. theres to trick that unravels chess's complexity
b. theres no trick that unavaels the existing software stacks complexity into something elegant
## Post 4 (2026-07-02 05:52:08) — reply to Post 1
@NOTimothyLottes You could pretend to be an audio jack implementation? If impersonating wine doesn't work.
@@ -0,0 +1,72 @@
{
"root_post_id": "2072445315370590266",
"posts": [
{
"post_id": "2072445315370590266",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Haha damn, I thought I had a great idea, for Wine workarounds, I could just detect Wine (easy), and then make the associated Linux system call from inside Wine using inline asm! [no surprise, it doesn't work]",
"timestamp": "2026-07-01 22:20:42",
"media_urls": [
"https://pbs.twimg.com/media/HMLNdMOXkAAIoEj?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 3,
"repost_count": 0,
"like_count": 16,
"view_count": 2023
}
},
{
"post_id": "2072447378242552093",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "https://gpfault.net/posts/drunk-exe.html - So it apparently is possible, likely I'm screwing up my register saves for the ABI differences ...",
"timestamp": "2026-07-01 22:28:53",
"media_urls": [],
"reply_to_id": "2072445315370590266",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 4,
"view_count": 650
}
},
{
"post_id": "2072447876987314447",
"author": "opdroid1234",
"handle": "opdroid1234",
"text": "@NOTimothyLottes the two truths ive come to accept in life\n\na. theres to trick that unravels chess's complexity\nb. theres no trick that unavaels the existing software stacks complexity into something elegant",
"timestamp": "2026-07-01 22:30:52",
"media_urls": [],
"reply_to_id": "2072445315370590266",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 214
}
},
{
"post_id": "2072558923215712441",
"author": "OZ",
"handle": "winning_tactic",
"text": "@NOTimothyLottes You could pretend to be an audio jack implementation? If impersonating wine doesn't work.",
"timestamp": "2026-07-02 05:52:08",
"media_urls": [],
"reply_to_id": "2072445315370590266",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 0,
"view_count": 78
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2072445315370590266"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

@@ -0,0 +1,35 @@
---
title: "Settings I'm using for snd_pcm_sw_params for ALSA, don't have docs for all of th"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2072506103401754653"
post_id: "2072506103401754653"
timestamp: "2026-07-02 02:22:15"
post_count: 4
reply_count: 1
repost_count: 0
like_count: 4
view_count: 773
---
# @NOTimothyLottes — Settings I'm using for snd_pcm_sw_params for ALSA, don't have docs for all of th
## Post 1 (2026-07-02 02:22:15)
Settings I'm using for snd_pcm_sw_params for ALSA, don't have docs for all of this, seems to work. I'm doing 64 frame period size on a double buffer right now without any thread priority, and not getting xruns, so not yet sure of bad behavior
![Media 1](./media/2072506103401754653_1.png)
## Post 2 (2026-07-02 02:28:27) — reply to Post 1
I put in a forced thread sleep between writes to force a xrun, and SNDRV_PCM_IOCTL_WRITEI_FRAMES kernel call then returns -32, in which case I run a SNDRV_PCM_IOCTL_PREPARE and then just get back to the write loop, seems to restore normal playback just fine.
## Post 3 (2026-07-02 02:42:11) — reply to Post 2
I reduced asound.h to this basically, the most minimal thing I found I needed. Now I also rename a few things (like structure names), and my IOCTL macros are slightly different in composition than standard.
![Media 1](./media/2072511121269928165_1.png)
## Post 4 (2026-07-02 02:45:11) — reply to Post 3
After getting this far, it actually looks quite easy, but the route to this was filled with garbage sifting because I couldn't easily find someone else who did this kind of minimalization. I'm only supporting 48KHz stereo 16-bit signed, with double buffering = keep it simple.
@@ -0,0 +1,74 @@
{
"root_post_id": "2072506103401754653",
"posts": [
{
"post_id": "2072506103401754653",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Settings I'm using for snd_pcm_sw_params for ALSA, don't have docs for all of this, seems to work. I'm doing 64 frame period size on a double buffer right now without any thread priority, and not getting xruns, so not yet sure of bad behavior",
"timestamp": "2026-07-02 02:22:15",
"media_urls": [
"https://pbs.twimg.com/media/HMMFAHiX0AAzY_R?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 773
}
},
{
"post_id": "2072507664576164085",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I put in a forced thread sleep between writes to force a xrun, and SNDRV_PCM_IOCTL_WRITEI_FRAMES kernel call then returns -32, in which case I run a SNDRV_PCM_IOCTL_PREPARE and then just get back to the write loop, seems to restore normal playback just fine.",
"timestamp": "2026-07-02 02:28:27",
"media_urls": [],
"reply_to_id": "2072506103401754653",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 221
}
},
{
"post_id": "2072511121269928165",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "I reduced asound.h to this basically, the most minimal thing I found I needed. Now I also rename a few things (like structure names), and my IOCTL macros are slightly different in composition than standard.",
"timestamp": "2026-07-02 02:42:11",
"media_urls": [
"https://pbs.twimg.com/media/HMMJjYPWAAAY1IE?format=png&name=orig"
],
"reply_to_id": "2072507664576164085",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 390
}
},
{
"post_id": "2072511875074421142",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "After getting this far, it actually looks quite easy, but the route to this was filled with garbage sifting because I couldn't easily find someone else who did this kind of minimalization. I'm only supporting 48KHz stereo 16-bit signed, with double buffering = keep it simple.",
"timestamp": "2026-07-02 02:45:11",
"media_urls": [],
"reply_to_id": "2072511121269928165",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 3,
"view_count": 309
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2072506103401754653"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1,38 @@
---
title: "Yuck, starting on WDM/KS audio interface for WIN32, much more painful than ALSA."
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2072804183992922296"
post_id: "2072804183992922296"
timestamp: "2026-07-02 22:06:42"
post_count: 4
reply_count: 1
repost_count: 0
like_count: 8
view_count: 1074
---
# @NOTimothyLottes — Yuck, starting on WDM/KS audio interface for WIN32, much more painful than ALSA.
## Post 1 (2026-07-02 22:06:42)
Yuck, starting on WDM/KS audio interface for WIN32, much more painful than ALSA. But I've been here before. Starting with the include bloat ... the real question is if I'm going to need to file more Wine bugs.
![Media 1](./media/2072804183992922296_1.png)
![Media 2](./media/2072804183992922296_2.png)
## Post 2 (2026-07-02 23:31:59) — reply to Post 1
Wine has a lot of problems with SetConsoleMode() I had to include an extra ENABLE_WRAP_AT_EOL_OUTPUT, and then force a newline right after ASCI ESC[H else it would screw up (and it still does at the end with the ??). But at least the debug is usable now.
![Media 1](./media/2072825642354123190_1.png)
## Post 3 (2026-07-02 23:36:49) — reply to Post 2
But of course instant bad news, I cannot open the WinMM DRV_QUERYDEVICEINTERFACE, it returned ~0 (INVALID_HANDLE_VALUE). So I'm dead in the water in Wine again. Honestly getting sick of filing bugs in Wine, all the important stuff I do is broken. So what, no games use WDM/KS?
![Media 1](./media/2072826861449629746_1.png)
## Post 4 (2026-07-02 23:48:13) — reply to Post 3
https://forum.winehq.org/viewtopic.php?t=10225 - Looks like I'm 16 years late to the answer, if they didn't get in WDM/KS in 16 years, certainly it won't happen. Still surprised that all PC games are using the higher level garbage-ware sound APIs on Windows.
@@ -0,0 +1,77 @@
{
"root_post_id": "2072804183992922296",
"posts": [
{
"post_id": "2072804183992922296",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Yuck, starting on WDM/KS audio interface for WIN32, much more painful than ALSA. But I've been here before. Starting with the include bloat ... the real question is if I'm going to need to file more Wine bugs.",
"timestamp": "2026-07-02 22:06:42",
"media_urls": [
"https://pbs.twimg.com/media/HMQT-ALWoAAABEe?format=png&name=orig",
"https://pbs.twimg.com/media/HMQUVgpXYAA3h6r?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 8,
"view_count": 1074
}
},
{
"post_id": "2072825642354123190",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Wine has a lot of problems with SetConsoleMode() I had to include an extra ENABLE_WRAP_AT_EOL_OUTPUT, and then force a newline right after ASCI ESC[H else it would screw up (and it still does at the end with the ??). But at least the debug is usable now.",
"timestamp": "2026-07-02 23:31:59",
"media_urls": [
"https://pbs.twimg.com/media/HMQnWmJXcAAOiSS?format=png&name=orig"
],
"reply_to_id": "2072804183992922296",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 287
}
},
{
"post_id": "2072826861449629746",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "But of course instant bad news, I cannot open the WinMM DRV_QUERYDEVICEINTERFACE, it returned ~0 (INVALID_HANDLE_VALUE). So I'm dead in the water in Wine again. Honestly getting sick of filing bugs in Wine, all the important stuff I do is broken. So what, no games use WDM/KS?",
"timestamp": "2026-07-02 23:36:49",
"media_urls": [
"https://pbs.twimg.com/media/HMQoTiQWkAAbwj1?format=png&name=orig"
],
"reply_to_id": "2072825642354123190",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 4,
"view_count": 469
}
},
{
"post_id": "2072829727639752830",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "https://forum.winehq.org/viewtopic.php?t=10225 - Looks like I'm 16 years late to the answer, if they didn't get in WDM/KS in 16 years, certainly it won't happen. Still surprised that all PC games are using the higher level garbage-ware sound APIs on Windows.",
"timestamp": "2026-07-02 23:48:13",
"media_urls": [],
"reply_to_id": "2072826861449629746",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 332
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2072804183992922296"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,51 @@
---
title: "Following the succession (thanks) of re-trying WASAPI using this example which h"
author: "NOTimothyLottes"
handle: "@NOTimothyLottes"
post_url: "https://x.com/NOTimothyLottes/status/2073096069529907441"
post_id: "2073096069529907441"
timestamp: "2026-07-03 17:26:33"
post_count: 6
reply_count: 1
repost_count: 0
like_count: 8
view_count: 1123
---
# @NOTimothyLottes — Following the succession (thanks) of re-trying WASAPI using this example which h
## Post 1 (2026-07-03 17:26:33)
Following the succession (thanks) of re-trying WASAPI using this example which has been pre-minimized and de-C++'ed: https://gist.github.com/mmozeiko/5a5b168e61aff4c1eaec0381da62808f#file-win32_wasapi-h - But I'm missing something on how to get the C++ as C linking to function (cross compiling), doesn't easily work out of the box.
![Media 1](./media/2073096069529907441_1.png)
## Post 2 (2026-07-03 17:37:48) — reply to Post 1
Of course I'm missing the magic header that does the real work ... curious how messy this will get
![Media 1](./media/2073098899896598550_1.jpg)
## Post 3 (2026-07-03 18:22:17) — reply to Post 2
So instead of the massive "mmdeviceapi.h" mess-ware, I defined a stupid CPP_(object,virtual_function_number) macro. This way I just have to write down the index in the VT table for the specific virtual function ...
![Media 1](./media/2073110092447203466_1.png)
## Post 4 (2026-07-03 18:27:11) — reply to Post 3
Here is initial bring up, function call by function call. No headers, and no C++. The magic of typecasting at usage IC4_(CPP_(... is that I don't ever have to build the headers. That is at least working out well. I do line by line to test in Wine, defer fail handling until later
![Media 1](./media/2073111326981783629_1.png)
## Post 5 (2026-07-03 18:35:35) — reply to Post 4
More on bring-up. I just run and check visually for output in the console (this time 'B055'). Since compile times are under a second, it is super fast to check as I go. Easy to see how much code bloat there is for C++ this way (doing it manually).
![Media 1](./media/2073113441959616958_1.png)
## Post 6 (2026-07-03 18:39:26) — reply to Post 5
Example below of how much header bloat I'm factoring out using my simple macros
![Media 1](./media/2073114409270997497_1.png)
@@ -0,0 +1,114 @@
{
"root_post_id": "2073096069529907441",
"posts": [
{
"post_id": "2073096069529907441",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Following the succession (thanks) of re-trying WASAPI using this example which has been pre-minimized and de-C++'ed: https://gist.github.com/mmozeiko/5a5b168e61aff4c1eaec0381da62808f#file-win32_wasapi-h - But I'm missing something on how to get the C++ as C linking to function (cross compiling), doesn't easily work out of the box.",
"timestamp": "2026-07-03 17:26:33",
"media_urls": [
"https://pbs.twimg.com/media/HMUdajFXEAAiaQE?format=png&name=orig"
],
"reply_to_id": null,
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 8,
"view_count": 1123
}
},
{
"post_id": "2073098899896598550",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Of course I'm missing the magic header that does the real work ... curious how messy this will get",
"timestamp": "2026-07-03 17:37:48",
"media_urls": [
"https://pbs.twimg.com/media/HMUgZcyWQAA263a?format=jpg&name=orig"
],
"reply_to_id": "2073096069529907441",
"quote_of_id": null,
"metrics": {
"reply_count": 2,
"repost_count": 0,
"like_count": 4,
"view_count": 335
}
},
{
"post_id": "2073110092447203466",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "So instead of the massive \"mmdeviceapi.h\" mess-ware, I defined a stupid CPP_(object,virtual_function_number) macro. This way I just have to write down the index in the VT table for the specific virtual function ...",
"timestamp": "2026-07-03 18:22:17",
"media_urls": [
"https://pbs.twimg.com/media/HMUqNm_XIAA0JEP?format=png&name=orig"
],
"reply_to_id": "2073098899896598550",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 3,
"view_count": 225
}
},
{
"post_id": "2073111326981783629",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Here is initial bring up, function call by function call. No headers, and no C++. The magic of typecasting at usage IC4_(CPP_(... is that I don't ever have to build the headers. That is at least working out well. I do line by line to test in Wine, defer fail handling until later",
"timestamp": "2026-07-03 18:27:11",
"media_urls": [
"https://pbs.twimg.com/media/HMUrDz2XsAA9JLP?format=png&name=orig"
],
"reply_to_id": "2073110092447203466",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 92
}
},
{
"post_id": "2073113441959616958",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "More on bring-up. I just run and check visually for output in the console (this time 'B055'). Since compile times are under a second, it is super fast to check as I go. Easy to see how much code bloat there is for C++ this way (doing it manually).",
"timestamp": "2026-07-03 18:35:35",
"media_urls": [
"https://pbs.twimg.com/media/HMUs9oLWUAAaHx9?format=png&name=orig"
],
"reply_to_id": "2073111326981783629",
"quote_of_id": null,
"metrics": {
"reply_count": 1,
"repost_count": 0,
"like_count": 2,
"view_count": 387
}
},
{
"post_id": "2073114409270997497",
"author": "NOTimothyLottes",
"handle": "NOTimothyLottes",
"text": "Example below of how much header bloat I'm factoring out using my simple macros",
"timestamp": "2026-07-03 18:39:26",
"media_urls": [
"https://pbs.twimg.com/media/HMUujnwWoAAUQd1?format=png&name=orig"
],
"reply_to_id": "2073113441959616958",
"quote_of_id": null,
"metrics": {
"reply_count": 0,
"repost_count": 0,
"like_count": 2,
"view_count": 350
}
}
],
"source_url": "https://x.com/NOTimothyLottes/status/2073096069529907441"
}

Some files were not shown because too many files have changed in this diff Show More