Per Vognsen

@pervognsen
2.5K Followers
358 Following
10K Posts
I like programming and understanding how stuff works. My background is in systems programming and game development.

Here's the Shadertoy where you can paint eroded mountains and islands with your mouse, right in the browser:
https://www.shadertoy.com/view/sf23W1

#ProcGen #vfx #GameDev

My erosion filter is out! Video, blog post, and shader source.

It emulates erosion without simulation, so it's fast, GPU friendly, and trivial to generate in chunks.

Explainer video:
https://www.youtube.com/watch?v=r4V21_uUK8Y

Companion blog post:
https://blog.runevision.com/2026/03/fast-and-gorgeous-erosion-filter.html

#ProcGen #vfx #GameDev

That is, it's technically UB if node->next == node + 1 and node and node->next are from different allocations and are only "accidentally" adjacent in the address space. I think the provenance-legal workarounds involve either inline assembly or exposed provenance which in the proposed change to the C standard requires ptr-int-ptr casts: https://gustedt.wordpress.com/2025/06/30/the-provenance-memory-model-for-c/.
The provenance memory model for C

[The wordpress markdown inclusion does a very bad job, it seems, there have been some idiotic formatting errors. I hope that these are fixed, now.] A years-long effort led by Kayvan Memarian and Pe…

Jens Gustedt's Blog
Now that pointer provenance is ingrained into my thinking, I realize that the code I posted some years ago as an example and which was written up by @francesco in https://mazzo.li/posts/value-speculation.html has provenance-related UB unless the nodes satisfying node->next == node + 1 come from the same allocation (e.g. from an arena block allocation).
Beating the L1 cache with value speculation

I'm occasionally tempted to do a homebrew computer vision project to figure out how frequently the geckos manage to get into and out of the sink on their own. My rule of thumb is that I never help a gecko the first time I see it in the sink, but if I come back an hour or two later and it's still there, it gets an assist.
There's a particularly fat house gecko I have to help out of the kitchen sink pretty much every day. At this point I feel like I'm interfering in the process of natural selection.
Andreas Abel added latency, throughput, and port usage data for Emerald Rapids, Meteor Lake, Arrow Lake, and Zen 5 to https://uops.info/table.html 🎉
uops.info - Table

FUN FACT: the "nano" prefix ultimately descends from Ancient Greek "nanos", which means "dwarf".

Consequently, translating "nanotechnology" as "dwarven machinery" is arguably defensible.

I've been reverse engineering and benchmarking Apple's, ARM's, and ImgTec's hardware image compression formats. ARM's AFRC is the clear winner, but does native hardware compression make real-time texture encoding obsolete?

https://www.ludicon.com/castano/blog/2026/03/hardware-image-compression/

Hardware Image Compression

One of the things I've always lamented about hardware image formats is the slow pace of innovation. Developers were usually unwilling to ship textures in a new format unless that format was widely available. That is, the format had to be supported in the majority of the hardware they were targeting,

Ignacio Castaño
I'm not a distributed systems person, but I guess this is a _much_ simpler version of something like https://en.wikipedia.org/wiki/Chandy%E2%80%93Lamport_algorithm. E.g. this part is similar to what I was describing as recording internal inputs during the checkpointing interval: "If a process receives a marker after having recorded its local state, it records the state of the incoming channel from which the marker came as carrying all the messages received since it first recorded its local state."
Chandy–Lamport algorithm - Wikipedia