zu www.bildungsgueter.de zur Inhaltsübersicht des Kapitels

Nutzung und Programmierung der GPU

Erforderliche Bibliotheken


Für die Nutzung der GPU des Raspberry Pi müssen spezielle Bibliotheken verwendet werden, die im Betriebs­system Raspbian im Verzeichnis /opt/vc und den Unter­ver­zeich­nis­sen dieses Verzeichnisses bereit­ge­stellt werden.

Mit der Einführung von Raspbian Stretch wurden einige Bibliotheken umbenannt. Die Um­be­nen­nung geschah, um zu ver­mei­den, dass an Stelle der Bibliotheken für die Nutzung der GPU gleichnamige Bibliotheken aus der Gruppe der Mesa-Treiber in ein Programm ein­ge­bun­den werden, das für die Nutzung der GPU compiliert wird. (Die Mesa-Treiber für Open GL ES und Open VG sind eine ver­hält­nis­mäß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 bereit­ge­hal­tenen Bibliotheken umbenannt; damit ent­fal­len Namens­konflikte, die in Raspbian Jessie auftreten konnten, wenn die Mesa-Bibliotheken installiert waren.

Im Verzeichnis /opt/vc/lib/pkgconfig werden Beschreibungs­dateien bereit­gehalten, die es erlauben, die für die Grafik­bibliotheken 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 zu­sam­men­ge­fasst; die Bibliothek libGLESv1_CM wird nicht mehr bereit­gestellt. 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:

Warnhinweis

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

zur Inhaltsübersicht des Kapitels