Add GPU-accelerated rendering: cpu/gpu/hybrid RenderBackend (Phase 8)

Splits RenderBackend's per-voxel face-visibility extraction and tile
shading out as GPU-offloadable steps (wgpu compute shaders), while
keeping greedy-mesh merge/compaction CPU-only per the plan's "partial
GPU rendering" design. RENDER_BACKEND=cpu|gpu|hybrid selects the
strategy, falling back to cpu automatically (logged) if no compatible
GPU adapter is found. Verified against a real GPU: all tests pass,
including ones asserting byte-identical output between the cpu and
gpu backends; a new benchmark example honestly shows cpu currently
outperforming gpu/hybrid at realistic batch sizes since each call is
its own dispatch/readback round trip rather than batched across a
whole render batch (documented as a follow-up optimization).

Also fixes two real, pre-existing gaps found while validating the
worker's actual `docker build`: a missing .dockerignore was sending
the local multi-GB target/ dir into the build context, and the
Dockerfile's rust:1.80 pin was already too old for current
transitive dependency MSRVs (bumped to rust:1.97).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015tKdPZt78zbPUZMXWzKEKt
This commit is contained in:
2026-08-09 21:39:32 +02:00
parent 826233e10c
commit 1a0ccd8b17
15 changed files with 1487 additions and 112 deletions
+11
View File
@@ -36,6 +36,17 @@ services:
# Scale render capacity locally with, e.g.: docker compose up --scale worker=3
# A `worker` can also run standalone on a separate machine, pointed at the same
# postgres/redis/minio over a private network (VPN/Tailscale/LAN) — see README.
#
# RENDER_BACKEND=gpu/hybrid (worker/.env.example, Phase 8) needs the container to actually
# see a GPU — the nvidia-container-toolkit must be installed on the host, then uncomment:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
# Default RENDER_BACKEND=cpu needs none of this — GPU rendering is opt-in, not required.
postgres:
image: postgres:17-alpine