{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreievw2ld2zhgyfyzefb2ztnftve3tmcg6xdxxsbdpk3kis4zlwbl5y",
    "uri": "at://did:plc:bqma3dxvtfkv542aaek7xf6c/app.bsky.feed.post/3mnwkfarisgr2"
  },
  "path": "/2026-06-10-fixing-the-rb-swap-the-right-way/",
  "publishedAt": "2026-06-10T10:55:54.031Z",
  "site": "https://christian-gmeiner.info",
  "tags": [
    "Igalia"
  ],
  "textContent": "If you’ve ever looked at a GPU render and seen blue where red should be, you’ve met the R/B swap problem. For etnaviv this has been a long-standing source of complexity. We were solving it in the shader, but the proprietary blob driver had a simpler approach all along. As part of my work at Igalia, I finally sat down and did it properly.\n\n## The problem\n\nVivante GPUs have a quirk: the Pixel Engine (PE) always writes pixels in BGRA byte order. When your API says “render to R8G8B8A8_UNORM”, what actually lands in memory is B, G, R, A. Every byte of every pixel, every frame. The hardware just works that way.",
  "title": "Fixing the R/B swap the right way",
  "updatedAt": "2026-06-10T00:00:00.000Z"
}