diff --git a/gpu/backend.go b/gpu/backend.go index 894ef805..d38c8815 100644 --- a/gpu/backend.go +++ b/gpu/backend.go @@ -20,7 +20,7 @@ type Backend interface { IsTimeContinuous() bool NewTexture(format TextureFormat, width, height int, minFilter, magFilter TextureFilter, bindings BufferBinding) Texture DefaultFramebuffer() Framebuffer - NewFramebuffer() Framebuffer + NewFramebuffer(tex Texture) Framebuffer NewImmutableBuffer(typ BufferBinding, data []byte) Buffer NewBuffer(typ BufferBinding, size int) Buffer NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error) @@ -125,7 +125,6 @@ type Buffer interface { type Framebuffer interface { Bind() - BindTexture(t Texture) Invalidate() Release() IsComplete() error diff --git a/gpu/gl/backend.go b/gpu/gl/backend.go index cd5ad571..124321b6 100644 --- a/gpu/gl/backend.go +++ b/gpu/gl/backend.go @@ -162,9 +162,13 @@ func (b *Backend) IsTimeContinuous() bool { return b.funcs.GetInteger(GPU_DISJOINT_EXT) == FALSE } -func (b *Backend) NewFramebuffer() gpu.Framebuffer { +func (b *Backend) NewFramebuffer(tex gpu.Texture) gpu.Framebuffer { + gltex := tex.(*gpuTexture) fb := b.funcs.CreateFramebuffer() - return &gpuFramebuffer{funcs: b.funcs, obj: fb} + fbo := &gpuFramebuffer{funcs: b.funcs, obj: fb} + fbo.Bind() + b.funcs.FramebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0, TEXTURE_2D, gltex.obj, 0) + return fbo } func (b *Backend) DefaultFramebuffer() gpu.Framebuffer { @@ -552,12 +556,6 @@ func (f *gpuFramebuffer) Release() { f.funcs.DeleteFramebuffer(f.obj) } -func (f *gpuFramebuffer) BindTexture(t gpu.Texture) { - gltex := t.(*gpuTexture) - f.Bind() - f.funcs.FramebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0, TEXTURE_2D, gltex.obj, 0) -} - func toTexFilter(f gpu.TextureFilter) int { switch f { case gpu.FilterNearest: diff --git a/gpu/path.go b/gpu/path.go index b4cc7131..d76d02a9 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -193,9 +193,7 @@ func newStenciler(ctx Backend) *stenciler { func (s *fboSet) resize(ctx Backend, sizes []image.Point) { // Add fbos. for i := len(s.fbos); i < len(sizes); i++ { - s.fbos = append(s.fbos, stencilFBO{ - fbo: ctx.NewFramebuffer(), - }) + s.fbos = append(s.fbos, stencilFBO{}) } // Resize fbos. for i, sz := range sizes { @@ -206,13 +204,14 @@ func (s *fboSet) resize(ctx Backend, sizes []image.Point) { waste := float32(sz.X*sz.Y) / float32(f.size.X*f.size.Y) resize = resize || waste > 1.2 if resize { - if f.tex != nil { + if f.fbo != nil { + f.fbo.Release() f.tex.Release() } f.size = sz f.tex = ctx.NewTexture(TextureFormatFloat, sz.X, sz.Y, FilterNearest, FilterNearest, BufferBindingTexture|BufferBindingFramebuffer) - f.fbo.BindTexture(f.tex) + f.fbo = ctx.NewFramebuffer(f.tex) } } // Delete extra fbos.