removed explicit deleting of gradients

removed finalizers from backends, instead using a finalizer as an emergency catch on the frontend
This commit is contained in:
Thomas Friedel 2020-03-21 13:03:56 +01:00
parent 7faf3cdcc6
commit f47d24543d
5 changed files with 13 additions and 80 deletions

View file

@ -28,8 +28,6 @@ type GLContext struct {
imageBuf []byte imageBuf []byte
ptsBuf []float32 ptsBuf []float32
glChan chan func()
} }
// NewGLContext creates all the necessary GL resources, // NewGLContext creates all the necessary GL resources,
@ -37,7 +35,6 @@ type GLContext struct {
func NewGLContext() (*GLContext, error) { func NewGLContext() (*GLContext, error) {
ctx := &GLContext{ ctx := &GLContext{
ptsBuf: make([]float32, 0, 4096), ptsBuf: make([]float32, 0, 4096),
glChan: make(chan func()),
} }
err := gl.Init() err := gl.Init()
@ -231,18 +228,6 @@ func (b *GoGLBackend) activate() {
activeContext = b activeContext = b
b.activateFn() b.activateFn()
} }
b.runGLQueue()
}
func (b *GoGLBackend) runGLQueue() {
for {
select {
case f := <-b.glChan:
f()
default:
return
}
}
} }
// Delete deletes the offscreen texture. After calling this // Delete deletes the offscreen texture. After calling this

View file

@ -1,8 +1,6 @@
package goglbackend package goglbackend
import ( import (
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase" "github.com/tfriedel6/canvas/backend/backendbase"
"github.com/tfriedel6/canvas/backend/goglbackend/gl" "github.com/tfriedel6/canvas/backend/goglbackend/gl"
) )
@ -42,11 +40,6 @@ func (b *GoGLBackend) LoadLinearGradient(data backendbase.Gradient) backendbase.
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
lg.load(data) lg.load(data)
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
b.glChan <- func() {
gl.DeleteTextures(1, &lg.tex)
}
})
return lg return lg
} }
@ -64,11 +57,6 @@ func (b *GoGLBackend) LoadRadialGradient(data backendbase.Gradient) backendbase.
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
rg.load(data) rg.load(data)
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
b.glChan <- func() {
gl.DeleteTextures(1, &rg.tex)
}
})
return rg return rg
} }

View file

@ -1,8 +1,6 @@
package xmobilebackend package xmobilebackend
import ( import (
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase" "github.com/tfriedel6/canvas/backend/backendbase"
"golang.org/x/mobile/gl" "golang.org/x/mobile/gl"
) )
@ -42,11 +40,6 @@ func (b *XMobileBackend) LoadLinearGradient(data backendbase.Gradient) backendba
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
lg.load(data) lg.load(data)
runtime.SetFinalizer(lg, func(lg *LinearGradient) {
b.glChan <- func() {
b.glctx.DeleteTexture(lg.tex)
}
})
return lg return lg
} }
@ -64,11 +57,6 @@ func (b *XMobileBackend) LoadRadialGradient(data backendbase.Gradient) backendba
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) b.glctx.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
rg.load(data) rg.load(data)
runtime.SetFinalizer(rg, func(rg *RadialGradient) {
b.glChan <- func() {
b.glctx.DeleteTexture(rg.tex)
}
})
return rg return rg
} }

View file

@ -32,8 +32,6 @@ type GLContext struct {
imageBuf []byte imageBuf []byte
ptsBuf []float32 ptsBuf []float32
glChan chan func()
} }
// NewGLContext creates all the necessary GL resources, // NewGLContext creates all the necessary GL resources,
@ -43,7 +41,6 @@ func NewGLContext(glctx gl.Context) (*GLContext, error) {
glctx: glctx, glctx: glctx,
ptsBuf: make([]float32, 0, 4096), ptsBuf: make([]float32, 0, 4096),
glChan: make(chan func()),
} }
var err error var err error
@ -224,18 +221,6 @@ func (b *XMobileBackend) activate() {
activeContext = b activeContext = b
b.activateFn() b.activateFn()
} }
b.runGLQueue()
}
func (b *XMobileBackend) runGLQueue() {
for {
select {
case f := <-b.glChan:
f()
default:
return
}
}
} }
// Delete deletes the offscreen texture. After calling this // Delete deletes the offscreen texture. After calling this

