62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
package video
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
|
|
"mxl-pattern-generator/internal/generator"
|
|
)
|
|
|
|
type generatorFactory func() (generator.FrameGenerator, error)
|
|
|
|
func newFrameGenerator(cfg Config, pattern pattern) (generator.FrameGenerator, Backend, error) {
|
|
newGPU := func() (generator.FrameGenerator, error) {
|
|
return generator.NewWGPUGenerator(cfg.Width(), cfg.Height(), pattern.kernelSource)
|
|
}
|
|
newCPU := func() (generator.FrameGenerator, error) {
|
|
return generator.NewCPUPatternGenerator(cfg.Width(), cfg.Height(), cfg.Pattern)
|
|
}
|
|
return selectFrameGenerator(cfg.Backend, newGPU, newCPU)
|
|
}
|
|
|
|
func selectFrameGenerator(
|
|
backend Backend,
|
|
newGPU, newCPU generatorFactory,
|
|
) (generator.FrameGenerator, Backend, error) {
|
|
switch backend {
|
|
case BackendGPU:
|
|
gen, err := newGPU()
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("initialize GPU video generator: %w", err)
|
|
}
|
|
return gen, BackendGPU, nil
|
|
|
|
case BackendCPU:
|
|
gen, err := newCPU()
|
|
if err != nil {
|
|
return nil, "", fmt.Errorf("initialize CPU video generator: %w", err)
|
|
}
|
|
return gen, BackendCPU, nil
|
|
|
|
case "", BackendAuto:
|
|
gpuGen, gpuErr := newGPU()
|
|
if gpuErr == nil {
|
|
return gpuGen, BackendGPU, nil
|
|
}
|
|
log.Printf("GPU video generator unavailable, falling back to CPU: %v", gpuErr)
|
|
|
|
cpuGen, cpuErr := newCPU()
|
|
if cpuErr == nil {
|
|
return cpuGen, BackendCPU, nil
|
|
}
|
|
return nil, "", errors.Join(
|
|
fmt.Errorf("initialize GPU video generator: %w", gpuErr),
|
|
fmt.Errorf("initialize CPU video generator: %w", cpuErr),
|
|
)
|
|
|
|
default:
|
|
return nil, "", fmt.Errorf("unsupported video backend %q", backend)
|
|
}
|
|
}
|