f31522130f
Build system (5 gaps hardened): - COOKBOOK_OFFLINE defaults to true (fork-mode) - normalize_patch handles diff -ruN format - New 'repo validate-patches' command (25/25 relibc patches) - 14 patched Qt/Wayland/display recipes added to protected list - relibc archive regenerated with current patch chain Boot fixes (fixable): - Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset) - D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped) - redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped) - daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch) - udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async) - relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs - greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait) - greeter-ui: built and linked (header guard unification, sem_compat stubs removed) - mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps - greeter config: removed stale keymapd dependency from display/greeter services - prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified Unfixable (diagnosed, upstream): - i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort - kded6/greeter-ui: page fault 0x8 — Qt library null deref - Thread panics fd != -1 — Rust std library on Redox - DHCP timeout / eth0 MAC — QEMU user-mode networking - hwrngd/thermald — no hardware RNG/thermal in VM - live preload allocation — BIOS memory fragmentation, continues on demand
148 lines
5.7 KiB
Plaintext
148 lines
5.7 KiB
Plaintext
Overview
|
|
========
|
|
|
|
This is the glgen application used to generate OpenGL related classes from the
|
|
official Khronos OpenGL specification and typemap files.
|
|
|
|
To run this application download the gl.spec and gl.tm files from:
|
|
|
|
http://www.opengl.org/registry/api/gl.spec
|
|
http://www.opengl.org/registry/api/gl.tm
|
|
|
|
and place them into the application directory. These files are not stored in
|
|
the Qt Project's git repo or downloaded automatically to
|
|
|
|
a) avoid copyright issues
|
|
b) make sure the version of OpenGL used is controlled by a human
|
|
|
|
The glgen application parses these files and generates:
|
|
|
|
1) A set of public classes, one for each combination of OpenGL version and profile.
|
|
2) A set of backend helper classes that contain the actual function pointers
|
|
3) A factory class for the classes in 1)
|
|
4) A set of classes, one for each OpenGL extension which introduces new entry points
|
|
|
|
We will now describe each of these categories.
|
|
|
|
|
|
OpenGL Version and Profile Classes
|
|
==================================
|
|
|
|
The base class of this set is QAbstractOpenGLFunctions. From this we inherit one class
|
|
for each OpenGL version and if supported, profile.
|
|
|
|
The Core profile contains only the non-deprecated functionality. The Compatibility profile
|
|
also includes all functionality that was removed in OpenGL 3.1. Therefore, for OpenGL
|
|
3.2 onwards we have two classes for each version.
|
|
|
|
All of these classes are named with the following convention:
|
|
|
|
QOpenGLFunctions_<MAJOR>_<MINOR>[_PROFILE]
|
|
|
|
For example QOpenGLFunctions_2_1, QOpenGLFunctions_4_3_Core
|
|
|
|
The source and header files for these classes take the form
|
|
|
|
qopenglfunction_<MAJOR>_<MINOR>[_PROFILE].cpp
|
|
qopenglfunction_<MAJOR>_<MINOR>[_PROFILE].h
|
|
|
|
and should be moved to
|
|
|
|
$QTBASE/src/gui/opengl/
|
|
|
|
and forms part of the public QtGui library API.
|
|
|
|
|
|
Backend Helper Classes
|
|
======================
|
|
|
|
Every OpenGL function is categorised by which version it was introduced with and
|
|
whether it is part of the Core Profile and is deemed part of the core specification
|
|
or whther it is only part of the Compatibility profile and has been marked as
|
|
deprecated.
|
|
|
|
Glgen creates a backend helper class containing function pointers to match each
|
|
possible case. E.g. QOpenGLFunctions_1_5_CoreBackend contains functions introduced
|
|
in OpenGL 1.5 which are still core (not deprecated).
|
|
|
|
The public frontend classes described above contain pointers to the set of backend
|
|
objects necessary to implement the functions for their version and profile.
|
|
|
|
Creating new instances of these backend objects for each public version functions
|
|
object would be wasteful in terms of memory (repeated function pointers) and CPU
|
|
time (no need to keep re-solving the same functions).
|
|
|
|
We cannot share the backend objects globally as OpenGL entry point addresses are
|
|
specific to the OpenGL context. They cannot even be reliably shared between a
|
|
context group. This is not surprising if you consider the case of contexts in a share
|
|
group where the contexts have different versions or even profiles. We therefore share
|
|
the backend instances at the QOpenGLContext level using a simple reference counting
|
|
scheme.
|
|
|
|
When the frontend version functions objects are intialized they check to see if
|
|
the associated context already has suitable backend objects available. If so they use
|
|
them, otherwise they will create backend objects and associate them with the context.
|
|
|
|
The backend classes are in
|
|
|
|
qopenglversionfunctions.h
|
|
qopenglversionfunctions.cpp
|
|
|
|
and should also be moved to
|
|
|
|
$QTBASE/src/gui/opengl/
|
|
|
|
|
|
OpenGL Version and Profile Factory
|
|
==================================
|
|
|
|
Instances of the OpenGL version and profile classes described above can be obtained
|
|
from QOpenGLContext by means of the versionFunctions() member. The OpenGLContext
|
|
retains ownership of the QOpenGLFunctions_* object. If a suitable object does not
|
|
already exist it is created by the factory class generated by glgen.
|
|
|
|
It is possible to request version functions objects for any version/profile
|
|
combination from a context. However not all requests can be serviced. For example
|
|
consider the case of an OpenGL 3.3 Core profile context. In this case:
|
|
|
|
* Requesting a 3.3 core profile functions object would succeed.
|
|
* Requesting a 3.3 compatibility profile functions object would fail. We would fail
|
|
to resolve the deprecated functions.
|
|
* Requesting a 4.3 core profile functions object would fail. We would fail to resolve
|
|
the new core functions introduced in versions 4.0-4.3.
|
|
* Requesting a 3.1 functions object would succeed. There is nothing in 3.1 that is not
|
|
also in 3.3 core.
|
|
|
|
If a request is not able to be serviced the factory, and hence QOpenGLContext::versionFunctions()
|
|
will return a null pointer that can be checked for.
|
|
|
|
The source and header file for this class should be moved to
|
|
|
|
$QTBASE/src/gui/opengl/
|
|
|
|
and forms part of the QtGui library.
|
|
|
|
If a user instantiates a version functions object directly (i.e. not via QOpenGLContext)
|
|
then it bypasses the above checks. However, the same checks are applied in the
|
|
initializeOpenGLFunctions() method and the result can once again be checked.
|
|
|
|
This approach allows maximum flexibility but ensure's safety in that once the user
|
|
posesses a functions object that has been successfully initialized they can rely upon its
|
|
member functions being successfully resolved.
|
|
|
|
|
|
OpenGL Extension Classes
|
|
========================
|
|
|
|
In addition, glgen also creates one class for each OpenGL extension that introduces
|
|
new entry points. These classes are named with the convention
|
|
|
|
QOpenGLExtension_<name-of-extension>
|
|
|
|
The usage pattern for OpenGL extensions is to just use a small
|
|
number of extensions out of the large number of those available.
|
|
|
|
Prior to Qt 6, these classes were provided as the openglextensions
|
|
module. Because of the new graphics architecture in Qt 6, that module
|
|
has been removed.
|