glx: directly link to gallium

this eliminates the loader interface, which avoids an entire class
of issues and simplifies a bunch of code

Acked-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29771>
This commit is contained in:
Mike Blumenkrantz
2024-06-18 13:14:10 -04:00
committed by Marge Bot
parent 67b778445a
commit 50fc7cc290
24 changed files with 229 additions and 48 deletions

View File

@@ -94,7 +94,7 @@ fi
# Fix prefix confusion: the build installs to $CI_PROJECT_DIR, but we expect
# it in /install
ln -sf $CI_PROJECT_DIR/install /install
export LD_LIBRARY_PATH=/install/lib
export LD_LIBRARY_PATH=/install/lib:/install/lib/dri
export LIBGL_DRIVERS_PATH=/install/lib/dri
# https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22495#note_1876691
@@ -113,7 +113,7 @@ export PYTHONPATH=$(python3 -c "import sys;print(\":\".join(sys.path))")
if [ -n "$MESA_LOADER_DRIVER_OVERRIDE" ]; then
rm /install/lib/dri/!($MESA_LOADER_DRIVER_OVERRIDE)_dri.so
fi
ls -1 /install/lib/dri/*_dri.so || true
ls -1 /install/lib/dri/*.so || true
if [ "$HWCI_FREQ_MAX" = "true" ]; then
# Ensure initialization of the DRM device (needed by MSM)

View File

@@ -7,7 +7,7 @@ _FLAG_FILE="/xorg-started"
echo "touch ${_FLAG_FILE}; sleep 100000" > "${_XORG_SCRIPT}"
if [ "x$1" != "x" ]; then
export LD_LIBRARY_PATH="${1}/lib"
export LD_LIBRARY_PATH="${1}/lib:${1}/lib/dri"
export LIBGL_DRIVERS_PATH="${1}/lib/dri"
fi
xinit /bin/sh "${_XORG_SCRIPT}" -- /usr/bin/Xorg vt45 -noreset -s 0 -dpms -logfile /Xorg.0.log &

View File

@@ -6,7 +6,7 @@ set -xe
export HOME=/cuttlefish
export PATH=$PATH:/cuttlefish/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CI_PROJECT_DIR}/install/lib/:/cuttlefish/lib64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CI_PROJECT_DIR}/install/lib/:${CI_PROJECT_DIR}/install/lib/dri:/cuttlefish/lib64
export EGL_PLATFORM=surfaceless
syslogd

View File

@@ -16,7 +16,7 @@ fi
INSTALL=$(realpath -s "$PWD"/install)
# Set up the driver environment.
export LD_LIBRARY_PATH="$INSTALL"/lib/:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH="$INSTALL"/lib/:"$INSTALL"/lib/dri:$LD_LIBRARY_PATH
export EGL_PLATFORM=surfaceless
ARCH=$(uname -m)
export VK_DRIVER_FILES="$PWD"/install/share/vulkan/icd.d/"$VK_DRIVER"_icd."$ARCH".json

View File

@@ -10,7 +10,7 @@ fi
INSTALL=$PWD/install
# Set up the driver environment.
export LD_LIBRARY_PATH="$INSTALL/lib/"
export LD_LIBRARY_PATH="$INSTALL/lib/:$INSTALL/lib/dri"
export VK_DRIVER_FILES="$INSTALL/share/vulkan/icd.d/${VK_DRIVER}_icd.x86_64.json"
# To store Fossilize logs on failure.

View File

@@ -6,7 +6,7 @@ set -ex
INSTALL=$PWD/install
# Set up the driver environment.
export LD_LIBRARY_PATH=$INSTALL/lib/
export LD_LIBRARY_PATH=$INSTALL/lib/:$INSTALL/lib/dri
RESULTS="$PWD/${GTEST_RESULTS_DIR:-results}"
mkdir -p "$RESULTS"

View File

@@ -11,7 +11,7 @@ fi
INSTALL="$PWD/install"
# Set up the driver environment.
export LD_LIBRARY_PATH="$INSTALL/lib/"
export LD_LIBRARY_PATH="$INSTALL/lib/:$INSTALL/lib/dri"
export EGL_PLATFORM=surfaceless
ARCH=$(uname -m)
export VK_DRIVER_FILES="$INSTALL/share/vulkan/icd.d/${VK_DRIVER}_icd.$ARCH.json"

View File

@@ -47,7 +47,7 @@ export WINEDLLOVERRIDES="mscoree=d;mshtml=d" # FIXME: drop, not needed anymore?
# Modifiying here directly LD_LIBRARY_PATH may cause problems when
# using a command wrapper. Hence, we will just set it when running the
# command.
export __LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/"
export __LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/:$INSTALL/lib/dri"
if [ -n "${VK_DRIVER}" ]; then
# Set environment for DXVK.
export DXVK_LOG_LEVEL="info"

View File

@@ -6,7 +6,7 @@ mkdir -p "$ARTIFACTSDIR"
export DRM_SHIM_DEBUG=true
LIBDIR=$(pwd)/install/lib
export LD_LIBRARY_PATH=$LIBDIR
export LD_LIBRARY_PATH=$LIBDIR:$LIBDIR/dri
cd /usr/local/shader-db

View File

@@ -17,7 +17,7 @@ mkdir -p "$RESULTS"
# Modifiying here directly LD_LIBRARY_PATH may cause problems when
# using a command wrapper. Hence, we will just set it when running the
# command.
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/:/vkd3d-proton-tests/x64/"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$INSTALL/lib/:$INSTALL/lib/dri/vkd3d-proton-tests/x64/"
# Set the Vulkan driver to use.

View File

@@ -1,6 +1,7 @@
{
global:
__driDriverGetExtensions*;
dri_loader_get_extensions;
@nouveau_drm_screen_create@
@radeon_drm_winsys_create@
@amdgpu_winsys_create@

View File

@@ -158,3 +158,196 @@ PUBLIC const __DRIextension **__driDriverGetExtensions_zink(void)
#if defined(GALLIUM_D3D12)
DEFINE_LOADER_DRM_ENTRYPOINT(d3d12);
#endif
const __DRIextension **
dri_loader_get_extensions(const char *driver_name);
PUBLIC const __DRIextension **
dri_loader_get_extensions(const char *driver_name)
{
#if defined(HAVE_I915)
if (!strcmp(driver_name, "i915"))
return __driDriverGetExtensions_i915();
#endif
#if defined(HAVE_IRIS)
if (!strcmp(driver_name, "iris"))
return __driDriverGetExtensions_iris();
#endif
#if defined(HAVE_CROCUS)
if (!strcmp(driver_name, "crocus"))
return __driDriverGetExtensions_crocus();
#endif
#if defined(HAVE_NOUVEAU)
if (!strcmp(driver_name, "nouveau"))
return __driDriverGetExtensions_nouveau();
#endif
#if defined(HAVE_R300)
if (!strcmp(driver_name, "r300"))
return __driDriverGetExtensions_r300();
#endif
#if defined(HAVE_R600)
if (!strcmp(driver_name, "r600"))
return __driDriverGetExtensions_r600();
#endif
#if defined(HAVE_RADEONSI)
if (!strcmp(driver_name, "radeonsi"))
return __driDriverGetExtensions_radeonsi();
#endif
#if defined(HAVE_VMWGFX)
if (!strcmp(driver_name, "vmwgfx"))
return __driDriverGetExtensions_vmwgfx();
#endif
#if defined(HAVE_FREEDRENO)
if (!strcmp(driver_name, "msm"))
return __driDriverGetExtensions_msm();
if (!strcmp(driver_name, "kgsl"))
return __driDriverGetExtensions_kgsl();
#endif
#if defined(HAVE_VIRGL) || (defined(HAVE_FREEDRENO) && !defined(PIPE_LOADER_DYNAMIC))
if (!strcmp(driver_name, "virtio_gpu"))
return __driDriverGetExtensions_virtio_gpu();
#endif
#if defined(HAVE_V3D)
if (!strcmp(driver_name, "v3d"))
return __driDriverGetExtensions_v3d();
#endif
#if defined(HAVE_VC4)
if (!strcmp(driver_name, "vc4"))
return __driDriverGetExtensions_vc4();
#endif
#if defined(HAVE_PANFROST)
if (!strcmp(driver_name, "panfrost"))
return __driDriverGetExtensions_panfrost();
if (!strcmp(driver_name, "panthor"))
return __driDriverGetExtensions_panthor();
#endif
#if defined(HAVE_ASAHI)
if (!strcmp(driver_name, "asahi"))
return __driDriverGetExtensions_asahi();
#endif
#if defined(HAVE_ETNAVIV)
if (!strcmp(driver_name, "etnaviv"))
return __driDriverGetExtensions_etnaviv();
#endif
#if defined(HAVE_TEGRA)
if (!strcmp(driver_name, "tegra"))
return __driDriverGetExtensions_tegra();
#endif
#if defined(HAVE_KMSRO)
if (!strcmp(driver_name, "armada_drm"))
return __driDriverGetExtensions_armada_drm();
if (!strcmp(driver_name, "exynos"))
return __driDriverGetExtensions_exynos();
if (!strcmp(driver_name, "gm12u320"))
return __driDriverGetExtensions_gm12u320();
if (!strcmp(driver_name, "hdlcd"))
return __driDriverGetExtensions_hdlcd();
if (!strcmp(driver_name, "hx8357d"))
return __driDriverGetExtensions_hx8357d();
if (!strcmp(driver_name, "ili9163"))
return __driDriverGetExtensions_ili9163();
if (!strcmp(driver_name, "ili9225"))
return __driDriverGetExtensions_ili9225();
if (!strcmp(driver_name, "ili9341"))
return __driDriverGetExtensions_ili9341();
if (!strcmp(driver_name, "ili9486"))
return __driDriverGetExtensions_ili9486();
if (!strcmp(driver_name, "imx_drm"))
return __driDriverGetExtensions_imx_drm();
if (!strcmp(driver_name, "imx_dcss"))
return __driDriverGetExtensions_imx_dcss();
if (!strcmp(driver_name, "imx_lcdif"))
return __driDriverGetExtensions_imx_lcdif();
if (!strcmp(driver_name, "ingenic_drm"))
return __driDriverGetExtensions_ingenic_drm();
if (!strcmp(driver_name, "kirin"))
return __driDriverGetExtensions_kirin();
if (!strcmp(driver_name, "komeda"))
return __driDriverGetExtensions_komeda();
if (!strcmp(driver_name, "mali_dp"))
return __driDriverGetExtensions_mali_dp();
if (!strcmp(driver_name, "mcde"))
return __driDriverGetExtensions_mcde();
if (!strcmp(driver_name, "mediatek"))
return __driDriverGetExtensions_mediatek();
if (!strcmp(driver_name, "meson"))
return __driDriverGetExtensions_meson();
if (!strcmp(driver_name, "mi0283qt"))
return __driDriverGetExtensions_mi0283qt();
if (!strcmp(driver_name, "mxsfb_drm"))
return __driDriverGetExtensions_mxsfb_drm();
if (!strcmp(driver_name, "panel_mipi_dbi"))
return __driDriverGetExtensions_panel_mipi_dbi();
if (!strcmp(driver_name, "pl111"))
return __driDriverGetExtensions_pl111();
if (!strcmp(driver_name, "rcar_du"))
return __driDriverGetExtensions_rcar_du();
if (!strcmp(driver_name, "repaper"))
return __driDriverGetExtensions_repaper();
if (!strcmp(driver_name, "rockchip"))
return __driDriverGetExtensions_rockchip();
if (!strcmp(driver_name, "rzg2l_du"))
return __driDriverGetExtensions_rzg2l_du();
if (!strcmp(driver_name, "ssd130x"))
return __driDriverGetExtensions_ssd130x();
if (!strcmp(driver_name, "st7586"))
return __driDriverGetExtensions_st7586();
if (!strcmp(driver_name, "st7735r"))
return __driDriverGetExtensions_st7735r();
if (!strcmp(driver_name, "sti"))
return __driDriverGetExtensions_sti();
if (!strcmp(driver_name, "stm"))
return __driDriverGetExtensions_stm();
if (!strcmp(driver_name, "sun4i_drm"))
return __driDriverGetExtensions_sun4i_drm();
if (!strcmp(driver_name, "udl"))
return __driDriverGetExtensions_udl();
if (!strcmp(driver_name, "vkms"))
return __driDriverGetExtensions_vkms();
if (!strcmp(driver_name, "zynqmp_dpsub"))
return __driDriverGetExtensions_zynqmp_dpsub();
#endif
#if defined(HAVE_LIMA)
if (!strcmp(driver_name, "lima"))
return __driDriverGetExtensions_lima();
#endif
#if defined(HAVE_ZINK)
if (!strcmp(driver_name, "zink"))
return __driDriverGetExtensions_zink();
#endif
#if defined(HAVE_D3D12)
if (!strcmp(driver_name, "d3d12"))
return __driDriverGetExtensions_d3d12();
#endif
#if defined(HAVE_SWRAST)
if (!strcmp(driver_name, "swrast"))
return __driDriverGetExtensions_swrast();
#if defined(HAVE_LIBDRM)
if (!strcmp(driver_name, "kms_swrast"))
return __driDriverGetExtensions_kms_swrast();
#endif
#endif
return NULL;
}

View File

@@ -34,7 +34,7 @@ libgallium_dri = shared_library(
link_depends : gallium_dri_link_depends,
link_with : [
libdri, libmesa, libgalliumvl,
libgallium, libglapi, libloader, libpipe_loader_static, libws_null, libwsw, libswdri,
libgallium, libglapi, libpipe_loader_static, libws_null, libwsw, libswdri,
libswkmsdri,
],
dependencies : [
@@ -45,7 +45,6 @@ libgallium_dri = shared_library(
driver_panfrost, driver_iris, driver_lima, driver_zink, driver_d3d12,
driver_asahi, driver_crocus
],
# Will be deleted during installation, see install_megadrivers.py
install : true,
install_dir : dri_drivers_path,
name_suffix : 'so',

View File

@@ -130,8 +130,6 @@ endforeach
# This only works on Unix-like oses, which is probably fine for dri
prog_ln = find_program('ln', required : false)
if prog_ln.found()
devenv.set('LIBGL_DRIVERS_PATH', meson.current_build_dir())
foreach d : dril_drivers
custom_target(
'devenv_@0@'.format(d),

View File

@@ -1058,7 +1058,7 @@ dri2CreateScreen(int screen, struct glx_display * priv, bool driver_name_is_infe
}
psc->driverName = driverName;
extensions = driOpenDriver(driverName, &psc->driver, driver_name_is_inferred);
extensions = driOpenDriver(driverName, driver_name_is_inferred);
if (extensions == NULL)
goto handle_error;
@@ -1178,8 +1178,6 @@ handle_error:
psc->driScreen = NULL;
if (psc->fd >= 0)
close(psc->fd);
if (psc->driver)
dlclose(psc->driver);
free(deviceName);
glx_screen_cleanup(&psc->base);

View File

@@ -56,7 +56,6 @@ struct dri2_screen {
const __DRI2interopExtension *interop;
const __DRIconfig **driver_configs;
void *driver;
char *driverName;
int fd;

View File

@@ -842,7 +842,7 @@ dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_in
goto handle_error;
}
extensions = driOpenDriver(driverName, &psc->driver, driver_name_is_inferred);
extensions = driOpenDriver(driverName, driver_name_is_inferred);
if (extensions == NULL)
goto handle_error;
@@ -1033,8 +1033,6 @@ handle_error:
close(psc->fd_display_gpu);
if (psc->fd_render_gpu >= 0)
close(psc->fd_render_gpu);
if (psc->driver)
dlclose(psc->driver);
free(driverName);
glx_screen_cleanup(&psc->base);

View File

@@ -98,7 +98,6 @@ struct dri3_screen {
const __DRI2interopExtension *interop;
const __DRIconfig **driver_configs;
void *driver;
/* fd of the GPU used for rendering. */
int fd_render_gpu;
/* fd of the GPU used for display. If the same GPU is used for display

View File

@@ -55,13 +55,12 @@
#define GL_LIB_NAME "libGL.so.1"
#endif
const __DRIextension **
dri_loader_get_extensions(const char *driver_name);
/**
* Try to \c dlopen the named driver.
*
* This function adds the "_dri.so" suffix to the driver name and searches the
* directories specified by the \c LIBGL_DRIVERS_PATH environment variable in
* order to find the driver.
*
* \param driverName - a name like "i965", "radeon", "nouveau", etc.
* \param out_driver_handle - Address to return the resulting dlopen() handle.
*
@@ -70,21 +69,19 @@
* file not found.
*/
_X_HIDDEN const __DRIextension **
driOpenDriver(const char *driverName, void **out_driver_handle, bool driver_name_is_inferred)
driOpenDriver(const char *driverName, bool driver_name_is_inferred)
{
void *glhandle;
/* Attempt to make sure libGL symbols will be visible to the driver */
glhandle = dlopen(GL_LIB_NAME, RTLD_NOW | RTLD_GLOBAL);
static const char *search_path_vars[] = {
"LIBGL_DRIVERS_PATH",
"LIBGL_DRIVERS_DIR", /* deprecated */
NULL
};
const __DRIextension **extensions = dri_loader_get_extensions(driverName);
const __DRIextension **extensions =
loader_open_driver(driverName, out_driver_handle, search_path_vars, driver_name_is_inferred);
if (driver_name_is_inferred) {
glx_message(_LOADER_WARNING,
"MESA-LOADER: failed to open %s: driver not built!)\n", driverName);
}
if (glhandle)
dlclose(glhandle);
@@ -742,9 +739,8 @@ clear_driver_config_cache()
static char *
get_driver_config(const char *driverName)
{
void *handle;
char *config = NULL;
const __DRIextension **extensions = driOpenDriver(driverName, &handle, false);
const __DRIextension **extensions = driOpenDriver(driverName, false);
if (extensions) {
for (int i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CONFIG_OPTIONS) != 0)
@@ -760,8 +756,6 @@ get_driver_config(const char *driverName)
}
}
dlclose(handle);
return config;
}

