mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
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:
+1
-2
@@ -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
@@ -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
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user