BLFS学习系列 第25章. 图形环境库 —— libdrm

一、简介

libdrm提供了一个用户空间库,用于在支持ioctl接口的操作系统上访问直接渲染管理器(DRM)。libdrm是一个低级别库,通常由图形驱动(程序)使用,如Mesa DRI驱动(程序)、X驱动(程序)、libva和类似项目。libdrm所处层次如下图所示:

在这里插入图片描述

二、包信息

解压后内容:

$ ls libdrm-2.4.115
amdgpu             CleanSpec.mk      etnaviv              include          libdrm.pc.in      meson.build        radeon            tegra               vc4           xf86drmHash.c  xf86drmRandom.c
android            CONTRIBUTING.rst  exynos               intel            libsync.h         meson_options.txt  README.rst        tests               xf86atomic.h  xf86drmHash.h  xf86drmRandom.h
Android.common.mk  core-symbols.txt  freedreno            libdrm_lists.h   Makefile.sources  nouveau            RELEASING         util_double_list.h  xf86drm.c     xf86drmMode.c  xf86drmSL.c
Android.mk         data              gen_table_fourcc.py  libdrm_macros.h  man               omap               symbols-check.py  util_math.h         xf86drm.h     xf86drmMode.h
$ tree libdrm-2.4.115
libdrm-2.4.115
├── amdgpu
│   ├── amdgpu_asic_id.c
│   ├── amdgpu_bo.c
│   ├── amdgpu_cs.c
│   ├── amdgpu_device.c
│   ├── amdgpu_gpu_info.c
│   ├── amdgpu.h
│   ├── amdgpu_internal.h
│   ├── amdgpu-symbols.txt
│   ├── amdgpu_vamgr.c
│   ├── amdgpu_vm.c
│   ├── Android.mk
│   ├── handle_table.c
│   ├── handle_table.h
│   ├── libdrm_amdgpu.pc.in
│   ├── Makefile.sources
│   └── meson.build
├── android
│   └── gralloc_handle.h
├── Android.common.mk
├── Android.mk
├── CleanSpec.mk
├── CONTRIBUTING.rst
├── core-symbols.txt
├── data
│   ├── amdgpu.ids
│   ├── Android.mk
│   └── meson.build
├── etnaviv
│   ├── Android.mk
│   ├── etnaviv_bo.c
│   ├── etnaviv_bo_cache.c
│   ├── etnaviv_cmd_stream.c
│   ├── etnaviv_device.c
│   ├── etnaviv_drm.h
│   ├── etnaviv_drmif.h
│   ├── etnaviv_gpu.c
│   ├── etnaviv_perfmon.c
│   ├── etnaviv_pipe.c
│   ├── etnaviv_priv.h
│   ├── etnaviv-symbols.txt
│   ├── libdrm_etnaviv.pc.in
│   ├── Makefile.sources
│   └── meson.build
├── exynos
│   ├── exynos_drm.c
│   ├── exynos_drm.h
│   ├── exynos_drmif.h
│   ├── exynos_fimg2d.c
│   ├── exynos_fimg2d.h
│   ├── exynos-symbols.txt
│   ├── fimg2d_reg.h
│   ├── libdrm_exynos.pc.in
│   └── meson.build
├── freedreno
│   ├── Android.mk
│   ├── freedreno_bo.c
│   ├── freedreno_bo_cache.c
│   ├── freedreno_device.c
│   ├── freedreno_drmif.h
│   ├── freedreno_pipe.c
│   ├── freedreno_priv.h
│   ├── freedreno_ringbuffer.c
│   ├── freedreno_ringbuffer.h
│   ├── freedreno-symbols.txt
│   ├── kgsl
│   │   ├── kgsl_bo.c
│   │   ├── kgsl_device.c
│   │   ├── kgsl_drm.h
│   │   ├── kgsl_pipe.c
│   │   ├── kgsl_priv.h
│   │   ├── kgsl_ringbuffer.c
│   │   ├── msm_kgsl.h
│   │   └── README
│   ├── libdrm_freedreno.pc.in
│   ├── Makefile.sources
│   ├── meson.build
│   └── msm
│       ├── msm_bo.c
│       ├── msm_device.c
│       ├── msm_pipe.c
│       ├── msm_priv.h
│       └── msm_ringbuffer.c
├── gen_table_fourcc.py
├── include
│   └── drm
│       ├── amdgpu_drm.h
│       ├── drm_fourcc.h
│       ├── drm.h
│       ├── drm_mode.h
│       ├── drm_sarea.h
│       ├── i915_drm.h
│       ├── mach64_drm.h
│       ├── mga_drm.h
│       ├── msm_drm.h
│       ├── nouveau_drm.h
│       ├── qxl_drm.h
│       ├── r128_drm.h
│       ├── radeon_drm.h
│       ├── README
│       ├── savage_drm.h
│       ├── sis_drm.h
│       ├── tegra_drm.h
│       ├── vc4_drm.h
│       ├── via_drm.h
│       ├── virtgpu_drm.h
│       └── vmwgfx_drm.h
├── intel
│   ├── Android.mk
│   ├── intel_aub.h
│   ├── intel_bufmgr.c
│   ├── intel_bufmgr_fake.c
│   ├── intel_bufmgr_gem.c
│   ├── intel_bufmgr.h
│   ├── intel_bufmgr_priv.h
│   ├── intel_chipset.h
│   ├── intel_debug.h
│   ├── intel_decode.c
│   ├── intel-symbols.txt
│   ├── libdrm_intel.pc.in
│   ├── Makefile.sources
│   ├── meson.build
│   ├── mm.c
│   ├── mm.h
│   ├── test_decode.c
│   ├── tests
│   │   ├── gen4-3d.batch
│   │   ├── gen4-3d.batch-ref.txt
│   │   ├── gen4-3d.batch.sh -> test-batch.sh
│   │   ├── gen5-3d.batch
│   │   ├── gen5-3d.batch-ref.txt
│   │   ├── gen5-3d.batch.sh -> test-batch.sh
│   │   ├── gen6-3d.batch
│   │   ├── gen6-3d.batch-ref.txt
│   │   ├── gen6-3d.batch.sh -> test-batch.sh
│   │   ├── gen7-2d-copy.batch
│   │   ├── gen7-2d-copy.batch-ref.txt
│   │   ├── gen7-2d-copy.batch.sh -> test-batch.sh
│   │   ├── gen7-3d.batch
│   │   ├── gen7-3d.batch-ref.txt
│   │   ├── gen7-3d.batch.sh -> test-batch.sh
│   │   ├── gm45-3d.batch
│   │   ├── gm45-3d.batch-ref.txt
│   │   ├── gm45-3d.batch.sh -> test-batch.sh
│   │   └── test-batch.sh
│   └── uthash.h
├── libdrm_lists.h
├── libdrm_macros.h
├── libdrm.pc.in
├── libsync.h
├── Makefile.sources
├── man
│   ├── drm.7.rst
│   ├── drmAvailable.3.rst
│   ├── drmHandleEvent.3.rst
│   ├── drm-kms.7.rst
│   ├── drm-memory.7.rst
│   ├── drmModeGetResources.3.rst
│   └── meson.build
├── meson.build
├── meson_options.txt
├── nouveau
│   ├── abi16.c
│   ├── Android.mk
│   ├── bufctx.c
│   ├── libdrm_nouveau.pc.in
│   ├── Makefile.sources
│   ├── meson.build
│   ├── nouveau.c
│   ├── nouveau.h
│   ├── nouveau-symbols.txt
│   ├── nvif
│   │   ├── cl0080.h
│   │   ├── cl9097.h
│   │   ├── class.h
│   │   ├── if0002.h
│   │   ├── if0003.h
│   │   ├── ioctl.h
│   │   └── unpack.h
│   ├── private.h
│   └── pushbuf.c
├── omap
│   ├── Android.mk
│   ├── libdrm_omap.pc.in
│   ├── meson.build
│   ├── omap_drm.c
│   ├── omap_drm.h
│   ├── omap_drmif.h
│   └── omap-symbols.txt
├── radeon
│   ├── Android.mk
│   ├── bof.c
│   ├── bof.h
│   ├── libdrm_radeon.pc.in
│   ├── Makefile.sources
│   ├── meson.build
│   ├── r600_pci_ids.h
│   ├── radeon_bo.c
│   ├── radeon_bo_gem.c
│   ├── radeon_bo_gem.h
│   ├── radeon_bo.h
│   ├── radeon_bo_int.h
│   ├── radeon_cs.c
│   ├── radeon_cs_gem.c
│   ├── radeon_cs_gem.h
│   ├── radeon_cs.h
│   ├── radeon_cs_int.h
│   ├── radeon_cs_space.c
│   ├── radeon_surface.c
│   ├── radeon_surface.h
│   └── radeon-symbols.txt
├── README.rst
├── RELEASING
├── symbols-check.py
├── tegra
│   ├── channel.c
│   ├── job.c
│   ├── libdrm_tegra.pc.in
│   ├── meson.build
│   ├── private.h
│   ├── pushbuf.c
│   ├── syncpt.c
│   ├── tegra.c
│   ├── tegra.h
│   └── tegra-symbols.txt
├── tests
│   ├── amdgpu
│   │   ├── amdgpu_stress.c
│   │   ├── amdgpu_test.c
│   │   ├── amdgpu_test.h
│   │   ├── basic_tests.c
│   │   ├── bo_tests.c
│   │   ├── cp_dma_tests.c
│   │   ├── cs_tests.c
│   │   ├── deadlock_tests.c
│   │   ├── decode_messages.h
│   │   ├── frame.h
│   │   ├── hotunplug_tests.c
│   │   ├── jpeg_tests.c
│   │   ├── meson.build
│   │   ├── ras_tests.c
│   │   ├── security_tests.c
│   │   ├── shader_code_gfx10.h
│   │   ├── shader_code_gfx11.h
│   │   ├── shader_code_gfx9.h
│   │   ├── shader_code.h
│   │   ├── shader_code_hang.h
│   │   ├── shader_test_util.c
│   │   ├── syncobj_tests.c
│   │   ├── uvd_enc_tests.c
│   │   ├── uve_ib.h
│   │   ├── vce_ib.h
│   │   ├── vce_tests.c
│   │   ├── vcn_tests.c
│   │   └── vm_tests.c
│   ├── Android.mk
│   ├── drmdevice.c
│   ├── drmsl.c
│   ├── etnaviv
│   │   ├── cmdstream.xml.h
│   │   ├── etnaviv_2d_test.c
│   │   ├── etnaviv_bo_cache_test.c
│   │   ├── etnaviv_cmd_stream_test.c
│   │   ├── meson.build
│   │   ├── state_2d.xml.h
│   │   ├── state.xml.h
│   │   ├── write_bmp.c
│   │   └── write_bmp.h
│   ├── exynos
│   │   ├── exynos_fimg2d_event.c
│   │   ├── exynos_fimg2d_perf.c
│   │   ├── exynos_fimg2d_test.c
│   │   └── meson.build
│   ├── hash.c
│   ├── meson.build
│   ├── modeprint
│   │   ├── meson.build
│   │   └── modeprint.c
│   ├── modetest
│   │   ├── Android.mk
│   │   ├── buffers.c
│   │   ├── buffers.h
│   │   ├── cursor.c
│   │   ├── cursor.h
│   │   ├── Makefile.sources
│   │   ├── meson.build
│   │   └── modetest.c
│   ├── nouveau
│   │   ├── meson.build
│   │   └── threaded.c
│   ├── proptest
│   │   ├── Android.mk
│   │   ├── Makefile.sources
│   │   ├── meson.build
│   │   └── proptest.c
│   ├── radeon
│   │   ├── meson.build
│   │   ├── radeon_ttm.c
│   │   ├── rbo.c
│   │   └── rbo.h
│   ├── tegra
│   │   ├── drm-test.c
│   │   ├── drm-test.h
│   │   ├── drm-test-tegra.c
│   │   ├── drm-test-tegra.h
│   │   ├── gr2d-fill.c
│   │   ├── host1x.h
│   │   ├── meson.build
│   │   ├── openclose.c
│   │   ├── syncpt-timeout.c
│   │   ├── syncpt-wait.c
│   │   ├── vic30.c
│   │   ├── vic30.h
│   │   ├── vic40.c
│   │   ├── vic40.h
│   │   ├── vic41.c
│   │   ├── vic41.h
│   │   ├── vic42.c
│   │   ├── vic42.h
│   │   ├── vic-blit.c
│   │   ├── vic.c
│   │   ├── vic-clear.c
│   │   ├── vic-flip.c
│   │   └── vic.h
│   ├── ttmtest
│   │   ├── AUTHORS
│   │   ├── ChangeLog
│   │   ├── configure.ac
│   │   ├── Makefile.am
│   │   ├── NEWS
│   │   ├── README
│   │   ├── reconf
│   │   └── src
│   │       ├── Makefile.am
│   │       ├── ttmtest.c
│   │       ├── xf86dri.c
│   │       ├── xf86dri.h
│   │       └── xf86dristr.h
│   ├── util
│   │   ├── Android.mk
│   │   ├── common.h
│   │   ├── format.c
│   │   ├── format.h
│   │   ├── kms.c
│   │   ├── kms.h
│   │   ├── Makefile.sources
│   │   ├── meson.build
│   │   ├── pattern.c
│   │   └── pattern.h
│   └── vbltest
│       ├── meson.build
│       └── vbltest.c
├── util_double_list.h
├── util_math.h
├── vc4
│   ├── libdrm_vc4.pc.in
│   ├── Makefile.sources
│   ├── meson.build
│   ├── vc4_packet.h
│   └── vc4_qpu_defines.h
├── xf86atomic.h
├── xf86drm.c
├── xf86drm.h
├── xf86drmHash.c
├── xf86drmHash.h
├── xf86drmMode.c
├── xf86drmMode.h
├── xf86drmRandom.c
├── xf86drmRandom.h
└── xf86drmSL.c

