Text + MXL logo pattern

This commit is contained in:
Dmitry Sergeev
2026-09-13 16:33:50 +03:00
parent 94ff41a124
commit 97dec92b8b
15 changed files with 999 additions and 23 deletions
+37 -7
View File
@@ -182,7 +182,7 @@ func flagSetAddFlags(fs *pflag.FlagSet, args *appArgs) {
// Video pattern flags
fs.Uint8VarP(&args.pattern, "pattern", "p", 0, "Video pattern type [TODO]")
fs.BoolVar(&args.listPatterns, "list-patterns", false, "List video available video patterns and exit [TODO]")
fs.StringVarP(&args.textOverlay, "text", "t", "", "Text overlay above video pattern [TODO]")
fs.StringVarP(&args.textOverlay, "text", "t", "", "Text overlay above video pattern")
fs.UintVar(&args.videoWidth, "width", 1920, "Video pattern width")
fs.UintVar(&args.videoHeight, "height", 1080, "Video pattern height")
fs.StringVar(&args.videoFPS, "fps", "25", "Video pattern FPS")
@@ -261,12 +261,37 @@ func main() {
// TODO: if init failed -> CPU generator
// But before i should create same patterns for both generators
// and text overlays
gen, err := generator.NewWGPUGenerator(vi.width, vi.height, "kernels/v210_bars_move.wgsl")
kernel := "kernels/v210_bars_move.wgsl"
// kernel = "kernels/v210_dvd_logo.wgsl"
var genOpts []generator.WGPUOption
if kernel == "kernels/v210_dvd_logo.wgsl" {
plane, err := generator.LoadLogoPNG("assets/mxl.png")
if err != nil {
log.Fatalf("logo load failed: %v", err)
}
genOpts = append(genOpts, generator.WithLogo(plane))
}
gen, err := generator.NewWGPUGenerator(vi.width, vi.height, kernel, genOpts...)
if err != nil {
log.Fatalf("wgpu init failed: %v", err)
}
defer gen.Close()
// Static text overlay: rasterized + pre-packed once, stamped on each
// frame after the GPU render (microseconds per frame).
var overlay *generator.TextOverlay
if args.textOverlay != "" {
face, err := generator.LoadFace("assets/fonts/JetBrainsMonoNLNerdFontMono-Regular.ttf", 48)
if err != nil {
log.Fatalf("text overlay init failed: %v", err)
}
defer face.Close()
overlay, err = generator.NewTextOverlay(args.textOverlay, int(vi.width), int(vi.height), face)
if err != nil {
log.Fatalf("text overlay init failed: %v", err)
}
}
inst, err := mxl.NewInstance(mxlDomain, "")
if err != nil {
log.Fatalf("MXL Init Failed: %v", err)
@@ -291,14 +316,14 @@ func main() {
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
// core loop
var written int64
var grainsWritten int64
// animation clock: small counter, not the huge grain index.
// Reason: current wgpu shaders limitations
var tick uint32
for {
select {
case <-stop:
log.Printf("stopping after %d grains", written)
log.Printf("stopping after %d grains", grainsWritten)
return
default:
}
@@ -310,15 +335,20 @@ func main() {
if err := gen.GenerateFrame(gwa.Payload, int(tick)); err != nil {
log.Fatalf("GenerateFrame(%d): %v", idx, err)
}
if overlay != nil {
if err := overlay.ApplyV210(gwa.Payload); err != nil {
log.Fatalf("text overlay: %v", err)
}
}
if err := gwa.Commit(gwa.TotalSlices, 0); err != nil {
log.Fatalf("Commit(%d): %v", idx, err)
}
written++
grainsWritten++
idx++
tick++
if written%100 == 0 {
log.Printf("grains written=%d, index=%d", written, idx)
if grainsWritten%100 == 0 {
log.Printf("grains written=%d, index=%d", grainsWritten, idx)
}
// Pace ourselves to roughly the grain rate
mxl.SleepNs(mxl.NsUntilIndex(idx, rate))