From 281edc278272f0650fc190c8539d443ac59157bc Mon Sep 17 00:00:00 2001 From: Daniel Charles Date: Thu, 08 Feb 2018 02:36:51 +0000 Subject: [PATCH] vaapi initialization: move it to vaapi_wrapper vaapi loading of libraries happens on the Pre and Post Sandbox functions. Moving dynamic loading of libaries, i.e. libva,libva-drm and i965_drv_video shared libraries to vaapi_wrapper. When calling PreSandbox function in vaapi_wrapper libva will open i965_drv_video shared library and both will be available for use BUG=785117 TEST=video initialization of h/w dec/enc, VAVDA/VAVEA/VAJDA subjective testing and include unittests and autotests Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel Change-Id: I862bb49f1167d7437e80387882cb9081ad53f54b Signed-off-by: Daniel Charles Reviewed-on: https://chromium-review.googlesource.com/666138 Commit-Queue: Miguel Casas Reviewed-by: Kenneth Russell Reviewed-by: Antoine Labour Reviewed-by: Dongseong Hwang Reviewed-by: Pawel Osciak Reviewed-by: Jorge Lucangeli Obes Cr-Commit-Position: refs/heads/master@{#535274} --- diff --git a/content/gpu/gpu_sandbox_hook_linux.cc b/content/gpu/gpu_sandbox_hook_linux.cc index e69e23e..5c4013c 100644 --- a/content/gpu/gpu_sandbox_hook_linux.cc +++ b/content/gpu/gpu_sandbox_hook_linux.cc @@ -29,10 +29,6 @@ #include "services/service_manager/sandbox/linux/bpf_gpu_policy_linux.h" #include "services/service_manager/sandbox/linux/sandbox_linux.h" -#if BUILDFLAG(USE_VAAPI) -#include -#endif - using sandbox::bpf_dsl::Policy; using sandbox::syscall_broker::BrokerFilePermission; using sandbox::syscall_broker::BrokerProcess; @@ -48,22 +44,6 @@ #endif } -inline bool IsArchitectureX86_64() { -#if defined(__x86_64__) - return true; -#else - return false; -#endif -} - -inline bool IsArchitectureI386() { -#if defined(__i386__) - return true; -#else - return false; -#endif -} - inline bool IsArchitectureArm() { #if defined(ARCH_CPU_ARM_FAMILY) return true; @@ -88,14 +68,6 @@ #endif } -inline bool IsLibVAVersion2() { -#if BUILDFLAG(USE_VAAPI) && VA_MAJOR_VERSION == 1 - return true; -#else - return false; -#endif -} - constexpr int dlopen_flag = RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE; void AddV4L2GpuWhitelist( @@ -270,50 +242,6 @@ } } -void LoadStandardLibraries( - const service_manager::SandboxSeccompBPF::Options& options) { - if (IsArchitectureX86_64() || IsArchitectureI386()) { - // Accelerated video dlopen()'s some shared objects - // inside the sandbox, so preload them now. - if (IsAcceleratedVideoEnabled(options)) { - if (IsLibVAVersion2()) { - if (IsArchitectureX86_64()) { - dlopen("/usr/lib64/va/drivers/i965_drv_video.so", dlopen_flag); - dlopen("/usr/lib64/va/drivers/hybrid_drv_video.so", dlopen_flag); - } else if (IsArchitectureI386()) { - dlopen("/usr/lib/va/drivers/i965_drv_video.so", dlopen_flag); - } - dlopen("libva.so.2", dlopen_flag); -#if defined(USE_OZONE) - dlopen("libva-drm.so.2", dlopen_flag); -#endif - } else { - // If we are linked against libva 1, we have two cases to handle: - // - the sysroot includes both libva 1 and 2, in which case the drivers - // are in /usr/lib{64}/va1/ - // - the sysroot only includes libva 1, in which case the drivers are - // are in /usr/lib{64}/va/ - // This is ugly, but temporary until all builds have switched to libva 2. - if (IsArchitectureX86_64()) { - if (!dlopen("/usr/lib64/va1/drivers/i965_drv_video.so", dlopen_flag)) - dlopen("/usr/lib64/va/drivers/i965_drv_video.so", dlopen_flag); - if (!dlopen("/usr/lib64/va1/drivers/hybrid_drv_video.so", dlopen_flag)) - dlopen("/usr/lib64/va/drivers/hybrid_drv_video.so", dlopen_flag); - } else if (IsArchitectureI386()) { - if (!dlopen("/usr/lib/va1/drivers/i965_drv_video.so", dlopen_flag)) - dlopen("/usr/lib/va/drivers/i965_drv_video.so", dlopen_flag); - } - dlopen("libva.so.1", dlopen_flag); -#if defined(USE_OZONE) - dlopen("libva-drm.so.1", dlopen_flag); -#elif defined(USE_X11) - dlopen("libva-x11.so.1", dlopen_flag); -#endif - } - } - } -} - bool LoadLibrariesForGpu( const service_manager::SandboxSeccompBPF::Options& options) { if (IsChromeOS()) { @@ -326,7 +254,6 @@ if (options.use_amd_specific_policies) return LoadAmdGpuLibraries(); } - LoadStandardLibraries(options); return true; } diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index bc3d735..7421a74 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc @@ -48,6 +48,11 @@ using media_gpu_vaapi::kModuleVa_x11; #endif using media_gpu_vaapi::InitializeStubs; +using media_gpu_vaapi::IsVaInitialized; +#if defined(USE_X11) +using media_gpu_vaapi::IsVa_x11Initialized; +#endif +using media_gpu_vaapi::IsVa_drmInitialized; using media_gpu_vaapi::StubPathMap; #define LOG_VA_ERROR_AND_REPORT(va_error, err_msg) \ @@ -166,9 +171,6 @@ void SetDrmFd(base::PlatformFile fd) { drm_fd_.reset(HANDLE_EINTR(dup(fd))); } private: - // Returns false on init failure. - static bool PostSandboxInitialization(); - // Protected by |va_lock_|. int refcount_; @@ -203,41 +205,17 @@ VADisplayState::Get()->SetDrmFd(drm_file.GetPlatformFile()); } -// static -bool VADisplayState::PostSandboxInitialization() { - const std::string va_suffix(std::to_string(VA_MAJOR_VERSION + 1)); - StubPathMap paths; - - paths[kModuleVa].push_back(std::string("libva.so.") + va_suffix); - paths[kModuleVa_drm].push_back(std::string("libva-drm.so.") + va_suffix); -#if defined(USE_X11) - // libva-x11 does not exist on libva >= 2 - if (VA_MAJOR_VERSION == 0) - paths[kModuleVa_x11].push_back("libva-x11.so.1"); -#endif - - const bool success = InitializeStubs(paths); - if (!success) { - static const char kErrorMsg[] = "Failed to initialize VAAPI libs"; -#if defined(OS_CHROMEOS) - // When Chrome runs on Linux with target_os="chromeos", do not log error - // message without VAAPI libraries. - LOG_IF(ERROR, base::SysInfo::IsRunningOnChromeOS()) << kErrorMsg; -#else - DVLOG(1) << kErrorMsg; -#endif - } - return success; -} - VADisplayState::VADisplayState() : refcount_(0), va_display_(nullptr), va_initialized_(false) {} bool VADisplayState::Initialize() { va_lock_.AssertAcquired(); - static bool result = PostSandboxInitialization(); - if (!result) + if (!IsVaInitialized() || +#if defined(USE_X11) + !IsVa_x11Initialized() || +#endif + !IsVa_drmInitialized()) return false; if (refcount_++ > 0) @@ -1169,6 +1147,38 @@ // static void VaapiWrapper::PreSandboxInitialization() { VADisplayState::PreSandboxInitialization(); + + const std::string va_suffix(std::to_string(VA_MAJOR_VERSION + 1)); + StubPathMap paths; + + paths[kModuleVa].push_back(std::string("libva.so.") + va_suffix); + paths[kModuleVa_drm].push_back(std::string("libva-drm.so.") + va_suffix); +#if defined(USE_X11) + paths[kModuleVa_x11].push_back(std::string("libva-x11.so.") + va_suffix); +#endif + + // InitializeStubs dlopen() VA-API libraries + // libva.so + // libva-x11.so (X11) + // libva-drm.so (X11 and Ozone). + static bool result = InitializeStubs(paths); + if (!result) { + static const char kErrorMsg[] = "Failed to initialize VAAPI libs"; +#if defined(OS_CHROMEOS) + // When Chrome runs on Linux with target_os="chromeos", do not log error + // message without VAAPI libraries. + LOG_IF(ERROR, base::SysInfo::IsRunningOnChromeOS()) << kErrorMsg; +#else + DVLOG(1) << kErrorMsg; +#endif + } + + // VASupportedProfiles::Get creates VADisplayState and in so doing + // driver associated libraries are dlopen(), to know: + // i965_drv_video.so + // hybrid_drv_video.so (platforms that support it) + // libcmrt.so (platforms that support it) + VASupportedProfiles::Get(); } VaapiWrapper::VaapiWrapper()