mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 09:55:40 +00:00
gpu/internal/opengl,internal: move sRGB emulation to OpenGL driver
There is only one driver but several backends (EGL, WebGL). Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+1
-1
@@ -280,7 +280,7 @@ func (g *compute) Frame() error {
|
||||
Y: (viewport.Y + tileHeightPx - 1) / tileHeightPx,
|
||||
}
|
||||
|
||||
defFBO := g.ctx.BeginFrame()
|
||||
defFBO := g.ctx.BeginFrame(viewport)
|
||||
defer g.ctx.EndFrame()
|
||||
|
||||
if g.drawOps.profile && g.timers.t == nil && g.ctx.Caps().Features.Has(driver.FeatureTimers) {
|
||||
|
||||
+2
-2
@@ -425,9 +425,9 @@ func (g *gpu) Collect(viewport image.Point, frameOps *op.Ops) {
|
||||
}
|
||||
|
||||
func (g *gpu) Frame() error {
|
||||
defFBO := g.ctx.BeginFrame()
|
||||
defer g.ctx.EndFrame()
|
||||
viewport := g.renderer.blitter.viewport
|
||||
defFBO := g.ctx.BeginFrame(viewport)
|
||||
defer g.ctx.EndFrame()
|
||||
for _, img := range g.drawOps.imageOps {
|
||||
expandPathOp(img.path, img.clip)
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ func newDriver(t *testing.T) driver.Device {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
b.BeginFrame()
|
||||
b.BeginFrame(image.Pt(1, 1))
|
||||
t.Cleanup(func() {
|
||||
b.EndFrame()
|
||||
ctx.ReleaseCurrent()
|
||||
|
||||
@@ -164,7 +164,7 @@ func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (b *Backend) BeginFrame() driver.Framebuffer {
|
||||
func (b *Backend) BeginFrame(viewport image.Point) driver.Framebuffer {
|
||||
renderTarget, depthView := b.ctx.OMGetRenderTargets()
|
||||
// Assume someone else is holding on to the render targets.
|
||||
if renderTarget != nil {
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
// APIs such as OpenGL, Direct3D useful for rendering Gio
|
||||
// operations.
|
||||
type Device interface {
|
||||
BeginFrame() Framebuffer
|
||||
BeginFrame(viewport image.Point) Framebuffer
|
||||
EndFrame()
|
||||
Caps() Caps
|
||||
NewTimer() Timer
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
|
||||
"gioui.org/gpu/internal/driver"
|
||||
"gioui.org/internal/gl"
|
||||
"gioui.org/internal/srgb"
|
||||
)
|
||||
|
||||
// Backend implements driver.Device.
|
||||
@@ -30,6 +31,9 @@ type Backend struct {
|
||||
// Single channel alpha textures.
|
||||
alphaTriple textureTriple
|
||||
srgbaTriple textureTriple
|
||||
|
||||
sRGBFBO *srgb.FBO
|
||||
defFBO gl.Framebuffer
|
||||
}
|
||||
|
||||
// State tracking.
|
||||
@@ -169,15 +173,43 @@ func newOpenGLDevice(api driver.OpenGL) (driver.Device, error) {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (b *Backend) BeginFrame() driver.Framebuffer {
|
||||
func (b *Backend) BeginFrame(viewport image.Point) driver.Framebuffer {
|
||||
// Assume GL state is reset between frames.
|
||||
b.state = glstate{}
|
||||
fboID := gl.Framebuffer(b.funcs.GetBinding(gl.FRAMEBUFFER_BINDING))
|
||||
return &gpuFramebuffer{backend: b, obj: fboID, foreign: true}
|
||||
b.defFBO = gl.Framebuffer(b.funcs.GetBinding(gl.FRAMEBUFFER_BINDING))
|
||||
// Determine color encoding of the output framebuffer.
|
||||
var fbEncoding int
|
||||
if !b.defFBO.Valid() {
|
||||
fbEncoding = b.funcs.GetFramebufferAttachmentParameteri(gl.FRAMEBUFFER, gl.BACK, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING)
|
||||
} else {
|
||||
fbEncoding = b.funcs.GetFramebufferAttachmentParameteri(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING)
|
||||
}
|
||||
renderFBO := b.defFBO
|
||||
if fbEncoding == gl.LINEAR {
|
||||
if b.sRGBFBO == nil {
|
||||
// Framebuffer is not in sRGB format. Emulate it.
|
||||
sfbo, err := srgb.New(b.funcs)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
b.sRGBFBO = sfbo
|
||||
}
|
||||
if err := b.sRGBFBO.Refresh(viewport); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
renderFBO = b.sRGBFBO.Framebuffer()
|
||||
}
|
||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, renderFBO)
|
||||
return &gpuFramebuffer{backend: b, obj: renderFBO, foreign: true}
|
||||
}
|
||||
|
||||
func (b *Backend) EndFrame() {
|
||||
b.funcs.ActiveTexture(gl.TEXTURE0)
|
||||
if b.sRGBFBO != nil {
|
||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
||||
b.sRGBFBO.Blit()
|
||||
}
|
||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
||||
}
|
||||
|
||||
func (b *Backend) Caps() driver.Caps {
|
||||
@@ -313,6 +345,10 @@ func glErr(f *gl.Functions) error {
|
||||
}
|
||||
|
||||
func (b *Backend) Release() {
|
||||
if b.sRGBFBO != nil {
|
||||
b.sRGBFBO.Release()
|
||||
}
|
||||
*b = Backend{}
|
||||
}
|
||||
|
||||
func (b *Backend) MemoryBarrier() {
|
||||
|
||||
Reference in New Issue
Block a user