From af6770de1899196b16d1184b9d2c4ff98004075a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 7 Sep 2021 18:42:21 +0200 Subject: [PATCH] app: add error result to context.RenderTarget Vulkan may report VK_ERROR_OUT_OF_DATE_KHR which is not a fatal error. Signed-off-by: Elias Naur --- app/d3d11_windows.go | 4 ++-- app/gl_js.go | 4 ++-- app/gl_macos.go | 4 ++-- app/metal_darwin.go | 10 +++++----- app/os.go | 2 +- app/window.go | 6 +++++- internal/egl/egl.go | 4 ++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/app/d3d11_windows.go b/app/d3d11_windows.go index 8324ed67..e9e09c48 100644 --- a/app/d3d11_windows.go +++ b/app/d3d11_windows.go @@ -53,10 +53,10 @@ func (c *d3d11Context) API() gpu.API { return gpu.Direct3D11{Device: unsafe.Pointer(c.dev)} } -func (c *d3d11Context) RenderTarget() gpu.RenderTarget { +func (c *d3d11Context) RenderTarget() (gpu.RenderTarget, error) { return gpu.Direct3D11RenderTarget{ RenderTarget: unsafe.Pointer(c.renderTarget), - } + }, nil } func (c *d3d11Context) Present() error { diff --git a/app/gl_js.go b/app/gl_js.go index d76f5bbb..e3aee8d7 100644 --- a/app/gl_js.go +++ b/app/gl_js.go @@ -36,8 +36,8 @@ func newContext(w *window) (*glContext, error) { return c, nil } -func (c *glContext) RenderTarget() gpu.RenderTarget { - return gpu.OpenGLRenderTarget{} +func (c *glContext) RenderTarget() (gpu.RenderTarget, error) { + return gpu.OpenGLRenderTarget{}, nil } func (c *glContext) API() gpu.API { diff --git a/app/gl_macos.go b/app/gl_macos.go index dc34d058..b64213f3 100644 --- a/app/gl_macos.go +++ b/app/gl_macos.go @@ -72,8 +72,8 @@ func newContext(w *window) (*glContext, error) { return c, nil } -func (c *glContext) RenderTarget() gpu.RenderTarget { - return gpu.OpenGLRenderTarget{} +func (c *glContext) RenderTarget() (gpu.RenderTarget, error) { + return gpu.OpenGLRenderTarget{}, nil } func (c *glContext) API() gpu.API { diff --git a/app/metal_darwin.go b/app/metal_darwin.go index 2dced328..d65a0ed4 100644 --- a/app/metal_darwin.go +++ b/app/metal_darwin.go @@ -111,21 +111,21 @@ func newMtlContext(w *window) (*mtlContext, error) { return c, nil } -func (c *mtlContext) RenderTarget() gpu.RenderTarget { +func (c *mtlContext) RenderTarget() (gpu.RenderTarget, error) { if c.drawable != 0 || c.texture != 0 { - panic("a previous RenderTarget wasn't Presented") + return nil, errors.New("metal:a previous RenderTarget wasn't Presented") } c.drawable = C.nextDrawable(c.layer) if c.drawable == 0 { - panic("metal: [CAMetalLayer nextDrawable] failed") + return nil, errors.New("metal: [CAMetalLayer nextDrawable] failed") } c.texture = C.drawableTexture(c.drawable) if c.texture == 0 { - panic("metal: CADrawable.texture is nil") + return nil, errors.New("metal: CADrawable.texture is nil") } return gpu.MetalRenderTarget{ Texture: unsafe.Pointer(c.texture), - } + }, nil } func (c *mtlContext) API() gpu.API { diff --git a/app/os.go b/app/os.go index d396a4a7..4d8227c1 100644 --- a/app/os.go +++ b/app/os.go @@ -105,7 +105,7 @@ type frameEvent struct { type context interface { API() gpu.API - RenderTarget() gpu.RenderTarget + RenderTarget() (gpu.RenderTarget, error) Present() error Refresh() error Release() diff --git a/app/window.go b/app/window.go index 1a286590..8106be2c 100644 --- a/app/window.go +++ b/app/window.go @@ -198,7 +198,11 @@ func (w *Window) render(frame *op.Ops, viewport image.Point) error { } else { w.gpu.Clear(color.NRGBA{A: 0xff, R: 0xff, G: 0xff, B: 0xff}) } - if err := w.gpu.Frame(frame, w.ctx.RenderTarget(), viewport); err != nil { + target, err := w.ctx.RenderTarget() + if err != nil { + return err + } + if err := w.gpu.Frame(frame, target, viewport); err != nil { return err } return w.ctx.Present() diff --git a/internal/egl/egl.go b/internal/egl/egl.go index 886f4a0d..7605d46e 100644 --- a/internal/egl/egl.go +++ b/internal/egl/egl.go @@ -97,8 +97,8 @@ func NewContext(disp NativeDisplayType) (*Context, error) { return c, nil } -func (c *Context) RenderTarget() gpu.RenderTarget { - return gpu.OpenGLRenderTarget{} +func (c *Context) RenderTarget() (gpu.RenderTarget, error) { + return gpu.OpenGLRenderTarget{}, nil } func (c *Context) API() gpu.API {