diff options
| author | crueter <crueter@eden-emu.dev> | 2025-08-04 04:50:14 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-08-04 04:50:14 +0200 |
| commit | 51b170b470ed587f99a7c2a773e4464687f0d07a (patch) | |
| tree | 4c03c510cfb17a5f5d6233df490d78f06dcfa7f7 /externals/libadrenotools/src/driver.cpp | |
| parent | 04e5e6453875ffa5c79cdb421a29bc19985b1049 (diff) | |
[cmake] refactor: Use CPM over submodules (#143)
Transfers the majority of submodules and large externals to CPM, using source archives rather than full Git clones. Not only does this save massive amounts of clone and configure time, but dependencies are grabbed on-demand rather than being required by default. Additionally, CPM will (generally) automatically search for system dependencies, though certain dependencies have options to control this.
Testing shows gains ranging from 5x to 10x in terms of overall clone/configure time.
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/143
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Diffstat (limited to 'externals/libadrenotools/src/driver.cpp')
| -rw-r--r-- | externals/libadrenotools/src/driver.cpp | 210 |
1 files changed, 0 insertions, 210 deletions
diff --git a/externals/libadrenotools/src/driver.cpp b/externals/libadrenotools/src/driver.cpp deleted file mode 100644 index 4ddee4aaa4..0000000000 --- a/externals/libadrenotools/src/driver.cpp +++ /dev/null @@ -1,210 +0,0 @@ -// SPDX-License-Identifier: BSD-2-Clause -// Copyright © 2021 Billy Laws - -#include <string> -#include <string_view> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <dlfcn.h> -#include <fcntl.h> -#include <android/api-level.h> -#include <android/log.h> -#include <android_linker_ns.h> -#include "hook/kgsl.h" -#include "hook/hook_impl_params.h" -#include <adrenotools/driver.h> -#include <unistd.h> - -void *adrenotools_open_libvulkan(int dlopenFlags, int featureFlags, const char *tmpLibDir, const char *hookLibDir, const char *customDriverDir, const char *customDriverName, const char *fileRedirectDir, void **userMappingHandle) { - // Bail out if linkernsbypass failed to load, this probably means we're on api < 28 - if (!linkernsbypass_load_status()) - return nullptr; - - // Always use memfd on Q+ since it's guaranteed to work - if (android_get_device_api_level() >= 29) - tmpLibDir = nullptr; - - // Verify that params for specific features are only passed if they are enabled - if (!(featureFlags & ADRENOTOOLS_DRIVER_FILE_REDIRECT) && fileRedirectDir) - return nullptr; - - if (!(featureFlags & ADRENOTOOLS_DRIVER_CUSTOM) && (customDriverDir || customDriverName)) - return nullptr; - - if (!(featureFlags & ADRENOTOOLS_DRIVER_GPU_MAPPING_IMPORT) && userMappingHandle) - return nullptr; - - // Verify that params for enabled features are correct - struct stat buf{}; - - if (featureFlags & ADRENOTOOLS_DRIVER_CUSTOM) { - if (!customDriverName || !customDriverDir) - return nullptr; - - if (stat((std::string(customDriverDir) + customDriverName).c_str(), &buf) != 0) - return nullptr; - } - - // Verify that params for enabled features are correct - if (featureFlags & ADRENOTOOLS_DRIVER_FILE_REDIRECT) { - if (!fileRedirectDir) - return nullptr; - - if (stat(fileRedirectDir, &buf) != 0) - return nullptr; - } - - // Create a namespace that can isolate our hook from the classloader namespace - auto hookNs{android_create_namespace("adrenotools-libvulkan", hookLibDir, nullptr, ANDROID_NAMESPACE_TYPE_SHARED, nullptr, nullptr)}; - - // Link it to the default namespace so the hook can use libandroid etc - if (!linkernsbypass_link_namespace_to_default_all_libs(hookNs)) - return nullptr; - - // Preload the hook implementation, otherwise we get a weird issue where despite being in NEEDED of the hook lib the hook's symbols will overwrite ours and cause an infinite loop - auto hookImpl{linkernsbypass_namespace_dlopen("libhook_impl.so", RTLD_NOW, hookNs)}; - if (!hookImpl) - return nullptr; - - // Pass parameters to the hook implementation - auto initHookParam{reinterpret_cast<void (*)(const void *)>(dlsym(hookImpl, "init_hook_param"))}; - if (!initHookParam) - return nullptr; - - - auto importMapping{[&]() -> adrenotools_gpu_mapping * { - if (featureFlags & ADRENOTOOLS_DRIVER_GPU_MAPPING_IMPORT) { - // This will be leaked, but it's not a big deal since it's only a few bytes - adrenotools_gpu_mapping *mapping{new adrenotools_gpu_mapping{}}; - *userMappingHandle = mapping; - return mapping; - } else { - return nullptr; - } - }()}; - - initHookParam(new HookImplParams(featureFlags, tmpLibDir, hookLibDir, customDriverDir, customDriverName, fileRedirectDir, importMapping)); - - // Load the libvulkan hook into the isolated namespace - if (!linkernsbypass_namespace_dlopen("libmain_hook.so", RTLD_GLOBAL, hookNs)) - return nullptr; - - return linkernsbypass_namespace_dlopen_unique("/system/lib64/libvulkan.so", tmpLibDir, dlopenFlags, hookNs); -} - -bool adrenotools_import_user_mem(void *handle, void *hostPtr, uint64_t size) { - auto importMapping{reinterpret_cast<adrenotools_gpu_mapping *>(handle)}; - - kgsl_gpuobj_import_useraddr addr{ - .virtaddr = reinterpret_cast<uint64_t>(hostPtr), - }; - - kgsl_gpuobj_import userMemImport{ - .priv = reinterpret_cast<uint64_t>(&addr), - .priv_len = size, - .flags = KGSL_CACHEMODE_WRITEBACK << KGSL_CACHEMODE_SHIFT | KGSL_MEMFLAGS_IOCOHERENT, - .type = KGSL_USER_MEM_TYPE_ADDR, - - }; - - kgsl_gpuobj_info info{}; - - int kgslFd{open("/dev/kgsl-3d0", O_RDWR)}; - if (kgslFd < 0) - return false; - - int ret{ioctl(kgslFd, IOCTL_KGSL_GPUOBJ_IMPORT, &userMemImport)}; - if (ret) - goto err; - - info.id = userMemImport.id; - ret = ioctl(kgslFd, IOCTL_KGSL_GPUOBJ_INFO, &info); - if (ret) - goto err; - - importMapping->host_ptr = hostPtr; - importMapping->gpu_addr = info.gpuaddr; - importMapping->size = size; - importMapping->flags = 0xc2600; //!< Unknown flags, but they are required for the mapping to work - - close(kgslFd); - return true; - -err: - close(kgslFd); - return false; -} - -bool adrenotools_mem_gpu_allocate(void *handle, uint64_t *size) { - auto mapping{reinterpret_cast<adrenotools_gpu_mapping *>(handle)}; - - kgsl_gpuobj_alloc gpuobjAlloc{ - .size = *size, - .flags = KGSL_CACHEMODE_WRITEBACK << KGSL_CACHEMODE_SHIFT | KGSL_MEMFLAGS_IOCOHERENT, - }; - - kgsl_gpuobj_info info{}; - - int kgslFd{open("/dev/kgsl-3d0", O_RDWR)}; - if (kgslFd < 0) - return false; - - int ret{ioctl(kgslFd, IOCTL_KGSL_GPUOBJ_ALLOC, &gpuobjAlloc)}; - if (ret) - goto err; - - *size = gpuobjAlloc.mmapsize; - - info.id = gpuobjAlloc.id; - - ret = ioctl(kgslFd, IOCTL_KGSL_GPUOBJ_INFO, &info); - if (ret) - goto err; - - mapping->host_ptr = nullptr; - mapping->gpu_addr = info.gpuaddr; - mapping->size = *size; - mapping->flags = 0xc2600; //!< Unknown flags, but they are required for the mapping to work - - close(kgslFd); - return true; - -err: - close(kgslFd); - return false; -} - - -bool adrenotools_mem_cpu_map(void *handle, void *hostPtr, uint64_t size) { - auto mapping{reinterpret_cast<adrenotools_gpu_mapping *>(handle)}; - - int kgslFd{open("/dev/kgsl-3d0", O_RDWR)}; - if (kgslFd < 0) - return false; - - mapping->host_ptr = mmap(hostPtr, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, kgslFd, mapping->gpu_addr); - close(kgslFd); - return mapping->host_ptr != nullptr; -} - -bool adrenotools_validate_gpu_mapping(void *handle) { - auto importMapping{reinterpret_cast<adrenotools_gpu_mapping *>(handle)}; - return importMapping->gpu_addr == ADRENOTOOLS_GPU_MAPPING_SUCCEEDED_MAGIC; -} - -void adrenotools_set_turbo(bool turbo) { - uint32_t enable{turbo ? 0U : 1U}; - kgsl_device_getproperty prop{ - .type = KGSL_PROP_PWRCTRL, - .value = reinterpret_cast<void *>(&enable), - .sizebytes = sizeof(enable), - }; - - int kgslFd{open("/dev/kgsl-3d0", O_RDWR)}; - if (kgslFd < 0) - return; - - ioctl(kgslFd, IOCTL_KGSL_SETPROPERTY, &prop); - close (kgslFd); -} |
