From 18b444239379939d0ab1b6b8662433b407f0c653 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 6 Aug 2021 16:36:56 +0200 Subject: [PATCH] all: remove Z buffer support It is no longer needed by any rendering backend. Signed-off-by: Elias Naur --- app/internal/wm/d3d11_windows.go | 20 +----- app/internal/wm/gl_ios.go | 25 +++----- app/internal/wm/gl_macos.m | 1 - gpu/compute.go | 4 +- gpu/gpu.go | 8 --- gpu/headless/driver_test.go | 4 +- gpu/headless/headless.go | 3 +- gpu/internal/d3d11/d3d11_windows.go | 88 +++----------------------- gpu/internal/driver/api.go | 2 - gpu/internal/driver/driver.go | 13 +--- gpu/internal/opengl/opengl.go | 98 ++--------------------------- gpu/internal/opengl/srgb.go | 7 --- gpu/path.go | 2 +- internal/egl/egl.go | 2 - 14 files changed, 27 insertions(+), 250 deletions(-) diff --git a/app/internal/wm/d3d11_windows.go b/app/internal/wm/d3d11_windows.go index d570a87b..2b89c1f2 100644 --- a/app/internal/wm/d3d11_windows.go +++ b/app/internal/wm/d3d11_windows.go @@ -17,7 +17,6 @@ type d3d11Context struct { swchain *d3d11.IDXGISwapChain renderTarget *d3d11.RenderTargetView - depthView *d3d11.DepthStencilView width, height int } @@ -56,8 +55,7 @@ func (c *d3d11Context) API() gpu.API { func (c *d3d11Context) RenderTarget() gpu.RenderTarget { return gpu.Direct3D11RenderTarget{ - RenderTarget: unsafe.Pointer(c.renderTarget), - DepthStencilView: unsafe.Pointer(c.depthView), + RenderTarget: unsafe.Pointer(c.renderTarget), } } @@ -91,10 +89,6 @@ func (c *d3d11Context) Refresh() error { c.width = width c.height = height - desc, err := c.swchain.GetDesc() - if err != nil { - return err - } backBuffer, err := c.swchain.GetBuffer(0, &d3d11.IID_Texture2D) if err != nil { return err @@ -105,18 +99,12 @@ func (c *d3d11Context) Refresh() error { if err != nil { return err } - depthView, err := d3d11.CreateDepthView(c.dev, int(desc.BufferDesc.Width), int(desc.BufferDesc.Height), 24) - if err != nil { - d3d11.IUnknownRelease(unsafe.Pointer(renderTarget), renderTarget.Vtbl.Release) - return err - } c.renderTarget = renderTarget - c.depthView = depthView return nil } func (c *d3d11Context) Lock() error { - c.ctx.OMSetRenderTargets(c.renderTarget, c.depthView) + c.ctx.OMSetRenderTargets(c.renderTarget, nil) return nil } @@ -140,10 +128,6 @@ func (c *d3d11Context) Release() { } func (c *d3d11Context) releaseFBO() { - if c.depthView != nil { - d3d11.IUnknownRelease(unsafe.Pointer(c.depthView), c.depthView.Vtbl.Release) - c.depthView = nil - } if c.renderTarget != nil { d3d11.IUnknownRelease(unsafe.Pointer(c.renderTarget), c.renderTarget.Vtbl.Release) c.renderTarget = nil diff --git a/app/internal/wm/gl_ios.go b/app/internal/wm/gl_ios.go index 74a8bddc..0cbddfc5 100644 --- a/app/internal/wm/gl_ios.go +++ b/app/internal/wm/gl_ios.go @@ -27,13 +27,13 @@ import ( ) type context struct { - owner *window - c *gl.Functions - ctx C.CFTypeRef - layer C.CFTypeRef - init bool - frameBuffer gl.Framebuffer - colorBuffer, depthBuffer gl.Renderbuffer + owner *window + c *gl.Functions + ctx C.CFTypeRef + layer C.CFTypeRef + init bool + frameBuffer gl.Framebuffer + colorBuffer gl.Renderbuffer } func init() { @@ -80,7 +80,6 @@ func (c *context) Release() { C.gio_renderbufferStorage(c.ctx, 0, C.GLenum(gl.RENDERBUFFER)) c.c.DeleteFramebuffer(c.frameBuffer) c.c.DeleteRenderbuffer(c.colorBuffer) - c.c.DeleteRenderbuffer(c.depthBuffer) C.gio_makeCurrent(0) C.CFRelease(c.ctx) c.ctx = 0 @@ -90,10 +89,6 @@ func (c *context) Present() error { if c.layer == 0 { panic("context is not active") } - // Discard depth buffer as recommended in - // https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html - c.c.BindFramebuffer(gl.FRAMEBUFFER, c.frameBuffer) - c.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT) c.c.BindRenderbuffer(gl.RENDERBUFFER, c.colorBuffer) if C.gio_presentRenderbuffer(c.ctx, C.GLenum(gl.RENDERBUFFER)) == 0 { return errors.New("presentRenderBuffer failed") @@ -120,7 +115,6 @@ func (c *context) Refresh() error { c.init = true c.frameBuffer = c.c.CreateFramebuffer() c.colorBuffer = c.c.CreateRenderbuffer() - c.depthBuffer = c.c.CreateRenderbuffer() } if !c.owner.isVisible() { // Make sure any in-flight GL commands are complete. @@ -132,14 +126,9 @@ func (c *context) Refresh() error { if C.gio_renderbufferStorage(c.ctx, c.layer, C.GLenum(gl.RENDERBUFFER)) == 0 { return errors.New("renderbufferStorage failed") } - w := c.c.GetRenderbufferParameteri(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) - h := c.c.GetRenderbufferParameteri(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) - c.c.BindRenderbuffer(gl.RENDERBUFFER, c.depthBuffer) - c.c.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h) c.c.BindRenderbuffer(gl.RENDERBUFFER, currentRB) c.c.BindFramebuffer(gl.FRAMEBUFFER, c.frameBuffer) c.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, c.colorBuffer) - c.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, c.depthBuffer) if st := c.c.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { return fmt.Errorf("framebuffer incomplete, status: %#x\n", st) } diff --git a/app/internal/wm/gl_macos.m b/app/internal/wm/gl_macos.m index d59117c9..2cf9ef5b 100644 --- a/app/internal/wm/gl_macos.m +++ b/app/internal/wm/gl_macos.m @@ -13,7 +13,6 @@ CFTypeRef gio_createGLContext(void) { NSOpenGLPixelFormatAttribute attr[] = { NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, NSOpenGLPFAColorSize, 24, - NSOpenGLPFADepthSize, 16, NSOpenGLPFAAccelerated, // Opt-in to automatic GPU switching. CGL-only property. kCGLPFASupportsAutomaticGraphicsSwitching, diff --git a/gpu/compute.go b/gpu/compute.go index 4f69df17..c8a97e1d 100644 --- a/gpu/compute.go +++ b/gpu/compute.go @@ -888,7 +888,7 @@ restart: if err != nil { return fmt.Errorf("compute: failed to create material atlas: %v", err) } - fbo, err := g.ctx.NewFramebuffer(handle, 0) + fbo, err := g.ctx.NewFramebuffer(handle) if err != nil { handle.Release() return fmt.Errorf("compute: failed to create material framebuffer: %v", err) @@ -1303,7 +1303,7 @@ func (a *layerAtlas) ensureSize(useCPU bool, ctx driver.Device, size image.Point if err != nil { return err } - fbo, err := ctx.NewFramebuffer(img, 0) + fbo, err := ctx.NewFramebuffer(img) if err != nil { img.Release() return err diff --git a/gpu/gpu.go b/gpu/gpu.go index 1d786351..6bf7e355 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -419,14 +419,10 @@ func (g *gpu) Frame(target RenderTarget) error { expandPathOp(img.path, img.clip) } g.ctx.BindFramebuffer(defFBO) - g.ctx.DepthFunc(driver.DepthFuncGreater) - // Note that Clear must be before ClearDepth if nothing else is rendered - // (len(zimageOps) == 0). If not, the Fairphone 2 will corrupt the depth buffer. if g.drawOps.clear { g.drawOps.clear = false g.ctx.Clear(g.drawOps.clearColor.Float32()) } - g.ctx.ClearDepth(0.0) g.ctx.Viewport(0, 0, viewport.X, viewport.Y) g.stencilTimer.begin() g.ctx.SetBlend(true) @@ -1035,8 +1031,6 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32 } func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) { - r.ctx.SetDepthTest(true) - r.ctx.DepthMask(false) r.ctx.BlendFunc(driver.BlendFactorOne, driver.BlendFactorOneMinusSrcAlpha) r.ctx.BindVertexBuffer(r.blitter.quadVerts, 4*4, 0) r.ctx.BindInputLayout(r.pather.coverer.layout) @@ -1071,8 +1065,6 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) { coverScale, coverOff := texSpaceTransform(layout.FRect(uv), fbo.size) r.pather.cover(m.material, m.color, m.color1, m.color2, scale, off, m.uvTrans, coverScale, coverOff) } - r.ctx.DepthMask(true) - r.ctx.SetDepthTest(false) } func (b *blitter) blit(mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D) { diff --git a/gpu/headless/driver_test.go b/gpu/headless/driver_test.go index 47058503..a286524b 100644 --- a/gpu/headless/driver_test.go +++ b/gpu/headless/driver_test.go @@ -132,7 +132,6 @@ func setupFBO(t *testing.T, b driver.Device, size image.Point) driver.Framebuffe // are in the sRGB color space. col := f32color.LinearFromSRGB(clearCol) b.Clear(col.Float32()) - b.ClearDepth(0.0) b.Viewport(0, 0, size.X, size.Y) return fbo } @@ -150,8 +149,7 @@ func newFBO(t *testing.T, b driver.Device, size image.Point) driver.Framebuffer t.Cleanup(func() { fboTex.Release() }) - const depthBits = 16 - fbo, err := b.NewFramebuffer(fboTex, depthBits) + fbo, err := b.NewFramebuffer(fboTex) if err != nil { t.Fatal(err) } diff --git a/gpu/headless/headless.go b/gpu/headless/headless.go index 46cddfa7..0ebbfa36 100644 --- a/gpu/headless/headless.go +++ b/gpu/headless/headless.go @@ -57,8 +57,7 @@ func NewWindow(width, height int) (*Window, error) { if err != nil { return nil } - const depthBits = 16 - fbo, err := dev.NewFramebuffer(fboTex, depthBits) + fbo, err := dev.NewFramebuffer(fboTex) if err != nil { fboTex.Release() return err diff --git a/gpu/internal/d3d11/d3d11_windows.go b/gpu/internal/d3d11/d3d11_windows.go index 318d1155..e70dca34 100644 --- a/gpu/internal/d3d11/d3d11_windows.go +++ b/gpu/internal/d3d11/d3d11_windows.go @@ -23,7 +23,6 @@ type Backend struct { // Temporary storage to avoid garbage. clearColor [4]float32 viewport d3d11.VIEWPORT - depthState depthState blendState blendState // Current program. @@ -37,7 +36,6 @@ type Backend struct { floatFormat uint32 // cached state objects. - depthStates map[depthState]*d3d11.DepthStencilState blendStates map[blendState]*d3d11.BlendState } @@ -47,12 +45,6 @@ type blendState struct { dfactor driver.BlendFactor } -type depthState struct { - enable bool - mask bool - fn driver.DepthFunc -} - type Texture struct { backend *Backend format uint32 @@ -83,7 +75,6 @@ type Framebuffer struct { format uint32 resource *d3d11.Resource renderTarget *d3d11.RenderTargetView - depthView *d3d11.DepthStencilView foreign bool } @@ -130,7 +121,6 @@ func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) { MaxTextureSize: 2048, // 9.1 maximum Features: driver.FeatureSRGB, }, - depthStates: make(map[depthState]*d3d11.DepthStencilState), blendStates: make(map[blendState]*d3d11.BlendState), } featLvl := dev.GetFeatureLevel() @@ -149,13 +139,10 @@ func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) { b.floatFormat = fmt b.caps.Features |= driver.FeatureFloatRenderTargets } - // Enable depth mask to match OpenGL. - b.depthState.mask = true // Disable backface culling to match OpenGL. state, err := dev.CreateRasterizerState(&d3d11.RASTERIZER_DESC{ - CullMode: d3d11.CULL_NONE, - FillMode: d3d11.FILL_SOLID, - DepthClipEnable: 1, + CullMode: d3d11.CULL_NONE, + FillMode: d3d11.FILL_SOLID, }) if err != nil { return nil, err @@ -168,21 +155,19 @@ func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) { func (b *Backend) BeginFrame(target driver.RenderTarget, clear bool, viewport image.Point) driver.Framebuffer { var ( renderTarget *d3d11.RenderTargetView - depthView *d3d11.DepthStencilView ) if target != nil { switch t := target.(type) { case driver.Direct3D11RenderTarget: renderTarget = (*d3d11.RenderTargetView)(t.RenderTarget) - depthView = (*d3d11.DepthStencilView)(t.DepthStencilView) case *Framebuffer: - renderTarget, depthView = t.renderTarget, t.depthView + renderTarget = t.renderTarget default: panic(fmt.Errorf("opengl: invalid render target type: %T", target)) } } - b.ctx.OMSetRenderTargets(renderTarget, depthView) - return &Framebuffer{ctx: b.ctx, dev: b.dev, renderTarget: renderTarget, depthView: depthView, foreign: true} + b.ctx.OMSetRenderTargets(renderTarget, nil) + return &Framebuffer{ctx: b.ctx, dev: b.dev, renderTarget: renderTarget, foreign: true} } func (b *Backend) BlitFramebuffer(dst, src driver.Framebuffer, srect, drect image.Rectangle) { @@ -205,9 +190,6 @@ func (b *Backend) IsTimeContinuous() bool { } func (b *Backend) Release() { - for _, state := range b.depthStates { - d3d11.IUnknownRelease(unsafe.Pointer(state), state.Vtbl.Release) - } for _, state := range b.blendStates { d3d11.IUnknownRelease(unsafe.Pointer(state), state.Vtbl.Release) } @@ -291,7 +273,7 @@ func (b *Backend) NewTexture(format driver.TextureFormat, width, height int, min return &Texture{backend: b, format: d3dfmt, tex: tex, sampler: sampler, resView: resView, bindings: bindings, width: width, height: height}, nil } -func (b *Backend) NewFramebuffer(tex driver.Texture, depthBits int) (driver.Framebuffer, error) { +func (b *Backend) NewFramebuffer(tex driver.Texture) (driver.Framebuffer, error) { d3dtex := tex.(*Texture) if d3dtex.bindings&driver.BufferBindingFramebuffer == 0 { return nil, errors.New("the texture was created without BufferBindingFramebuffer binding") @@ -302,14 +284,6 @@ func (b *Backend) NewFramebuffer(tex driver.Texture, depthBits int) (driver.Fram return nil, err } fbo := &Framebuffer{ctx: b.ctx, dev: b.dev, format: d3dtex.format, resource: resource, renderTarget: renderTarget} - if depthBits > 0 { - depthView, err := d3d11.CreateDepthView(b.dev, d3dtex.width, d3dtex.height, depthBits) - if err != nil { - d3d11.IUnknownRelease(unsafe.Pointer(renderTarget), renderTarget.Vtbl.Release) - return nil, err - } - fbo.depthView = depthView - } return fbo, nil } @@ -430,12 +404,6 @@ func (b *Backend) Clear(colr, colg, colb, cola float32) { b.ctx.ClearRenderTargetView(b.fbo.renderTarget, &b.clearColor) } -func (b *Backend) ClearDepth(depth float32) { - if b.fbo.depthView != nil { - b.ctx.ClearDepthStencilView(b.fbo.depthView, d3d11.CLEAR_DEPTH|d3d11.CLEAR_STENCIL, depth, 0) - } -} - func (b *Backend) Viewport(x, y, width, height int) { b.viewport = d3d11.VIEWPORT{ TopLeftX: float32(x), @@ -480,32 +448,6 @@ func (b *Backend) prepareDraw(mode driver.DrawMode) { } b.ctx.IASetPrimitiveTopology(topology) - depthState, ok := b.depthStates[b.depthState] - if !ok { - var desc d3d11.DEPTH_STENCIL_DESC - if b.depthState.enable { - desc.DepthEnable = 1 - } - if b.depthState.mask { - desc.DepthWriteMask = d3d11.DEPTH_WRITE_MASK_ALL - } - switch b.depthState.fn { - case driver.DepthFuncGreater: - desc.DepthFunc = d3d11.COMPARISON_GREATER - case driver.DepthFuncGreaterEqual: - desc.DepthFunc = d3d11.COMPARISON_GREATER_EQUAL - default: - panic("unsupported depth func") - } - var err error - depthState, err = b.dev.CreateDepthStencilState(&desc) - if err != nil { - panic(err) - } - b.depthStates[b.depthState] = depthState - } - b.ctx.OMSetDepthStencilState(depthState, 0) - blendState, ok := b.blendStates[b.blendState] if !ok { var desc d3d11.BLEND_DESC @@ -532,22 +474,10 @@ func (b *Backend) prepareDraw(mode driver.DrawMode) { b.ctx.OMSetBlendState(blendState, nil, 0xffffffff) } -func (b *Backend) DepthFunc(f driver.DepthFunc) { - b.depthState.fn = f -} - func (b *Backend) SetBlend(enable bool) { b.blendState.enable = enable } -func (b *Backend) SetDepthTest(enable bool) { - b.depthState.enable = enable -} - -func (b *Backend) DepthMask(mask bool) { - b.depthState.mask = mask -} - func (b *Backend) BlendFunc(sfactor, dfactor driver.BlendFactor) { b.blendState.sfactor = sfactor b.blendState.dfactor = dfactor @@ -701,7 +631,7 @@ func (f *Framebuffer) ReadPixels(src image.Rectangle, pixels []byte) error { func (b *Backend) BindFramebuffer(fbo driver.Framebuffer) { b.fbo = fbo.(*Framebuffer) - b.ctx.OMSetRenderTargets(b.fbo.renderTarget, b.fbo.depthView) + b.ctx.OMSetRenderTargets(b.fbo.renderTarget, nil) } func (f *Framebuffer) Invalidate() { @@ -715,10 +645,6 @@ func (f *Framebuffer) Release() { d3d11.IUnknownRelease(unsafe.Pointer(f.renderTarget), f.renderTarget.Vtbl.Release) f.renderTarget = nil } - if f.depthView != nil { - d3d11.IUnknownRelease(unsafe.Pointer(f.depthView), f.depthView.Vtbl.Release) - f.depthView = nil - } } func (f *Framebuffer) ImplementsRenderTarget() {} diff --git a/gpu/internal/driver/api.go b/gpu/internal/driver/api.go index 10a4cf2c..0b4af132 100644 --- a/gpu/internal/driver/api.go +++ b/gpu/internal/driver/api.go @@ -24,8 +24,6 @@ type OpenGLRenderTarget gl.Framebuffer type Direct3D11RenderTarget struct { // RenderTarget is a *ID3D11RenderTargetView. RenderTarget unsafe.Pointer - // DepthStencilView is a *ID3D11DepthStencilView. - DepthStencilView unsafe.Pointer } type OpenGL struct { diff --git a/gpu/internal/driver/driver.go b/gpu/internal/driver/driver.go index 48b5e400..3bb6701d 100644 --- a/gpu/internal/driver/driver.go +++ b/gpu/internal/driver/driver.go @@ -20,22 +20,18 @@ type Device interface { // are valid at the point of call. IsTimeContinuous() bool NewTexture(format TextureFormat, width, height int, minFilter, magFilter TextureFilter, bindings BufferBinding) (Texture, error) - NewFramebuffer(tex Texture, depthBits int) (Framebuffer, error) + NewFramebuffer(tex Texture) (Framebuffer, error) NewImmutableBuffer(typ BufferBinding, data []byte) (Buffer, error) NewBuffer(typ BufferBinding, size int) (Buffer, error) NewComputeProgram(shader ShaderSources) (Program, error) NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error) NewInputLayout(vertexShader ShaderSources, layout []InputDesc) (InputLayout, error) - DepthFunc(f DepthFunc) - ClearDepth(d float32) Clear(r, g, b, a float32) Viewport(x, y, width, height int) DrawArrays(mode DrawMode, off, count int) DrawElements(mode DrawMode, off, count int) SetBlend(enable bool) - SetDepthTest(enable bool) - DepthMask(mask bool) BlendFunc(sfactor, dfactor BlendFactor) BindInputLayout(i InputLayout) @@ -129,8 +125,6 @@ type BufferBinding uint8 type DataType uint8 -type DepthFunc uint8 - type Features uint type Caps struct { @@ -173,11 +167,6 @@ type Texture interface { Release() } -const ( - DepthFuncGreater DepthFunc = iota - DepthFuncGreaterEqual -) - const ( DataTypeFloat DataType = iota DataTypeInt diff --git a/gpu/internal/opengl/opengl.go b/gpu/internal/opengl/opengl.go index 8f2cfc07..9c43ac52 100644 --- a/gpu/internal/opengl/opengl.go +++ b/gpu/internal/opengl/opengl.go @@ -67,17 +67,13 @@ type glState struct { storeBuf gl.Buffer storeBufs [4]gl.Buffer vertArray gl.VertexArray - depthMask bool - depthFunc gl.Enum srgb bool blend struct { enable bool srcRGB, dstRGB gl.Enum srcA, dstA gl.Enum } - depthTest bool clearColor [4]float32 - clearDepth float32 viewport [4]int unpack_row_length int } @@ -108,11 +104,9 @@ type gpuTexture struct { } type gpuFramebuffer struct { - backend *Backend - obj gl.Framebuffer - hasDepth bool - depthBuf gl.Renderbuffer - foreign bool + backend *Backend + obj gl.Framebuffer + foreign bool } type gpuBuffer struct { @@ -286,10 +280,6 @@ func (b *Backend) queryState() glState { arrayBuf: gl.Buffer(b.funcs.GetBinding(gl.ARRAY_BUFFER_BINDING)), elemBuf: gl.Buffer(b.funcs.GetBinding(gl.ELEMENT_ARRAY_BUFFER_BINDING)), drawFBO: gl.Framebuffer(b.funcs.GetBinding(gl.FRAMEBUFFER_BINDING)), - depthMask: b.funcs.GetInteger(gl.DEPTH_WRITEMASK) != gl.FALSE, - depthTest: b.funcs.IsEnabled(gl.DEPTH_TEST), - depthFunc: gl.Enum(b.funcs.GetInteger(gl.DEPTH_FUNC)), - clearDepth: b.funcs.GetFloat(gl.DEPTH_CLEAR_VALUE), clearColor: b.funcs.GetFloat4(gl.COLOR_CLEAR_VALUE), viewport: b.funcs.GetInteger4(gl.VIEWPORT), unpack_row_length: b.funcs.GetInteger(gl.UNPACK_ROW_LENGTH), @@ -346,8 +336,6 @@ func (b *Backend) restoreState(dst glState) { src.set(f, gl.BLEND, dst.blend.enable) bf := dst.blend src.setBlendFuncSeparate(f, bf.srcRGB, bf.dstRGB, bf.srcA, bf.dstA) - src.set(f, gl.DEPTH_TEST, dst.depthTest) - src.setDepthFunc(f, dst.depthFunc) src.set(f, gl.FRAMEBUFFER_SRGB, dst.srgb) src.bindVertexArray(f, dst.vertArray) src.useProgram(f, dst.prog) @@ -360,8 +348,6 @@ func (b *Backend) restoreState(dst glState) { src.bindBufferBase(f, gl.SHADER_STORAGE_BUFFER, i, b) } src.bindBuffer(f, gl.SHADER_STORAGE_BUFFER, dst.storeBuf) - src.setDepthMask(f, dst.depthMask) - src.setClearDepth(f, dst.clearDepth) col := dst.clearColor src.setClearColor(f, col[0], col[1], col[2], col[3]) for i, attr := range dst.vertAttribs { @@ -583,13 +569,6 @@ func (s *glState) pixelStorei(f *gl.Functions, pname gl.Enum, val int) { } } -func (s *glState) setClearDepth(f *gl.Functions, d float32) { - if d != s.clearDepth { - f.ClearDepthf(d) - s.clearDepth = d - } -} - func (s *glState) setClearColor(f *gl.Functions, r, g, b, a float32) { col := [4]float32{r, g, b, a} if col != s.clearColor { @@ -606,13 +585,6 @@ func (s *glState) setViewport(f *gl.Functions, x, y, width, height int) { } } -func (s *glState) setDepthFunc(f *gl.Functions, df gl.Enum) { - if df != s.depthFunc { - f.DepthFunc(df) - s.depthFunc = df - } -} - func (s *glState) setBlendFuncSeparate(f *gl.Functions, srcRGB, dstRGB, srcA, dstA gl.Enum) { if srcRGB != s.blend.srcRGB || dstRGB != s.blend.dstRGB || srcA != s.blend.srcA || dstA != s.blend.dstA { s.blend.srcRGB = srcRGB @@ -623,13 +595,6 @@ func (s *glState) setBlendFuncSeparate(f *gl.Functions, srcRGB, dstRGB, srcA, ds } } -func (s *glState) setDepthMask(f *gl.Functions, enable bool) { - if enable != s.depthMask { - f.DepthMask(enable) - s.depthMask = enable - } -} - func (s *glState) set(f *gl.Functions, target gl.Enum, enable bool) { switch target { case gl.FRAMEBUFFER_SRGB: @@ -642,11 +607,6 @@ func (s *glState) set(f *gl.Functions, target gl.Enum, enable bool) { return } s.blend.enable = enable - case gl.DEPTH_TEST: - if enable == s.depthTest { - return - } - s.depthTest = enable default: panic("unknown enable") } @@ -672,7 +632,7 @@ func (b *Backend) IsTimeContinuous() bool { return b.funcs.GetInteger(gl.GPU_DISJOINT_EXT) == gl.FALSE } -func (b *Backend) NewFramebuffer(tex driver.Texture, depthBits int) (driver.Framebuffer, error) { +func (b *Backend) NewFramebuffer(tex driver.Texture) (driver.Framebuffer, error) { glErr(b.funcs) gltex := tex.(*gpuTexture) fb := b.funcs.CreateFramebuffer() @@ -683,25 +643,6 @@ func (b *Backend) NewFramebuffer(tex driver.Texture, depthBits int) (driver.Fram return nil, err } b.funcs.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, gltex.obj, 0) - if depthBits > 0 { - size := gl.Enum(gl.DEPTH_COMPONENT16) - switch { - case depthBits > 24: - size = gl.DEPTH_COMPONENT32F - case depthBits > 16: - size = gl.DEPTH_COMPONENT24 - } - depthBuf := b.funcs.CreateRenderbuffer() - b.glstate.bindRenderbuffer(b.funcs, gl.RENDERBUFFER, depthBuf) - b.funcs.RenderbufferStorage(gl.RENDERBUFFER, size, gltex.width, gltex.height) - b.funcs.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuf) - fbo.depthBuf = depthBuf - fbo.hasDepth = true - if err := glErr(b.funcs); err != nil { - fbo.Release() - return nil, err - } - } if st := b.funcs.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { fbo.Release() return nil, fmt.Errorf("incomplete framebuffer, status = 0x%x, err = %d", st, b.funcs.GetError()) @@ -840,10 +781,6 @@ func (b *Backend) useProgram(p *gpuProgram) { b.state.prog = p } -func (b *Backend) SetDepthTest(enable bool) { - b.glstate.set(b.funcs, gl.DEPTH_TEST, enable) -} - func (b *Backend) BlendFunc(sfactor, dfactor driver.BlendFactor) { src, dst := toGLBlendFactor(sfactor), toGLBlendFactor(dfactor) b.glstate.setBlendFuncSeparate(b.funcs, src, dst, src, dst) @@ -864,10 +801,6 @@ func toGLBlendFactor(f driver.BlendFactor) gl.Enum { } } -func (b *Backend) DepthMask(mask bool) { - b.glstate.setDepthMask(b.funcs, mask) -} - func (b *Backend) SetBlend(enable bool) { b.glstate.set(b.funcs, gl.BLEND, enable) } @@ -913,24 +846,6 @@ func (b *Backend) Clear(colR, colG, colB, colA float32) { b.funcs.Clear(gl.COLOR_BUFFER_BIT) } -func (b *Backend) ClearDepth(d float32) { - b.glstate.setClearDepth(b.funcs, d) - b.funcs.Clear(gl.DEPTH_BUFFER_BIT) -} - -func (b *Backend) DepthFunc(f driver.DepthFunc) { - var glfunc gl.Enum - switch f { - case driver.DepthFuncGreater: - glfunc = gl.GREATER - case driver.DepthFuncGreaterEqual: - glfunc = gl.GEQUAL - default: - panic("unsupported depth func") - } - b.glstate.setDepthFunc(b.funcs, glfunc) -} - func (b *Backend) NewInputLayout(vs driver.ShaderSources, layout []driver.InputDesc) (driver.InputLayout, error) { if len(vs.Inputs) != len(layout) { return nil, fmt.Errorf("NewInputLayout: got %d inputs, expected %d", len(layout), len(vs.Inputs)) @@ -1222,7 +1137,7 @@ func (b *Backend) BlitFramebuffer(dst, src driver.Framebuffer, srect, drect imag b.funcs.BlitFramebuffer( srect.Min.X, srect.Min.Y, srect.Max.X, srect.Max.Y, drect.Min.X, drect.Min.Y, drect.Max.X, drect.Max.Y, - gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT|gl.STENCIL_BUFFER_BIT, + gl.COLOR_BUFFER_BIT, gl.NEAREST) } @@ -1250,9 +1165,6 @@ func (f *gpuFramebuffer) Release() { panic("framebuffer not created by NewFramebuffer") } f.backend.glstate.deleteFramebuffer(f.backend.funcs, f.obj) - if f.hasDepth { - f.backend.glstate.deleteRenderbuffer(f.backend.funcs, f.depthBuf) - } } func (f *gpuFramebuffer) ImplementsRenderTarget() {} diff --git a/gpu/internal/opengl/srgb.go b/gpu/internal/opengl/srgb.go index ff392343..1c5b528a 100644 --- a/gpu/internal/opengl/srgb.go +++ b/gpu/internal/opengl/srgb.go @@ -22,7 +22,6 @@ type SRGBFBO struct { viewport image.Point fbo gl.Framebuffer tex gl.Texture - depth gl.Renderbuffer blitted bool quad gl.Buffer prog gl.Program @@ -47,7 +46,6 @@ func NewSRGBFBO(f *gl.Functions, state *glState) (*SRGBFBO, error) { format: srgbTriple, fbo: f.CreateFramebuffer(), tex: f.CreateTexture(), - depth: f.CreateRenderbuffer(), } state.bindTexture(f, 0, s.tex) f.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) @@ -87,7 +85,6 @@ func (s *SRGBFBO) Blit() { s.c.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) s.state.bindFramebuffer(s.c, gl.FRAMEBUFFER, s.fbo) s.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0) - s.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT) } func (s *SRGBFBO) Framebuffer() gl.Framebuffer { @@ -104,11 +101,8 @@ func (s *SRGBFBO) Refresh(viewport image.Point) error { s.viewport = viewport s.state.bindTexture(s.c, 0, s.tex) s.c.TexImage2D(gl.TEXTURE_2D, 0, s.format.internalFormat, viewport.X, viewport.Y, s.format.format, s.format.typ) - s.state.bindRenderbuffer(s.c, gl.RENDERBUFFER, s.depth) - s.c.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, viewport.X, viewport.Y) s.state.bindFramebuffer(s.c, gl.FRAMEBUFFER, s.fbo) s.c.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, s.tex, 0) - s.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, s.depth) if st := s.c.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { return fmt.Errorf("sRGB framebuffer incomplete (%dx%d), status: %#x error: %x", viewport.X, viewport.Y, st, s.c.GetError()) } @@ -135,7 +129,6 @@ func (s *SRGBFBO) Refresh(viewport image.Point) error { func (s *SRGBFBO) Release() { s.state.deleteFramebuffer(s.c, s.fbo) s.state.deleteTexture(s.c, s.tex) - s.state.deleteRenderbuffer(s.c, s.depth) if s.blitted { s.state.deleteBuffer(s.c, s.quad) s.state.deleteProgram(s.c, s.prog) diff --git a/gpu/path.go b/gpu/path.go index 3170bab5..3692c88c 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -252,7 +252,7 @@ func (s *fboSet) resize(ctx driver.Device, sizes []image.Point) { if err != nil { panic(err) } - fbo, err := ctx.NewFramebuffer(tex, 0) + fbo, err := ctx.NewFramebuffer(tex) if err != nil { panic(err) } diff --git a/internal/egl/egl.go b/internal/egl/egl.go index 772841f5..f2b775df 100644 --- a/internal/egl/egl.go +++ b/internal/egl/egl.go @@ -187,8 +187,6 @@ func createContext(disp _EGLDisplay) (*eglContext, error) { // Also, some Android devices (Samsung S9) need alpha for sRGB to work. attribs = append(attribs, _EGL_ALPHA_SIZE, 8) } - // Only request a depth buffer if we're going to render directly to the framebuffer. - attribs = append(attribs, _EGL_DEPTH_SIZE, 16) } attribs = append(attribs, _EGL_NONE) eglCfg, ret := eglChooseConfig(disp, attribs)