mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 02:38:53 +01:00
opengl: Introduce locationCache struct
This commit is contained in:
parent
3c4aa7ec1e
commit
93f9d9fbb0
@ -47,7 +47,8 @@ func (p Program) id() programID {
|
||||
}
|
||||
|
||||
type context struct {
|
||||
funcs chan func()
|
||||
locationCache *locationCache
|
||||
funcs chan func()
|
||||
}
|
||||
|
||||
func NewContext() *Context {
|
||||
@ -63,6 +64,7 @@ func NewContext() *Context {
|
||||
Triangles: gl.TRIANGLES,
|
||||
Lines: gl.LINES,
|
||||
}
|
||||
c.locationCache = newLocationCache()
|
||||
c.funcs = make(chan func())
|
||||
return c
|
||||
}
|
||||
@ -321,14 +323,14 @@ func (c *Context) getUniformLocation(p Program, location string) UniformLocation
|
||||
|
||||
func (c *Context) UniformInt(p Program, location string, v int) {
|
||||
c.RunOnContextThread(func() {
|
||||
l := int32(GetUniformLocation(c, p, location))
|
||||
l := int32(c.locationCache.GetUniformLocation(c, p, location))
|
||||
gl.Uniform1i(l, int32(v))
|
||||
})
|
||||
}
|
||||
|
||||
func (c *Context) UniformFloats(p Program, location string, v []float32) {
|
||||
c.RunOnContextThread(func() {
|
||||
l := int32(GetUniformLocation(c, p, location))
|
||||
l := int32(c.locationCache.GetUniformLocation(c, p, location))
|
||||
switch len(v) {
|
||||
case 4:
|
||||
gl.Uniform4fv(l, 1, (*float32)(gl.Ptr(v)))
|
||||
@ -350,21 +352,21 @@ func (c *Context) getAttribLocation(p Program, location string) AttribLocation {
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
c.RunOnContextThread(func() {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(uint32(l), int32(size), gl.SHORT, normalize, int32(stride), gl.PtrOffset(v))
|
||||
})
|
||||
}
|
||||
|
||||
func (c *Context) EnableVertexAttribArray(p Program, location string) {
|
||||
c.RunOnContextThread(func() {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.EnableVertexAttribArray(uint32(l))
|
||||
})
|
||||
}
|
||||
|
||||
func (c *Context) DisableVertexAttribArray(p Program, location string) {
|
||||
c.RunOnContextThread(func() {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.DisableVertexAttribArray(uint32(l))
|
||||
})
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ func (p Program) id() programID {
|
||||
type context struct {
|
||||
gl *webgl.Context
|
||||
lastFramebuffer Framebuffer
|
||||
locationCache *locationCache
|
||||
}
|
||||
|
||||
func NewContext() *Context {
|
||||
@ -105,6 +106,7 @@ func NewContext() *Context {
|
||||
Lines: Mode(gl.LINES),
|
||||
}
|
||||
c.gl = gl
|
||||
c.locationCache = newLocationCache()
|
||||
c.init()
|
||||
return c
|
||||
}
|
||||
@ -297,13 +299,13 @@ func (c *Context) getUniformLocation(p Program, location string) UniformLocation
|
||||
|
||||
func (c *Context) UniformInt(p Program, location string, v int) {
|
||||
gl := c.gl
|
||||
l := GetUniformLocation(c, p, location)
|
||||
l := c.locationCache.GetUniformLocation(c, p, location)
|
||||
gl.Uniform1i(l.Object, v)
|
||||
}
|
||||
|
||||
func (c *Context) UniformFloats(p Program, location string, v []float32) {
|
||||
gl := c.gl
|
||||
l := GetUniformLocation(c, p, location)
|
||||
l := c.locationCache.GetUniformLocation(c, p, location)
|
||||
switch len(v) {
|
||||
case 4:
|
||||
gl.Call("uniform4fv", l.Object, v)
|
||||
@ -321,19 +323,19 @@ func (c *Context) getAttribLocation(p Program, location string) AttribLocation {
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
gl := c.gl
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(int(l), size, gl.SHORT, normalize, stride, v)
|
||||
}
|
||||
|
||||
func (c *Context) EnableVertexAttribArray(p Program, location string) {
|
||||
gl := c.gl
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.EnableVertexAttribArray(int(l))
|
||||
}
|
||||
|
||||
func (c *Context) DisableVertexAttribArray(p Program, location string) {
|
||||
gl := c.gl
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.DisableVertexAttribArray(int(l))
|
||||
}
|
||||
|
||||
|
@ -48,8 +48,9 @@ func (p Program) id() programID {
|
||||
}
|
||||
|
||||
type context struct {
|
||||
worker mgl.Worker
|
||||
funcs chan func()
|
||||
locationCache *locationCache
|
||||
worker mgl.Worker
|
||||
funcs chan func()
|
||||
}
|
||||
|
||||
// TODO: This variable can be in the context struct.
|
||||
@ -70,6 +71,7 @@ func NewContext() *Context {
|
||||
Triangles: mgl.TRIANGLES,
|
||||
Lines: mgl.LINES,
|
||||
}
|
||||
c.locationCache = newLocationCache()
|
||||
c.funcs = make(chan func())
|
||||
gl, c.worker = mgl.NewContext()
|
||||
return c
|
||||
@ -259,11 +261,11 @@ func (c *Context) getUniformLocation(p Program, location string) UniformLocation
|
||||
}
|
||||
|
||||
func (c *Context) UniformInt(p Program, location string, v int) {
|
||||
gl.Uniform1i(mgl.Uniform(GetUniformLocation(c, p, location)), v)
|
||||
gl.Uniform1i(mgl.Uniform(c.locationCache.GetUniformLocation(c, p, location)), v)
|
||||
}
|
||||
|
||||
func (c *Context) UniformFloats(p Program, location string, v []float32) {
|
||||
l := mgl.Uniform(GetUniformLocation(c, p, location))
|
||||
l := mgl.Uniform(c.locationCache.GetUniformLocation(c, p, location))
|
||||
switch len(v) {
|
||||
case 4:
|
||||
gl.Uniform4fv(l, v)
|
||||
@ -283,17 +285,17 @@ func (c *Context) getAttribLocation(p Program, location string) AttribLocation {
|
||||
}
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(mgl.Attrib(l), size, mgl.SHORT, normalize, stride, v)
|
||||
}
|
||||
|
||||
func (c *Context) EnableVertexAttribArray(p Program, location string) {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.EnableVertexAttribArray(mgl.Attrib(l))
|
||||
}
|
||||
|
||||
func (c *Context) DisableVertexAttribArray(p Program, location string) {
|
||||
l := GetAttribLocation(c, p, location)
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.DisableVertexAttribArray(mgl.Attrib(l))
|
||||
}
|
||||
|
||||
|
@ -16,8 +16,17 @@ package opengl
|
||||
|
||||
// Since js.Object (Program) can't be keys of a map, use integers (programID) instead.
|
||||
|
||||
var uniformLocationCache = map[programID]map[string]UniformLocation{}
|
||||
var attribLocationCache = map[programID]map[string]AttribLocation{}
|
||||
type locationCache struct {
|
||||
uniformLocationCache map[programID]map[string]UniformLocation
|
||||
attribLocationCache map[programID]map[string]AttribLocation
|
||||
}
|
||||
|
||||
func newLocationCache() *locationCache {
|
||||
return &locationCache{
|
||||
uniformLocationCache: map[programID]map[string]UniformLocation{},
|
||||
attribLocationCache: map[programID]map[string]AttribLocation{},
|
||||
}
|
||||
}
|
||||
|
||||
type uniformLocationGetter interface {
|
||||
getUniformLocation(p Program, location string) UniformLocation
|
||||
@ -25,15 +34,15 @@ type uniformLocationGetter interface {
|
||||
|
||||
// TODO: Rename these functions not to be confusing
|
||||
|
||||
func GetUniformLocation(g uniformLocationGetter, p Program, location string) UniformLocation {
|
||||
func (c *locationCache) GetUniformLocation(g uniformLocationGetter, p Program, location string) UniformLocation {
|
||||
id := p.id()
|
||||
if _, ok := uniformLocationCache[id]; !ok {
|
||||
uniformLocationCache[id] = map[string]UniformLocation{}
|
||||
if _, ok := c.uniformLocationCache[id]; !ok {
|
||||
c.uniformLocationCache[id] = map[string]UniformLocation{}
|
||||
}
|
||||
l, ok := uniformLocationCache[id][location]
|
||||
l, ok := c.uniformLocationCache[id][location]
|
||||
if !ok {
|
||||
l = g.getUniformLocation(p, location)
|
||||
uniformLocationCache[id][location] = l
|
||||
c.uniformLocationCache[id][location] = l
|
||||
}
|
||||
return l
|
||||
}
|
||||
@ -42,15 +51,15 @@ type attribLocationGetter interface {
|
||||
getAttribLocation(p Program, location string) AttribLocation
|
||||
}
|
||||
|
||||
func GetAttribLocation(g attribLocationGetter, p Program, location string) AttribLocation {
|
||||
func (c *locationCache) GetAttribLocation(g attribLocationGetter, p Program, location string) AttribLocation {
|
||||
id := p.id()
|
||||
if _, ok := attribLocationCache[id]; !ok {
|
||||
attribLocationCache[id] = map[string]AttribLocation{}
|
||||
if _, ok := c.attribLocationCache[id]; !ok {
|
||||
c.attribLocationCache[id] = map[string]AttribLocation{}
|
||||
}
|
||||
l, ok := attribLocationCache[id][location]
|
||||
l, ok := c.attribLocationCache[id][location]
|
||||
if !ok {
|
||||
l = g.getAttribLocation(p, location)
|
||||
attribLocationCache[id][location] = l
|
||||
c.attribLocationCache[id][location] = l
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user