mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 18:35:34 +00:00
app/headless: prepare OpenGL context on macOS
The macOS backend uses a desktop OpenGL context, not a OpenGL ES context. The main difference is that sRGB have to be enabled and a vertex buffer must be bound. Do that and fix Window.Screenshot for scenes more complex than a glClear. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -13,8 +13,9 @@ import "gioui.org/app/internal/gl"
|
|||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
type nsContext struct {
|
type nsContext struct {
|
||||||
c *gl.Functions
|
c *gl.Functions
|
||||||
ctx C.CFTypeRef
|
ctx C.CFTypeRef
|
||||||
|
prepared bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newContext() (context, error) {
|
func newContext() (context, error) {
|
||||||
@@ -24,6 +25,10 @@ func newContext() (context, error) {
|
|||||||
|
|
||||||
func (c *nsContext) MakeCurrent() error {
|
func (c *nsContext) MakeCurrent() error {
|
||||||
C.gio_headless_makeCurrentContext(c.ctx)
|
C.gio_headless_makeCurrentContext(c.ctx)
|
||||||
|
if !c.prepared {
|
||||||
|
C.gio_headless_prepareContext(c.ctx)
|
||||||
|
c.prepared = true
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ __attribute__ ((visibility ("hidden"))) CFTypeRef gio_headless_newContext(void);
|
|||||||
__attribute__ ((visibility ("hidden"))) void gio_headless_releaseContext(CFTypeRef ctxRef);
|
__attribute__ ((visibility ("hidden"))) void gio_headless_releaseContext(CFTypeRef ctxRef);
|
||||||
__attribute__ ((visibility ("hidden"))) void gio_headless_clearCurrentContext(CFTypeRef ctxRef);
|
__attribute__ ((visibility ("hidden"))) void gio_headless_clearCurrentContext(CFTypeRef ctxRef);
|
||||||
__attribute__ ((visibility ("hidden"))) void gio_headless_makeCurrentContext(CFTypeRef ctxRef);
|
__attribute__ ((visibility ("hidden"))) void gio_headless_makeCurrentContext(CFTypeRef ctxRef);
|
||||||
|
__attribute__ ((visibility ("hidden"))) void gio_headless_prepareContext(CFTypeRef ctxRef);
|
||||||
|
|||||||
@@ -27,3 +27,6 @@ void gio_headless_makeCurrentContext(CFTypeRef ctxRef) {
|
|||||||
EAGLContext *ctx = (__bridge EAGLContext *)ctxRef;
|
EAGLContext *ctx = (__bridge EAGLContext *)ctxRef;
|
||||||
[EAGLContext setCurrentContext:ctx];
|
[EAGLContext setCurrentContext:ctx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gio_headless_prepareContext(CFTypeRef ctxRef) {
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
@import AppKit;
|
@import AppKit;
|
||||||
@import OpenGL;
|
@import OpenGL;
|
||||||
@import OpenGL.GL;
|
@import OpenGL.GL;
|
||||||
|
@import OpenGL.GL3;
|
||||||
|
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include "headless_darwin.h"
|
#include "headless_darwin.h"
|
||||||
@@ -40,6 +41,13 @@ void gio_headless_clearCurrentContext(CFTypeRef ctxRef) {
|
|||||||
void gio_headless_makeCurrentContext(CFTypeRef ctxRef) {
|
void gio_headless_makeCurrentContext(CFTypeRef ctxRef) {
|
||||||
NSOpenGLContext *ctx = (__bridge NSOpenGLContext *)ctxRef;
|
NSOpenGLContext *ctx = (__bridge NSOpenGLContext *)ctxRef;
|
||||||
[ctx makeCurrentContext];
|
[ctx makeCurrentContext];
|
||||||
glEnable(GL_FRAMEBUFFER_SRGB);
|
|
||||||
CGLLockContext([ctx CGLContextObj]);
|
CGLLockContext([ctx CGLContextObj]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gio_headless_prepareContext(CFTypeRef ctxRef) {
|
||||||
|
// Bind a default VBA to emulate OpenGL ES 2.
|
||||||
|
GLuint defVBA;
|
||||||
|
glGenVertexArrays(1, &defVBA);
|
||||||
|
glBindVertexArray(defVBA);
|
||||||
|
glEnable(GL_FRAMEBUFFER_SRGB);
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ func TestHeadless(t *testing.T) {
|
|||||||
col := color.RGBA{A: 0xff, R: 0xcc, G: 0xcc}
|
col := color.RGBA{A: 0xff, R: 0xcc, G: 0xcc}
|
||||||
var ops op.Ops
|
var ops op.Ops
|
||||||
paint.ColorOp{Color: col}.Add(&ops)
|
paint.ColorOp{Color: col}.Add(&ops)
|
||||||
|
// Paint only part of the screen to avoid the glClear optimization.
|
||||||
paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{
|
paint.PaintOp{Rect: f32.Rectangle{Max: f32.Point{
|
||||||
X: float32(sz.X),
|
X: float32(sz.X) - 100,
|
||||||
Y: float32(sz.Y),
|
Y: float32(sz.Y) - 100,
|
||||||
}}}.Add(&ops)
|
}}}.Add(&ops)
|
||||||
w.Frame(&ops)
|
w.Frame(&ops)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user