Draft apply of new media convention.

This commit is contained in:
ed committed 2026-08-24 14:48:57 -04:00
1 parent 78401f09a2
commit cd9803fe85
53 files changed
+153 -185

No files matched your search

+2 -2
View File
@@ -53,10 +53,10 @@ Templates: `templates/archive-source.md`, `templates/authored-note.md` (Template
## Images and embeds
Images: absolute HTTPS URLs on your image host. Do not commit local binaries for published notes.
Images: absolute HTTPS URLs from the original provider when possible. Notes do not embed local binaries.
```md
![](https://files.catbox.moe/example.png)
![](https://pbs.twimg.com/media/FhAidkhUoAA3FJz?format=png&name=orig)
```
Keep local copies in `assets/` (not committed). Do not point notes at `assets/` or `./media/`.
+2 -2
View File
@@ -35,10 +35,10 @@ in_reply_to: ""
## Media
Images use absolute HTTPS URLs:
Images use direct HTTPS URLs from the original provider when possible:
```md
![](https://files.catbox.moe/example.png)
![](https://pbs.twimg.com/media/EXAMPLE?format=png&name=orig)
```
A live tweet embed is optional and is not the archive:
@@ -29,4 +29,4 @@ in_reply_to: ""
Example of "Bind-Everything-Once" Layout Aliasing in Vulkan. Storage image format by aliased name, also bound as sampled image. Choose buffer {readonly,writeonly,volatile (read uncached),atomic} access by aliased name, as either {uint,uint4,float,float4}.
Media (not lifted): `1589810282104524800_FhAidkhUoAA3FJz_orig.png`
![](https://pbs.twimg.com/media/FhAidkhUoAA3FJz?format=png&name=orig)
@@ -36,8 +36,7 @@ I will save your image for that day (if I get approval to use it), since Twitter
@SebAaltonen "Approval", haha, sure it's covered under my favorite license
![](https://files.catbox.moe/y9nkha.png)
![](https://pbs.twimg.com/media/Fz3_kb8WYAMXvcT?format=png&name=orig)
## Related
- Spine: [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal]]
@@ -30,8 +30,7 @@ parent_post_id: "1674757854471806977"
@NOTimothyLottes Looks like a koala
![](https://files.catbox.moe/wtbwl8.jpg)
![](https://pbs.twimg.com/media/Fz88Bk0WAAApDzL?format=jpg&name=orig)
## Related
- Spine: [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal]]
@@ -30,8 +30,7 @@ parent_post_id: "1674757854471806977"
@NOTimothyLottes
![](https://files.catbox.moe/n7x29c.jpg)
![](https://pbs.twimg.com/media/Fz6pnsBaQAEtMIZ?format=jpg&name=orig)
## Related
- Spine: [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal]]
@@ -29,6 +29,5 @@ in_reply_to: ""
"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.
![](https://files.catbox.moe/w4l74z.jpg)
![](https://pbs.twimg.com/media/Fz3vY5fXwAgEpzn?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-06-30-SebAaltonen-would-be-nice-to-talk-a-full-presentation-about]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-06-30-leonard_coder-4e71-if-you-know-you-know]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-06-30-domipheus-i-like-this-given-i-never-write-code-any-more]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-06-30-_spolsh-once-in-a-while-people-need-to-be-reminded-to]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-mike_acton-thread]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-SimonNordon-nop-is-ideal]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-azeke1984-best-software-is-absense-of-it-https-en-wikipedia]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-helpful_signage-folks-theyre-calling-it-computer-oriented]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-claudiogonzalo-c-to-c]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-DefenceForceOrg-many-games-used-to-be-like-that-at-least-the-ones]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-PierreTerdiman-i-was-calling-it-disoriented-programming-just-the]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-asparagiii-looks-like-a-koala]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-CodingFiend-i-designed-a-language-beads-which-uses-a-graph-db]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-01-TimSweeneyEpic-can-teach-it-in-abstinence-only-programming]], [[archive/threads/NOTimothyLottes/2023-06-30-nothing-oriented-programming-nop-where-the-goal/2023-07-09-wyattscarpenter-https-github-com-wyattscarpenter-wu]]
@@ -29,7 +29,7 @@ in_reply_to: ""
SPC: Using 8 deep swap all aliasing same BO (image) fixes Game Mode crash with external display. Pipelined load gets to black screen in 2 ms. Takes 460 ms to allocate 4 GiB GTT video ram, 558 ms to copy 256 MiB cart from page cache to USWC (page faults), all in parallel.
![](https://files.catbox.moe/yfbahk.jpg)
![](https://pbs.twimg.com/media/F2mmqYXWoAAG3fj?format=jpg&name=orig)
**2/**
@@ -29,26 +29,26 @@ in_reply_to: ""
SPC: Left off with KEY and GAMEPAD input GPU-accessable. NOP design, no functions, no API, just a fixed VA address and data format to read, dead easy.
Media (not lifted): `1687250591813079041_F2pRdu9WgAABCLE_orig.jpg` `1687250591813079041_F2pReKsXoAAPvow_orig.jpg`
![](https://pbs.twimg.com/media/F2pRdu9WgAABCLE?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F2pReKsXoAAPvow?format=jpg&name=orig)
**2/**
Wrote some console data dumping to aid in bringing up HID parsers for Deck and three generations of PlayStation controllers. Apparently XBox controllers aren't HIDs so not sure how one is supposed to access those.
Media (not lifted): `1687251721032978432_F2pSfIHXcAMI-IQ_orig.jpg` `1687251721032978432_F2pSfzAWcAMo6t7_orig.jpg`
![](https://pbs.twimg.com/media/F2pSfIHXcAMI-IQ?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F2pSfzAWcAMo6t7?format=jpg&name=orig)
**3/**
Supporting hot plug was a bit of a mess, just trying to open devices every second. Adding open devices to an epoll. {Product, vendor} isn't enough to ID a device, too much aliasing, so I use packet size as well.
Media (not lifted): `1687252813468852225_F2pTfekWYAAAwSi_orig.jpg`
![](https://pbs.twimg.com/media/F2pTfekWYAAAwSi?format=jpg&name=orig)
**4/**
Open devices with matching packet size get set in a bit array, and I collect up to 4 of those device outputs to sent to the GPU. Special logic to always place Steam Deck controls last to make docking work well.
Media (not lifted): `1687253442643755008_F2pUEG0XwAEwYvP_orig.jpg`
![](https://pbs.twimg.com/media/F2pUEG0XwAEwYvP?format=jpg&name=orig)
**5/**
I'll have to tackle audio at some point, but I'm skipping networking for version 1. But otherwise SPC is good to move on to the next step, which is to build out the GPU side assembler & data editor. Which will be written in binary at first.
@@ -29,4 +29,4 @@ in_reply_to: ""
Yeah, perhaps wildly alien. But for those who grew up with MOD-like trackers (like Impulse Tracker below), the interface will almost feel like home (those had simple {instrument, pattern, arangement} editors, with a very spreadsheet feel).
Media (not lifted): `1688286623375454208_F23_OOhXgAUBtlb_orig.png`
![](https://pbs.twimg.com/media/F23_OOhXgAUBtlb?format=png&name=orig)
@@ -30,8 +30,9 @@ parent_post_id: "1688491417109196800"
@NOTimothyLottes Very interesting "crosstalk from voltage inversion" artifact. Some repeating patterns or flicker patterns can trigger crosstalk artifacts too. Behavior varies a lot between TN, IPS, and VA, but all of them have to alternate voltage polarity spatially and temporally.
Media (not lifted): `1689479056448684032_F3I8AZmW0AEy6jn_orig.png` `1689479056448684032_F3I8BVlXoAAnuJB_orig.png`
![](https://pbs.twimg.com/media/F3I8AZmW0AEy6jn?format=png&name=orig)
![](https://pbs.twimg.com/media/F3I8BVlXoAAnuJB?format=png&name=orig)
## Related
- Spine: [[archive/threads/NOTimothyLottes/2023-08-07-crt-emulation-on-lcds-can-be-hard-for-example-its]]
@@ -29,22 +29,21 @@ in_reply_to: ""
CRT emulation on LCDs can be hard. For example it's often easy to generate a pattern that causes a LCD hardware bug. NOT joking. Here is an example on the Steam Deck. The pattern in the window affects the scan (Deck scan is rotated) outside the window.
Media (not lifted): `1688491417109196800_F265_JZXsAAInpa_orig.jpg` `1688491417109196800_F265_hLXkAAnfek_orig.jpg`
![](https://pbs.twimg.com/media/F265_JZXsAAInpa?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F265_hLXkAAnfek?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2023-08-07-crt-emulation-on-lcds-can-be-hard-for-example-its/2023-08-10-BlurBusters-very-interesting-crosstalk-from-voltage-inversion]]
**2/**
The actual pattern is this (it's a 2x1 pixel checker of {G,RB}).
Media (not lifted): `1688492237775142912_F266epnW4AAdCiK_orig.png`
![](https://pbs.twimg.com/media/F266epnW4AAdCiK?format=png&name=orig)
**3/**
The theory: Deck's 90deg scan results in {(bottom)R, G, B (top)} sub-pixel components. So could alternate {G,RB} only per pixel in a checker pattern to generate a new sub-pixel pattern at a different resolution. In this case trying for 640x400 virtual resolution.
Media (not lifted): `1688493686554849280_F267UYuXAAAO50A_orig.png`
![](https://pbs.twimg.com/media/F267UYuXAAAO50A?format=png&name=orig)
**4/**
For virtual pixel, shift energy into masked virtual phosphor. So 50% brightness red, would be {100%, 0%} for {in, out} of phosphor pixels. Over 50% one starts to increase non-phosphor pixels until some maximum so mask is still visible, but brightness isn't too compromised.
@@ -29,8 +29,11 @@ in_reply_to: ""
SPC: Last CRT shader was broken. Corrected it. It's energy conserving now, and correctly doing sub-pixel line width raster using the individual channels. Cell camera shots below at different zooms.
Media (not lifted): `1692395128739057844_F3yYY1iXYAAaAlE_orig.jpg` `1692395128739057844_F3yYZQwXcAABFvi_orig.jpg` `1692395128739057844_F3yYZo5WAAA0aRS_orig.jpg`
![](https://pbs.twimg.com/media/F3yYY1iXYAAaAlE?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F3yYZQwXcAABFvi?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F3yYZo5WAAA0aRS?format=jpg&name=orig)
**2/**
Each scan line is simulated with only 3 pixels. But you get 9 sub-pixels to play with, so that is where the quality comes from. It reaches 7/8th of the display peak brightness, this compromise was so there is always some amount of perceptual scan effect.
@@ -29,20 +29,15 @@ in_reply_to: ""
SPC: CRT shader on the Deck. This time not doing subpix render. Yet RGB vs BGR order matters still. One way it becomes possible to simulate even spaced aperture grill (removing scan fx), and the other more of the scan effect.
![](https://files.catbox.moe/mve2kr.jpg)
![](https://files.catbox.moe/vis95s.jpg)
![](https://pbs.twimg.com/media/F30tppDWwAAA-8J?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F30tqE8XYAAgrFv?format=jpg&name=orig)
**2/**
Comparing all methods (grille, bad convergence scan, subpix scan)
![](https://files.catbox.moe/mve2kr.jpg)
![](https://files.catbox.moe/vis95s.jpg)
![](https://files.catbox.moe/34pnhf.jpg)
![](https://pbs.twimg.com/media/F30uJoSWcAA7ICE?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F30uKJdXkAA4PV8?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F30uKouWQAAvY0q?format=jpg&name=orig)
**3/**
The non-subpix scan has 1-pixel separation of RGB (intentional bad convergence) to help hide scaling. The subpix scan uses 1/3-pixel separation (less visible misaligned convergence). Pixel as in output pixel.
@@ -51,6 +46,5 @@ The non-subpix scan has 1-pixel separation of RGB (intentional bad convergence)
The subpix version is definitely better. Because of the almost 3x doubling of scanline width detail, it just perceptually feels a lot cleaner and easier to reconstruct in the mind.
![](https://files.catbox.moe/ugcsjy.jpg)
![](https://files.catbox.moe/g42t2i.jpg)
![](https://pbs.twimg.com/media/F30y9HPWUAAbmmw?format=jpg&name=orig)
![](https://pbs.twimg.com/media/F30y9h3WAAETuui?format=jpg&name=orig)
@@ -29,50 +29,42 @@ in_reply_to: ""
Inspecting my old VK engines. On start I would warm all the pages. Code pages get a read, and data pages got an atomic add of a non-compiler known zero. An attempt to improve initial load time. But in the end nothing helps the 2.6 seconds or so required to just open the VK device
Media (not lifted): `1736147815829565624_GBgHT_2WIAAKuNq_orig.png`
![](https://pbs.twimg.com/media/GBgHT_2WIAAKuNq?format=png&name=orig)
**2/**
Since I almost never get crashes I forgot about this, but had written a system to auto relaunch the app on crash or special case exit. No complex error handling, just bank on fast relaunch instead.
Media (not lifted): `1736149104269344962_GBgJ1y5W0AArwSt_orig.png`
![](https://pbs.twimg.com/media/GBgJ1y5W0AArwSt?format=png&name=orig)
**3/**
The hope of single PSO in VK was scrapped because IHV compile times explode. However I did maintain single SPIR-V file, and use spec constants to choose individual shaders. The threads doing compile dump compile times and disassembly in DEV mode.
Media (not lifted): `1736151406703214631_GBgMbMEWkAAOd_d_orig.png`
![](https://pbs.twimg.com/media/GBgMbMEWkAAOd_d?format=png&name=orig)
**4/**
I'm a fan of single file applications. So when not in DEV mode the one SPIR-V file gets pulled from the EXE. Compiling PSOs is always the critical path, the moment the "bind everything once" layout is done, PSO compile goes wide on the machine.
Media (not lifted): `1736153352096882847_GBgOQRiXoAAX2k6_orig.png`
![](https://pbs.twimg.com/media/GBgOQRiXoAAX2k6?format=png&name=orig)
**5/**
"Bind-Everything-Once" in Vulkan looks like this. Bindings {1}=CPU pushing to GPU, {2}=buffer (more on that next), {3}=as UAVs, {4}=as TEX ... No binding logic at runtime ever. Access anything in the most efficient way any time.
Media (not lifted): `1736154923408953499_GBgPDhAWUAAzhEi_orig.png`
![](https://pbs.twimg.com/media/GBgPDhAWUAAzhEi?format=png&name=orig)
**6/**
Did something silly but fast for buffers. Here is an example from a dummy test app. The main SSBO gets aliased as 4 structures, each with the same data accessable with four types {uint, uint4, float, float4}. So same binding layout aliasing chooses load type and K$ or V$ access.
Media (not lifted): `1736156478354903216_GBgQ0xlWQAA7Yks_orig.png`
![](https://pbs.twimg.com/media/GBgQ0xlWQAA7Yks?format=png&name=orig)
**7/**
Literally the CPU does almost nothing. All game input gets pushed to the GPU for game logic. Some major advantages in input latency to do player logic on the GPU instead. And it's dead easy.
Media (not lifted): `1736157335058300999_GBgRu3wXoAAp_K7_orig.png`
![](https://pbs.twimg.com/media/GBgRu3wXoAAp_K7?format=png&name=orig)
**8/**
This requires context, I build programs in a hardware style, fixed resources, fixed shaders, and all logic expressed in the data itself. No code or resource variation, no runtime issues period. So another dummy program example, I can just list my resources on load in a table ...
Media (not lifted): `1736158727370154157_GBgTCgJXsAEPH3W_orig.png`
![](https://pbs.twimg.com/media/GBgTCgJXsAEPH3W?format=png&name=orig)
**9/**
Radically simplicity is how I roll personally. Easy to confuse the idea that one needs complexity to express a complex system. It's more like one needs complexity to express a complex solution -> abstractions and hierachical meta feeds on itself until tech debt freezes progess.
@@ -30,8 +30,7 @@ parent_post_id: "1776597200073568623"
@NOTimothyLottes @SebAaltonen @MartinJIFuller Ha! That won’t save you from my follow
Media (not lifted): `1777246377824731474_GKoMKCHWwAAWLvG.mp4_orig.mp4`
<video controls src="https://video.twimg.com/tweet_video/GKoMKCHWwAAWLvG.mp4"></video>
## Related
- Spine: [[archive/threads/NOTimothyLottes/2024-04-06-on-https-mastodon-gamedev-place-notimothylottes]]
@@ -31,6 +31,5 @@ in_reply_to: "1776518700230721688"
@MartinJIFuller @SebAaltonen On https://mastodon.gamedev.place/@NOTimothyLottes I'm collecting posts with AMD GPU disassembly dumps for a book on everything the shader compiler 'isn't doing'. Constant AMD GPU compiler perf bug SPAM is a key part of my online strategy to keep a low follower count.
Media (not lifted): `1776597200073568623_GKe8HDtXYAAOrfj_orig.jpg`
![](https://pbs.twimg.com/media/GKe8HDtXYAAOrfj?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2024-04-06-on-https-mastodon-gamedev-place-notimothylottes/2024-04-06-MartinJIFuller-a-worthwhile-project-knowledge-well-worth-sharing]], [[archive/threads/NOTimothyLottes/2024-04-06-on-https-mastodon-gamedev-place-notimothylottes/2024-04-08-RickyAH-ha-that-wont-save-you-from-my-follow]], [[archive/threads/NOTimothyLottes/2024-04-06-on-https-mastodon-gamedev-place-notimothylottes/2024-04-09-BenSimsTech-oh-sick-im-deep-in-optimising-shaders-in-an-aaa]]
@@ -29,12 +29,11 @@ in_reply_to: ""
@Karyuutensei I don't use standard C libs or anything like that. I just write my own stuff. For 'printf' style debugging I have macros that write to a memory mapped log file. They give {[restartNumber]|[msSinceLaunch]|[sourceLine]|[hex]|[dec]|[comment]}. Keeping multiple restarts in same log
Media (not lifted): `1948009807161721332_Gwi4H27WgAAIgMN_orig.png`
![](https://pbs.twimg.com/media/Gwi4H27WgAAIgMN?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2025-07-23-i-dont-use-standard-c-libs-or-anything-like-that/2025-07-23-Karyuutensei-where-does-the-restart-number-come-from-i-assume]]
**2/**
@Karyuutensei That log example is a simple test program, it starts in 0.3 ms for that run. The log tells all about how it pipelines start up {doing memory page warming, kart load, window setup, VK setup in parallel, getting to PSO gen as fast as possible [get layout done first]}
Media (not lifted): `1948010813555634392_Gwi47owXQAEa2Ar_orig.png`
![](https://pbs.twimg.com/media/Gwi47owXQAEa2Ar?format=png&name=orig)
@@ -30,8 +30,7 @@ parent_post_id: "1950860870818439202"
@NOTimothyLottes
Media (not lifted): `1950900720770625916_GxL93LLW8AA-5hM.mp4_orig.mp4`
<video controls src="https://video.twimg.com/tweet_video/GxL93LLW8AA-5hM.mp4"></video>
## Related
- Spine: [[archive/threads/NOTimothyLottes/2025-07-31-people-claim-assembly-is-hard-a-good-counter-to]]
@@ -29,6 +29,5 @@ in_reply_to: ""
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 (not lifted): `1990260050485797063_G57SXPJW8AAvEhh_orig.png`
![](https://pbs.twimg.com/media/G57SXPJW8AAvEhh?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2025-11-17-i-wish-everyone-would-just-adopt-reversed-with/2025-11-17-AgileJebrim-reversed-is-a-significant-improvement-but-it]], [[archive/threads/NOTimothyLottes/2025-11-17-i-wish-everyone-would-just-adopt-reversed-with/2025-11-17-terekhov_de-ive-never-had-real-depth-precision-issues-in-our]], [[archive/threads/NOTimothyLottes/2025-11-17-i-wish-everyone-would-just-adopt-reversed-with/2025-11-17-bgolus-many-are-still-on-opengles-and-webgl-which-dont]], [[archive/threads/NOTimothyLottes/2025-11-17-i-wish-everyone-would-just-adopt-reversed-with/2025-11-18-Alecazam123-infinite-far-doesnt-apply-to-ortho-and-many-of]], [[archive/threads/NOTimothyLottes/2025-11-17-i-wish-everyone-would-just-adopt-reversed-with/2025-11-19-stainless_code-i-havent-really-done-graphics-in-a-while-but-ive]]
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2060730425929080874_HJku0L4WkAAZk5a_orig.png`
![](https://pbs.twimg.com/media/HJku0L4WkAAZk5a?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-05-30-renovating-cpu-clock-code-im-assuming-x86-64-tsc/2026-05-31-FUZxxl-if-you-do-the-multiply-in-uint128-t-and-then]]
**2/**
@@ -29,4 +29,4 @@ in_reply_to: ""
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 (not lifted): `2062031187023982879_HJ3Ny2wX0AAKFFv_orig.png`
![](https://pbs.twimg.com/media/HJ3Ny2wX0AAKFFv?format=png&name=orig)
@@ -29,8 +29,9 @@ in_reply_to: ""
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 (not lifted): `2065832746757341482_HKtP7aQXsAAtJ5X_orig.jpg` `2065832746757341482_HKtP7aTWEAAC_j4_orig.jpg`
![](https://pbs.twimg.com/media/HKtP7aQXsAAtJ5X?format=jpg&name=orig)
![](https://pbs.twimg.com/media/HKtP7aTWEAAC_j4?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-06-13-cross-compilation-is-up-just-like-on-windows-with/2026-06-13-tomcr2100-interesting-font-does-it-have-a-name]]
**2/**
@@ -29,18 +29,16 @@ in_reply_to: ""
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 (not lifted): `2065804972378243476_HKs2q8RXQAAVsjN_orig.jpg`
![](https://pbs.twimg.com/media/HKs2q8RXQAAVsjN?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-06-13-nanorc-done-and-back-to-actual-programming-with/2026-06-13-quiveron_x-why-are-you-using-crt]], [[archive/threads/NOTimothyLottes/2026-06-13-nanorc-done-and-back-to-actual-programming-with/2026-06-13-eternalclassic_-you-can-use-camac-free-to-take-raw-photos-on]], [[archive/threads/NOTimothyLottes/2026-06-13-nanorc-done-and-back-to-actual-programming-with/2026-06-13-winning_tactic-hz-sharing-i-wonder-if-crts-can-be-changed-like]], [[archive/threads/NOTimothyLottes/2026-06-13-nanorc-done-and-back-to-actual-programming-with/2026-06-14-mayemayey-ohh-what-is-that-a-2070sb]]
**2/**
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 (not lifted): `2065806847634776401_HKs4YE5WMAAfe6G_orig.jpg`
![](https://pbs.twimg.com/media/HKs4YE5WMAAfe6G?format=jpg&name=orig)
**3/**
Lubbers are invading my screen
Media (not lifted): `2065809876488503805_HKs7IJHWMAAwzVL_orig.jpg`
![](https://pbs.twimg.com/media/HKs7IJHWMAAwzVL?format=jpg&name=orig)
@@ -29,4 +29,4 @@ in_reply_to: "2065851939917906296"
@axelgneiting The glibc implementation would do that. I bypass libc and just do it manually with perf_event_open syscall and mmap.
Media (not lifted): `2065872197147578751_HKtzz5RXcAA6CIX_orig.jpg`
![](https://pbs.twimg.com/media/HKtzz5RXcAA6CIX?format=jpg&name=orig)
@@ -29,6 +29,5 @@ in_reply_to: ""
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 (not lifted): `2066184005632786736_HKyPZnfWMAAv4qF_orig.jpg`
![](https://pbs.twimg.com/media/HKyPZnfWMAAv4qF?format=jpg&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-06-14-on-linux-i-do-speculative-pinning-of-cpu-memory/2026-06-14-Social_Vulture-running-in-crt-or-are-you-emulating-scanlines-in]], [[archive/threads/NOTimothyLottes/2026-06-14-on-linux-i-do-speculative-pinning-of-cpu-memory/2026-06-15-sadhuIGI-also-this-font-is-cursed]], [[archive/threads/NOTimothyLottes/2026-06-14-on-linux-i-do-speculative-pinning-of-cpu-memory/2026-06-15-GrowlerEnjooyer-there-is-0-chance-you-actually-use-this-font-its]]
@@ -29,6 +29,5 @@ in_reply_to: ""
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 (not lifted): `2070337342854832468_HLtP4RgWgAADbir_orig.png`
![](https://pbs.twimg.com/media/HLtP4RgWgAADbir?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-06-26-quick-summary-of-why-not-pselect-ppoll-epoll/2026-06-26-AgileJebrim-sendmmsg-recvmmsg-can-only-work-with-1024-packets]], [[archive/threads/NOTimothyLottes/2026-06-26-quick-summary-of-why-not-pselect-ppoll-epoll/2026-06-26-BigP4P4Smurf-take-a-look-at-http-lalists-stanford-edu-lad-2001]]
@@ -29,10 +29,9 @@ in_reply_to: ""
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 (not lifted): `2070734717825986566_HLy5-C9XMAAfs_w_orig.png`
![](https://pbs.twimg.com/media/HLy5-C9XMAAfs_w?format=png&name=orig)
**2/**
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 (not lifted): `2070735722043023873_HLy6SApX0AApPub_orig.png`
![](https://pbs.twimg.com/media/HLy6SApX0AApPub?format=png&name=orig)
@@ -29,28 +29,24 @@ in_reply_to: ""
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 (not lifted): `2071706805114216559_HMAt1GiXAAAoahX_orig.png`
![](https://pbs.twimg.com/media/HMAt1GiXAAAoahX?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-06-29-alsa-hell-month-continues-remember-it-might-be/2026-06-29-AlexABPerson-have-you-actually-reached-out-to-said-developers]]
**2/**
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 (not lifted): `2071710958397898929_HMAx0PmW0AAdUAy_orig.png`
![](https://pbs.twimg.com/media/HMAx0PmW0AAdUAy?format=png&name=orig)
**3/**
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 (not lifted): `2071714384225681440_HMA1CA9XIAAwRAB_orig.png`
![](https://pbs.twimg.com/media/HMA1CA9XIAAwRAB?format=png&name=orig)
**4/**
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 (not lifted): `2071715941688258752_HMA2LibWMAAMW3O_orig.png`
![](https://pbs.twimg.com/media/HMA2LibWMAAMW3O?format=png&name=orig)
**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).
@@ -59,21 +55,18 @@ In theory a good API, SNDRV_PCM_IOCTL_PREPARE would fail if the next SNDRV_PCM_I
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 (not lifted): `2071717187623030935_HMA3sGVXwAAVDMT_orig.png`
![](https://pbs.twimg.com/media/HMA3sGVXwAAVDMT?format=png&name=orig)
**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 (not lifted): `2071725181576319370_HMA-CDAXEAAw9ns_orig.jpg`
![](https://pbs.twimg.com/media/HMA-CDAXEAAw9ns?format=jpg&name=orig)
**8/**
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 (not lifted): `2071759816725311959_HMBePMXXwAE5_1M_orig.png`
![](https://pbs.twimg.com/media/HMBePMXXwAE5_1M?format=png&name=orig)
**9/**
magiz/
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2071415096304193820_HL8km6eWsAEq6xb_orig.png`
![](https://pbs.twimg.com/media/HL8km6eWsAEq6xb?format=png&name=orig)
**2/**
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.
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2071937360288235902_HMD_iq0XcAASnSn_orig.png`
![](https://pbs.twimg.com/media/HMD_iq0XcAASnSn?format=png&name=orig)
**2/**
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).
@@ -39,4 +38,4 @@ Theory says: better for size, worse for perf! Global structure will miss the cac
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 (not lifted): `2071938677584863448_HMEBJNuW4AE8JUV_orig.png`
![](https://pbs.twimg.com/media/HMEBJNuW4AE8JUV?format=png&name=orig)
@@ -29,8 +29,7 @@ in_reply_to: ""
Did manage to get ALSA to function without SNDRV_PCM_IOCTL_HW_REFINE and only with SNDRV_PCM_IOCTL_HW_PARAMS. My structures are different but aliased (snd_interval.interger -> .flag=4). Apparently setting the core values is enough for the driver.
Media (not lifted): `2072194202851549432_HMHoiZAWcAAjn6j_orig.png`
![](https://pbs.twimg.com/media/HMHoiZAWcAAjn6j?format=png&name=orig)
**2/**
Don't actually have to set {.flags,.rmask,.info} on my machine. Absolutely do have to set ".max=~0" for the intervals not being hardcoded. I only do double buffered, 48000Hz stereo, and just vary the frames/period sizing.
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2072445315370590266_HMLNdMOXkAAIoEj_orig.png`
![](https://pbs.twimg.com/media/HMLNdMOXkAAIoEj?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-01-haha-damn-i-thought-i-had-a-great-idea-for-wine/2026-07-01-opdroid1234-the-two-truths-ive-come-to-accept-in-life-a]], [[archive/threads/NOTimothyLottes/2026-07-01-haha-damn-i-thought-i-had-a-great-idea-for-wine/2026-07-02-winning_tactic-you-could-pretend-to-be-an-audio-jack]]
**2/**
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2072135292115427728_HMGz-64W4AABeaH_orig.png`
![](https://pbs.twimg.com/media/HMGz-64W4AABeaH?format=png&name=orig)
**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.
@@ -42,8 +41,9 @@ Linux priority workarounds
(b.) Use setrlimit() to set 'soft=hard' limit
(c.) Then set priority or nice based on new soft limit
Media (not lifted): `2072147378480566273_HMG-UCRXIAEKbdj_orig.png` `2072147378480566273_HMG-zRxWwAAWtI4_orig.png`
![](https://pbs.twimg.com/media/HMG-UCRXIAEKbdj?format=png&name=orig)
![](https://pbs.twimg.com/media/HMG-zRxWwAAWtI4?format=png&name=orig)
**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.
@@ -52,4 +52,4 @@ I don't do one-time global priority maximums, just in case someone sudo's higher
Also while on setrlimit, I also bump up the RLIMIT_MEMLOCK to it's maximum just in case before the mlockall().
Media (not lifted): `2072149707107787035_HMHBGTPXwAA_axg_orig.png`
![](https://pbs.twimg.com/media/HMHBGTPXwAA_axg?format=png&name=orig)
@@ -29,8 +29,7 @@ in_reply_to: ""
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 (not lifted): `2072506103401754653_HMMFAHiX0AAzY_R_orig.png`
![](https://pbs.twimg.com/media/HMMFAHiX0AAzY_R?format=png&name=orig)
**2/**
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.
@@ -39,8 +38,7 @@ I put in a forced thread sleep between writes to force a xrun, and SNDRV_PCM_IOC
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 (not lifted): `2072511121269928165_HMMJjYPWAAAY1IE_orig.png`
![](https://pbs.twimg.com/media/HMMJjYPWAAAY1IE?format=png&name=orig)
**4/**
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.
@@ -29,20 +29,19 @@ in_reply_to: ""
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 (not lifted): `2072804183992922296_HMQT-ALWoAAABEe_orig.png` `2072804183992922296_HMQUVgpXYAA3h6r_orig.png`
![](https://pbs.twimg.com/media/HMQT-ALWoAAABEe?format=png&name=orig)
![](https://pbs.twimg.com/media/HMQUVgpXYAA3h6r?format=png&name=orig)
**2/**
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 (not lifted): `2072825642354123190_HMQnWmJXcAAOiSS_orig.png`
![](https://pbs.twimg.com/media/HMQnWmJXcAAOiSS?format=png&name=orig)
**3/**
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 (not lifted): `2072826861449629746_HMQoTiQWkAAbwj1_orig.png`
![](https://pbs.twimg.com/media/HMQoTiQWkAAbwj1?format=png&name=orig)
**4/**
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.
@@ -29,34 +29,29 @@ in_reply_to: ""
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 (not lifted): `2073096069529907441_HMUdajFXEAAiaQE_orig.png`
![](https://pbs.twimg.com/media/HMUdajFXEAAiaQE?format=png&name=orig)
**2/**
Of course I'm missing the magic header that does the real work ... curious how messy this will get
Media (not lifted): `2073098899896598550_HMUgZcyWQAA263a_orig.jpg`
![](https://pbs.twimg.com/media/HMUgZcyWQAA263a?format=jpg&name=orig)
**3/**
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 (not lifted): `2073110092447203466_HMUqNm_XIAA0JEP_orig.png`
![](https://pbs.twimg.com/media/HMUqNm_XIAA0JEP?format=png&name=orig)
**4/**
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 (not lifted): `2073111326981783629_HMUrDz2XsAA9JLP_orig.png`
![](https://pbs.twimg.com/media/HMUrDz2XsAA9JLP?format=png&name=orig)
**5/**
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 (not lifted): `2073113441959616958_HMUs9oLWUAAaHx9_orig.png`
![](https://pbs.twimg.com/media/HMUs9oLWUAAaHx9?format=png&name=orig)
**6/**
Example below of how much header bloat I'm factoring out using my simple macros
Media (not lifted): `2073114409270997497_HMUujnwWoAAUQd1_orig.png`
![](https://pbs.twimg.com/media/HMUujnwWoAAUQd1?format=png&name=orig)
@@ -29,22 +29,19 @@ in_reply_to: ""
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 (not lifted): `2073110092447203466_HMUqNm_XIAA0JEP_orig.png`
![](https://pbs.twimg.com/media/HMUqNm_XIAA0JEP?format=png&name=orig)
**2/**
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 (not lifted): `2073111326981783629_HMUrDz2XsAA9JLP_orig.png`
![](https://pbs.twimg.com/media/HMUrDz2XsAA9JLP?format=png&name=orig)
**3/**
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 (not lifted): `2073113441959616958_HMUs9oLWUAAaHx9_orig.png`
![](https://pbs.twimg.com/media/HMUs9oLWUAAaHx9?format=png&name=orig)
**4/**
Example below of how much header bloat I'm factoring out using my simple macros
Media (not lifted): `2073114409270997497_HMUujnwWoAAUQd1_orig.png`
![](https://pbs.twimg.com/media/HMUujnwWoAAUQd1?format=png&name=orig)
@@ -29,6 +29,5 @@ in_reply_to: ""
Vulkan starts with the ping pong between getting an instance proc addr so one can get vkCreateInstance, then using that to create an instance so one can get the remaining functions. I reuse my Lib() code modified for VK, that keeps a 64-bit base and 32-bit offsets for symbols.
Media (not lifted): `2074108624553554387_HMi2ZkFXEAAy767_orig.png`
![](https://pbs.twimg.com/media/HMi2ZkFXEAAy767?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-06-vulkan-starts-with-the-ping-pong-between-getting/2026-07-08-nullspector-thats-very-neat-but-is-it-really-true-in-practice]]
@@ -29,18 +29,22 @@ in_reply_to: ""
Rethinking Vulkan queue choice. Traditional double-buffered games might do something like the code below. Find the queue that does {presentation,graphics,compute}. First off this seems like a lot of unnecessary work when one could just choose queue 0 and be done with it ...
Media (not lifted): `2075769880092037309_HM6desTW0AAHA_H_orig.png`
![](https://pbs.twimg.com/media/HM6desTW0AAHA_H?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-11-rethinking-vulkan-queue-choice-traditional-double/2026-07-11-konrad_kubacki_-am-i-having-a-stroke-what-is-this-font-it-feels]]
**2/**
AMD on Linux (RADV) and Windows. Queue 0 just works. But note both platforms support doing present on queue 1. So on AMD I'm likely going to render via compute on queue 0 [to reduce chance of preemption] and present on queue 1. And have both decoupled (for front buffer rendering)
Media (not lifted): `2075770634349527454_HM6d5GnWAAAGOmg_orig.jpg` `2075770634349527454_HM6d8lcXsAA-8LJ_orig.jpg`
![](https://pbs.twimg.com/media/HM6d5GnWAAAGOmg?format=jpg&name=orig)
![](https://pbs.twimg.com/media/HM6d8lcXsAA-8LJ?format=jpg&name=orig)
**3/**
NVIDIA is more complex. They put a DMA engine in queue 1 slot, and compute engine in queue 2 slot. Some sometimes queue 2 slot can or cannot do present (varies by driver). So maybe present on 0 (gfx queue), and dispatch on queue 2 by default for NV.
Media (not lifted): `2075771407510773906_HM6egsMWcAAkjOq_orig.jpg` `2075771407510773906_HM6ex2jXwAAkmI6_orig.jpg` `2075771407510773906_HM6e5EdXwAAuOG5_orig.jpg`
![](https://pbs.twimg.com/media/HM6egsMWcAAkjOq?format=jpg&name=orig)
![](https://pbs.twimg.com/media/HM6ex2jXwAAkmI6?format=jpg&name=orig)
![](https://pbs.twimg.com/media/HM6e5EdXwAAuOG5?format=jpg&name=orig)
@@ -29,6 +29,5 @@ in_reply_to: ""
Example usage after clean-up.
Media (not lifted): `2076833886827376782_HNJlSFyW0AAQylS_orig.png`
![](https://pbs.twimg.com/media/HNJlSFyW0AAQylS?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-14-example-usage-after-clean-up/2026-07-14-bkaradzic-much-clearer]], [[archive/threads/NOTimothyLottes/2026-07-14-example-usage-after-clean-up/2026-07-14-noop_dev-at-this-point-could-make-a-dsl-with-perl]]
@@ -29,6 +29,5 @@ in_reply_to: ""
Oh, F-it! The urge to drop the C baggage was too strong, using nasm to bootstrap another radical Forth for Linux. Will see how far I can get in a 4 KiB binary to start. Apparently this wants to exist, and I have no choice but to lend some fingers. ELF64 out of the way.
Media (not lifted): `2078257788732461389_HNdzRxAXMAEom1u_orig.png`
![](https://pbs.twimg.com/media/HNdzRxAXMAEom1u?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-17-oh-f-it-the-urge-to-drop-the-c-baggage-was-too/2026-07-18-furan-sorry-for-the-tangent-what-is-this-font-and-where]]
@@ -29,6 +29,5 @@ in_reply_to: ""
I realized at some point I can have most interpreted forth-style words in an aligned 8-bytes. So can make a very small interpreter.
Media (not lifted): `2078349730204078527_HNfHl-dXcAAf6Om_orig.png`
![](https://pbs.twimg.com/media/HNfHl-dXcAAf6Om?format=png&name=orig)
Branches: [[archive/threads/NOTimothyLottes/2026-07-18-i-realized-at-some-point-i-can-have-most/2026-07-18-noop_dev-even-smaller-code-size-possible-with-custom]]
@@ -49,26 +49,22 @@ In a traditional right-justified CPU, you'd have three ops {MUL, ADD, SHR} which
Left justified variable bit-width loads make a lot more sense, partly because the LSBs index into bits (or sub-bits depending on mapping) effectively (instead of bytes), and one can do {4/8/16/32-bit} extraction with 8 SLICES and one CLB deep [a lot easier than right-justified]
Media (not lifted): `2083764013570093330_HOsENEBXEAAoWlx_orig.png`
![](https://pbs.twimg.com/media/HOsENEBXEAAoWlx?format=png&name=orig)
**7/**
The core normalized IMAD can easily be made -/+ symmetrical simply by feeding in truncated LSBs of the add operand with simple logic based on MSBs of mul operands. In the example below the {-4} represents {-1.0}. Of course -4*-4 overflows to -4 [2's comp]
Media (not lifted): `2083765900436492692_HOsFs-nWAAAUlTy_orig.png`
![](https://pbs.twimg.com/media/HOsFs-nWAAAUlTy?format=png&name=orig)
**8/**
Predicate/bool logic becomes {0.0, -1.0} based, can leverage {a+b} wrap around to implement XOR, and -(a*b) to implement AND.
Media (not lifted): `2083766854980383071_HOsG3VBXAAA92kz_orig.png`
![](https://pbs.twimg.com/media/HOsG3VBXAAA92kz?format=png&name=orig)
**9/**
Doing a "perspective divide" {s=x/z} can be transformed into a scaled perspective divide {s=x*(a/z)} to work around the {-1.0 to <1.0} range limitation. And one can transform the divide into a binary search for 's' - specifically largest 's' where {s*z<=x*a}
Media (not lifted): `2083768129658765655_HOsIBCBWcAA79PL_orig.png`
![](https://pbs.twimg.com/media/HOsIBCBWcAA79PL?format=png&name=orig)
**10/**
Notice this binary search test takes just one IMAD {s*z+t} where t=-x*a. Meaning a smart machine can do a test step in 2 ops on a DSP (one IMAD for the test, the next to ADD to 's' for the next search step) ...
@@ -35,4 +35,8 @@ code is awful because i'm using Java as if it's C, and it isn't optimized (plent
the <\> represents NULL. (this was debugged with print 🙂).
Media (not lifted): `1991383117571957052_G6LJrEgXkAA2Z26_orig.png` `1991383117571957052_G6LPXFOWAAABSVy_orig.jpg` `1991383117571957052_G6LPYhqXgAA2rvt_orig.jpg`
![](https://pbs.twimg.com/media/G6LJrEgXkAA2Z26?format=png&name=orig)
![](https://pbs.twimg.com/media/G6LPXFOWAAABSVy?format=jpg&name=orig)
![](https://pbs.twimg.com/media/G6LPYhqXgAA2rvt?format=jpg&name=orig)
@@ -30,8 +30,7 @@ parent_post_id: "2073406569459368226"
@VictorTaelin Bro, you dont hafta Grug-post to be popular with the right people.
![](https://files.catbox.moe/uuordl.jpg)
![](https://pbs.twimg.com/media/HMZQa0UXUAA3ZJp?format=jpg&name=orig)
## Related
- Spine: [[archive/threads/VictorTaelin/2026-07-04-sighs]]
@@ -30,8 +30,7 @@ parent_post_id: "2073406569459368226"
@VictorTaelin Legend
![](https://files.catbox.moe/55q672.jpg)
![](https://pbs.twimg.com/media/HMb6HlXacAAgdAN?format=jpg&name=orig)
## Related
- Spine: [[archive/threads/VictorTaelin/2026-07-04-sighs]]
@@ -32,8 +32,7 @@ parent_post_id: "2073406569459368226"
so “+1”
![](https://files.catbox.moe/iiumro.jpg)
![](https://pbs.twimg.com/media/HMcipC5WUAA44VI?format=jpg&name=orig)
## Related
- Spine: [[archive/threads/VictorTaelin/2026-07-04-sighs]]
@@ -90,6 +90,5 @@ that was Fable's contribution, and, if you can't see how incredible this is, I d
as for the solution, Fable proposed a few. all bad. my fix was to split Type in two sorts: one for arbitrary types, and other for lower order values. this lets me have the relaxed checks on positions where lambdas cannot occur, while still ensuring lambdas cannot be cloned and, therefore, self replicate. this is the "elegant proof" I mentioned in the post below!
![](https://files.catbox.moe/566zyf.jpg)
![](https://pbs.twimg.com/media/HMY3SbQWAAAGmrp?format=jpg&name=orig)
Branches: [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Rafa_Schwinger-no-i-prefer-the-previous-angry-rhetoric-pls]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-NickChapmn-y-combinators-dont-have-valid-types-so-you-are]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-ETazou-i-understood-5-but-i-still-enjoyed-it]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-fecklesstit-u-the-best-man-keep-it-up]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-AutorRecomienda-fable-simplemente-hizo-de-placa-base-pitando-para]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-MancerAI_-its-lonely-sometimes-eh-im-excited-about-your]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-ThePremiseOfIt-theres-an-emergent-ai-psychosis-psychosis-in]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-willyrgf-wow-thats-impressive-best-argument-on-the-quality]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-o1lo01ol1o-do-you-allow-for-non-termination-on-total]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-WayneBrown6922-i-began-following-you-when-i-scrolled-across-an]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-MoisasADR-os-caras-acham-que-s-eles-s-o-superinteligentes]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-billylevin-this-is-so-cool-and-inspiring-not-that-i]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-taxilogiker-russel-antinomy]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-anghel4d-im-a-big-fan-of-interaction-combinators-and-i]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-mprado-loved-this-long-post-version-of-yours-you-should]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-trinitotolukeno-karpathy-said-he-had-ai-psychosis-for-a-while-and]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-yacineMTB-its-not-how-many-likes-you-get-its-likes-from-who]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-marunarh-most-of-you-cant-understand-my-posts-of-course]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Unblinking3Y3-bro-you-dont-hafta-grug-post-to-be-popular-with]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-okiwano-im-curious-what-comes-after-bend2-bend3-or-are]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-YgorIsm-texto-mt-bem-escrito-ficou-bem-mais-f-cil-de]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-0xAgathosDaimon-the-real-crime-is-those-idiots-not-knowing-who]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-pakatanatakata-lemme-aske-gpt-for-translating-your-hieroglyph]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-RizwanKhuharo-angry-ones-always-get-attention-on-internet]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-iabom-sigh-true-brother-we-smart-people-are-alone-no]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-RealSchmebulog-sorry-im-not-very-technical-did-you-mean-ai-good]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-VincentLejeune-the-more-ai-advances-the-more-we-need-very-high]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-LeeeeeeeeeT_-i-once-implemented-a-type-checker-for]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-zyansheep-in-my-language-im-trying-to-do-termination-by]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-SdoGtnepreS-dont-let-them-get-you-down-they-can-barely-see]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-habibislop-this-is-a-very-naive-and-ignorant-question-but]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-carmim_13-adorei-ler-esse-post-timo-poder-ler-de-voc-essas]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Foxfire1st-you-speak-simply-into-a-mixed-space-where-most]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-itisnotsavio-one-question-does-bend-have-an-unscoped-lambda]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-esa_was_taken-is-another-good-example-this-is-happening-to-both]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-An0o0o0o0n-im-not-going-to-read-all-that-im-happy-for-you-or]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-adelbucetta-sometimes-the-problem-isnt-explaining-something]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Juanpinha11-i-never-thought-you-had-ai-psychosis-but-the-fact]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Kinch_ahoy-i-got-interested-in-bend-for-its-prosaic]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-Trevor62271128-i-cant-really-comprehend-what-bend2-will-be]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-donalfellows-if-you-have-a-system-that-provably-must-terminate]], [[archive/threads/VictorTaelin/2026-07-04-sighs/2026-07-04-SoritesMinor-keep-posting-and-ill-keep-readinLine truncated
+1 -1
View File
@@ -1 +1 @@
Working media for Threadwell. Mirrors archive/threads/<handle>/<date-slug>/ plus handles/<handle>/. Gitignored except this file. Not published. Lift to the image host later. Do not link notes at this folder.
Working media for Threadwell. Mirrors archive/threads/<handle>/<date-slug>/ plus handles/<handle>/. Gitignored except this file. Not published. Notes never link here; published media cites the original provider's HTTPS URL. A separate `tw.py backup --id <id>` command mirrors these assets to configured storage; alternative-host uploads are a manual fallback used only after the origin is confirmed unavailable. Do not link notes at this folder.
+1 -1
View File
@@ -48,7 +48,7 @@ A thread folder holds `index.md` (spine) and one markdown file per off-spine rep
# Images
Always absolute HTTPS URLs on the image host (catbox after upload). Do not commit local binaries for published notes. Working files sit in `assets/` (gitignored), not in `meta/attachments/` except unrelated Obsidian drops.
Always absolute HTTPS URLs from the original provider when possible (`pbs.twimg.com`, `video.twimg.com`). The vault also retains a local, unpublished copy under `assets/` using the same relative taxonomy as the archive. A separately requested backup may mirror those assets to configured storage; alternative-host uploads are a manual fallback used only after the origin is confirmed unavailable, and the original URL and every fallback URL remain recorded in `media.json`. Do not commit local binaries for published notes. Working files sit in `assets/` (gitignored), not in `meta/attachments/` except unrelated Obsidian drops.
```md
![](https://files.catbox.moe/example.png)
+1 -1
View File
@@ -36,7 +36,7 @@ Every imported thread starts with `archive`, `twitter`, and the author's handle.
## Images
Pictures on the site are ordinary HTTPS URLs. Working copies of files live outside what GitHub Pages serves. A note that is still being prepared is marked `draft: true` and does not appear on the site.
Pictures on the site are direct HTTPS URLs from the original image host when possible. Working copies of files live outside what GitHub Pages serves. A note that is still being prepared is marked `draft: true` and does not appear on the site.
## Reading
+33 -14
View File
@@ -5,42 +5,61 @@ Front door: `tw.py`. Individual scripts still work.
From the vault root:
```
python C:\projects\Threadwell\scripts\twitter\tw.py locate --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py graph --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py refresh --id <snowflake> --tip
python C:\projects\Threadwell\scripts\twitter\tw.py lift --id <snowflake> --orig
python C:\projects\Threadwell\scripts\twitter\tw.py ocr --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py audit-media --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py publish --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py sync --handle <handle> # rebuild handle index
python C:\projects\Threadwell\scripts\twitter\tw.py sync # rebuild all handle indexes
python C:\projects\Threadwell\scripts\twitter\tw.py sync --handle <handle>
python C:\projects\Threadwell\scripts\twitter\tw.py backup --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py fallback --id <snowflake> --media-id <media-id> --role <role> --confirm-origin-unavailable
python C:\projects\Threadwell\scripts\twitter\tw.py restore-origin --id <snowflake> --media-id <media-id>
python C:\projects\Threadwell\scripts\twitter\tw.py migrate-media --id <snowflake>
python C:\projects\Threadwell\scripts\twitter\tw.py migrate-media --all --apply
```
`paths.py` sets vault = two parents above this file, dumps = `../manual_slop/docs/twitter`, scratch = `../Threadwell-ai/scratch`.
`refresh` = refetch (cookies) + ingest + emit `--force` + media_merge. `--tip` treats `--id` as the tip (climb same-handle `reply_to`). Does not flip `draft`. Does not commit. Frozen Onat ids abort.
`refresh` = refetch (cookies) + ingest + emit `--force` + media_merge. `--tip` treats `--id` as the tip (climb same-handle `reply_to`). Does not flip `draft`. Does not commit. Frozen ids abort.
Usual publish path after you like the note:
1. `tw.py graph --id …` — confirm tip vs root.
2. `tw.py refresh --id … --tip` if the dump stored a tip as root.
3. `tw.py lift --id … --orig` — catbox + rewrite `![](https://…)`.
3. `tw.py audit-media --id …` — confirm origin URLs are selected.
4. `tw.py publish --id …` sets `draft: false`. You commit.
Site wikilinks must be `[[archive/threads/<handle>/<date-slug>]]`. Short `[[slug]]` 404s.
## Media policy
Published Twitter/X media cites the original provider's HTTPS URL by default. The vault also retains a local, unpublished copy under `assets/threads/<handle>/<date-slug>/` using the same relative taxonomy as the archive. A separately requested backup may mirror those assets to configured storage. Alternative-host uploads are a manual fallback used only after the origin is confirmed unavailable; the original URL and every fallback URL remain recorded in `media.json`.
The `lift` command is retired. Use `fallback` for a single media item after explicit confirmation, or `restore-origin` to select the immutable provider URL again. The Catbox userhash and backup destination id/root are read from `secrets/credentials.toml` by the script. Never paste them into chat.
Frozen threads (ids listed in `do_not_refetch.txt`, matched against every captured post id) are read-only across refetch, refresh, emit, manifest migration, note rewrite, fallback, publication selection, and tracked backup operations. Read-only `audit-media` may still inspect them.
## Pieces
| Script | Job |
|---|---|
| `tw.py` | locate / graph / refetch / emit / refresh / lift / ocr / merge |
| `tw.py` | locate / graph / refetch / emit / refresh / ocr / merge / sync / publish / migrate-media / backup / fallback / restore-origin |
| `graph_dry_run.py` | tip graph, no vault writes |
| `ingest_gallery.py` | gallery-dl JSON → `thread_data.json` |
| `emit_archive.py` | JSON → notes + assets. `--force` now keeps CRT/OCR rows and prior catbox URLs |
| `lift_catbox.py` | upload `publish: true` (or `--orig`) |
| `emit_archive.py` | JSON → notes + assets. Uses canonical media locations. `--force` preserves derived/fallback rows |
| `media_migrate.py` | legacy `media.json` → canonical locations, dry-run or apply |
| `media_audit.py` | local integrity, reference counts, mirror freshness, optional origin check |
| `media_manifest.py` | schema, validation, merge, selection, atomic I/O |
| `media_refs.py` | media-aware markup and note rewrite planning |
| `backup_assets.py` | sparse, hash-verified copy of one thread asset dir |
| `catbox_client.py` | one sanitized Catbox upload; no batching or retry |
| `fallback_media.py` | confirm-origin fallback activation and restore-origin |
| `frozen.py` | resolve frozen ids against every captured post id |
| `lift_catbox.py` | retired entry; points operators to `tw.py fallback` |
| `ocr_pass.py` | Umi HTTP `:1224` / tesseract / Windows OCR |
| `media_embed.py` | `--show crt` / `--attach-ocr` |
| `media_merge.py` | restore extra rows if you still need it |
| `media_embed.py` | `--attach-ocr` only; refuses `--show crt` |
| `media_merge.py` | restore derived rows under canonical API |
| `crt_pass.py` | stock slang only; ShaderGlass is the look reference |
| `do_not_refetch.txt` | Onat freeze list |
| `do_not_refetch.txt` | frozen id list |
| `tests/` | isolated, deterministic unit tests |
Secrets: `secrets/twitter_cookies.txt`, `secrets/credentials.toml` `[catbox] userhash`. Never print them.
Secrets: `secrets/twitter_cookies.txt`, `secrets/credentials.toml` `[catbox] userhash` and `[backup] id`/`root`. The script reads them; never paste into chat, tests, or commits.