GoGPU: 아이디어에서 2주 만에 10만 라인 — Go의 GPU 생태계 구축

발행: (2025년 12월 17일 오전 09:57 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Introduction

수년 동안 나는 Go — 단순함과 성능으로 사랑받는 언어 — 가 아직도 전문적인 GUI 생태계를 갖추지 못한 이유를 이해하지 못했다. Go에서 그래픽이 필요할 때마다 나는 같은 장벽에 부딪혔다: CGO 요구사항, 방치된 프로젝트, 불완전한 솔루션. 정말 답답했다.

6개월 전 나는 준비를 시작했다: WebGPU 사양을 읽고, wgpunaga 소스 코드를 공부하며, 아키텍처를 설계했다. 수백 명의 개발자가 같은 좌절감을 공유한 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 KWebGPU 타입 정의
core/~6 K검증 및 상태 추적
hal/vulkan/~35 KVulkan 1.3 백엔드
hal/gles/~7.5 KOpenGL ES 백엔드
hal/software/~1 KCI/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‑rswgpunaga의 레퍼런스 구현.
  • r/golang 커뮤니티 – 내가 필요로 했던 동기 부여.

수년간의 좌절, 6개월의 준비, 2주간의 코딩: 100 000줄의 순수 Go 그래픽 코드. Go가 마땅히 받아야 할 GPU 생태계가 구축되고 있다.

GoGPU

Back to Blog

관련 글

더 보기 »

Marlin 소개

!Introducing Marlin의 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3....