mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-14 23:17:27 +01:00
internal/graphicsdriver/opengl: bug fix: use GLX when possible for ES
Use GLX when possible. EGL with an X window might not work well on Wayland unfortunately. Closes #3152
This commit is contained in:
parent
7b5054ca3a
commit
4be626f707
@ -17,11 +17,56 @@
|
|||||||
package opengl
|
package opengl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/glfw"
|
"github.com/hajimehoshi/ebiten/v2/internal/glfw"
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver"
|
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver"
|
||||||
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl/gl"
|
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl/gl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func isGLXExtensionForGL2Available() bool {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
cmd := exec.Command("glxinfo")
|
||||||
|
cmd.Stdout = &buf
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
indent = " "
|
||||||
|
ext = "GLX_EXT_create_context_es2_profile"
|
||||||
|
)
|
||||||
|
|
||||||
|
var listingExtensions bool
|
||||||
|
s := bufio.NewScanner(&buf)
|
||||||
|
for s.Scan() {
|
||||||
|
if !listingExtensions {
|
||||||
|
if s.Text() == "GLX extensions:" {
|
||||||
|
listingExtensions = true
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(s.Text(), indent) {
|
||||||
|
listingExtensions = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
line := s.Text()
|
||||||
|
for len(line) > 0 {
|
||||||
|
head, tail, _ := strings.Cut(line, ",")
|
||||||
|
if strings.TrimSpace(head) == ext {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
line = tail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
type graphicsPlatform struct {
|
type graphicsPlatform struct {
|
||||||
window *glfw.Window
|
window *glfw.Window
|
||||||
}
|
}
|
||||||
@ -52,9 +97,13 @@ func setGLFWClientAPI(isES bool) error {
|
|||||||
if err := glfw.WindowHint(glfw.ContextVersionMinor, 0); err != nil {
|
if err := glfw.WindowHint(glfw.ContextVersionMinor, 0); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
// Use GLX if the extension allows, or use EGL otherwise.
|
||||||
|
// Prefer GLX since EGL might not work well on Wayland (#3152).
|
||||||
|
if !isGLXExtensionForGL2Available() {
|
||||||
if err := glfw.WindowHint(glfw.ContextCreationAPI, glfw.EGLContextAPI); err != nil {
|
if err := glfw.WindowHint(glfw.ContextCreationAPI, glfw.EGLContextAPI); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user