this post was submitted on 16 Jun 2024
5 points (100.0% liked)

linux4noobs

973 readers
24 users here now

linux4noobs


Noob Friendly, Expert Enabling

Whether you're a seasoned pro or the noobiest of noobs, you've found the right place for Linux support and information. With a dedication to supporting free and open source software, this community aims to ensure Linux fits your needs and works for you. From troubleshooting to tutorials, practical tips, news and more, all aspects of Linux are warmly welcomed. Join a community of like-minded enthusiasts and professionals driving Linux's ongoing evolution.


Seeking Support?

Community Rules

founded 1 year ago
MODERATORS
 

Display of OpenGL context works fine on Windows, no issues with resizing. Function glViewport works as intended.

It only has issues with X11 on Linux (no plans yet to implement Wayland due to lack of free time). Resizing breaks everything, and it doesn't really work the way you expect (point of triangle moves down if you make it taller, etc). I cannot find anything on if I should call anything else besides glViewport, only that "you should use [insert already existing library], which will take care of this behavior". Others are suggesting me that it's an issue with my distro, but I cannot find any OpenGL testcase that is small enough to test on my VM or my Raspberry Pi to actually test whether that's the case.

top 5 comments
sorted by: hot top controversial new old
[–] [email protected] 3 points 3 months ago (1 children)

On a past OpenGL project where I supported resizing, I used GLFW and responded to its framebuffer size callback by calling glViewport and resetting the projection matrix (in my case with glLoadIdentity followed by glOrtho -- it's not fresh in my memory any more, but I don't think that project used shaders at all). I also called glClear with GL_COLOR_BUFFER_BIT as part of my regular redraw. That worked fine for my needs.

It looks like what GLFW was doing under the hood to trigger that callback was looking for an XEvent from X11 (via XNextEvent in a loop with a condition based on the result of calling XQLength) with type set to ConfigureNotify and which had an xconfigure entry with a width or height that differed from what was tracked directly by GLFW on its own window structure. When it saw an event like that, it would call the callback. After processing the event queue, GLFW called XFlush on the display.

See x11_window.c in GLFW's source code for more detail: https://github.com/glfw/glfw/blob/master/src/x11_window.c

Direct link to raw code, if you prefer: https://raw.githubusercontent.com/glfw/glfw/master/src/x11_window.c

Hopefully comparing with what GLFW did can help you debug your own implementation. Good luck!

[–] [email protected] 3 points 3 months ago (1 children)

It seems like the issue was setting the ResizeRedirectFlag in the event configuration, since the whole documentation on event configurations were scarce.

[–] [email protected] 1 points 3 months ago

ResizeRedirectFlag

Did you mean ResizeRedirectMask?

Xlib docs for that say:

Similarly, a single client can select for ResizeRedirectMask on a parent window. Then, any attempt to resize the window by another client is suppressed, and the client receives a ResizeRequest event.

which definitely sounds like it could cause misbehavior.

Glad to hear you've made progress, and good luck on the rest of your project!

[–] [email protected] 0 points 3 months ago (1 children)
[–] [email protected] 1 points 3 months ago

Full repository: https://github.com/ZILtoid1991/iota

Testcase for OpenGL: https://github.com/ZILtoid1991/iota/blob/main/gltest/app.d

Code that creates the window: https://github.com/ZILtoid1991/iota/blob/main/source/iota/window/oswindow.d

Note that I also get an X connection to :0.0 broken (explicit kill or server shutdown). error message every time I close one of my x11 testcases, and I find nothing about this error message (besides the usual "use preexiting library" suggestion).