Skip to content

Instantly share code, notes, and snippets.

@zeux
zeux / clang27.md
Last active January 27, 2024 11:45
How does clang 2.7 hold up in 2021?

A friend recently learned about Proebsting's law and mentioned it to me off hand. I knew about the law's existence but I never really asked myself - do I believe in it?

For people who aren't aware, Proebsting's law states:

Compiler Advances Double Computing Power Every 18 Years

Which is to say, if you upgrade your compiler every 18 years, you would expect on average your code to double in performance on the same hardware.

Let's C about this

State of Roblox graphics API across all platforms, with percentage deltas since EOY 2020. Updated December 31 2021.

Windows

API Share
Direct3D 11+ 92% (+3%)
Direct3D 10.1 5% (-2%)
Direct3D 10.0 3% (-0.5%)
@zeux
zeux / builtin.lua
Created May 20, 2020 15:43
Roblox Luau type surface as of May 20, 2020
export type any=any
export type nil=nil
export type string=string
export type number=number
export type boolean=boolean
@zeux
zeux / codecbench-clang.txt
Created April 25, 2020 18:41
codecbench: native gcc vs native clang vs v8 Wasm vs WAVM Wasm
source: vertex data 32064032 bytes, index data 24000000 bytes
pass 0: vertex data 18518385 bytes, index data 2332680 bytes
decode: vertex 9.31 ms (3.21 GB/sec), index 5.65 ms (3.95 GB/sec)
decode: vertex 9.43 ms (3.17 GB/sec), index 5.64 ms (3.96 GB/sec)
decode: vertex 9.44 ms (3.16 GB/sec), index 5.69 ms (3.93 GB/sec)
decode: vertex 9.47 ms (3.15 GB/sec), index 5.72 ms (3.91 GB/sec)
decode: vertex 9.50 ms (3.14 GB/sec), index 5.72 ms (3.91 GB/sec)
decode: vertex 9.36 ms (3.19 GB/sec), index 5.82 ms (3.84 GB/sec)
decode: vertex 9.57 ms (3.12 GB/sec), index 5.75 ms (3.89 GB/sec)
decode: vertex 9.47 ms (3.15 GB/sec), index 5.72 ms (3.91 GB/sec)
@zeux
zeux / fixupsimd.js
Last active April 3, 2020 19:42
A SIMD opcode remapper for the impending Wasm SIMD instruction renumbering, written on stream https://www.youtube.com/watch?v=zo20ryVj6e8
function fixupSimd(input) {
var data = new Uint8Array(input);
var read = 0;
var result = new Uint8Array(data.length * 2); // worst case: opcode renumbering changes 1-byte to 2-byte
var write = 0;
var readByte = function() {
read++;
if (read >= data.length) {
@zeux
zeux / codec-versioning.md
Last active January 27, 2020 05:17
Writing down various options to extend meshoptimizer encoding API with format versioning

Problem

meshoptimizer currently ships with index and vertex codecs with the API along these lines:

size_t encode(destination, destination_capacity, source, source_size)
void decode(destination, destination_size, source, source_size)

The next version of meshoptimizer needs to make backwards incompatible changes to the encoding format to allow for better compression.

State of Roblox graphics API across all platforms, with percentage deltas since EOY 2019. Updated December 27 2020.

Windows

API Share
Direct3D 11+ 89% (+4%)
Direct3D 10.1 7% (-2%)
Direct3D 10.0 3.5% (-1.5%)
Direct3D 9 0.5% (-0.5%)
@zeux
zeux / types.lua
Created January 18, 2020 04:00
Luau dumptypes output as of 1/17/2020
This file has been truncated, but you can view the full file.
type AdvancedDragger={
AncestryChanged:Event,
Archivable:boolean,
AttributeChanged:Event,
AttributesReplicate:string,
AttributesSerialize:any,
Changed:Event,
ChildAdded:Event,
ChildRemoved:Event,
@zeux
zeux / nbody.s
Last active January 2, 2020 18:20
luaujit: nbody.lua when compiled using experimental Luau JIT engine. All assembly snippets only show inner loop body. Variants: scalar - using type info, records and basic block compiler to generate much more efficient inner loop; vector - scalar but with scalars replaced with first-class 3-component vector
# table type guard (memory safety)
cmp dword ptr [rdi + 12], 6
jne 1072 <.text+0x5ea>
# load array index and convert to integer (+ exactness check)
movsd xmm0, qword ptr [rdi + 256]
cvttsd2si eax, xmm0
cvtsi2sd xmm1, eax
ucomisd xmm1, xmm0
jne 1046 <.text+0x5ea>
# indices are 1-based; could remove this one with runtime changes
@zeux
zeux / islandize-reuv.cpp
Last active June 25, 2019 05:58
Isolate UV islands and move each island to 0..1 range if possible; this reduces the total UV range of the mesh.
unsigned int follow(std::vector<unsigned int>& ids, unsigned int v)
{
unsigned int nv = v;
while (ids[nv] != nv)
nv = ids[nv];
return ids[v] = nv;
}
size_t islandize(const std::vector<unsigned int>& indices, std::vector<unsigned int>& islands)