GoGPU: 아이디어에서 2주 만에 10만 라인 — Go의 GPU 생태계 구축
Source: Dev.to
Introduction
수년 동안 나는 Go — 단순함과 성능으로 사랑받는 언어 — 가 아직도 전문적인 GUI 생태계를 갖추지 못한 이유를 이해하지 못했다. Go에서 그래픽이 필요할 때마다 나는 같은 장벽에 부딪혔다: CGO 요구사항, 방치된 프로젝트, 불완전한 솔루션. 정말 답답했다.
6개월 전 나는 준비를 시작했다: WebGPU 사양을 읽고, wgpu와 naga 소스 코드를 공부하며, 아키텍처를 설계했다. 수백 명의 개발자가 같은 좌절감을 공유한 Reddit 스레드가 계기가 되었다. 나는 간단한 삼각형 데모와 함께 첫 번째 글을 공개하고 코딩을 시작했다.
2주 후: 100 000+ 라인의 순수 Go가 네 개의 저장소에 걸쳐, CGO 없이, 단지 go build만으로.
메인 프레임워크
핵심 프레임워크는 이중 백엔드 아키텍처를 제공합니다 — 성능 또는 단순성을 선택하세요.
package main
import (
"github.com/gogpu/gogpu"
"github.com/gogpu/gogpu/gmath"
)
func main() {
app := gogpu.NewApp(gogpu.DefaultConfig().
WithTitle("Hello GoGPU").
WithSize(800, 600))
app.OnDraw(func(ctx *gogpu.Context) {
ctx.DrawTriangleColor(gmath.DarkGray)
})
app.Run()
}
백엔드 선택을 위한 빌드 태그
go build ./... # Both backends
go build -tags rust ./... # Rust backend (max performance)
go build -tags purego ./... # Pure Go backend (zero dependencies)
전체 WebGPU 구현 (≈ 57 900 라인)
| 구성 요소 | 대략 라인 수 | 설명 |
|---|---|---|
types/ | ~2 K | WebGPU 타입 정의 |
core/ | ~6 K | 검증 및 상태 추적 |
hal/vulkan/ | ~35 K | Vulkan 1.3 백엔드 |
hal/gles/ | ~7.5 K | OpenGL ES 백엔드 |
hal/software/ | ~1 K | CI/CD용 CPU 렌더링 |
백엔드
- Vulkan – Windows, Linux, macOS. 자동 생성 바인딩, buddy 메모리 할당자, Vulkan 1.3 동적 렌더링.
- OpenGL ES – Windows (WGL), Linux (EGL).
- Software – 헤드리스 렌더링; GPU가 필요 없음 (CI/CD에 유용).
// CI/CD without GPU
import _ "github.com/gogpu/wgpu/hal/software"
pixels := surface.GetFramebuffer() // CPU‑rendered pixels
WGSL → SPIR‑V Compiler (≈ 16 100 lines)
A pure‑Go compiler with 136 tests.
→ 136개의 테스트를 포함한 순수 Go 컴파일러.
source := `
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3) {
let index = id.x;
output[index] = input[index] * 2.0;
}
`
spirv, err := naga.Compile(source)
Supports vertex, fragment, and compute shaders, atomics, barriers, texture sampling, 50+ built‑in functions.
→ 버텍스, 프래그먼트, 컴퓨트 셰이더를 지원하며, 원자 연산, 배리어, 텍스처 샘플링, 50개 이상의 내장 함수를 제공합니다.
엔터프라이즈급 2D 그래픽 (≈ 23 400 라인)
fogleman/gg에서 영감을 받아, gg 패키지는 텍스트 렌더링, 이미지, 클리핑, 29가지 블렌드 모드, 레이어 및 선형 색상 공간 블렌딩을 지원하는 캔버스 API를 제공합니다. 핵심 패키지(blend, color, image, text)에 대한 테스트 커버리지는 80 %를 초과합니다.
ctx := gg.NewContext(800, 600)
ctx.ClearWithColor(gg.White)
// Shapes
ctx.SetColor(gg.Hex("#3498db"))
ctx.DrawCircle(400, 300, 100)
ctx.Fill()
// Text with font fallback
source, _ := text.NewFontSourceFromFile("Roboto.ttf")
ctx.SetFont(source.Face(24))
ctx.DrawString("Hello, GoGPU!", 350, 305)
// Layers with blend modes
ctx.PushLayer(gg.BlendMultiply, 0.7)
ctx.SetColor(gg.Red)
ctx.DrawRectangle(350, 250, 100, 100)
ctx.Fill()
ctx.PopLayer()
ctx.SavePNG("output.png")
프로젝트 메트릭
| 메트릭 | 값 |
|---|---|
| 총 코드 라인 수 | 106 295 |
| 저장소 | 4 |
| 개발 기간 | 2 주 |
| 외부 종속성 | 0 |
| CGO 필요 여부 | 아니오 |
| 플랫폼 | Windows, Linux, macOS |
아키텍처 개요
┌─────────────────────────────────────┐
│ Your Application │
├─────────────────────────────────────┤
│ gogpu/ui (planned) │ gogpu/gg (2D) │
├─────────────────────────────────────┤
│ gogpu/gogpu (framework) │
│ Windowing, Input, GPU Abstraction │
├─────────────────────────────────────┤
│ Rust Backend (wgpu‑native) │ Pure Go Backend (wgpu) │
├─────────────────────────────────────┤
│ gogpu/naga (WGSL → SPIR‑V) │
├─────────────────────────────────────┤
│ Vulkan │ OpenGL ES │ Software │
└─────────────────────────────────────┘
개발자를 위한 이점
- 간단한 빌드 –
go build는 별다른 설정 없이 바로 작동합니다. - 크로스‑컴파일 – Go 툴체인으로 손쉽게 가능합니다.
- 디버깅 – Go 안에서 이루어지며, 별도의 네이티브 디버거가 필요 없습니다.
CI/CD
- 소프트웨어 백엔드 덕분에 GPU가 필요 없습니다.
- 테스트를 컨테이너에서 실행해 드라이버 문제를 피할 수 있습니다.
생태계 영향
- 네이티브 툴링 및 표준 프로파일링 지원.
- CGO 오버헤드 없음.
- 향후 확장: Metal, DirectX 12 백엔드, GUI 위젯 툴킷 (
gogpu/ui).
시작하기
go get github.com/gogpu/gg
import "github.com/gogpu/gg"
저장소 탐색:
github.com/gogpu/gogpu– 핵심 프레임워크github.com/gogpu/wgpu– WebGPU 구현github.com/gogpu/naga– WGSL → SPIR‑V 컴파일러github.com/gogpu/gg– 2D 그래픽 라이브러리
저장소에 별을 달고 기여하세요!
Contributing
- Metal 또는 DirectX 12 백엔드 구현.
- 문서 개선.
- 테스트 또는 예제 추가.
감사의 글
- Michael Fogleman – 원본
gg라이브러리. - gfx‑rs –
wgpu와naga의 레퍼런스 구현. - r/golang 커뮤니티 – 내가 필요로 했던 동기 부여.
수년간의 좌절, 6개월의 준비, 2주간의 코딩: 100 000줄의 순수 Go 그래픽 코드. Go가 마땅히 받아야 할 GPU 생태계가 구축되고 있다.
GoGPU –