mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-08 02:45:38 +00:00
gp/internal/opengl: support sRGB emulation for embedded content
Programs such as gio-example/glfw rely on Gio drawing blending with the framebuffer background. This change makes it so when sRGB emulation is active. 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,
|
Y: (viewport.Y + tileHeightPx - 1) / tileHeightPx,
|
||||||
}
|
}
|
||||||
|
|
||||||
defFBO := g.ctx.BeginFrame(viewport)
|
defFBO := g.ctx.BeginFrame(g.drawOps.clear, viewport)
|
||||||
defer g.ctx.EndFrame()
|
defer g.ctx.EndFrame()
|
||||||
|
|
||||||
if g.drawOps.profile && g.timers.t == nil && g.ctx.Caps().Features.Has(driver.FeatureTimers) {
|
if g.drawOps.profile && g.timers.t == nil && g.ctx.Caps().Features.Has(driver.FeatureTimers) {
|
||||||
|
|||||||
+1
-1
@@ -426,7 +426,7 @@ func (g *gpu) Collect(viewport image.Point, frameOps *op.Ops) {
|
|||||||
|
|
||||||
func (g *gpu) Frame() error {
|
func (g *gpu) Frame() error {
|
||||||
viewport := g.renderer.blitter.viewport
|
viewport := g.renderer.blitter.viewport
|
||||||
defFBO := g.ctx.BeginFrame(viewport)
|
defFBO := g.ctx.BeginFrame(g.drawOps.clear, viewport)
|
||||||
defer g.ctx.EndFrame()
|
defer g.ctx.EndFrame()
|
||||||
for _, img := range g.drawOps.imageOps {
|
for _, img := range g.drawOps.imageOps {
|
||||||
expandPathOp(img.path, img.clip)
|
expandPathOp(img.path, img.clip)
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ func newDriver(t *testing.T) driver.Device {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
b.BeginFrame(image.Pt(1, 1))
|
b.BeginFrame(true, image.Pt(1, 1))
|
||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
b.EndFrame()
|
b.EndFrame()
|
||||||
ctx.ReleaseCurrent()
|
ctx.ReleaseCurrent()
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ func newDirect3D11Device(api driver.Direct3D11) (driver.Device, error) {
|
|||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Backend) BeginFrame(viewport image.Point) driver.Framebuffer {
|
func (b *Backend) BeginFrame(clear bool, viewport image.Point) driver.Framebuffer {
|
||||||
renderTarget, depthView := b.ctx.OMGetRenderTargets()
|
renderTarget, depthView := b.ctx.OMGetRenderTargets()
|
||||||
// Assume someone else is holding on to the render targets.
|
// Assume someone else is holding on to the render targets.
|
||||||
if renderTarget != nil {
|
if renderTarget != nil {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
// APIs such as OpenGL, Direct3D useful for rendering Gio
|
// APIs such as OpenGL, Direct3D useful for rendering Gio
|
||||||
// operations.
|
// operations.
|
||||||
type Device interface {
|
type Device interface {
|
||||||
BeginFrame(viewport image.Point) Framebuffer
|
BeginFrame(clear bool, viewport image.Point) Framebuffer
|
||||||
EndFrame()
|
EndFrame()
|
||||||
Caps() Caps
|
Caps() Caps
|
||||||
NewTimer() Timer
|
NewTimer() Timer
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import (
|
|||||||
type Backend struct {
|
type Backend struct {
|
||||||
funcs *gl.Functions
|
funcs *gl.Functions
|
||||||
|
|
||||||
|
clear bool
|
||||||
state glstate
|
state glstate
|
||||||
|
|
||||||
glver [2]int
|
glver [2]int
|
||||||
@@ -171,7 +172,8 @@ func newOpenGLDevice(api driver.OpenGL) (driver.Device, error) {
|
|||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Backend) BeginFrame(viewport image.Point) driver.Framebuffer {
|
func (b *Backend) BeginFrame(clear bool, viewport image.Point) driver.Framebuffer {
|
||||||
|
b.clear = clear
|
||||||
// Assume GL state is reset between frames.
|
// Assume GL state is reset between frames.
|
||||||
b.state = glstate{}
|
b.state = glstate{}
|
||||||
b.defFBO = gl.Framebuffer(b.funcs.GetBinding(gl.FRAMEBUFFER_BINDING))
|
b.defFBO = gl.Framebuffer(b.funcs.GetBinding(gl.FRAMEBUFFER_BINDING))
|
||||||
@@ -198,6 +200,9 @@ func (b *Backend) BeginFrame(viewport image.Point) driver.Framebuffer {
|
|||||||
renderFBO = b.sRGBFBO.Framebuffer()
|
renderFBO = b.sRGBFBO.Framebuffer()
|
||||||
}
|
}
|
||||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, renderFBO)
|
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, renderFBO)
|
||||||
|
if b.sRGBFBO != nil && !clear {
|
||||||
|
b.Clear(0, 0, 0, 0)
|
||||||
|
}
|
||||||
return &gpuFramebuffer{backend: b, obj: renderFBO, foreign: true}
|
return &gpuFramebuffer{backend: b, obj: renderFBO, foreign: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,8 +210,15 @@ func (b *Backend) EndFrame() {
|
|||||||
b.funcs.ActiveTexture(gl.TEXTURE0)
|
b.funcs.ActiveTexture(gl.TEXTURE0)
|
||||||
if b.sRGBFBO != nil {
|
if b.sRGBFBO != nil {
|
||||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
||||||
|
if b.clear {
|
||||||
|
b.SetBlend(false)
|
||||||
|
} else {
|
||||||
|
b.BlendFunc(driver.BlendFactorOne, driver.BlendFactorOneMinusSrcAlpha)
|
||||||
|
b.SetBlend(true)
|
||||||
|
}
|
||||||
b.sRGBFBO.Blit()
|
b.sRGBFBO.Blit()
|
||||||
}
|
}
|
||||||
|
b.SetBlend(false)
|
||||||
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
b.funcs.BindFramebuffer(gl.FRAMEBUFFER, b.defFBO)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user