View file

@ -2,6 +2,7 @@ package canvas
import ( import (
"image/color" "image/color"
"runtime"
"github.com/tfriedel6/canvas/backend/backendbase" "github.com/tfriedel6/canvas/backend/backendbase"
) )
@ -15,7 +16,6 @@ type LinearGradient struct {
from, to vec from, to vec
created bool created bool
loaded bool loaded bool
deleted bool
opaque bool opaque bool
grad backendbase.LinearGradient grad backendbase.LinearGradient
data backendbase.Gradient data backendbase.Gradient
@ -32,7 +32,6 @@ type RadialGradient struct {
radTo float64 radTo float64
created bool created bool
loaded bool loaded bool
deleted bool
opaque bool opaque bool
grad backendbase.RadialGradient grad backendbase.RadialGradient
data backendbase.Gradient data backendbase.Gradient
@ -42,13 +41,17 @@ type RadialGradient struct {
// the coordinates from where to where the gradient // the coordinates from where to where the gradient
// will apply on the canvas // will apply on the canvas
func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient { func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
return &LinearGradient{ lg := &LinearGradient{
cv: cv, cv: cv,
opaque: true, opaque: true,
from: vec{x0, y0}, from: vec{x0, y0},
to: vec{x1, y1}, to: vec{x1, y1},
data: make(backendbase.Gradient, 0, 20), data: make(backendbase.Gradient, 0, 20),
} }
runtime.SetFinalizer(lg, func(*LinearGradient) {
lg.grad.Delete()
})
return lg
} }
// CreateRadialGradient creates a new radial gradient with // CreateRadialGradient creates a new radial gradient with
@ -56,7 +59,7 @@ func (cv *Canvas) CreateLinearGradient(x0, y0, x1, y1 float64) *LinearGradient {
// gradient will apply from the first to the second // gradient will apply from the first to the second
// circle // circle
func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient { func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGradient {
return &RadialGradient{ rg := &RadialGradient{
cv: cv, cv: cv,
opaque: true, opaque: true,
from: vec{x0, y0}, from: vec{x0, y0},
@ -65,30 +68,14 @@ func (cv *Canvas) CreateRadialGradient(x0, y0, r0, x1, y1, r1 float64) *RadialGr
radTo: r1, radTo: r1,
data: make(backendbase.Gradient, 0, 20), data: make(backendbase.Gradient, 0, 20),
} }
} runtime.SetFinalizer(rg, func(*RadialGradient) {
// Delete explicitly deletes the gradient
func (lg *LinearGradient) Delete() {
if lg.deleted {
return
}
lg.grad.Delete()
lg.grad = nil
lg.deleted = true
}
// Delete explicitly deletes the gradient
func (rg *RadialGradient) Delete() {
if rg.deleted {
return
}
rg.grad.Delete() rg.grad.Delete()
rg.grad = nil })
rg.deleted = true return rg
} }
func (lg *LinearGradient) load() { func (lg *LinearGradient) load() {
if lg.loaded || len(lg.data) < 1 || lg.deleted { if lg.loaded || len(lg.data) < 1 {
return return
} }
@ -102,7 +89,7 @@ func (lg *LinearGradient) load() {
} }
func (rg *RadialGradient) load() { func (rg *RadialGradient) load() {
if rg.loaded || len(rg.data) < 1 || rg.deleted { if rg.loaded || len(rg.data) < 1 {
return return
} }