The Curious Engineer

All blogs / Graphics

The ryg blog

fgiesen.wordpress.com

When I grow up I'll be an inventor.

GraphicsPerformance / optimizationAlgorithms / data structuresCPU / microarchitectureDemoscene

Posts
171 from 4 Oct 2009 to 25 Aug 2026
Posting
now and then (5 in the last year)
Kind
personal blog
Feed
https://fgiesen.wordpress.com/feed/

2026 5

  1. Memory ordering in CPUs
  2. ryg_rans is not a library
  3. PivCo-Huffman “merge” operations
  4. Simple batch decoding of unary codes
  5. Why does ASTC use ISE when almost nothing else does?

2025 2

  1. Content creator
  2. Oodle 2.9.14 and Intel 13th/14th gen CPUs

2024 9

  1. UNORM and SNORM to float, hardware edition
  2. Mrsse
  3. Exact UNORM8 to float
  4. BC7 optimal solid-color blocks
  5. Why those particular integer multiplies?
  6. Inserting a 0 bit in the middle of a value
  7. Zero or sign extend
  8. When is a BCn/ASTC endpoints-from-indices solve singular?
  9. Oodle, Kraken etc. misconceptions

2023 5

  1. Entropy decoding in Oodle Data: x86-64 6-stream Huffman decoders
  2. Computational complexity of texture encoding
  3. A very brief BitKnit retrospective
  4. Notes on FFTs: for implementers
  5. Notes on FFTs: for users

2022 5

  1. What’s that magic computation in stb__RefineBlock?
  2. On AlphaTensor’s new matrix multiplication algorithms
  3. Morton codes addendum
  4. Entropy decoding in Oodle Data: x86-64 3-stream Huffman decoders
  5. Entropy decoding in Oodle Data: Huffman decoding on the Jaguar

2021 3

  1. GPU BCn decoding
  2. Entropy coding in Oodle Data: Huffman coding
  3. Entropy coding in Oodle Data: the big picture

2019 4

  1. Frequency responses of half-pel filters
  2. What happens when iterating filters?
  3. Cache tables
  4. Rotating a single vector using a quaternion

2018 6

  1. Rate-distortion optimization
  2. Reading bits in far too many ways (part 3)
  3. A whirlwind introduction to dataflow graphs
  4. Reading bits in far too many ways (part 2)
  5. Reading bits in far too many ways (part 1)
  6. Network latencies and speed of light

2017 8

  1. Papers I like (part 7)
  2. Papers I like (part 6)
  3. Papers I like (part 5)
  4. Papers I like (part 4)
  5. Papers I like (part 3)
  6. Papers I like (part 2)
  7. Papers I like (part 1)
  8. Memory bandwidth

2016 8

  1. Rounding up to the nearest integer that’s congruent to k mod N
  2. How many x86 instructions are there?
  3. Why do CPUs have multiple cache levels?
  4. SSE: mind the gap!
  5. Repeated match offsets in BitKnit
  6. “Smart”
  7. Thoughts on The Witness
  8. End-of-buffer checks in decompressors

2015 8

  1. rANS in practice
  2. Reading and writing are less symmetric than you (probably) think
  3. Intervals in modular arithmetic
  4. The Modulith
  5. Models for adaptive arithmetic coding
  6. Triangular numbers mod 2^n
  7. Mixing discrete probability distributions
  8. A small note on SIMD matrix-vector multiplication

2014 11

  1. From the archives: “Alias Huffman coding.”
  2. Binary alias coding
  3. Little-endian vs. big-endian
  4. Atomic operations and contention
  5. Cache coherency primer
  6. Bindless chain letter
  7. FSE/ANS history correction
  8. Networks all the way down, part 2.
  9. Networks all the way down.
  10. rANS with static probability distributions
  11. rANS notes