33 directories, 337 files

三、包依赖

  • 推荐

Xorg库(Mesa需要的Intel KMS API支持) 。

  • 可选

Cairo-1.17.6(用于测试)、CMake-3.25.2(可用于在无pkgconfig文件的情况下查找依赖项)、docbook-xml-4.5、docbook-xsl-nons-1.79.2、docutils-0.19、libxslt-1.1.37(用于构建手册页)、libatomic_ops-7.6.14(没有本机原子操作的体系结构所需)、Valgring-3.20.0和CUnit(用于AMDGPU测试)。

四、安装

运行以下命令安装libdrm:

mkdir build &&
cd    build &&

meson setup  --prefix=$XORG_PREFIX \
             --buildtype=release   \
             -Dudev=true           \
             -Dvalgrind=disabled   &&
ninja

执行以下命令检查结果:

ninja test

执行以下命令进行安装:

sudo ninja install

命令(选项)解释

  • -buildtype=release

指定一个适合包的稳定发布的构建类型,因为默认情况下可能会生成未优化的二进制文件。

  • -Dudev=true

此参数使能对于Udev的使用以代替mknod。

  • -Dvalgrind=disabled

此参数禁用使用valgrind支持构建libdrm。这修复了构建使用libdrm的sysprof和其他包的问题。如果需要valgrind的支持,请将此参数更改为“已启用”(或将其删除)。

五、生成内容

  • 安装的程序:
  • 安装的库:libdrm_amdgpu.so, libdrm_intel.so, libdrm_nouveau.so, libdrm_radeon.so, and libdrm.so
  • 安装的目录:/usr/include/libdrm and /usr/share/libdrm

简短说明

libdrm_amdgpu.so

包含特定于AMDGPU的直接渲染管理器函数

libdrm_intel.so

包含特定于Intel的直接渲染管理器函数

libdrm_nouveau.so

包含特定于开源nVidia(Nouveau)的直接渲染管理器函数

libdrm_radeon.so

包含特定于AMD Raedon的直接渲染管理器函数

libdrm.so

包含直接渲染管理器API函数

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/132411521