View File

@@ -64,7 +64,6 @@ extern void
driReleaseDrawables(struct glx_context *gc);
extern const __DRIextension **driOpenDriver(const char *driverName,
void **out_driver_handle,
bool driver_name_is_inferred);
struct dri_ctx_attribs {

View File

@@ -800,8 +800,6 @@ driswDestroyScreen(struct glx_screen *base)
psc->core->destroyScreen(psc->driScreen);
driDestroyConfigs(psc->driver_configs);
psc->driScreen = NULL;
if (psc->driver)
dlclose(psc->driver);
free(psc);
}
@@ -955,7 +953,7 @@ driswCreateScreenDriver(int screen, struct glx_display *priv,
return NULL;
}
extensions = driOpenDriver(driver, &psc->driver, driver_name_is_inferred);
extensions = driOpenDriver(driver, driver_name_is_inferred);
if (extensions == NULL)
goto handle_error;
psc->name = driver;
@@ -1051,8 +1049,6 @@ driswCreateScreenDriver(int screen, struct glx_display *priv,
psc->core->destroyScreen(psc->driScreen);
psc->driScreen = NULL;
if (psc->driver)
dlclose(psc->driver);
glx_screen_cleanup(&psc->base);
free(psc);

View File

@@ -53,7 +53,6 @@ struct drisw_screen
const __DRIconfig **driver_configs;
void *driver;
const char *name;
bool has_multibuffer;

View File

@@ -105,6 +105,13 @@ else
)
endif
glx_gallium_link = []
if with_dri
glx_gallium_link += libgallium_dri
endif
if with_platform_windows
glx_gallium_link += libgallium_wgl
endif
libglx = static_library(
'glx',
[files_libglx, glx_generated],
@@ -115,7 +122,7 @@ libglx = static_library(
gnu_symbol_visibility : 'hidden',
link_with : [
libloader, libloader_dri3_helper,
extra_libs_libglx,
extra_libs_libglx, glx_gallium_link
],
dependencies : [
idep_mesautil, idep_xmlconfig,
@@ -137,6 +144,7 @@ libgl = shared_library(
version : gl_lib_version,
darwin_versions : '4.0.0',
install : true,
install_rpath : dri_drivers_path,
)
if with_tests

View File

@@ -26,7 +26,7 @@ if with_shared_glapi
executable(
'glx-test',
[files_glx_test, glx_indirect_size_h, main_dispatch_h],
link_with : [libglx, libglapi, libloader],
link_with : [libglx, libglapi, glx_gallium_link, libloader],
include_directories : [
inc_src, inc_include, inc_mesa, inc_mapi, inc_glx, inc_loader, inc_gallium
],