2013 36

  1. Index compression follow-up
  2. Simple lossless(*) index buffer compression
  3. Symmetry
  4. Bink 2.2 integer DCT design, part 2
  5. Bink 2.2 integer DCT design, part 1
  6. Bit scanning equivalencies
  7. Tales of Suspense, Adventure and Data Structure Manipulation!
  8. Native debugging on Android
  9. Texture uploads on Android
  10. SIMD transposes 2
  11. SIMD transposes 1
  12. “It’s just a game”
  13. Modified Gram-Schmidt orthogonalization
  14. Trig identities from complex exponentials
  15. 64-bit mode and 3-operand instructions
  16. On ePub/PDF versions of my posts and licensing
  17. Optimizing Software Occlusion Culling: The Reckoning
  18. Mopping up
  19. Speculatively speaking
  20. Reshaping dataflows
  21. The care and feeding of worker threads, part 2
  22. The care and feeding of worker threads, part 1
  23. Optimizing Software Occlusion Culling – index
  24. Depth buffers done quick, part 2
  25. Depth buffers done quick, part 1
  26. Optimizing the basic rasterizer
  27. Triangle rasterization in practice
  28. The barycentric conspiracy
  29. Frustum culling: turning the crank
  30. Fixing cache issues, the lazy way
  31. Cores don’t like to share
  32. A string processing rant
  33. Write combining is not your friend
  34. Order-preserving bijections
  35. Min, Max under negation and an AABB trick
  36. Small note on Quaternion distance metrics

2012 20

  1. Frustum planes from the projection matrix
  2. Z-transform done quick
  3. Quaternion differentiation
  4. Linear interpolation past, present and future
  5. Polynomials from repeated linear interpolation
  6. Fast blurs 2
  7. Fast blurs 1
  8. The Magic Ring Buffer
  9. Linear Algebra Toolbox 3
  10. Linear Algebra Toolbox 2
  11. (Linear) Algebra Toolbox 1
  12. GenThree Overview
  13. If in doubt, go to the source
  14. Metaprogramming for madmen
  15. Half-edges redux
  16. Half to float done quick
  17. Half-edge based mesh representations: practice
  18. Half-edge based mesh representations: theory
  19. Debris: Opening the box
  20. Row major vs. column major, row vectors vs. column vectors

2011 23

  1. Buffer-centric IO
  2. Checking for interval overlap
  3. A trip through the Graphics Pipeline 2011, part 13
  4. Migrating Thunderbird profiles: A story in three acts
  5. A trip through the Graphics Pipeline 2011, part 12
  6. A trip through the Graphics Pipeline 2011, part 11
  7. A trip through the Graphics Pipeline 2011, part 10
  8. A trip through the Graphics Pipeline 2011, part 9
  9. A trip through the Graphics Pipeline 2011, part 8
  10. A trip through the Graphics Pipeline 2011: Index
  11. A trip through the Graphics Pipeline 2011, part 7
  12. A trip through the Graphics Pipeline 2011, part 6
  13. A trip through the Graphics Pipeline 2011, part 5
  14. A trip through the Graphics Pipeline 2011, part 4
  15. A trip through the Graphics Pipeline 2011, part 3
  16. A trip through the Graphics Pipeline 2011, part 2
  17. A trip through the Graphics Pipeline 2011, part 1
  18. Row-major vs. column-major and GL ES
  19. Notes on caches and threads
  20. Loop control overhead on x86
  21. x86 code compression in kkrunchy
  22. A small note on the Elias gamma code
  23. Texture tiling and swizzling

2010 15

  1. Ring buffers and queues
  2. Negative space in programming
  3. More PPC compiler babysitting
  4. Planar rotations and the DCT
  5. sinc and Polynomial interpolation
  6. Finish your derivations, please
  7. Some more frustum culling notes
  8. View frustum culling
  9. 64-bit tidbits
  10. Cycle detection algorithms are handy to know
  11. We don’t need new multimedia formats
  12. Data structures and invariants
  13. Carry-save adders and averaging bit-packed values
  14. How to generate cellular textures 2
  15. How to generate cellular textures

2009 3

  1. DXT5 alpha block index determination
  2. Decoding Morton Codes
  3. Launch