gpu: specify target Texture Backend.NewFramebuffer

OpenGL doesn't care if the texture to a framebuffer changes, but
Direct3D does. Change Backend to better match both APIs.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-02-21 15:02:54 +01:00
parent cae97a9861
commit eb7e11ee8e
3 changed files with 11 additions and 15 deletions
+1 -2
View File
@@ -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
+6 -8
View File
@@ -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:
+4 -5
View File
@@ -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.