From 65fb9d56bacbfd0c9bf4af29135bddfe36ca0579 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Mon, 13 Mar 2023 21:22:35 +0900 Subject: [PATCH] internal/graphicsdriver/metal: refactoring Updates #2599 --- internal/graphicsdriver/metal/graphics_darwin.go | 15 ++++++++------- internal/graphicsdriver/metal/view_darwin.go | 8 ++------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/internal/graphicsdriver/metal/graphics_darwin.go b/internal/graphicsdriver/metal/graphics_darwin.go index 60cb34f14..ef9ac1be9 100644 --- a/internal/graphicsdriver/metal/graphics_darwin.go +++ b/internal/graphicsdriver/metal/graphics_darwin.go @@ -74,12 +74,14 @@ const ( noStencil ) -var creatingSystemDefaultDeviceSucceeded bool +var systemDefaultDevice mtl.Device func init() { // mtl.CreateSystemDefaultDevice must be called on the main thread (#2147). - _, err := mtl.CreateSystemDefaultDevice() - creatingSystemDefaultDeviceSucceeded = err == nil + d, err := mtl.CreateSystemDefaultDevice() + if err == nil { + systemDefaultDevice = d + } } // NewGraphics creates an implementation of graphicsdriver.Graphics for Metal. @@ -88,15 +90,14 @@ func NewGraphics() (graphicsdriver.Graphics, error) { // On old mac devices like iMac 2011, Metal is not supported (#779). // TODO: Is there a better way to check whether Metal is available or not? // It seems OK to call MTLCreateSystemDefaultDevice multiple times, so this should be fine. - if !creatingSystemDefaultDeviceSucceeded { + if systemDefaultDevice == (mtl.Device{}) { return nil, fmt.Errorf("metal: mtl.CreateSystemDefaultDevice failed") } g := &Graphics{} if runtime.GOOS != "ios" { - // Initializing a Metal device and a layer must be done in the main thread on macOS. - if err := g.view.initialize(); err != nil { + if err := g.view.initialize(systemDefaultDevice); err != nil { return nil, err } } @@ -386,7 +387,7 @@ func (g *Graphics) Initialize() error { if runtime.GOOS == "ios" { // Initializing a Metal device and a layer must be done in the render thread on iOS. - if err := g.view.initialize(); err != nil { + if err := g.view.initialize(systemDefaultDevice); err != nil { return err } } diff --git a/internal/graphicsdriver/metal/view_darwin.go b/internal/graphicsdriver/metal/view_darwin.go index f1a876923..6273c4a72 100644 --- a/internal/graphicsdriver/metal/view_darwin.go +++ b/internal/graphicsdriver/metal/view_darwin.go @@ -58,12 +58,8 @@ func (v *view) colorPixelFormat() mtl.PixelFormat { return v.ml.PixelFormat() } -func (v *view) initialize() error { - d, err := mtl.CreateSystemDefaultDevice() - if err != nil { - return err - } - v.device = d +func (v *view) initialize(device mtl.Device) error { + v.device = device ml, err := ca.MakeMetalLayer() if err != nil {