graphics: Try to restore the context on browsers (WIP)

This commit is contained in:
Hajime Hoshi 2017-01-21 02:47:31 +09:00
parent de987be85f
commit bccf76867e
5 changed files with 28 additions and 23 deletions

View File

@ -180,7 +180,7 @@ func (i *Image) ReplacePixels(p []uint8) error {
}
func (i *Image) IsInvalidated(context *opengl.Context) bool {
return context.IsContextLost(i.texture.native)
return !context.IsTexture(i.texture.native)
}
func (i *Image) createFramebufferIfNeeded(context *opengl.Context) (*framebuffer, error) {

View File

@ -514,7 +514,3 @@ func (c *Context) Flush() {
return nil
})
}
func (c *Context) IsContextLost(t Texture) bool {
return !c.IsTexture(t)
}

View File

@ -87,6 +87,7 @@ func init() {
type context struct {
gl *webgl.Context
loseContext *js.Object
lastProgramID programID
}
@ -116,6 +117,15 @@ func NewContext() (*Context, error) {
}
c := &Context{}
c.gl = gl
// Getting an extension might fail after the context is lost, so
// it is required to get the extension here.
c.loseContext = gl.GetExtension("WEBGL_lose_context")
if c.loseContext != nil {
// This testing function name is temporary.
js.Global.Set("_ebiten_loseContextForTesting", func() {
c.loseContext.Call("loseContext")
})
}
return c, nil
}
@ -408,7 +418,13 @@ func (c *Context) Flush() {
gl.Flush()
}
func (c *Context) IsContextLost(t Texture) bool {
func (c *Context) IsContextLost() bool {
gl := c.gl
return gl.IsContextLost()
}
func (c *Context) RestoreContext() {
if c.loseContext != nil {
c.loseContext.Call("restoreContext")
}
}

View File

@ -430,7 +430,3 @@ func (c *Context) Flush() {
gl := c.gl
gl.Flush()
}
func (c *Context) IsContextLost(t Texture) bool {
return !c.IsTexture(t)
}

View File

@ -27,17 +27,15 @@ import (
var canvas *js.Object
type userInterface struct {
scale float64
deviceScale float64
sizeChanged bool
contextRestored bool
windowFocus bool
scale float64
deviceScale float64
sizeChanged bool
windowFocus bool
}
var currentUI = &userInterface{
sizeChanged: true,
contextRestored: true,
windowFocus: true,
sizeChanged: true,
windowFocus: true,
}
// NOTE: This returns true even when the browser is not active.
@ -74,8 +72,8 @@ func (u *userInterface) update(g GraphicsContext) error {
if !u.windowFocus {
return nil
}
if !u.contextRestored {
return nil
if glContext.IsContextLost() {
glContext.RestoreContext()
}
currentInput.updateGamepads()
if u.sizeChanged {
@ -235,12 +233,11 @@ func initialize() error {
canvas.Call("addEventListener", "webglcontextlost", func(e *js.Object) {
e.Call("preventDefault")
currentUI.contextRestored = false
})
canvas.Call("addEventListener", "webglcontextrestored", func(e *js.Object) {
// TODO: Call preventDefault?
currentUI.contextRestored = true
// Do nothing.
})
return nil
}