{"id":34634484,"url":"https://github.com/gogpu/gogpu","last_synced_at":"2026-03-10T22:11:53.560Z","repository":{"id":328216936,"uuid":"1110695525","full_name":"gogpu/gogpu","owner":"gogpu","description":"Pure Go Graphics Framework — GPU power, Go simplicity","archived":false,"fork":false,"pushed_at":"2026-03-07T05:47:27.000Z","size":15151,"stargazers_count":178,"open_issues_count":2,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-03-07T13:39:52.255Z","etag":null,"topics":["game-development","go","golang","gpu","graphics","pure-go","rendering","webgpu","zero-cgo"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gogpu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-05T15:24:57.000Z","updated_at":"2026-03-07T12:23:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gogpu/gogpu","commit_stats":null,"previous_names":["gogpu/gogpu"],"tags_count":76,"template":false,"template_full_name":null,"purl":"pkg:github/gogpu/gogpu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgogpu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgogpu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgogpu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgogpu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gogpu","download_url":"https://codeload.github.com/gogpu/gogpu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gogpu%2Fgogpu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30357625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["game-development","go","golang","gpu","graphics","pure-go","rendering","webgpu","zero-cgo"],"created_at":"2025-12-24T16:59:38.914Z","updated_at":"2026-03-10T22:11:53.537Z","avatar_url":"https://github.com/gogpu.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"GoGPU Logo\" width=\"180\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eGoGPU\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003ePure Go GPU Computing Ecosystem\u003c/strong\u003e\u003cbr\u003e\n  GPU power, Go simplicity. Zero CGO.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/gogpu/gogpu/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/gogpu/gogpu/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/gogpu/gogpu\"\u003e\u003cimg src=\"https://codecov.io/gh/gogpu/gogpu/branch/main/graph/badge.svg\" alt=\"codecov\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pkg.go.dev/github.com/gogpu/gogpu\"\u003e\u003cimg src=\"https://pkg.go.dev/badge/github.com/gogpu/gogpu.svg\" alt=\"Go Reference\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/gogpu/gogpu\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/gogpu/gogpu\" alt=\"Go Report Card\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/gogpu/gogpu/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/gogpu/gogpu\" alt=\"Latest Release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/gogpu/gogpu\"\u003e\u003cimg src=\"https://img.shields.io/badge/Go-1.25+-00ADD8?logo=go\" alt=\"Go Version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/gogpu/gogpu/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/gogpu/gogpu?style=flat\u0026labelColor=555\u0026color=yellow\" alt=\"Stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Overview\n\n**GoGPU** is a GPU computing framework for Go that provides a high-level API for graphics and compute operations. It supports dual backends: a high-performance Rust backend (wgpu-native) and a pure Go backend for zero-dependency builds.\n\n### Key Features\n\n| Category | Capabilities |\n|----------|--------------|\n| **Backends** | Rust (wgpu-native) or Pure Go (gogpu/wgpu) |\n| **Graphics API** | Runtime selection: Vulkan, DX12, Metal, GLES, Software |\n| **Platforms** | Windows (Vulkan/DX12/GLES), Linux X11/Wayland (Vulkan/GLES), macOS (Metal) |\n| **Rendering** | Event-driven three-state model (idle/animating/continuous), zero-copy surface rendering |\n| **Graphics** | Windowing, input handling, texture loading |\n| **Compute** | Full compute shader support |\n| **Integration** | DeviceProvider, HalProvider, WindowProvider, PlatformProvider, SurfaceView |\n| **Logging** | Structured logging via `log/slog`, silent by default |\n| **Build** | Zero CGO with Pure Go backend |\n\n---\n\n## Installation\n\n```bash\ngo get github.com/gogpu/gogpu\n```\n\n**Requirements:**\n- Go 1.25+\n- `CGO_ENABLED=0` (Pure Go FFI requires CGO disabled)\n\n**Zero dependencies — just works:**\n```bash\nCGO_ENABLED=0 go run .\n```\n\n\u003e **Note:** On macOS and some Linux distros, CGO is enabled by default. Always set `CGO_ENABLED=0` when building GoGPU projects.\n\n---\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"github.com/gogpu/gogpu\"\n    \"github.com/gogpu/gogpu/gmath\"\n)\n\nfunc main() {\n    app := gogpu.NewApp(gogpu.DefaultConfig().\n        WithTitle(\"Hello GoGPU\").\n        WithSize(800, 600))\n\n    app.OnDraw(func(dc *gogpu.Context) {\n        dc.DrawTriangleColor(gmath.DarkGray)\n    })\n\n    app.Run()\n}\n```\n\n**Result:** A window with a rendered triangle in approximately 20 lines of code, compared to 480+ lines of raw WebGPU.\n\n---\n\n## Backend Selection\n\nGoGPU supports two WebGPU implementations, selectable at compile time or runtime.\n\n### Build Tags\n\n```bash\n# Pure Go backend (default, zero dependencies)\ngo build ./...\n\n# Enable Rust backend (requires wgpu-native shared library)\ngo build -tags rust ./...\n```\n\n### Runtime Selection\n\n```go\n// Auto-select best available (default)\napp := gogpu.NewApp(gogpu.DefaultConfig())\n\n// Explicit Rust backend\napp := gogpu.NewApp(gogpu.DefaultConfig().WithBackend(gogpu.BackendRust))\n\n// Explicit Pure Go backend\napp := gogpu.NewApp(gogpu.DefaultConfig().WithBackend(gogpu.BackendGo))\n```\n\n| Backend | Build Tag | Library | Use Case |\n|---------|-----------|---------|----------|\n| **Native Go** | (default) | gogpu/wgpu | Zero dependencies, simple deployment |\n| **Rust** | `-tags rust` | wgpu-native via FFI | Maximum performance (all platforms) |\n\n\u003e **Note:** Rust backend requires [wgpu-native](https://github.com/gfx-rs/wgpu-native/releases) DLL.\n\n### Graphics API Selection\n\nBackend (Rust/Native) and Graphics API (Vulkan/DX12/Metal/GLES) are independent choices:\n\n```go\n// Force Vulkan on Windows (instead of auto-detected default)\napp := gogpu.NewApp(gogpu.DefaultConfig().\n    WithGraphicsAPI(gogpu.GraphicsAPIVulkan))\n\n// Force DirectX 12 on Windows\napp := gogpu.NewApp(gogpu.DefaultConfig().\n    WithGraphicsAPI(gogpu.GraphicsAPIDX12))\n\n// Force GLES (useful for testing or compatibility)\napp := gogpu.NewApp(gogpu.DefaultConfig().\n    WithGraphicsAPI(gogpu.GraphicsAPIGLES))\n\n// Software backend — no GPU required, always available\n// Windows: renders to screen via GDI. Linux/macOS: headless.\napp := gogpu.NewApp(gogpu.DefaultConfig().\n    WithGraphicsAPI(gogpu.GraphicsAPISoftware))\n```\n\n| Graphics API | Platforms | Constant |\n|--------------|-----------|----------|\n| **Auto** | All (default) | `gogpu.GraphicsAPIAuto` |\n| **Vulkan** | Windows, Linux | `gogpu.GraphicsAPIVulkan` |\n| **DX12** | Windows | `gogpu.GraphicsAPIDX12` |\n| **Metal** | macOS | `gogpu.GraphicsAPIMetal` |\n| **GLES** | Windows, Linux | `gogpu.GraphicsAPIGLES` |\n| **Software** | All (no GPU needed) | `gogpu.GraphicsAPISoftware` |\n\n---\n\n## Resource Management\n\nGPU resources are automatically cleaned up on shutdown when registered with `TrackResource`:\n\n```go\ncanvas, _ := ggcanvas.New(provider, 800, 600)\napp.TrackResource(canvas) // auto-closed on shutdown, no OnClose needed\n```\n\nResources are closed in LIFO (reverse) order after GPU idle, before device destruction. The shutdown sequence is: `WaitIdle → tracked resources → OnClose → Renderer.Destroy()`.\n\n**ggcanvas auto-registration:** When created via a provider that implements `ResourceTracker` (like `App`), ggcanvas auto-registers — no `TrackResource` call needed.\n\n**GC safety net:** Textures use `runtime.AddCleanup` as a fallback — if you forget `Destroy()`, the GC will eventually clean up GPU resources. This is a safety net, not a replacement for explicit cleanup.\n\n---\n\n## Texture Loading\n\n```go\n// Load from file (PNG, JPEG)\ntex, err := renderer.LoadTexture(\"sprite.png\")\ndefer tex.Destroy()\n\n// Create from Go image\nimg := image.NewRGBA(image.Rect(0, 0, 128, 128))\ntex, err := renderer.NewTextureFromImage(img)\n\n// With custom filtering options\nopts := gogpu.TextureOptions{\n    MagFilter:    gputypes.FilterModeNearest,  // Crisp pixels\n    AddressModeU: gputypes.AddressModeRepeat,  // Tiling\n}\ntex, err := renderer.LoadTextureWithOptions(\"tile.png\", opts)\n```\n\n---\n\n## DeviceProvider Interface\n\nGoGPU exposes GPU resources through the `DeviceProvider` interface for integration with external libraries:\n\n```go\ntype DeviceProvider interface {\n    Device() hal.Device              // HAL GPU device (type-safe Go interface)\n    Queue() hal.Queue                // HAL command queue\n    SurfaceFormat() gputypes.TextureFormat\n}\n\n// Usage\nprovider := app.DeviceProvider()\ndevice := provider.Device()   // hal.Device — 30+ methods with error returns\nqueue := provider.Queue()     // hal.Queue — Submit, WriteBuffer, ReadBuffer\n```\n\n### Cross-Package Integration (gpucontext)\n\nFor integration with external libraries like [gogpu/gg](https://github.com/gogpu/gg), use the standard [gpucontext](https://github.com/gogpu/gpucontext) interfaces:\n\n```go\nimport \"github.com/gogpu/gpucontext\"\n\n// Get gpucontext.DeviceProvider for external libraries\nprovider := app.GPUContextProvider()\ndevice := provider.Device()   // gpucontext.Device interface\nqueue := provider.Queue()     // gpucontext.Queue interface\nformat := provider.SurfaceFormat() // gpucontext.TextureFormat\n\n// Get gpucontext.EventSource for UI frameworks\nevents := app.EventSource()\nevents.OnKeyPress(func(key gpucontext.Key, mods gpucontext.Modifiers) {\n    // Handle keyboard input\n})\nevents.OnMousePress(func(button gpucontext.MouseButton, x, y float64) {\n    // Handle mouse click\n})\n```\n\nThis enables enterprise-grade dependency injection between packages without circular imports.\n\n### HalProvider (Direct GPU Access)\n\nFor GPU accelerators that need low-level HAL access (compute shaders, buffer readback):\n\n```go\nimport \"github.com/gogpu/gpucontext\"\n\nprovider := app.GPUContextProvider()\n\n// Type-assert to HalProvider for direct HAL access\nif hp, ok := provider.(gpucontext.HalProvider); ok {\n    halDevice := hp.HalDevice() // hal.Device for compute pipelines\n    halQueue := hp.HalQueue()   // hal.Queue for command submission\n}\n```\n\nUsed by [gogpu/gg](https://github.com/gogpu/gg) GPU SDF accelerator for compute shader dispatch on shared device.\n\n### SurfaceView (Zero-Copy Rendering)\n\nFor direct GPU rendering without CPU readback:\n\n```go\napp.OnDraw(func(dc *gogpu.Context) {\n    view := dc.SurfaceView() // Current frame's GPU texture view\n    // Pass to ggcanvas.RenderDirect() for zero-copy compositing\n})\n```\n\nThis eliminates the GPU→CPU→GPU round-trip when integrating with gg/ggcanvas.\n\n### Window \u0026 Platform Integration\n\n`App` implements `gpucontext.WindowProvider` and `gpucontext.PlatformProvider` for UI frameworks:\n\n```go\n// Window geometry and DPI\nw, h := app.Size()              // physical pixels\nscale := app.ScaleFactor()      // 1.0 = standard, 2.0 = Retina/HiDPI\n\n// Clipboard\ntext, _ := app.ClipboardRead()\napp.ClipboardWrite(\"copied text\")\n\n// Cursor management\napp.SetCursor(gpucontext.CursorPointer)  // hand cursor\napp.SetCursor(gpucontext.CursorText)     // I-beam for text input\n\n// System preferences\nif app.DarkMode() { /* switch to dark theme */ }\nif app.ReduceMotion() { /* disable animations */ }\nif app.HighContrast() { /* increase contrast */ }\nfontMul := app.FontScale() // user's font size preference\n```\n\n### Ebiten-Style Input Polling\n\nFor game loops, use the polling-based Input API:\n\n```go\nimport \"github.com/gogpu/gogpu/input\"\n\napp.OnUpdate(func(dt float64) {\n    inp := app.Input()\n\n    // Keyboard\n    if inp.Keyboard().JustPressed(input.KeySpace) {\n        player.Jump()\n    }\n    if inp.Keyboard().Pressed(input.KeyLeft) {\n        player.MoveLeft(dt)\n    }\n\n    // Mouse\n    x, y := inp.Mouse().Position()\n    if inp.Mouse().JustPressed(input.MouseButtonLeft) {\n        player.Shoot(x, y)\n    }\n})\n```\n\nAll input methods are thread-safe and work with the frame-based update loop.\n\n### Event-Driven Rendering\n\nGoGPU uses a three-state rendering model for optimal power efficiency:\n\n| State | Condition | CPU Usage | Latency |\n|-------|-----------|-----------|---------|\n| **Idle** | No activity | 0% (blocks on OS events) | \u003c1ms wakeup |\n| **Animating** | Active animation tokens | VSync (~60fps) | Smooth |\n| **Continuous** | `ContinuousRender=true` | 100% (game loop) | Immediate |\n\n```go\n// Event-driven mode (default for UI apps)\napp := gogpu.NewApp(gogpu.DefaultConfig().\n    WithContinuousRender(false))\n\n// Start animation — renders at VSync while token is alive\ntoken := app.StartAnimation()\n// ... animation runs at 60fps ...\ntoken.Stop() // Loop returns to idle (0% CPU)\n\n// Request single-frame redraw from any goroutine\napp.RequestRedraw()\n```\n\nMultiple animation tokens can be active simultaneously. The loop renders continuously until all tokens are stopped.\n\n### Resource Cleanup\n\nUse `OnClose` to release GPU resources before the renderer is destroyed:\n\n```go\napp.OnClose(func() {\n    if canvas != nil {\n        _ = canvas.Close()\n        canvas = nil\n    }\n})\n\nif err := app.Run(); err != nil {\n    log.Fatal(err)\n}\n```\n\n`OnClose` runs on the render thread before `Renderer.Destroy()`, ensuring textures, bind groups, and pipelines are released while the device is still alive.\n\n---\n\n## Compute Shaders\n\nFull compute shader support via HAL interfaces:\n\n```go\n// Create compute pipeline via HAL device\npipeline, _ := device.CreateComputePipeline(\u0026hal.ComputePipelineDescriptor{\n    Layout:     pipelineLayout,\n    Module:     shaderModule,\n    EntryPoint: \"main\",\n})\n\n// Create storage buffers\ninputBuffer, _ := device.CreateBuffer(\u0026hal.BufferDescriptor{\n    Size:  dataSize,\n    Usage: gputypes.BufferUsageStorage | gputypes.BufferUsageCopyDst,\n})\n\n// Dispatch compute work via command encoder\nencoder, _ := device.CreateCommandEncoder()\nencoder.BeginEncoding(\"compute\")\npass := encoder.BeginComputePass(\u0026hal.ComputePassDescriptor{})\npass.SetPipeline(pipeline)\npass.SetBindGroup(0, bindGroup, nil)\npass.Dispatch(workgroupsX, 1, 1)\npass.End()\ncmdBuf := encoder.EndEncoding()\nqueue.Submit([]hal.CommandBuffer{cmdBuf}, nil, 0)\n```\n\n---\n\n## Logging\n\nGoGPU uses `log/slog` for structured logging, silent by default:\n\n```go\nimport \"log/slog\"\n\n// Enable info-level logging\ngogpu.SetLogger(slog.Default())\n\n// Enable debug-level logging for full diagnostics\ngogpu.SetLogger(slog.New(slog.NewTextHandler(os.Stderr, \u0026slog.HandlerOptions{\n    Level: slog.LevelDebug,\n})))\n\n// Get current logger\nlogger := gogpu.Logger()\n```\n\nLog levels: `Debug` (texture creation, pipeline state), `Info` (backend selected, adapter info), `Warn` (resource cleanup errors).\n\n---\n\n## Architecture\n\nGoGPU uses **multi-thread architecture** (Ebiten/Gio pattern) for professional responsiveness:\n- **Main thread:** Window events only (Win32/Cocoa/X11 message pump)\n- **Render thread:** All GPU operations (device, swapchain, commands)\n\nThis ensures windows never show \"Not Responding\" during heavy GPU operations.\n\n```\nUser Application\n       │\n       ▼\n┌─────────────────────────────────────────────────────────┐\n│                      gogpu.App                          │\n│    Multi-Thread: Events (main) + Render (dedicated)     │\n└─────────────────────────────────────────────────────────┘\n       │\n       ▼\n┌─────────────────────────────────────────────────────────┐\n│                    gogpu.Renderer                       │\n│  Uses hal.Device / hal.Queue directly (Go interfaces)   │\n└─────────────────────────────────────────────────────────┘\n       │\n       ├─────────────────┐\n       ▼                 ▼\n┌─────────────┐  ┌─────────────┐\n│  gogpu/wgpu │  │  Platform   │\n│ (Pure Go    │  │  Windowing  │\n│  WebGPU)    │  │ Win32/Cocoa │\n└──────┬──────┘  └─────────────┘\n       │\n ┌─────┴─────┬─────┬─────┬─────────┐\n ▼           ▼     ▼     ▼         ▼\nVulkan     DX12  Metal  GLES   Software\n```\n\n### Package Structure\n\n| Package | Purpose |\n|---------|---------|\n| `gogpu` (root) | App, Config, Context, Renderer, Texture |\n| `gpu/` | Backend selection (HAL-based) |\n| `gpu/types/` | BackendType, GraphicsAPI enums |\n| `gpu/backend/rust/` | Rust backend via wgpu-native FFI (opt-in, `-tags rust`) |\n| `gpu/backend/native/` | HAL backend creation (Vulkan/Metal selection) |\n| `gmath/` | Vec2, Vec3, Vec4, Mat4, Color |\n| `window/` | Window configuration |\n| `input/` | Keyboard and mouse input |\n| `internal/platform/` | Platform-specific windowing |\n| `internal/thread/` | Multi-thread rendering (RenderLoop) |\n\n---\n\n## Platform Support\n\n### Windows\n\nNative Win32 windowing with Vulkan, DirectX 12, GLES, and Software backends.\n\n### Linux\n\nX11 and Wayland support with Vulkan, GLES, and Software (headless) backends.\n\n- **X11** — pure Go X11 protocol with libX11 loaded via goffi for Vulkan surface creation. Multi-touch input via XInput2 wire protocol.\n- **Wayland** — pure Go Wayland protocol (object dispatch) with libwayland-client via goffi for Vulkan surfaces. Server-side decorations via `zxdg_decoration_manager_v1`. Tested on WSLg, GNOME, KDE, sway.\n\n### macOS\n\nPure Go Cocoa implementation via goffi Objective-C runtime, with Metal and Software (headless) backends:\n\n```\ninternal/platform/darwin/\n├── application.go   # NSApplication lifecycle\n├── window.go        # NSWindow, NSView management\n├── surface.go       # CAMetalLayer integration\n└── objc.go          # Objective-C runtime via goffi\n```\n\n**Note:** macOS Cocoa requires UI operations on the main thread. GoGPU handles this automatically.\n\n---\n\n## Ecosystem\n\n| Project | Description |\n|---------|-------------|\n| **gogpu/gogpu** | **GPU framework (this repo)** |\n| [gogpu/gpucontext](https://github.com/gogpu/gpucontext) | Shared interfaces (DeviceProvider, WindowProvider, PlatformProvider, EventSource) |\n| [gogpu/gputypes](https://github.com/gogpu/gputypes) | Shared WebGPU types (TextureFormat, BufferUsage, Limits) |\n| [gogpu/wgpu](https://github.com/gogpu/wgpu) | Pure Go WebGPU implementation |\n| [gogpu/naga](https://github.com/gogpu/naga) | Shader compiler (WGSL to SPIR-V, MSL, GLSL) |\n| [gogpu/gg](https://github.com/gogpu/gg) | 2D graphics library |\n| [gogpu/ui](https://github.com/gogpu/ui) | GUI toolkit (planned) |\n| [go-webgpu/webgpu](https://github.com/go-webgpu/webgpu) | wgpu-native FFI bindings |\n| [go-webgpu/goffi](https://github.com/go-webgpu/goffi) | Pure Go FFI library |\n\n---\n\n## Documentation\n\n- **[ARCHITECTURE.md](docs/ARCHITECTURE.md)** — System architecture\n- **[ROADMAP.md](ROADMAP.md)** — Development milestones\n- **[CHANGELOG.md](CHANGELOG.md)** — Release notes\n- **[pkg.go.dev](https://pkg.go.dev/github.com/gogpu/gogpu)** — API reference\n\n### Articles\n\n- [GoGPU: From Idea to 100K Lines in Two Weeks](https://dev.to/kolkov/gogpu-from-idea-to-100k-lines-in-two-weeks-building-gos-gpu-ecosystem-3b2)\n- [GoGPU Announcement](https://dev.to/kolkov/gogpu-a-pure-go-graphics-library-for-gpu-programming-2j5d)\n\n---\n\n## Contributing\n\nContributions welcome! See [GitHub Discussions](https://github.com/gogpu/gogpu/discussions) to share ideas and ask questions.\n\n**Priority areas:**\n- Platform testing (macOS, Linux X11/Wayland, Windows DX12)\n- Documentation and examples\n- Performance benchmarks\n- Bug reports\n\n```bash\ngit clone https://github.com/gogpu/gogpu\ncd gogpu\ngo build ./...\ngo test ./...\n```\n\n---\n\n## Acknowledgments\n\n**Professor Ancha Baranova** — This project would not have been possible without her invaluable help and support.\n\n### Inspiration\n\n- [u/m-unknown-2025](https://www.reddit.com/user/m-unknown-2025/) — The [Reddit post](https://www.reddit.com/r/golang/comments/1pdw9i7/go_deserves_more_support_in_gui_development/) that started it all\n- [born-ml/born](https://github.com/born-ml/born) — ML framework where go-webgpu bindings originated\n\n### Contributors\n\n| Contributor | Contributions |\n|-------------|---------------|\n| [@ppoage](https://github.com/ppoage) | macOS ARM64 (Apple Silicon) support — 3 merged PRs across gogpu, wgpu, and naga with ~3,500 lines of code. Made Metal backend work on M1/M4 |\n| [@JanGordon](https://github.com/JanGordon) | Documentation fix (wgpu) |\n\n### Community Champions\n\n| Champion | Contributions |\n|----------|---------------|\n| [@darkliquid](https://github.com/darkliquid) · Andrew Montgomery | Linux platform hero — 3 bug reports, 13+ comments with detailed stack traces and diagnostics. His persistence uncovered the critical [goffi stack spill bug](https://github.com/go-webgpu/goffi/issues/19) affecting all Linux/macOS users |\n| [@i2534](https://github.com/i2534) | Most prolific gg tester — 7 bug reports covering alpha blending, patterns, transforms, and line joins. Shaped the quality of the 2D renderer |\n| [@qq1792569310](https://github.com/qq1792569310) · luomo | Early stress-tester — 3 issues and 9 comments. Found memory leak and event system bugs that improved framework stability |\n| [@rcarlier](https://github.com/rcarlier) · Richard Carlier | Cross-platform tester — 4 issues across gg and ui. Active tester of text rendering, image handling, and UI on macOS Apple Silicon (M3) |\n| [@amortaza](https://github.com/amortaza) · Afshin Mortazavi-Nia | Architecture contributor — deep multi-week engagement in gg+gogpu integration discussions. Author of [go-bellina](https://github.com/amortaza/go-bellina) UI library |\n| [@cyberbeast](https://github.com/cyberbeast) · Sandesh Gade | macOS Tahoe debugger — thorough Metal backend debugging on Apple M2 Max with detailed diagnostics |\n| [@crsolver](https://github.com/crsolver) | UI architecture advisor — significant input on the UI toolkit RFC with 8+ discussion comments |\n| [@neurlang](https://github.com/neurlang) | Wayland expert — author of [neurlang/wayland](https://github.com/neurlang/wayland), provided expert consultation on Wayland protocol issues |\n\n### Early Adopters\n\nThese developers tested GoGPU on Day 1 — when nothing worked and every platform was broken. Their bug reports shaped the project:\n\n- [@Nickrocky](https://github.com/Nickrocky) — First macOS tester (Dec 25, 2025). The very first external user to try GoGPU\n- [@facemcgee](https://github.com/facemcgee) — Early Linux tester (Dec 29, 2025)\n- [@soypat](https://github.com/soypat) — Early naga interest, [gsdf](https://github.com/soypat/gsdf) integration exploration\n- [@jan53n](https://github.com/jan53n) — Linux X11 testing\n- [@davidmichaelkarr](https://github.com/davidmichaelkarr) — Windows 11 testing\n- [@martinarisk](https://github.com/martinarisk) — Wayland testing, report that led to major protocol fixes\n- [@adamsanclemente](https://github.com/adamsanclemente) — Found transform rendering bug in gg\n- [@beikege](https://github.com/beikege) — Touch input advocacy, UI toolkit feedback\n- [@joeblew999](https://github.com/joeblew999) — WASM/browser platform interest\n\n---\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eGoGPU\u003c/strong\u003e — Building the GPU computing ecosystem Go deserves\n\u003c/p\u003e\n","funding_links":[],"categories":["Game Development"],"sub_categories":["Search and Analytic Databases"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgogpu%2Fgogpu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgogpu%2Fgogpu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgogpu%2Fgogpu/lists"}