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 IsTimeContinuous() bool
NewTexture(format TextureFormat, width, height int, minFilter, magFilter TextureFilter, bindings BufferBinding) Texture NewTexture(format TextureFormat, width, height int, minFilter, magFilter TextureFilter, bindings BufferBinding) Texture
DefaultFramebuffer() Framebuffer DefaultFramebuffer() Framebuffer
NewFramebuffer() Framebuffer NewFramebuffer(tex Texture) Framebuffer
NewImmutableBuffer(typ BufferBinding, data []byte) Buffer NewImmutableBuffer(typ BufferBinding, data []byte) Buffer
NewBuffer(typ BufferBinding, size int) Buffer NewBuffer(typ BufferBinding, size int) Buffer
NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error) NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error)
@@ -125,7 +125,6 @@ type Buffer interface {
type Framebuffer interface { type Framebuffer interface {
Bind() Bind()
BindTexture(t Texture)
Invalidate() Invalidate()
Release() Release()
IsComplete() error IsComplete() error
+6 -8
View File
@@ -162,9 +162,13 @@ func (b *Backend) IsTimeContinuous() bool {
return b.funcs.GetInteger(GPU_DISJOINT_EXT) == FALSE 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() 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 { func (b *Backend) DefaultFramebuffer() gpu.Framebuffer {
@@ -552,12 +556,6 @@ func (f *gpuFramebuffer) Release() {
f.funcs.DeleteFramebuffer(f.obj) 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 { func toTexFilter(f gpu.TextureFilter) int {
switch f { switch f {
case gpu.FilterNearest: 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) { func (s *fboSet) resize(ctx Backend, sizes []image.Point) {
// Add fbos. // Add fbos.
for i := len(s.fbos); i < len(sizes); i++ { for i := len(s.fbos); i < len(sizes); i++ {
s.fbos = append(s.fbos, stencilFBO{ s.fbos = append(s.fbos, stencilFBO{})
fbo: ctx.NewFramebuffer(),
})
} }
// Resize fbos. // Resize fbos.
for i, sz := range sizes { 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) waste := float32(sz.X*sz.Y) / float32(f.size.X*f.size.Y)
resize = resize || waste > 1.2 resize = resize || waste > 1.2
if resize { if resize {
if f.tex != nil { if f.fbo != nil {
f.fbo.Release()
f.tex.Release() f.tex.Release()
} }
f.size = sz f.size = sz
f.tex = ctx.NewTexture(TextureFormatFloat, sz.X, sz.Y, FilterNearest, FilterNearest, f.tex = ctx.NewTexture(TextureFormatFloat, sz.X, sz.Y, FilterNearest, FilterNearest,
BufferBindingTexture|BufferBindingFramebuffer) BufferBindingTexture|BufferBindingFramebuffer)
f.fbo.BindTexture(f.tex) f.fbo = ctx.NewFramebuffer(f.tex)
} }
} }
// Delete extra fbos. // Delete extra fbos.