forked from joejulian/gio
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
|
||||
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
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user