mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
graphics: Delete programs and buffers when resuming
This commit is contained in:
parent
2c1bcaf87a
commit
d0a779e272
@ -394,6 +394,13 @@ func (c *Context) UseProgram(p Program) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteProgram(p Program) {
|
||||||
|
c.RunOnContextThread(func() error {
|
||||||
|
gl.DeleteProgram(uint32(p))
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
||||||
uniform := uniformLocation(gl.GetUniformLocation(uint32(p), gl.Str(location+"\x00")))
|
uniform := uniformLocation(gl.GetUniformLocation(uint32(p), gl.Str(location+"\x00")))
|
||||||
if uniform == -1 {
|
if uniform == -1 {
|
||||||
@ -491,6 +498,14 @@ func (c *Context) BufferSubData(bufferType BufferType, data []int16) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteBuffer(b Buffer) {
|
||||||
|
c.RunOnContextThread(func() error {
|
||||||
|
bb := uint32(b)
|
||||||
|
gl.DeleteBuffers(1, &bb)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
||||||
c.RunOnContextThread(func() error {
|
c.RunOnContextThread(func() error {
|
||||||
gl.DrawElements(uint32(mode), int32(len), gl.UNSIGNED_SHORT, gl.PtrOffset(offsetInBytes))
|
gl.DrawElements(uint32(mode), int32(len), gl.UNSIGNED_SHORT, gl.PtrOffset(offsetInBytes))
|
||||||
|
@ -321,6 +321,11 @@ func (c *Context) UseProgram(p Program) {
|
|||||||
gl.UseProgram(p.Object)
|
gl.UseProgram(p.Object)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteProgram(p Program) {
|
||||||
|
gl := c.gl
|
||||||
|
gl.DeleteProgram(p.Object)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
||||||
gl := c.gl
|
gl := c.gl
|
||||||
return uniformLocation{gl.GetUniformLocation(p.Object, location)}
|
return uniformLocation{gl.GetUniformLocation(p.Object, location)}
|
||||||
@ -386,6 +391,11 @@ func (c *Context) BufferSubData(bufferType BufferType, data []int16) {
|
|||||||
gl.BufferSubData(int(bufferType), 0, data)
|
gl.BufferSubData(int(bufferType), 0, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteBuffer(b Buffer) {
|
||||||
|
gl := c.gl
|
||||||
|
gl.DeleteBuffer(b.Object)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
||||||
gl := c.gl
|
gl := c.gl
|
||||||
gl.DrawElements(int(mode), len, gl.UNSIGNED_SHORT, offsetInBytes)
|
gl.DrawElements(int(mode), len, gl.UNSIGNED_SHORT, offsetInBytes)
|
||||||
|
@ -295,6 +295,11 @@ func (c *Context) UseProgram(p Program) {
|
|||||||
gl.UseProgram(mgl.Program(p))
|
gl.UseProgram(mgl.Program(p))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteProgram(p Program) {
|
||||||
|
gl := c.gl
|
||||||
|
gl.DeleteProgram(mgl.Program(p))
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
func (c *Context) getUniformLocationImpl(p Program, location string) uniformLocation {
|
||||||
gl := c.gl
|
gl := c.gl
|
||||||
u := uniformLocation(gl.GetUniformLocation(mgl.Program(p), location))
|
u := uniformLocation(gl.GetUniformLocation(mgl.Program(p), location))
|
||||||
@ -392,6 +397,11 @@ func (c *Context) BufferSubData(bufferType BufferType, data []int16) {
|
|||||||
gl.BufferSubData(mgl.Enum(bufferType), 0, int16ToBytes(data))
|
gl.BufferSubData(mgl.Enum(bufferType), 0, int16ToBytes(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) DeleteBuffer(b Buffer) {
|
||||||
|
gl := c.gl
|
||||||
|
gl.DeleteBuffer(mgl.Buffer(b))
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) {
|
||||||
gl := c.gl
|
gl := c.gl
|
||||||
gl.DrawElements(mgl.Enum(mode), len, mgl.UNSIGNED_SHORT, offsetInBytes)
|
gl.DrawElements(mgl.Enum(mode), len, mgl.UNSIGNED_SHORT, offsetInBytes)
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type openGLState struct {
|
type openGLState struct {
|
||||||
|
arrayBuffer opengl.Buffer
|
||||||
indexBufferQuads opengl.Buffer
|
indexBufferQuads opengl.Buffer
|
||||||
programTexture opengl.Program
|
programTexture opengl.Program
|
||||||
|
|
||||||
@ -32,8 +33,10 @@ type openGLState struct {
|
|||||||
lastTexture opengl.Texture
|
lastTexture opengl.Texture
|
||||||
}
|
}
|
||||||
|
|
||||||
var theOpenGLState openGLState
|
|
||||||
var (
|
var (
|
||||||
|
theOpenGLState openGLState
|
||||||
|
|
||||||
|
zeroBuffer opengl.Buffer
|
||||||
zeroProgram opengl.Program
|
zeroProgram opengl.Program
|
||||||
zeroTexture opengl.Texture
|
zeroTexture opengl.Texture
|
||||||
)
|
)
|
||||||
@ -63,7 +66,15 @@ func (s *openGLState) initialize(context *opengl.Context) error {
|
|||||||
s.lastColorMatrixTranslation = nil
|
s.lastColorMatrixTranslation = nil
|
||||||
s.lastTexture = zeroTexture
|
s.lastTexture = zeroTexture
|
||||||
|
|
||||||
// TODO: Remove the old programs when resuming?
|
if s.arrayBuffer != zeroBuffer {
|
||||||
|
context.DeleteBuffer(s.arrayBuffer)
|
||||||
|
}
|
||||||
|
if s.indexBufferQuads != zeroBuffer {
|
||||||
|
context.DeleteBuffer(s.indexBufferQuads)
|
||||||
|
}
|
||||||
|
if s.programTexture != zeroProgram {
|
||||||
|
context.DeleteProgram(s.programTexture)
|
||||||
|
}
|
||||||
|
|
||||||
shaderVertexModelviewNative, err := context.NewShader(opengl.VertexShader, shader(context, shaderVertexModelview))
|
shaderVertexModelviewNative, err := context.NewShader(opengl.VertexShader, shader(context, shaderVertexModelview))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -85,10 +96,8 @@ func (s *openGLState) initialize(context *opengl.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove the old buffers when resuming?
|
|
||||||
|
|
||||||
const stride = 8 // (2 [vertices] + 2 [texels]) * 2 [sizeof(int16)/bytes]
|
const stride = 8 // (2 [vertices] + 2 [texels]) * 2 [sizeof(int16)/bytes]
|
||||||
context.NewBuffer(opengl.ArrayBuffer, 4*stride*MaxQuads, opengl.DynamicDraw)
|
s.arrayBuffer = context.NewBuffer(opengl.ArrayBuffer, 4*stride*MaxQuads, opengl.DynamicDraw)
|
||||||
|
|
||||||
indices := make([]uint16, 6*MaxQuads)
|
indices := make([]uint16, 6*MaxQuads)
|
||||||
for i := uint16(0); i < MaxQuads; i++ {
|
for i := uint16(0); i < MaxQuads; i++ {
|
||||||
|
Loading…
Reference in New Issue
Block a user