Für die Nutzung der GPU des Raspberry Pi müssen spezielle Bibliotheken verwendet werden, die im Betriebssystem Raspbian im Verzeichnis /opt/vc und den Unterverzeichnissen dieses Verzeichnisses bereitgestellt werden.
Mit der Einführung von Raspbian Stretch wurden einige Bibliotheken umbenannt. Die Umbenennung geschah, um zu vermeiden, dass an Stelle der Bibliotheken für die Nutzung der GPU gleichnamige Bibliotheken aus der Gruppe der Mesa-Treiber in ein Programm eingebunden werden, das für die Nutzung der GPU compiliert wird. (Die Mesa-Treiber für Open GL ES und Open VG sind eine verhältnismäßig neue Ergänzung von Raspbian.)
Es werden die folgenden Bibliotheken benötigt:
libEGL.so | für den Zugriff auf die Betriebsmittel der GPU |
libGLESv1_CM.so | für die Verwendung von OpenGL ES 1.1 |
libGLESv2.so | für die Verwendung von OpenGL ES 2.0 |
libOpenVG.so | für die Verwendung von OpenVG |
Im Repository von Raspbian Jessie werden diese Bibliotheken mehrfach vorgehalten. Mit dem Befehl apt-file lassen sich die folgenden Vorkommen feststellen:
Bibliothek | Paket | Speicherort |
libEGL.so | libraspberrypi0 | /opt/vc/lib |
libegl1-mesa-dev | /usr/lib/arm-linux-gnueabihf | |
libGLESv1_CM.so | libraspberrypi0 | /opt/vc/lib |
libgles1-mesa-dev | /usr/lib/arm-linux-gnueabihf | |
libGLESv2.so | libraspberrypi0 | /opt/vc/lib |
libgles2-mesa-dev | /usr/lib/arm-linux-gnueabihf | |
libOpenVG.so | libraspberrypi0 | /opt/vc/lib |
libopenvg1-mesa-dev | /usr/lib/arm-linux-gnueabihf |
Das Paket libraspberrypi0 ist in der Auslieferungsversion von Raspbian Jessie bereits installiert. Die Mesa-Pakete werden zusammen mit bestimmten anderen Paketen möglicherweise automatisch installiert. Dadurch kann es geschehen, dass ein Programm, das mit einer Bibliothek aus dem Paket libraspberrypi0 gebunden werden sollte, tatsächlich mit einer Bibliothek eines anderen Pakets gebunden wird.
Für die Verwendung der GPU werden die Bibliotheken im Verzeichnis /opt/vc/lib benötigt. Die zugehörigen Headerdateien stehen im Verzeichnis /opt/vc/include.
In Projekten, in denen auch Bibliotheken benötigt werden, die in /usr/lib/arm-linux-gnueabihf stehen, ist darauf zu achten, das vorrangig in /opt/vc/lib gesucht wird. Bei der Verwendung von CMake und bei der Verwendung von qmake (für Qt) ist es nicht ganz einfach, die Projektdateien so zu schreiben, dass der erforderliche Vorrang von /opt/vc/lib vor /usr/lib/arm-linux-gnueabihf erreicht wird.
Hinweise zu Raspbian Stretch
In Raspbian Stretch wurden die in /opt/vc/lib bereitgehaltenen Bibliotheken umbenannt; damit entfallen Namenskonflikte, die in Raspbian Jessie auftreten konnten, wenn die Mesa-Bibliotheken installiert waren.
Im Verzeichnis /opt/vc/lib/pkgconfig werden Beschreibungsdateien bereitgehalten, die es erlauben, die für die Grafikbibliotheken erforderlichen Compileroptionen mit dem Hilfsprogramm pkg-config zu ermitteln.
Die Funktionen von OpenGL ES 1.1 und OpenGL ES 2.0 sind nun in der Bibliothek libbrcmGLESv2 zusammengefasst; die Bibliothek libGLESv1_CM wird nicht mehr bereitgestellt. Die Zusammenfassung aller OpenGL-APIs in einer Bibliothek wird auch von den Herstellern anderer GPUs so praktiziert.
Hinweise zu Raspbian Buster
Raspbian Buster ist ein auf Debian aufbauendes Betriebssystem, das auf allen Versionen des Raspberry Pi ablauffähig ist. Das Modell 4 verlangt die Verwendung von Raspbian Buster, da in früheren Versionen von Raspbian die für dieses Modell erforderlichen Gerätetreiber fehlen.
Raspbian Buster stellt zwei verschiedene Softwareumgebungen für die Verwendung der unterschiedlichen GPUs der verschiedenen Modelle des Raspberry Pi bereit:
Bibliotheken, mit denen die GPU angesteuert wird, die in den Modellen A, B, B+, 2, 3 und Zero des Raspberry Pi verbaut ist. Diese Bibliotheken befinden sich im Verzeichnis /opt/vc/lib.
Bibliotheken, mit denen die GPU angesteuert wird, die im Modell 4 verbaut ist. Diese Bibliotheken befinden sich im Verzeichnis /usr/lib/arm-linux-gnueabihf.
Compilierte Programme, die die GPU verwenden, sind zwischen Raspberry Pi Modell 4 und den älteren Modellen des Raspberry nicht austauschbar. Die Übertragung eines solchen Programms vom Raspberry Pi Modell 4 zu einem älteren Modell verlangt auch Änderungen im Makefile. |
|
Das folgende Makefile ist in der Lage, zu erkennen, wie die in /opt/vc/lib bereitgestellten Bibliotheken benannt sind. Das Makefile kann auf allen Versionen des Raspberry verwendet werden, die für die Verwendung von OpenGL ES auf die Bibliotheken in /opt/vc/lib angewiesen sind.
OS_NAME := $(shell lsb_release -sc) OS_RELEASE := $(shell lsb_release -sr) FILE_TO_LOOKUP = /opt/vc/lib/libGLESv1_CM.so ifeq ($(shell test -e $(FILE_TO_LOOKUP) && echo -n yes), yes) GLES_LIBS_TO_USE := -lGLESv1_CM -lEGL else GLES_LIBS_TO_USE := -lbrcmGLESv2 -lbrcmEGL endif #$(info GLES_LIBS_TO_USE is $(GLES_LIBS_TO_USE)) CC = g++ EXTENSION = cpp HEADER_EXT = hpp GUI = gtkmm-3.0 cairomm-1.0 WARNINGS = -Wall COMPILEOPTS = -std=c++11 -O2 GLES_HEADER = -I/opt/vc/include/ AUX_CFLAGS = -DUSE_VCHIQ_ARM \ $(GLES_HEADER) \ $(GLES_HEADER)interface/vmcs_host/linux \ $(GLES_HEADER)interface/vcos/pthreads AUX_LIBS = -lbcm_host -lvchostif -lbcm_host -lvcos -lvchiq_arm -pthread CFLAGS = $(WARNINGS) $(COMPILEOPTS) `pkg-config $(GUI) --cflags ` $(AUX_CFLAGS) LDFLAGS = `pkg-config $(GUI) --libs` GLES_PATH = -L/opt/vc/lib/ GLES_LIBS = $(GLES_LIBS_TO_USE) $(AUX_LIBS) NAME = demo CONFDIR = conf SRCDIR = src INCDIR = inc OBJDIR = obj RESDIR = res INCPATH = -I$(CONFDIR) -I$(INCDIR) -I$(RESDIR) SYSINCL = -isystem SOURCES := $(shell find $(SRCDIR) -name '*.$(EXTENSION)') OBJ := $(SOURCES:$(SRCDIR)/%.$(EXTENSION)=$(OBJDIR)/%.o) compile: $(NAME) -include $(OBJDIR)/*.d $(NAME): $(OBJ) $(CC) $(OBJ) -o $(NAME) $(GLES_PATH) $(LDFLAGS) $(GLES_LIBS) $(OBJDIR)/%.o: $(SRCDIR)/%.$(EXTENSION) mkdir -p $(OBJDIR) $(CC) $(INCPATH) $(CFLAGS) -c $< -o $@ $(CC) -MM $(INCPATH) $(GLES_HEADER) -MT '$(OBJDIR)/$(basename $(notdir $<)).o' -c $< > $(OBJDIR)/$(basename $(notdir $<)).d clean: rm -f $(OBJDIR)/*.o $(OBJDIR)/*.d $(NAME) .PHONY: compile clean