diff --git a/myphoneinfo/andinfo/src/main/AndroidManifest.xml b/myphoneinfo/andinfo/src/main/AndroidManifest.xml index 09f32ab..c067acc 100644 --- a/myphoneinfo/andinfo/src/main/AndroidManifest.xml +++ b/myphoneinfo/andinfo/src/main/AndroidManifest.xml @@ -1,5 +1,10 @@ + + + + + - \ No newline at end of file + diff --git a/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt b/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt index e471048..84ecba4 100644 --- a/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt +++ b/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(andinfo SHARED egl/EglContext.cpp egl/EglSession.cpp vulkan/VkSession.cpp + vulkan/vkloader.cpp vulkan_wrapper/vulkan_wrapper.cpp) target_link_libraries(andinfo diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp index 57df7e1..2dc7528 100644 --- a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp @@ -11,13 +11,20 @@ VkSession::VkSession(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator) { - if (!IsVulkanSupported()) { - throw std::runtime_error("Vulkan not supported"); - } - - if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) { +// if (!IsVulkanSupported()) { +// throw std::runtime_error("Vulkan not supported"); +// } + mLoader = new VulkanLoader(); + mLoader->openLib(); + mLoader->loadGlobalFuncs(); + if (!mLoader->createInstance(pCreateInfo, pAllocator)) { throw std::runtime_error("Failed to create Vulkan instance"); } + mInstance = mLoader->instance; + +// if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) { +// throw std::runtime_error("Failed to create Vulkan instance"); +// } } VkSession::~VkSession() { diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak new file mode 100644 index 0000000..a7c368e --- /dev/null +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: Sebastiano Barezzi + * SPDX-License-Identifier: Apache-2.0 + */ + +#define LOG_TAG "VkSession" + +#include +#include "VkSession.h" +#include "../logging.h" + +VkSession::VkSession(const VkInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator) { +// if (!IsVulkanSupported()) { +// throw std::runtime_error("Vulkan not supported"); +// } + mLoader=new VulkanLoader(); + if(!mLoader->createInstance(pCreateInfo,pAllocator)){ + throw std::runtime_error("Failed to create Vulkan instance"); + } + mInstance=mLoader->instance; + +// if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) { +// throw std::runtime_error("Failed to create Vulkan instance"); +// } +} + +VkSession::~VkSession() { + vkDestroyInstance(mInstance, nullptr); +} + +std::vector VkSession::vkEnumeratePhysicalDevices() { + VkResult result; + + uint32_t deviceCount = 0; + result = ::vkEnumeratePhysicalDevices(mInstance, &deviceCount, nullptr); + if (result != VK_SUCCESS) { + LOGE("Failed to enumerate Vulkan devices: %d", result); + return {}; + } + + if (deviceCount <= 0) { + LOGI("No Vulkan device found"); + return {}; + } + + std::vector devices(deviceCount); + result = ::vkEnumeratePhysicalDevices(mInstance, &deviceCount, devices.data()); + if (result != VK_SUCCESS) { + LOGE("Failed to enumerate Vulkan devices: %d", result); + return {}; + } + + return devices; +} + +VkPhysicalDeviceProperties VkSession::vkGetPhysicalDeviceProperties(VkPhysicalDevice device) { + VkPhysicalDeviceProperties properties; + ::vkGetPhysicalDeviceProperties(device, &properties); + return properties; +} + +std::unique_ptr VkSession::create(const VkInstanceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator) { + try { + return std::unique_ptr(new VkSession(pCreateInfo, pAllocator)); + } catch (std::runtime_error &error) { + LOGE("Failed to create Vulkan session: %s", error.what()); + return nullptr; + } +} diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h index 99d4f29..d963025 100644 --- a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h @@ -7,7 +7,7 @@ #include #include -#include "../vulkan_wrapper/vulkan_wrapper.h" +#include "./vkloader.h" class VkSession { public: @@ -28,4 +28,5 @@ private: VkSession(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator); VkInstance mInstance = nullptr; + VulkanLoader* mLoader= nullptr; }; diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak new file mode 100644 index 0000000..d963025 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: Sebastiano Barezzi + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include +#include "./vkloader.h" + +class VkSession { +public: + VkSession(const VkSession &) = delete; + + ~VkSession(); + + VkSession &operator=(const VkSession &) = delete; + + std::vector vkEnumeratePhysicalDevices(); + + static std::unique_ptr + create(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator); + + VkPhysicalDeviceProperties vkGetPhysicalDeviceProperties(VkPhysicalDevice device); + +private: + VkSession(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator); + + VkInstance mInstance = nullptr; + VulkanLoader* mLoader= nullptr; +}; diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp new file mode 100644 index 0000000..22d44db --- /dev/null +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp @@ -0,0 +1,122 @@ +// +// Created by lhyqy5 on 2025/12/9. +// + +#include "vkloader.h" +// vulkan_loader.cpp + + +#include +#include +#include +#include + +#define LOG(...) do { std::fprintf(stderr, __VA_ARGS__); std::fprintf(stderr, "\n"); } while(0) + +VulkanLoader::VulkanLoader() {} + +VulkanLoader::~VulkanLoader() { + if (instance != VK_NULL_HANDLE) { + auto vkDestroyInstance = reinterpret_cast( + vkGetInstanceProcAddr(instance, "vkDestroyInstance")); + + if (vkDestroyInstance) { + vkDestroyInstance(instance, nullptr); + } + instance = VK_NULL_HANDLE; + } + + if (lib) { + dlclose(lib); + lib = nullptr; + } +} + +bool VulkanLoader::openLib(const char* path) { + lib = dlopen(path, RTLD_NOW | RTLD_LOCAL); + if (!lib) { + LOG("dlopen(%s) failed: %s", path, dlerror()); + return false; + } + + void* sym = dlsym(lib, "vkGetInstanceProcAddr"); + if (!sym) { + LOG("dlsym(vkGetInstanceProcAddr) returned NULL"); + dlclose(lib); + lib = nullptr; + return false; + } + + vkGetInstanceProcAddr = reinterpret_cast(sym); + LOG("vkGetInstanceProcAddr = %p", sym); + + return true; +} + +bool VulkanLoader::loadGlobalFuncs() { + if (!vkGetInstanceProcAddr) return false; + + vkCreateInstance = reinterpret_cast( + vkGetInstanceProcAddr(nullptr, "vkCreateInstance")); + + vkEnumerateInstanceExtensionProperties = + reinterpret_cast( + vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceExtensionProperties")); + + LOG("vkCreateInstance = %p", reinterpret_cast(vkCreateInstance)); + LOG("vkEnumerateInstanceExtensionProperties = %p", + reinterpret_cast(vkEnumerateInstanceExtensionProperties)); + + return vkCreateInstance != nullptr; +} + +bool VulkanLoader::createInstance(const VkInstanceCreateInfo* createInfo, + const VkAllocationCallbacks *pAllocator) { + if (!vkCreateInstance) return false; + +// VkInstanceCreateInfo ci{}; +// ci.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; +// ci.pApplicationInfo = &appInfo; +// ci.enabledExtensionCount = (uint32_t)instanceExtensions.size(); +// ci.ppEnabledExtensionNames = instanceExtensions.empty() ? nullptr : instanceExtensions.data(); + + VkResult r = vkCreateInstance(createInfo, pAllocator, &instance); + + if (r != VK_SUCCESS) { + LOG("vkCreateInstance failed: %d", r); + return false; + } + + LOG("vkCreateInstance ok, instance=%p", (void*)instance); + return true; +} + +void* VulkanLoader::_getInstanceProc(const char* name) { + if (!vkGetInstanceProcAddr || instance == VK_NULL_HANDLE) + return nullptr; + + void* fn = reinterpret_cast(vkGetInstanceProcAddr(instance, name)); + LOG("instance-level %s = %p", name, fn); + return fn; +} + +void* VulkanLoader::_getDeviceProc(VkDevice device, const char* name) { + if (!vkGetInstanceProcAddr) + return nullptr; + + // get vkGetDeviceProcAddr first + auto vkGetDeviceProcAddr = + reinterpret_cast( + vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr")); + + if (vkGetDeviceProcAddr) { + void* fn = reinterpret_cast(vkGetDeviceProcAddr(device, name)); + LOG("device-level %s = %p", name, fn); + return fn; + } + + // fallback (rare) – some drivers expose device functions at instance level + void* fn = reinterpret_cast(vkGetInstanceProcAddr(instance, name)); + LOG("fallback device-level %s = %p", name, fn); + return fn; +} diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h new file mode 100644 index 0000000..6b5002f --- /dev/null +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h @@ -0,0 +1,55 @@ +// +// Created by lhyqy5 on 2025/12/9. +// +// vulkan_loader.h +#pragma once + +#include +#include + +class VulkanLoader { +public: + VulkanLoader(); + ~VulkanLoader(); + + // open libvulkan.so, load vkGetInstanceProcAddr + bool openLib(const char* path = "libvulkan.so"); + + // load global functions such as vkCreateInstance + bool loadGlobalFuncs(); + + // create instance + bool createInstance(const VkInstanceCreateInfo* createInfo, + const VkAllocationCallbacks *pAllocator); + + // load instance-level function + template + T getInstanceProc(const char* name) { + return reinterpret_cast(_getInstanceProc(name)); + } + + // load device-level function + template + T getDeviceProc(VkDevice device, const char* name) { + return reinterpret_cast(_getDeviceProc(device, name)); + } + + VkInstance instance = VK_NULL_HANDLE; + +private: + void* lib = nullptr; + + PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = nullptr; + + // global-level functions + PFN_vkCreateInstance vkCreateInstance = nullptr; + PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = nullptr; + + // internal helpers + void* _getInstanceProc(const char* name); + void* _getDeviceProc(VkDevice device, const char* name); + + // disable copy + VulkanLoader(const VulkanLoader&) = delete; + VulkanLoader& operator=(const VulkanLoader&) = delete; +}; diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp index eb34b37..649d005 100644 --- a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp @@ -17,195 +17,207 @@ static VulkanWrapperStatus InitVulkan() { return UNSUPPORTED; } + auto vkGetInstanceProcAddr = + reinterpret_cast( + dlsym(libvulkan, "vkGetInstanceProcAddr")); + + auto vkCreateInstance = + reinterpret_cast( + vkGetInstanceProcAddr(nullptr, "vkCreateInstance")); + + +// vkGetInstanceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetInstanceProcAddr")); +// vkGetDeviceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceProcAddr")); + + auto x=vkGetInstanceProcAddr(nullptr, "vkDestroyInstance"); // Vulkan supported, set function addresses - vkCreateInstance = reinterpret_cast(dlsym(libvulkan, "vkCreateInstance")); - vkDestroyInstance = reinterpret_cast(dlsym(libvulkan, "vkDestroyInstance")); - vkEnumeratePhysicalDevices = reinterpret_cast(dlsym(libvulkan, "vkEnumeratePhysicalDevices")); - vkGetPhysicalDeviceFeatures = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFeatures")); - vkGetPhysicalDeviceFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFormatProperties")); - vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceImageFormatProperties")); - vkGetPhysicalDeviceProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceProperties")); - vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceQueueFamilyProperties")); - vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceMemoryProperties")); - vkGetInstanceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetInstanceProcAddr")); - vkGetDeviceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceProcAddr")); - vkCreateDevice = reinterpret_cast(dlsym(libvulkan, "vkCreateDevice")); - vkDestroyDevice = reinterpret_cast(dlsym(libvulkan, "vkDestroyDevice")); - vkEnumerateInstanceExtensionProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateInstanceExtensionProperties")); - vkEnumerateDeviceExtensionProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateDeviceExtensionProperties")); - vkEnumerateInstanceLayerProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateInstanceLayerProperties")); - vkEnumerateDeviceLayerProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateDeviceLayerProperties")); - vkGetDeviceQueue = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceQueue")); - vkQueueSubmit = reinterpret_cast(dlsym(libvulkan, "vkQueueSubmit")); - vkQueueWaitIdle = reinterpret_cast(dlsym(libvulkan, "vkQueueWaitIdle")); - vkDeviceWaitIdle = reinterpret_cast(dlsym(libvulkan, "vkDeviceWaitIdle")); - vkAllocateMemory = reinterpret_cast(dlsym(libvulkan, "vkAllocateMemory")); - vkFreeMemory = reinterpret_cast(dlsym(libvulkan, "vkFreeMemory")); - vkMapMemory = reinterpret_cast(dlsym(libvulkan, "vkMapMemory")); - vkUnmapMemory = reinterpret_cast(dlsym(libvulkan, "vkUnmapMemory")); - vkFlushMappedMemoryRanges = reinterpret_cast(dlsym(libvulkan, "vkFlushMappedMemoryRanges")); - vkInvalidateMappedMemoryRanges = reinterpret_cast(dlsym(libvulkan, "vkInvalidateMappedMemoryRanges")); - vkGetDeviceMemoryCommitment = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceMemoryCommitment")); - vkBindBufferMemory = reinterpret_cast(dlsym(libvulkan, "vkBindBufferMemory")); - vkBindImageMemory = reinterpret_cast(dlsym(libvulkan, "vkBindImageMemory")); - vkGetBufferMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetBufferMemoryRequirements")); - vkGetImageMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetImageMemoryRequirements")); - vkGetImageSparseMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetImageSparseMemoryRequirements")); - vkGetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSparseImageFormatProperties")); - vkQueueBindSparse = reinterpret_cast(dlsym(libvulkan, "vkQueueBindSparse")); - vkCreateFence = reinterpret_cast(dlsym(libvulkan, "vkCreateFence")); - vkDestroyFence = reinterpret_cast(dlsym(libvulkan, "vkDestroyFence")); - vkResetFences = reinterpret_cast(dlsym(libvulkan, "vkResetFences")); - vkGetFenceStatus = reinterpret_cast(dlsym(libvulkan, "vkGetFenceStatus")); - vkWaitForFences = reinterpret_cast(dlsym(libvulkan, "vkWaitForFences")); - vkCreateSemaphore = reinterpret_cast(dlsym(libvulkan, "vkCreateSemaphore")); - vkDestroySemaphore = reinterpret_cast(dlsym(libvulkan, "vkDestroySemaphore")); - vkCreateEvent = reinterpret_cast(dlsym(libvulkan, "vkCreateEvent")); - vkDestroyEvent = reinterpret_cast(dlsym(libvulkan, "vkDestroyEvent")); - vkGetEventStatus = reinterpret_cast(dlsym(libvulkan, "vkGetEventStatus")); - vkSetEvent = reinterpret_cast(dlsym(libvulkan, "vkSetEvent")); - vkResetEvent = reinterpret_cast(dlsym(libvulkan, "vkResetEvent")); - vkCreateQueryPool = reinterpret_cast(dlsym(libvulkan, "vkCreateQueryPool")); - vkDestroyQueryPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyQueryPool")); - vkGetQueryPoolResults = reinterpret_cast(dlsym(libvulkan, "vkGetQueryPoolResults")); - vkCreateBuffer = reinterpret_cast(dlsym(libvulkan, "vkCreateBuffer")); - vkDestroyBuffer = reinterpret_cast(dlsym(libvulkan, "vkDestroyBuffer")); - vkCreateBufferView = reinterpret_cast(dlsym(libvulkan, "vkCreateBufferView")); - vkDestroyBufferView = reinterpret_cast(dlsym(libvulkan, "vkDestroyBufferView")); - vkCreateImage = reinterpret_cast(dlsym(libvulkan, "vkCreateImage")); - vkDestroyImage = reinterpret_cast(dlsym(libvulkan, "vkDestroyImage")); - vkGetImageSubresourceLayout = reinterpret_cast(dlsym(libvulkan, "vkGetImageSubresourceLayout")); - vkCreateImageView = reinterpret_cast(dlsym(libvulkan, "vkCreateImageView")); - vkDestroyImageView = reinterpret_cast(dlsym(libvulkan, "vkDestroyImageView")); - vkCreateShaderModule = reinterpret_cast(dlsym(libvulkan, "vkCreateShaderModule")); - vkDestroyShaderModule = reinterpret_cast(dlsym(libvulkan, "vkDestroyShaderModule")); - vkCreatePipelineCache = reinterpret_cast(dlsym(libvulkan, "vkCreatePipelineCache")); - vkDestroyPipelineCache = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipelineCache")); - vkGetPipelineCacheData = reinterpret_cast(dlsym(libvulkan, "vkGetPipelineCacheData")); - vkMergePipelineCaches = reinterpret_cast(dlsym(libvulkan, "vkMergePipelineCaches")); - vkCreateGraphicsPipelines = reinterpret_cast(dlsym(libvulkan, "vkCreateGraphicsPipelines")); - vkCreateComputePipelines = reinterpret_cast(dlsym(libvulkan, "vkCreateComputePipelines")); - vkDestroyPipeline = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipeline")); - vkCreatePipelineLayout = reinterpret_cast(dlsym(libvulkan, "vkCreatePipelineLayout")); - vkDestroyPipelineLayout = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipelineLayout")); - vkCreateSampler = reinterpret_cast(dlsym(libvulkan, "vkCreateSampler")); - vkDestroySampler = reinterpret_cast(dlsym(libvulkan, "vkDestroySampler")); - vkCreateDescriptorSetLayout = reinterpret_cast(dlsym(libvulkan, "vkCreateDescriptorSetLayout")); - vkDestroyDescriptorSetLayout = reinterpret_cast(dlsym(libvulkan, "vkDestroyDescriptorSetLayout")); - vkCreateDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkCreateDescriptorPool")); - vkDestroyDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyDescriptorPool")); - vkResetDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkResetDescriptorPool")); - vkAllocateDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkAllocateDescriptorSets")); - vkFreeDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkFreeDescriptorSets")); - vkUpdateDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkUpdateDescriptorSets")); - vkCreateFramebuffer = reinterpret_cast(dlsym(libvulkan, "vkCreateFramebuffer")); - vkDestroyFramebuffer = reinterpret_cast(dlsym(libvulkan, "vkDestroyFramebuffer")); - vkCreateRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCreateRenderPass")); - vkDestroyRenderPass = reinterpret_cast(dlsym(libvulkan, "vkDestroyRenderPass")); - vkGetRenderAreaGranularity = reinterpret_cast(dlsym(libvulkan, "vkGetRenderAreaGranularity")); - vkCreateCommandPool = reinterpret_cast(dlsym(libvulkan, "vkCreateCommandPool")); - vkDestroyCommandPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyCommandPool")); - vkResetCommandPool = reinterpret_cast(dlsym(libvulkan, "vkResetCommandPool")); - vkAllocateCommandBuffers = reinterpret_cast(dlsym(libvulkan, "vkAllocateCommandBuffers")); - vkFreeCommandBuffers = reinterpret_cast(dlsym(libvulkan, "vkFreeCommandBuffers")); - vkBeginCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkBeginCommandBuffer")); - vkEndCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkEndCommandBuffer")); - vkResetCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkResetCommandBuffer")); - vkCmdBindPipeline = reinterpret_cast(dlsym(libvulkan, "vkCmdBindPipeline")); - vkCmdSetViewport = reinterpret_cast(dlsym(libvulkan, "vkCmdSetViewport")); - vkCmdSetScissor = reinterpret_cast(dlsym(libvulkan, "vkCmdSetScissor")); - vkCmdSetLineWidth = reinterpret_cast(dlsym(libvulkan, "vkCmdSetLineWidth")); - vkCmdSetDepthBias = reinterpret_cast(dlsym(libvulkan, "vkCmdSetDepthBias")); - vkCmdSetBlendConstants = reinterpret_cast(dlsym(libvulkan, "vkCmdSetBlendConstants")); - vkCmdSetDepthBounds = reinterpret_cast(dlsym(libvulkan, "vkCmdSetDepthBounds")); - vkCmdSetStencilCompareMask = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilCompareMask")); - vkCmdSetStencilWriteMask = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilWriteMask")); - vkCmdSetStencilReference = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilReference")); - vkCmdBindDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkCmdBindDescriptorSets")); - vkCmdBindIndexBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdBindIndexBuffer")); - vkCmdBindVertexBuffers = reinterpret_cast(dlsym(libvulkan, "vkCmdBindVertexBuffers")); - vkCmdDraw = reinterpret_cast(dlsym(libvulkan, "vkCmdDraw")); - vkCmdDrawIndexed = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndexed")); - vkCmdDrawIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndirect")); - vkCmdDrawIndexedIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndexedIndirect")); - vkCmdDispatch = reinterpret_cast(dlsym(libvulkan, "vkCmdDispatch")); - vkCmdDispatchIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDispatchIndirect")); - vkCmdCopyBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyBuffer")); - vkCmdCopyImage = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyImage")); - vkCmdBlitImage = reinterpret_cast(dlsym(libvulkan, "vkCmdBlitImage")); - vkCmdCopyBufferToImage = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyBufferToImage")); - vkCmdCopyImageToBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyImageToBuffer")); - vkCmdUpdateBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdUpdateBuffer")); - vkCmdFillBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdFillBuffer")); - vkCmdClearColorImage = reinterpret_cast(dlsym(libvulkan, "vkCmdClearColorImage")); - vkCmdClearDepthStencilImage = reinterpret_cast(dlsym(libvulkan, "vkCmdClearDepthStencilImage")); - vkCmdClearAttachments = reinterpret_cast(dlsym(libvulkan, "vkCmdClearAttachments")); - vkCmdResolveImage = reinterpret_cast(dlsym(libvulkan, "vkCmdResolveImage")); - vkCmdSetEvent = reinterpret_cast(dlsym(libvulkan, "vkCmdSetEvent")); - vkCmdResetEvent = reinterpret_cast(dlsym(libvulkan, "vkCmdResetEvent")); - vkCmdWaitEvents = reinterpret_cast(dlsym(libvulkan, "vkCmdWaitEvents")); - vkCmdPipelineBarrier = reinterpret_cast(dlsym(libvulkan, "vkCmdPipelineBarrier")); - vkCmdBeginQuery = reinterpret_cast(dlsym(libvulkan, "vkCmdBeginQuery")); - vkCmdEndQuery = reinterpret_cast(dlsym(libvulkan, "vkCmdEndQuery")); - vkCmdResetQueryPool = reinterpret_cast(dlsym(libvulkan, "vkCmdResetQueryPool")); - vkCmdWriteTimestamp = reinterpret_cast(dlsym(libvulkan, "vkCmdWriteTimestamp")); - vkCmdCopyQueryPoolResults = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyQueryPoolResults")); - vkCmdPushConstants = reinterpret_cast(dlsym(libvulkan, "vkCmdPushConstants")); - vkCmdBeginRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCmdBeginRenderPass")); - vkCmdNextSubpass = reinterpret_cast(dlsym(libvulkan, "vkCmdNextSubpass")); - vkCmdEndRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCmdEndRenderPass")); - vkCmdExecuteCommands = reinterpret_cast(dlsym(libvulkan, "vkCmdExecuteCommands")); - vkDestroySurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkDestroySurfaceKHR")); - vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceSupportKHR")); - vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")); - vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceFormatsKHR")); - vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfacePresentModesKHR")); - vkCreateSwapchainKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateSwapchainKHR")); - vkDestroySwapchainKHR = reinterpret_cast(dlsym(libvulkan, "vkDestroySwapchainKHR")); - vkGetSwapchainImagesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetSwapchainImagesKHR")); - vkAcquireNextImageKHR = reinterpret_cast(dlsym(libvulkan, "vkAcquireNextImageKHR")); - vkQueuePresentKHR = reinterpret_cast(dlsym(libvulkan, "vkQueuePresentKHR")); - // vkGetPhysicalDeviceDisplayPropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceDisplayPropertiesKHR")); - // vkGetPhysicalDeviceDisplayPlanePropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR")); - // vkGetDisplayPlaneSupportedDisplaysKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayPlaneSupportedDisplaysKHR")); - // vkGetDisplayModePropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayModePropertiesKHR")); - // vkCreateDisplayModeKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateDisplayModeKHR")); - // vkGetDisplayPlaneCapabilitiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayPlaneCapabilitiesKHR")); - // vkCreateDisplayPlaneSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateDisplayPlaneSurfaceKHR")); - // vkCreateSharedSwapchainsKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateSharedSwapchainsKHR")); +// vkCreateInstance = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateInstance")); +// vkDestroyInstance = reinterpret_cast(dlsym(libvulkan, "vkDestroyInstance")); +// vkEnumeratePhysicalDevices = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumeratePhysicalDevices")); +// vkGetPhysicalDeviceFeatures = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceFeatures")); +// vkGetPhysicalDeviceFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceFormatProperties")); +// vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceImageFormatProperties")); +// vkGetPhysicalDeviceProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceProperties")); +// vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceQueueFamilyProperties")); +// vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceMemoryProperties")); +// vkGetDeviceProcAddr = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceProcAddr")); +// vkCreateDevice = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDevice")); +// vkDestroyDevice = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyDevice")); +// vkEnumerateInstanceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceExtensionProperties")); +// vkEnumerateDeviceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateDeviceExtensionProperties")); +// vkEnumerateInstanceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceLayerProperties")); +// vkEnumerateDeviceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateDeviceLayerProperties")); +// vkGetDeviceQueue = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceQueue")); +// vkQueueSubmit = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueSubmit")); +// vkQueueWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueWaitIdle")); +// vkDeviceWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDeviceWaitIdle")); +// vkAllocateMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkAllocateMemory")); +// vkFreeMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFreeMemory")); +// vkMapMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkMapMemory")); +// vkUnmapMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkUnmapMemory")); +// vkFlushMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFlushMappedMemoryRanges")); +// vkInvalidateMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkInvalidateMappedMemoryRanges")); +// vkGetDeviceMemoryCommitment = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceMemoryCommitment")); +// vkBindBufferMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkBindBufferMemory")); +// vkBindImageMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkBindImageMemory")); +// vkGetBufferMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetBufferMemoryRequirements")); +// vkGetImageMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageMemoryRequirements")); +// vkGetImageSparseMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageSparseMemoryRequirements")); +// vkGetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSparseImageFormatProperties")); +// vkQueueBindSparse = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueBindSparse")); +// vkCreateFence = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateFence")); +// vkDestroyFence = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyFence")); +// vkResetFences = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetFences")); +// vkGetFenceStatus = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetFenceStatus")); +// vkWaitForFences = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkWaitForFences")); +// vkCreateSemaphore = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateSemaphore")); +// vkDestroySemaphore = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroySemaphore")); +// vkCreateEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateEvent")); +// vkDestroyEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyEvent")); +// vkGetEventStatus = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetEventStatus")); +// vkSetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkSetEvent")); +// vkResetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetEvent")); +// vkCreateQueryPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateQueryPool")); +// vkDestroyQueryPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyQueryPool")); +// vkGetQueryPoolResults = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetQueryPoolResults")); +// vkCreateBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateBuffer")); +// vkDestroyBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyBuffer")); +// vkCreateBufferView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateBufferView")); +// vkDestroyBufferView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyBufferView")); +// vkCreateImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateImage")); +// vkDestroyImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyImage")); +// vkGetImageSubresourceLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageSubresourceLayout")); +// vkCreateImageView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateImageView")); +// vkDestroyImageView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyImageView")); +// vkCreateShaderModule = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateShaderModule")); +// vkDestroyShaderModule = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyShaderModule")); +// vkCreatePipelineCache = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreatePipelineCache")); +// vkDestroyPipelineCache = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyPipelineCache")); +// vkGetPipelineCacheData = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPipelineCacheData")); +// vkMergePipelineCaches = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkMergePipelineCaches")); +// vkCreateGraphicsPipelines = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateGraphicsPipelines")); +// vkCreateComputePipelines = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateComputePipelines")); +// vkDestroyPipeline = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyPipeline")); +// vkCreatePipelineLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreatePipelineLayout")); +// vkDestroyPipelineLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyPipelineLayout")); +// vkCreateSampler = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateSampler")); +// vkDestroySampler = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroySampler")); +// vkCreateDescriptorSetLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDescriptorSetLayout")); +// vkDestroyDescriptorSetLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyDescriptorSetLayout")); +// vkCreateDescriptorPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDescriptorPool")); +// vkDestroyDescriptorPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyDescriptorPool")); +// vkResetDescriptorPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetDescriptorPool")); +// vkAllocateDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkAllocateDescriptorSets")); +// vkFreeDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFreeDescriptorSets")); +// vkUpdateDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkUpdateDescriptorSets")); +// vkCreateFramebuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateFramebuffer")); +// vkDestroyFramebuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyFramebuffer")); +// vkCreateRenderPass = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateRenderPass")); +// vkDestroyRenderPass = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyRenderPass")); +// vkGetRenderAreaGranularity = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetRenderAreaGranularity")); +// vkCreateCommandPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateCommandPool")); +// vkDestroyCommandPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyCommandPool")); +// vkResetCommandPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetCommandPool")); +// vkAllocateCommandBuffers = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkAllocateCommandBuffers")); +// vkFreeCommandBuffers = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFreeCommandBuffers")); +// vkBeginCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkBeginCommandBuffer")); +// vkEndCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEndCommandBuffer")); +// vkResetCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetCommandBuffer")); +// vkCmdBindPipeline = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBindPipeline")); +// vkCmdSetViewport = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetViewport")); +// vkCmdSetScissor = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetScissor")); +// vkCmdSetLineWidth = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetLineWidth")); +// vkCmdSetDepthBias = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetDepthBias")); +// vkCmdSetBlendConstants = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetBlendConstants")); +// vkCmdSetDepthBounds = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetDepthBounds")); +// vkCmdSetStencilCompareMask = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetStencilCompareMask")); +// vkCmdSetStencilWriteMask = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetStencilWriteMask")); +// vkCmdSetStencilReference = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetStencilReference")); +// vkCmdBindDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBindDescriptorSets")); +// vkCmdBindIndexBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBindIndexBuffer")); +// vkCmdBindVertexBuffers = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBindVertexBuffers")); +// vkCmdDraw = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDraw")); +// vkCmdDrawIndexed = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDrawIndexed")); +// vkCmdDrawIndirect = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDrawIndirect")); +// vkCmdDrawIndexedIndirect = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDrawIndexedIndirect")); +// vkCmdDispatch = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDispatch")); +// vkCmdDispatchIndirect = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdDispatchIndirect")); +// vkCmdCopyBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdCopyBuffer")); +// vkCmdCopyImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdCopyImage")); +// vkCmdBlitImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBlitImage")); +// vkCmdCopyBufferToImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdCopyBufferToImage")); +// vkCmdCopyImageToBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdCopyImageToBuffer")); +// vkCmdUpdateBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdUpdateBuffer")); +// vkCmdFillBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdFillBuffer")); +// vkCmdClearColorImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdClearColorImage")); +// vkCmdClearDepthStencilImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdClearDepthStencilImage")); +// vkCmdClearAttachments = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdClearAttachments")); +// vkCmdResolveImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdResolveImage")); +// vkCmdSetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdSetEvent")); +// vkCmdResetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdResetEvent")); +// vkCmdWaitEvents = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdWaitEvents")); +// vkCmdPipelineBarrier = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdPipelineBarrier")); +// vkCmdBeginQuery = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBeginQuery")); +// vkCmdEndQuery = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdEndQuery")); +// vkCmdResetQueryPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdResetQueryPool")); +// vkCmdWriteTimestamp = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdWriteTimestamp")); +// vkCmdCopyQueryPoolResults = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdCopyQueryPoolResults")); +// vkCmdPushConstants = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdPushConstants")); +// vkCmdBeginRenderPass = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdBeginRenderPass")); +// vkCmdNextSubpass = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdNextSubpass")); +// vkCmdEndRenderPass = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdEndRenderPass")); +// vkCmdExecuteCommands = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCmdExecuteCommands")); +// vkDestroySurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroySurfaceKHR")); +// vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSurfaceSupportKHR")); +// vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")); +// vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSurfaceFormatsKHR")); +// vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSurfacePresentModesKHR")); +// vkCreateSwapchainKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateSwapchainKHR")); +// vkDestroySwapchainKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroySwapchainKHR")); +// vkGetSwapchainImagesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetSwapchainImagesKHR")); +// vkAcquireNextImageKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkAcquireNextImageKHR")); +// vkQueuePresentKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueuePresentKHR")); + // vkGetPhysicalDeviceDisplayPropertiesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceDisplayPropertiesKHR")); + // vkGetPhysicalDeviceDisplayPlanePropertiesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR")); + // vkGetDisplayPlaneSupportedDisplaysKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDisplayPlaneSupportedDisplaysKHR")); + // vkGetDisplayModePropertiesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDisplayModePropertiesKHR")); + // vkCreateDisplayModeKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDisplayModeKHR")); + // vkGetDisplayPlaneCapabilitiesKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDisplayPlaneCapabilitiesKHR")); + // vkCreateDisplayPlaneSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDisplayPlaneSurfaceKHR")); + // vkCreateSharedSwapchainsKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateSharedSwapchainsKHR")); #ifdef VK_USE_PLATFORM_XLIB_KHR - // vkCreateXlibSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateXlibSurfaceKHR")); - // vkGetPhysicalDeviceXlibPresentationSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceXlibPresentationSupportKHR")); + // vkCreateXlibSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateXlibSurfaceKHR")); + // vkGetPhysicalDeviceXlibPresentationSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceXlibPresentationSupportKHR")); #endif #ifdef VK_USE_PLATFORM_XCB_KHR - // vkCreateXcbSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateXcbSurfaceKHR")); - // vkGetPhysicalDeviceXcbPresentationSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceXcbPresentationSupportKHR")); + // vkCreateXcbSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateXcbSurfaceKHR")); + // vkGetPhysicalDeviceXcbPresentationSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceXcbPresentationSupportKHR")); #endif #ifdef VK_USE_PLATFORM_WAYLAND_KHR - // vkCreateWaylandSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateWaylandSurfaceKHR")); - // vkGetPhysicalDeviceWaylandPresentationSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceWaylandPresentationSupportKHR")); + // vkCreateWaylandSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateWaylandSurfaceKHR")); + // vkGetPhysicalDeviceWaylandPresentationSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceWaylandPresentationSupportKHR")); #endif #ifdef VK_USE_PLATFORM_MIR_KHR - // vkCreateMirSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateMirSurfaceKHR")); - // vkGetPhysicalDeviceMirPresentationSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceMirPresentationSupportKHR")); + // vkCreateMirSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateMirSurfaceKHR")); + // vkGetPhysicalDeviceMirPresentationSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceMirPresentationSupportKHR")); #endif #ifdef VK_USE_PLATFORM_ANDROID_KHR - // vkCreateAndroidSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateAndroidSurfaceKHR")); + // vkCreateAndroidSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateAndroidSurfaceKHR")); #endif #ifdef VK_USE_PLATFORM_WIN32_KHR - // vkCreateWin32SurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateWin32SurfaceKHR")); - // vkGetPhysicalDeviceWin32PresentationSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceWin32PresentationSupportKHR")); + // vkCreateWin32SurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateWin32SurfaceKHR")); + // vkGetPhysicalDeviceWin32PresentationSupportKHR = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceWin32PresentationSupportKHR")); #endif #ifdef USE_DEBUG_EXTENTIONS - vkCreateDebugReportCallbackEXT = reinterpret_cast(dlsym(libvulkan, "vkCreateDebugReportCallbackEXT")); - vkDestroyDebugReportCallbackEXT = reinterpret_cast(dlsym(libvulkan, "vkDestroyDebugReportCallbackEXT")); - vkDebugReportMessageEXT = reinterpret_cast(dlsym(libvulkan, "vkDebugReportMessageEXT")); + vkCreateDebugReportCallbackEXT = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDebugReportCallbackEXT")); + vkDestroyDebugReportCallbackEXT = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyDebugReportCallbackEXT")); + vkDebugReportMessageEXT = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDebugReportMessageEXT")); #endif return SUPPORTED; } diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.h b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.h index 5b49408..27e715a 100644 --- a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.h +++ b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.h @@ -22,166 +22,166 @@ bool IsVulkanSupported(); extern PFN_vkCreateInstance vkCreateInstance; extern PFN_vkDestroyInstance vkDestroyInstance; extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; -extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; -extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; -extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; +//extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; +//extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; +//extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties; extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; -extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; -extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; +//extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; +//extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; -extern PFN_vkCreateDevice vkCreateDevice; -extern PFN_vkDestroyDevice vkDestroyDevice; -extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; -extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; -extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; -extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; -extern PFN_vkGetDeviceQueue vkGetDeviceQueue; -extern PFN_vkQueueSubmit vkQueueSubmit; -extern PFN_vkQueueWaitIdle vkQueueWaitIdle; -extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; -extern PFN_vkAllocateMemory vkAllocateMemory; -extern PFN_vkFreeMemory vkFreeMemory; -extern PFN_vkMapMemory vkMapMemory; -extern PFN_vkUnmapMemory vkUnmapMemory; -extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; -extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; -extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; -extern PFN_vkBindBufferMemory vkBindBufferMemory; -extern PFN_vkBindImageMemory vkBindImageMemory; -extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; -extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; -extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; -extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; -extern PFN_vkQueueBindSparse vkQueueBindSparse; -extern PFN_vkCreateFence vkCreateFence; -extern PFN_vkDestroyFence vkDestroyFence; -extern PFN_vkResetFences vkResetFences; -extern PFN_vkGetFenceStatus vkGetFenceStatus; -extern PFN_vkWaitForFences vkWaitForFences; -extern PFN_vkCreateSemaphore vkCreateSemaphore; -extern PFN_vkDestroySemaphore vkDestroySemaphore; -extern PFN_vkCreateEvent vkCreateEvent; -extern PFN_vkDestroyEvent vkDestroyEvent; -extern PFN_vkGetEventStatus vkGetEventStatus; -extern PFN_vkSetEvent vkSetEvent; -extern PFN_vkResetEvent vkResetEvent; -extern PFN_vkCreateQueryPool vkCreateQueryPool; -extern PFN_vkDestroyQueryPool vkDestroyQueryPool; -extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; -extern PFN_vkCreateBuffer vkCreateBuffer; -extern PFN_vkDestroyBuffer vkDestroyBuffer; -extern PFN_vkCreateBufferView vkCreateBufferView; -extern PFN_vkDestroyBufferView vkDestroyBufferView; -extern PFN_vkCreateImage vkCreateImage; -extern PFN_vkDestroyImage vkDestroyImage; -extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; -extern PFN_vkCreateImageView vkCreateImageView; -extern PFN_vkDestroyImageView vkDestroyImageView; -extern PFN_vkCreateShaderModule vkCreateShaderModule; -extern PFN_vkDestroyShaderModule vkDestroyShaderModule; -extern PFN_vkCreatePipelineCache vkCreatePipelineCache; -extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; -extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; -extern PFN_vkMergePipelineCaches vkMergePipelineCaches; -extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; -extern PFN_vkCreateComputePipelines vkCreateComputePipelines; -extern PFN_vkDestroyPipeline vkDestroyPipeline; -extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; -extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; -extern PFN_vkCreateSampler vkCreateSampler; -extern PFN_vkDestroySampler vkDestroySampler; -extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; -extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; -extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; -extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; -extern PFN_vkResetDescriptorPool vkResetDescriptorPool; -extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; -extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; -extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; -extern PFN_vkCreateFramebuffer vkCreateFramebuffer; -extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; -extern PFN_vkCreateRenderPass vkCreateRenderPass; -extern PFN_vkDestroyRenderPass vkDestroyRenderPass; -extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; -extern PFN_vkCreateCommandPool vkCreateCommandPool; -extern PFN_vkDestroyCommandPool vkDestroyCommandPool; -extern PFN_vkResetCommandPool vkResetCommandPool; -extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; -extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; -extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; -extern PFN_vkEndCommandBuffer vkEndCommandBuffer; -extern PFN_vkResetCommandBuffer vkResetCommandBuffer; -extern PFN_vkCmdBindPipeline vkCmdBindPipeline; -extern PFN_vkCmdSetViewport vkCmdSetViewport; -extern PFN_vkCmdSetScissor vkCmdSetScissor; -extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; -extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; -extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; -extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; -extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; -extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; -extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; -extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; -extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; -extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; -extern PFN_vkCmdDraw vkCmdDraw; -extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; -extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; -extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; -extern PFN_vkCmdDispatch vkCmdDispatch; -extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; -extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; -extern PFN_vkCmdCopyImage vkCmdCopyImage; -extern PFN_vkCmdBlitImage vkCmdBlitImage; -extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; -extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; -extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; -extern PFN_vkCmdFillBuffer vkCmdFillBuffer; -extern PFN_vkCmdClearColorImage vkCmdClearColorImage; -extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; -extern PFN_vkCmdClearAttachments vkCmdClearAttachments; -extern PFN_vkCmdResolveImage vkCmdResolveImage; -extern PFN_vkCmdSetEvent vkCmdSetEvent; -extern PFN_vkCmdResetEvent vkCmdResetEvent; -extern PFN_vkCmdWaitEvents vkCmdWaitEvents; -extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; -extern PFN_vkCmdBeginQuery vkCmdBeginQuery; -extern PFN_vkCmdEndQuery vkCmdEndQuery; -extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; -extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; -extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; -extern PFN_vkCmdPushConstants vkCmdPushConstants; -extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; -extern PFN_vkCmdNextSubpass vkCmdNextSubpass; -extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; -extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; - -// VK_KHR_surface -extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; -extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; -extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; -extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; -extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; - -// VK_KHR_swapchain -extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; -extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; -extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; -extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; -extern PFN_vkQueuePresentKHR vkQueuePresentKHR; - -// VK_KHR_display -extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR; -extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR; -extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR; -extern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR; -extern PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR; -extern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR; -extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; - -// VK_KHR_display_swapchain -extern PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR; +//extern PFN_vkCreateDevice vkCreateDevice; +//extern PFN_vkDestroyDevice vkDestroyDevice; +//extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; +//extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; +//extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; +//extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; +//extern PFN_vkGetDeviceQueue vkGetDeviceQueue; +//extern PFN_vkQueueSubmit vkQueueSubmit; +//extern PFN_vkQueueWaitIdle vkQueueWaitIdle; +//extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle; +//extern PFN_vkAllocateMemory vkAllocateMemory; +//extern PFN_vkFreeMemory vkFreeMemory; +//extern PFN_vkMapMemory vkMapMemory; +//extern PFN_vkUnmapMemory vkUnmapMemory; +//extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; +//extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; +//extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment; +//extern PFN_vkBindBufferMemory vkBindBufferMemory; +//extern PFN_vkBindImageMemory vkBindImageMemory; +//extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; +//extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; +//extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements; +//extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties; +//extern PFN_vkQueueBindSparse vkQueueBindSparse; +//extern PFN_vkCreateFence vkCreateFence; +//extern PFN_vkDestroyFence vkDestroyFence; +//extern PFN_vkResetFences vkResetFences; +//extern PFN_vkGetFenceStatus vkGetFenceStatus; +//extern PFN_vkWaitForFences vkWaitForFences; +//extern PFN_vkCreateSemaphore vkCreateSemaphore; +//extern PFN_vkDestroySemaphore vkDestroySemaphore; +//extern PFN_vkCreateEvent vkCreateEvent; +//extern PFN_vkDestroyEvent vkDestroyEvent; +//extern PFN_vkGetEventStatus vkGetEventStatus; +//extern PFN_vkSetEvent vkSetEvent; +//extern PFN_vkResetEvent vkResetEvent; +//extern PFN_vkCreateQueryPool vkCreateQueryPool; +//extern PFN_vkDestroyQueryPool vkDestroyQueryPool; +//extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults; +//extern PFN_vkCreateBuffer vkCreateBuffer; +//extern PFN_vkDestroyBuffer vkDestroyBuffer; +//extern PFN_vkCreateBufferView vkCreateBufferView; +//extern PFN_vkDestroyBufferView vkDestroyBufferView; +//extern PFN_vkCreateImage vkCreateImage; +//extern PFN_vkDestroyImage vkDestroyImage; +//extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; +//extern PFN_vkCreateImageView vkCreateImageView; +//extern PFN_vkDestroyImageView vkDestroyImageView; +//extern PFN_vkCreateShaderModule vkCreateShaderModule; +//extern PFN_vkDestroyShaderModule vkDestroyShaderModule; +//extern PFN_vkCreatePipelineCache vkCreatePipelineCache; +//extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache; +//extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData; +//extern PFN_vkMergePipelineCaches vkMergePipelineCaches; +//extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; +//extern PFN_vkCreateComputePipelines vkCreateComputePipelines; +//extern PFN_vkDestroyPipeline vkDestroyPipeline; +//extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout; +//extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; +//extern PFN_vkCreateSampler vkCreateSampler; +//extern PFN_vkDestroySampler vkDestroySampler; +//extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; +//extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; +//extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool; +//extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; +//extern PFN_vkResetDescriptorPool vkResetDescriptorPool; +//extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; +//extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets; +//extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; +//extern PFN_vkCreateFramebuffer vkCreateFramebuffer; +//extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer; +//extern PFN_vkCreateRenderPass vkCreateRenderPass; +//extern PFN_vkDestroyRenderPass vkDestroyRenderPass; +//extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity; +//extern PFN_vkCreateCommandPool vkCreateCommandPool; +//extern PFN_vkDestroyCommandPool vkDestroyCommandPool; +//extern PFN_vkResetCommandPool vkResetCommandPool; +//extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; +//extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers; +//extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer; +//extern PFN_vkEndCommandBuffer vkEndCommandBuffer; +//extern PFN_vkResetCommandBuffer vkResetCommandBuffer; +//extern PFN_vkCmdBindPipeline vkCmdBindPipeline; +//extern PFN_vkCmdSetViewport vkCmdSetViewport; +//extern PFN_vkCmdSetScissor vkCmdSetScissor; +//extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth; +//extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias; +//extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants; +//extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds; +//extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask; +//extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask; +//extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference; +//extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; +//extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; +//extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; +//extern PFN_vkCmdDraw vkCmdDraw; +//extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed; +//extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect; +//extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; +//extern PFN_vkCmdDispatch vkCmdDispatch; +//extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect; +//extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer; +//extern PFN_vkCmdCopyImage vkCmdCopyImage; +//extern PFN_vkCmdBlitImage vkCmdBlitImage; +//extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; +//extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer; +//extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer; +//extern PFN_vkCmdFillBuffer vkCmdFillBuffer; +//extern PFN_vkCmdClearColorImage vkCmdClearColorImage; +//extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage; +//extern PFN_vkCmdClearAttachments vkCmdClearAttachments; +//extern PFN_vkCmdResolveImage vkCmdResolveImage; +//extern PFN_vkCmdSetEvent vkCmdSetEvent; +//extern PFN_vkCmdResetEvent vkCmdResetEvent; +//extern PFN_vkCmdWaitEvents vkCmdWaitEvents; +//extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; +//extern PFN_vkCmdBeginQuery vkCmdBeginQuery; +//extern PFN_vkCmdEndQuery vkCmdEndQuery; +//extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool; +//extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp; +//extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; +//extern PFN_vkCmdPushConstants vkCmdPushConstants; +//extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; +//extern PFN_vkCmdNextSubpass vkCmdNextSubpass; +//extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass; +//extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands; +// +//// VK_KHR_surface +//extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; +//extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; +//extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; +//extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; +//extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; +// +//// VK_KHR_swapchain +//extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; +//extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; +//extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; +//extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; +//extern PFN_vkQueuePresentKHR vkQueuePresentKHR; +// +//// VK_KHR_display +//extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR; +//extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR; +//extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR; +//extern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR; +//extern PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR; +//extern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR; +//extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR; +// +//// VK_KHR_display_swapchain +//extern PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR; #ifdef VK_USE_PLATFORM_XLIB_KHR // VK_KHR_xlib_surface diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt index 6ed81f2..4629b39 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/AndInfo.kt @@ -8,6 +8,9 @@ import com.xyzshell.andinfo.libs.SensorInfo import com.xyzshell.andinfo.libs.BuildInfo import com.xyzshell.andinfo.libs.GpuInfo import com.xyzshell.andinfo.libs.InputInfo +import com.xyzshell.andinfo.libs.CameraInfo +import com.xyzshell.andinfo.libs.BluetoothInfo +import com.xyzshell.andinfo.libs.StorageInfo class AndInfo private constructor(private val applicationContext: Context) { @@ -34,6 +37,9 @@ class AndInfo private constructor(private val applicationContext: Context) { private val _build: BuildInfo private val _gpu: GpuInfo private val _input: InputInfo + private val _camera: CameraInfo + private val _bluetooth: BluetoothInfo + private val _storage: StorageInfo init { _cpu = CpuInfo() @@ -43,6 +49,9 @@ class AndInfo private constructor(private val applicationContext: Context) { _build = BuildInfo(applicationContext) _gpu = GpuInfo(applicationContext) _input = InputInfo(applicationContext) + _camera = CameraInfo(applicationContext) + _bluetooth = BluetoothInfo(applicationContext) + _storage = StorageInfo(applicationContext) } val cpu get() = _cpu @@ -52,6 +61,9 @@ class AndInfo private constructor(private val applicationContext: Context) { val build get() = _build val gpu get() = _gpu val input get() = _input + val camera get() = _camera + val bluetooth get() = _bluetooth + val storage get() = _storage val context get() = applicationContext diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BluetoothInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BluetoothInfo.kt new file mode 100644 index 0000000..fba915e --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/BluetoothInfo.kt @@ -0,0 +1,45 @@ +package com.xyzshell.andinfo.libs + +import android.Manifest +import android.annotation.SuppressLint +import android.bluetooth.BluetoothManager +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build + +class BluetoothInfo(private val context: Context) { + + private val bluetoothManager: BluetoothManager? = context.getSystemService( + BluetoothManager::class.java + ) + + @get:SuppressLint("MissingPermission") + val bluetoothAdapter by lazy { bluetoothManager?.adapter } + + @get:SuppressLint("MissingPermission") + val adapterName: String? + get() = bluetoothAdapter?.name + + @get:SuppressLint("HardwareIds", "MissingPermission") + val adapterMacAddress: String? + get() = bluetoothAdapter?.address + + @get:SuppressLint("MissingPermission") + val bondedDevices: List> + get() = bluetoothAdapter?.bondedDevices?.map { + Pair(it.name, it.address) + } ?: emptyList() + + val isBluetoothLeSupported: Boolean + get() = context.packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE) + + val requiredPermissions: Array + get() = buildList { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + add(Manifest.permission.BLUETOOTH_CONNECT) + } else { + add(Manifest.permission.BLUETOOTH) + add(Manifest.permission.BLUETOOTH_ADMIN) + } + }.toTypedArray() +} diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CameraInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CameraInfo.kt new file mode 100644 index 0000000..ad59989 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CameraInfo.kt @@ -0,0 +1,114 @@ +package com.xyzshell.andinfo.libs + +import android.Manifest +import android.content.Context +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager +import android.hardware.camera2.CameraMetadata +import android.os.Build +import android.os.Handler +import android.os.Looper +import com.xyzshell.andinfo.R +import com.xyzshell.andinfo.libs.camera.models.CameraCapability +import com.xyzshell.andinfo.libs.camera.models.CameraFacing +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.callbackFlow + +class CameraInfo(private val context: Context) { + + private val cameraManager: CameraManager? = context.getSystemService( + CameraManager::class.java + ) + + val cameraIds: List + get() = cameraManager?.cameraIdList?.toList() ?: emptyList() + + fun getCameraCharacteristics(cameraId: String): CameraCharacteristics? { + return cameraManager?.getCameraCharacteristics(cameraId) + } + + fun cameraIdsFlow() = cameraManager?.let { manager -> + callbackFlow { + val onCameraIdUpdated = { + trySend(manager.cameraIdList.toList()) + } + + val availabilityCallback = object : CameraManager.AvailabilityCallback() { + override fun onCameraAvailable(cameraId: String) { + onCameraIdUpdated() + } + + override fun onCameraUnavailable(cameraId: String) { + onCameraIdUpdated() + } + } + + manager.registerAvailabilityCallback( + availabilityCallback, Handler(Looper.getMainLooper()) + ) + + onCameraIdUpdated() + + awaitClose { + manager.unregisterAvailabilityCallback(availabilityCallback) + } + } + } + + fun getCameraFacing(characteristics: CameraCharacteristics): CameraFacing? { + return characteristics.get(CameraCharacteristics.LENS_FACING)?.let { + when (it) { + CameraMetadata.LENS_FACING_BACK -> CameraFacing.BACK + CameraMetadata.LENS_FACING_FRONT -> CameraFacing.FRONT + CameraMetadata.LENS_FACING_EXTERNAL -> CameraFacing.EXTERNAL + else -> null + } + } + } + + fun getPixelArraySize(characteristics: CameraCharacteristics): String? { + return characteristics.get(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE)?.toString() + } + + fun getSensorPhysicalSize(characteristics: CameraCharacteristics): String? { + return characteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE)?.toString() + } + + fun hasFlashUnit(characteristics: CameraCharacteristics): Boolean? { + return characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) + } + + fun getAvailableApertures(characteristics: CameraCharacteristics): FloatArray? { + return characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES) + } + + fun getAvailableCapabilities(characteristics: CameraCharacteristics): List { + val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) + return capabilities?.toList()?.mapNotNull { capability -> + when (capability) { + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE -> CameraCapability.BACKWARD_COMPATIBLE + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR -> CameraCapability.MANUAL_SENSOR + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING -> CameraCapability.MANUAL_POST_PROCESSING + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW -> CameraCapability.RAW + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING -> CameraCapability.PRIVATE_REPROCESSING + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS -> CameraCapability.READ_SENSOR_SETTINGS + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE -> CameraCapability.BURST_CAPTURE + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING -> CameraCapability.YUV_REPROCESSING + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT -> CameraCapability.DEPTH_OUTPUT + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO -> CameraCapability.CONSTRAINED_HIGH_SPEED_VIDEO + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CameraCapability.MOTION_TRACKING else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CameraCapability.LOGICAL_MULTI_CAMERA else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) CameraCapability.MONOCHROME else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) CameraCapability.SECURE_IMAGE_DATA else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) CameraCapability.SYSTEM_CAMERA else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) CameraCapability.OFFLINE_PROCESSING else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) CameraCapability.ULTRA_HIGH_RESOLUTION_SENSOR else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_REMOSAIC_REPROCESSING -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) CameraCapability.REMOSAIC_REPROCESSING else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) CameraCapability.DYNAMIC_RANGE_TEN_BIT else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) CameraCapability.STREAM_USE_CASE else null + CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_COLOR_SPACE_PROFILES -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) CameraCapability.COLOR_SPACE_PROFILES else null + else -> null + } + } ?: emptyList() + } +} diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/StorageInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/StorageInfo.kt new file mode 100644 index 0000000..844e5a3 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/StorageInfo.kt @@ -0,0 +1,92 @@ +package com.xyzshell.andinfo.libs + +import android.content.Context +import android.os.Environment +import android.os.StatFs +import com.xyzshell.andinfo.libs.storage.models.EncryptionType +import com.xyzshell.andinfo.utils.SystemProperties + +class StorageInfo(private val context: Context) { + + val internalStorageTotalSpace: Long + get() = StatFs(Environment.getDataDirectory().absolutePath).let { statFs -> + statFs.blockCountLong * statFs.blockSizeLong + } + + val internalStorageAvailableSpace: Long + get() = StatFs(Environment.getDataDirectory().absolutePath).let { statFs -> + statFs.availableBlocksLong * statFs.blockSizeLong + } + + val internalStorageUsedSpace: Long + get() = internalStorageTotalSpace - internalStorageAvailableSpace + + val isInternalStorageEncrypted: Boolean? + get() = when (SystemProperties.getString("ro.crypto.state", "unknown")) { + "encrypted" -> true + "unencrypted" -> false + else -> null + } + + val internalStorageEncryptionType: EncryptionType? + get() = when (SystemProperties.getString("ro.crypto.type", "unknown")) { + "none" -> EncryptionType.NONE + "block" -> EncryptionType.FDE + "file" -> EncryptionType.FBE + else -> null + } + + val externalStorageTotalSpace: Long? + get() = runCatching { + StatFs(Environment.getExternalStorageDirectory().absolutePath).let { statFs -> + statFs.blockCountLong * statFs.blockSizeLong + } + }.getOrNull() + + val externalStorageAvailableSpace: Long? + get() = runCatching { + StatFs(Environment.getExternalStorageDirectory().absolutePath).let { statFs -> + statFs.availableBlocksLong * statFs.blockSizeLong + } + }.getOrNull() + + val externalStorageUsedSpace: Long? + get() = externalStorageTotalSpace?.let { total -> + externalStorageAvailableSpace?.let { available -> + total - available + } + } + + val isExternalStorageEmulated: Boolean + get() = Environment.isExternalStorageEmulated() + + val isExternalStorageRemovable: Boolean + get() = Environment.isExternalStorageRemovable() + + val hasUpdatableApex: Boolean? + get() = SystemProperties.getBoolean("ro.apex.updatable") + + val usesSystemAsRoot: Boolean? + get() = SystemProperties.getBoolean("ro.build.system_root_image") + + val usesAb: Boolean? + get() = SystemProperties.getBoolean("ro.build.ab_update") + + val abOtaPartitions: Array? + get() = SystemProperties.getString("ro.product.ab_ota_partitions")?.split(",")?.toTypedArray() + + val usesDynamicPartitions: Boolean? + get() = SystemProperties.getBoolean("ro.boot.dynamic_partitions") + + val usesRetrofittedDynamicPartitions: Boolean? + get() = SystemProperties.getBoolean("ro.boot.dynamic_partitions_retrofit") + + val usesVirtualAb: Boolean? + get() = SystemProperties.getBoolean("ro.virtual_ab.enabled") + + val usesRetrofittedVirtualAb: Boolean? + get() = SystemProperties.getBoolean("ro.virtual_ab.retrofit") + + val usesCompressedVirtualAb: Boolean? + get() = SystemProperties.getBoolean("ro.virtual_ab.compression.enabled") +} diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/camera/models/CameraModels.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/camera/models/CameraModels.kt new file mode 100644 index 0000000..28d2731 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/camera/models/CameraModels.kt @@ -0,0 +1,31 @@ +package com.xyzshell.andinfo.libs.camera.models + +enum class CameraFacing { + BACK, + FRONT, + EXTERNAL +} + +enum class CameraCapability { + BACKWARD_COMPATIBLE, + MANUAL_SENSOR, + MANUAL_POST_PROCESSING, + RAW, + PRIVATE_REPROCESSING, + READ_SENSOR_SETTINGS, + BURST_CAPTURE, + YUV_REPROCESSING, + DEPTH_OUTPUT, + CONSTRAINED_HIGH_SPEED_VIDEO, + MOTION_TRACKING, + LOGICAL_MULTI_CAMERA, + MONOCHROME, + SECURE_IMAGE_DATA, + SYSTEM_CAMERA, + OFFLINE_PROCESSING, + ULTRA_HIGH_RESOLUTION_SENSOR, + REMOSAIC_REPROCESSING, + DYNAMIC_RANGE_TEN_BIT, + STREAM_USE_CASE, + COLOR_SPACE_PROFILES +} diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDevice.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDevice.kt index fcaf8d7..9b1cec5 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDevice.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDevice.kt @@ -2,10 +2,10 @@ package com.xyzshell.andinfo.libs.gpu.models data class VkPhysicalDevice( val apiVersion: VkVersion, - val driverVersion: Int, - val vendorId: Int, + val driverVersion: Long, + val vendorId: Long, val registeredVendorId: VkVendorId?, - val deviceId: Int, + val deviceId: Long, val deviceType: VkPhysicalDeviceType, val deviceName: String, ) diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDeviceType.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDeviceType.kt index 73b9b0a..e8fe3a1 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDeviceType.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkPhysicalDeviceType.kt @@ -1,6 +1,6 @@ package com.xyzshell.andinfo.libs.gpu.models -enum class VkPhysicalDeviceType(val value: Int) { +enum class VkPhysicalDeviceType(val value: Long) { OTHER(0), INTEGRATED_GPU(1), DISCRETE_GPU(2), @@ -9,6 +9,6 @@ enum class VkPhysicalDeviceType(val value: Int) { ; companion object { - fun fromValue(value: Int) = values().firstOrNull { it.value == value } + fun fromValue(value: Long) = values().firstOrNull { it.value == value } } } diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkVendorId.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkVendorId.kt index 1ca96d6..4a17500 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkVendorId.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/models/VkVendorId.kt @@ -1,6 +1,6 @@ package com.xyzshell.andinfo.libs.gpu.models -enum class VkVendorId(val id: Int) { +enum class VkVendorId(val id: Long) { KHRONOS(0x10001), VIV(0x10002), VSI(0x10003), @@ -12,6 +12,6 @@ enum class VkVendorId(val id: Int) { ; companion object { - fun fromId(id: Int) = values().firstOrNull { it.id == id } + fun fromId(id: Long) = values().firstOrNull { it.id == id } } } diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/utils/VkUtils.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/utils/VkUtils.kt index d73115f..0b8cc96 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/utils/VkUtils.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/gpu/utils/VkUtils.kt @@ -14,14 +14,14 @@ object VkUtils { fun addDevice( apiVersion: Long, driverVersion: Long, - vendorId: Int, - deviceId: Int, - deviceType: Int, + vendorId: Long, + deviceId: Long, + deviceType: Long, deviceName: String, ) = add( VkPhysicalDevice( apiVersion = VkVersion(apiVersion.toInt()), - driverVersion = driverVersion.toInt(), + driverVersion = driverVersion, vendorId = vendorId, registeredVendorId = com.xyzshell.andinfo.libs.gpu.models.VkVendorId.fromId(vendorId), deviceId = deviceId, diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/storage/models/EncryptionType.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/storage/models/EncryptionType.kt new file mode 100644 index 0000000..9328104 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/storage/models/EncryptionType.kt @@ -0,0 +1,7 @@ +package com.xyzshell.andinfo.libs.storage.models + +enum class EncryptionType { + NONE, + FDE, + FBE +} diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/utils/SystemProperties.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/utils/SystemProperties.kt new file mode 100644 index 0000000..d2e2a97 --- /dev/null +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/utils/SystemProperties.kt @@ -0,0 +1,196 @@ +package com.xyzshell.andinfo.utils + +import android.os.Build +import android.util.Log +import java.io.BufferedReader +import java.io.InputStreamReader +import java.util.regex.Pattern + +object SystemProperties { + private const val LOG_TAG = "SystemProperties" + + /** + * From system/libbase/parsebool.cpp + */ + private val YES_VALUES = setOf( + "1", + "y", + "yes", + "on", + "true", + ) + + /** + * From system/libbase/parsebool.cpp + */ + private val NO_VALUES = setOf( + "0", + "n", + "no", + "off", + "false", + ) + + private abstract class Provider { + /** + * Return whether or not the implementation works. + */ + abstract fun isValid(): Boolean + + /** + * Get a string property. + * Implementation must do everything possible to figure out if the property exists + * (empty string is considered existing). + * + * @param key The property key + * @return The property value or null if it doesn't exist + */ + abstract fun getString(key: String): String? + } + + @Suppress("PrivateApi") + private object SystemPropertiesReflectionProvider : Provider() { + private const val CLASS_NAME = "android.os.SystemProperties" + + private const val DEFAULT = "default" + private const val ALT_DEFAULT = "alt_default" + + private val systemPropertiesClass = runCatching { + Class.forName(CLASS_NAME) + }.onFailure { + Log.e(LOG_TAG, "Failed to get $CLASS_NAME", it) + }.getOrNull() + + private val _getMethod = runCatching { + systemPropertiesClass?.getMethod( + "get", String::class.java, String::class.java + ) + }.getOrNull() + private val getMethod get() = _getMethod!! + + override fun isValid() = listOf( + systemPropertiesClass, + _getMethod, + ).all { it != null } + + override fun getString(key: String): String? { + val key = when (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + true -> key + false -> key.take(31) + } + + val value = getMethod.invoke(systemPropertiesClass, key, DEFAULT) as String + val altValue = getMethod.invoke(systemPropertiesClass, key, ALT_DEFAULT) as String + + return value.takeIf { + // If both values stays the same when changing default value, something is set + // and the value didn't change between the calls + it == altValue + } ?: when (value == DEFAULT && altValue == ALT_DEFAULT) { + true -> null // Both are equal to the defaults + false -> { + // Let's just repeat the process, we checked at a bad time + getString(key) + } + } + } + } + + private object GetPropProvider : Provider() { + private const val GETPROP_EXECUTABLE_PATH = "/system/bin/getprop" + private val GETPROP_LINE_PATTERN = Pattern.compile("\\[(.*?)]: \\[(.*?)]") + + override fun isValid() = true + + override fun getString(key: String) = getProps()[key] + + fun getProps() = mutableMapOf().apply { + var process: Process? = null + + try { + process = ProcessBuilder() + .command(GETPROP_EXECUTABLE_PATH) + .redirectErrorStream(true) + .start() + + process?.let { p -> + BufferedReader(InputStreamReader(p.inputStream)).forEachLine { line -> + val matcher = GETPROP_LINE_PATTERN.matcher(line) + if (matcher.find()) { + matcher.group(1)?.let { key -> + this[key] = matcher.group(2) ?: "" + } + } + } + } + } catch (e: Exception) { + Log.e(LOG_TAG, "Failed to read system properties: $e") + } finally { + process?.destroy() + } + }.toMap() + } + + private object DummyProvider : Provider() { + override fun isValid() = true + + override fun getString(key: String) = null + } + + private val provider = listOf( + SystemPropertiesReflectionProvider, + GetPropProvider, + ).firstOrNull { + it.isValid() + } ?: run { + Log.e(LOG_TAG, "No working system properties provider found") + + DummyProvider + } + + fun getProps() = GetPropProvider.getProps() + + fun getString(key: String) = provider.getString(key) + + fun getString(key: String, default: String) = getString(key) ?: default + + fun getInt(key: String) = provider.getString(key)?.let { parseNumber(it, String::toIntOrNull) } + + fun getInt(key: String, default: Int) = getInt(key) ?: default + + fun getLong(key: String) = + provider.getString(key)?.let { parseNumber(it, String::toLongOrNull) } + + fun getLong(key: String, default: Long) = getLong(key) ?: default + + fun getBoolean(key: String) = getString(key)?.let { + when { + YES_VALUES.contains(it) -> true + NO_VALUES.contains(it) -> false + else -> null + } + } + + fun getBoolean(key: String, default: Boolean) = getBoolean(key) ?: default + + private inline fun parseNumber( + value: String, toTOrNull: String.(radix: Int) -> T? + ): T? { + val trimmedValue = value.trimStart() + + if (trimmedValue.isEmpty()) { + return null + } + + val isHex = trimmedValue.length > 2 + && trimmedValue[0] == '0' + && trimmedValue[1] in listOf('x', 'X') + + val radix = when (isHex) { + true -> 16 + false -> 10 + } + + return trimmedValue.toTOrNull(radix) + } +} diff --git a/myphoneinfo/andinfo/src/main/res/values/strings.xml b/myphoneinfo/andinfo/src/main/res/values/strings.xml new file mode 100644 index 0000000..d92a54d --- /dev/null +++ b/myphoneinfo/andinfo/src/main/res/values/strings.xml @@ -0,0 +1,70 @@ + + + 相机 + 显示相机信息 + %1$s 相机 + 朝向 + 像素阵列大小 + 传感器物理尺寸 + 有闪光灯 + 可用光圈 + 可用功能 + 后置 + 前置 + 外置 + 向后兼容 + 手动传感器 + 手动后期处理 + RAW + 私有再处理 + 读取传感器设置 + 连拍 + YUV 再处理 + 深度输出 + 受限高速视频 + 运动追踪 + 逻辑多相机 + 单色 + 安全图像数据 + 系统相机 + 离线处理 + 超高分辨率传感器 + 重镶嵌处理 + 动态范围十位 + 流用例 + 色彩空间配置文件 + + 蓝牙 + 显示蓝牙信息 + 适配器 + 名称 + MAC 地址 + 已配对设备 + 低功耗蓝牙 + 支持 + + 存储 + 显示存储信息 + 内部存储 + 总空间 + 可用空间 + 已用空间 + 已加密 + 加密类型 + 外部存储 + 已模拟 + 可移除 + 系统分区 + 有可更新的 APEX + 使用 system-as-root + 使用 A/B 更新 + A/B OTA 分区 + 使用动态分区 + 使用改造的动态分区 + 使用虚拟 A/B + 使用改造的虚拟 A/B + 使用压缩的虚拟 A/B + + 全盘加密 (FDE) + 文件级加密 (FBE) + diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/MainActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/MainActivity.kt index 69b87d6..e61db4b 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/MainActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/MainActivity.kt @@ -1,69 +1,50 @@ package com.xyzshell.myphoneinfo -import android.app.AlertDialog +import android.Manifest +import android.content.pm.PackageManager +import android.hardware.Sensor +import android.os.Build import android.os.Bundle +import android.text.format.Formatter import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.Card +import androidx.compose.material3.ListItem import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.xyzshell.myphoneinfo.ui.theme.MyAndriodInfoTheme import com.xyzshell.andinfo.AndInfo -import android.text.format.Formatter -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue -import android.hardware.Sensor -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material3.ListItem -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.material3.SheetState -import androidx.compose.material3.rememberStandardBottomSheetState -import androidx.compose.material3.BottomSheetScaffold -import androidx.compose.material3.SheetValue -import androidx.compose.material3.rememberBottomSheetScaffoldState -import androidx.compose.material3.BottomSheetDefaults -import androidx.compose.material3.BottomSheetScaffoldState -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.rememberBottomSheetScaffoldState -import kotlinx.coroutines.launch -import androidx.compose.runtime.rememberCoroutineScope -import com.xyzshell.andinfo.libs.SensorInfo import com.xyzshell.andinfo.libs.GpuInfo -import com.xyzshell.andinfo.libs.gpu.models.VkPhysicalDevice -import com.xyzshell.andinfo.libs.gpu.models.EglInformation -import androidx.compose.foundation.lazy.itemsIndexed -import android.os.Build import com.xyzshell.andinfo.libs.InputInfo import com.xyzshell.andinfo.libs.InputInfo.InputDeviceInfo -import androidx.compose.foundation.clickable +import com.xyzshell.andinfo.libs.SensorInfo +import com.xyzshell.myphoneinfo.ui.theme.MyAndriodInfoTheme + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -73,15 +54,27 @@ class MainActivity : ComponentActivity() { MyAndriodInfoTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> MainView( - name = "DevCheck Clone", + name = "DevCheck", modifier = Modifier.padding(innerPadding) ) } } } + requestBluetoothPermissionsIfNeeded() } - + private fun requestBluetoothPermissionsIfNeeded() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if (checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) + != PackageManager.PERMISSION_GRANTED + ) { + requestPermissions( + arrayOf(Manifest.permission.BLUETOOTH_CONNECT), + 1001 + ) + } + } + } } @Composable @@ -95,18 +88,25 @@ fun MainView(name: String, modifier: Modifier = Modifier) { var showGpuDialog by remember { mutableStateOf(false) } var showInputDevicesDialog by remember { mutableStateOf(false) } var selectedInputDevice by remember { mutableStateOf(null) } + var showCameraDialog by remember { mutableStateOf(false) } + var showBluetoothDialog by remember { mutableStateOf(false) } + var showStorageDialog by remember { mutableStateOf(false) } - Column (modifier){ + Column (modifier.fillMaxWidth().verticalScroll(rememberScrollState())){ Box(modifier = Modifier.fillMaxWidth()){ Text(text = name, Modifier.align(Alignment.Center)) } - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ Text("硬件:${AndInfo.instance.cpu.hardware()}") Text("核心数:${AndInfo.instance.cpu.cores.size}") Button(onClick = { showCpuDialog = true }) { Text("CPU 详情") } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ val memoryInfo = AndInfo.instance.device.getMemoryInfo() Text("设备型号:${AndInfo.instance.device.model}") Text("制造商:${AndInfo.instance.device.manufacturer}") @@ -115,7 +115,9 @@ fun MainView(name: String, modifier: Modifier = Modifier) { Button(onClick = { showDeviceDialog = true }) { Text("设备详情") } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ val defaultDisplayInfo = AndInfo.instance.display.getDefaultDisplayInfo() if (defaultDisplayInfo != null) { Text("显示器名称:${defaultDisplayInfo.name}") @@ -127,28 +129,36 @@ fun MainView(name: String, modifier: Modifier = Modifier) { } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ val allSensors = AndInfo.instance.sensor.getAllSensors() Text("传感器数量:${allSensors.size}") Text("支持动态传感器发现:${AndInfo.instance.sensor.isDynamicSensorDiscoverySupported()}") Button(onClick = { showSensorsDialog = true }) { Text("传感器列表") } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ Text("构建指纹:${AndInfo.instance.build.fingerprint}") Text("构建类型:${AndInfo.instance.build.type}") Text("Android 版本:${AndInfo.instance.build.versionRelease} (SDK ${AndInfo.instance.build.versionSdkInt})") Button(onClick = { showBuildDialog = true }) { Text("构建详情") } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ val gpuInfo = AndInfo.instance.gpu.getGpuInformation() Text("Vulkan 设备数量:${gpuInfo.vkPhysicalDevices?.size ?: 0}") Text("EGL 信息可用:${gpuInfo.eglInformation != null}") Button(onClick = { showGpuDialog = true }) { Text("GPU 详情") } } Spacer(modifier = Modifier.height(16.dp)) - Card(modifier= Modifier.fillMaxWidth().padding(10.dp)){ + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ val inputDevices = AndInfo.instance.input.getInputDevices() Text("输入设备数量:${inputDevices.size}") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -159,6 +169,36 @@ fun MainView(name: String, modifier: Modifier = Modifier) { } Button(onClick = { showInputDevicesDialog = true }) { Text("输入设备列表") } } + Spacer(modifier = Modifier.height(16.dp)) + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ + val cameraIds = AndInfo.instance.camera.cameraIds + Text("相机数量:${cameraIds.size}") + Button(onClick = { showCameraDialog = true }) { Text("相机详情") } + } + Spacer(modifier = Modifier.height(16.dp)) + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ + val bluetoothAdapter = AndInfo.instance.bluetooth.bluetoothAdapter + Text("蓝牙适配器可用:${bluetoothAdapter != null}") + bluetoothAdapter?.let { + Text("适配器名称:${AndInfo.instance.bluetooth.adapterName ?: "N/A"}") + Text("已配对设备:${AndInfo.instance.bluetooth.bondedDevices.size}") + } + Button(onClick = { showBluetoothDialog = true }) { Text("蓝牙详情") } + } + Spacer(modifier = Modifier.height(16.dp)) + Card(modifier= Modifier + .fillMaxWidth() + .padding(10.dp)){ + val storageInfo = AndInfo.instance.storage + Text("内部存储总空间:${Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageTotalSpace)}") + Text("内部存储可用空间:${Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageAvailableSpace)}") + Text("外部存储可用:${storageInfo.externalStorageTotalSpace != null}") + Button(onClick = { showStorageDialog = true }) { Text("存储详情") } + } } if (showCpuDialog) { @@ -273,7 +313,8 @@ fun MainView(name: String, modifier: Modifier = Modifier) { headlineContent = { Text(sensor.name) }, supportingContent = { Text(sensor.stringType) }, trailingContent = { Text(sensor.vendor) }, - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .clickable { selectedSensor = sensor showSensorsDialog = false @@ -462,7 +503,8 @@ fun MainView(name: String, modifier: Modifier = Modifier) { ListItem( headlineContent = { Text(inputDevice.name) }, supportingContent = { Text("ID: ${inputDevice.id}, 供应商: ${inputDevice.vendorId}, 产品: ${inputDevice.productId}") }, - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .clickable { selectedInputDevice = inputDevice showInputDevicesDialog = false @@ -510,6 +552,134 @@ fun MainView(name: String, modifier: Modifier = Modifier) { } ) } + + if (showCameraDialog) { + val cameraInfo = AndInfo.instance.camera + val cameraIds = cameraInfo.cameraIds + AlertDialog( + onDismissRequest = { showCameraDialog = false }, + title = { Text(text = "相机详情") }, + text = { + LazyColumn { + if (cameraIds.isNotEmpty()) { + item { Text("相机数量: ${cameraIds.size}") } + items(cameraIds) { cameraId -> + val characteristics = cameraInfo.getCameraCharacteristics(cameraId) + characteristics?.let { + Column(modifier = Modifier.padding(start = 16.dp)) { + Text("相机 ID: $cameraId") + cameraInfo.getCameraFacing(it)?.let { facing -> + Text(" 朝向: $facing") + } + cameraInfo.getPixelArraySize(it)?.let { size -> + Text(" 像素阵列大小: $size") + } + cameraInfo.getSensorPhysicalSize(it)?.let { size -> + Text(" 传感器物理尺寸: $size") + } + cameraInfo.hasFlashUnit(it)?.let { hasFlash -> + Text(" 有闪光灯: $hasFlash") + } + cameraInfo.getAvailableApertures(it)?.let { apertures -> + Text(" 可用光圈: ${apertures.joinToString()}") + } + val capabilities = cameraInfo.getAvailableCapabilities(it) + if (capabilities.isNotEmpty()) { + Text(" 可用功能: ${capabilities.joinToString()}") + } + } + } + } + } else { + item { Text("无相机信息") } + } + } + }, + confirmButton = { + TextButton(onClick = { showCameraDialog = false }) { + Text("确认") + } + } + ) + } + + if (showBluetoothDialog) { + val bluetoothInfo = AndInfo.instance.bluetooth + AlertDialog( + onDismissRequest = { showBluetoothDialog = false }, + title = { Text(text = "蓝牙详情") }, + text = { + Column { + bluetoothInfo.bluetoothAdapter?.let { + Text("适配器名称: ${bluetoothInfo.adapterName ?: "N/A"}") + Text("MAC 地址: ${bluetoothInfo.adapterMacAddress ?: "N/A"}") + Text("已配对设备数量: ${bluetoothInfo.bondedDevices.size}") + bluetoothInfo.bondedDevices.forEach { (name, address) -> + Text(" - ${name ?: "未知设备"} ($address)") + } + } ?: run { + Text("蓝牙适配器不可用") + } + Text("支持低功耗蓝牙: ${bluetoothInfo.isBluetoothLeSupported}") + Text("所需权限: ${bluetoothInfo.requiredPermissions.joinToString()}") + } + }, + confirmButton = { + TextButton(onClick = { showBluetoothDialog = false }) { + Text("确认") + } + } + ) + } + + if (showStorageDialog) { + val storageInfo = AndInfo.instance.storage + AlertDialog( + onDismissRequest = { showStorageDialog = false }, + title = { Text(text = "存储详情") }, + text = { + LazyColumn { + item { Text("内部存储总空间: ${Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageTotalSpace)}") } + item { Text("内部存储可用空间: ${Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageAvailableSpace)}") } + item { Text("内部存储已用空间: ${Formatter.formatFileSize(AndInfo.instance.context, storageInfo.internalStorageUsedSpace)}") } + storageInfo.isInternalStorageEncrypted?.let { item { Text("内部存储已加密: $it") } } + storageInfo.internalStorageEncryptionType?.let { item { Text("内部存储加密类型: $it") } } + + item { Spacer(modifier = Modifier.height(8.dp)) } + + storageInfo.externalStorageTotalSpace?.let { total -> + item { Text("外部存储总空间: ${Formatter.formatFileSize(AndInfo.instance.context, total)}") } + } ?: item { Text("外部存储总空间: 不可用") } + storageInfo.externalStorageAvailableSpace?.let { available -> + item { Text("外部存储可用空间: ${Formatter.formatFileSize(AndInfo.instance.context, available)}") } + } ?: item { Text("外部存储可用空间: 不可用") } + storageInfo.externalStorageUsedSpace?.let { used -> + item { Text("外部存储已用空间: ${Formatter.formatFileSize(AndInfo.instance.context, used)}") } + } ?: item { Text("外部存储已用空间: 不可用") } + + item { Text("外部存储是否模拟: ${storageInfo.isExternalStorageEmulated}") } + item { Text("外部存储是否可移除: ${storageInfo.isExternalStorageRemovable}") } + + item { Spacer(modifier = Modifier.height(8.dp)) } + + storageInfo.hasUpdatableApex?.let { item { Text("有可更新的 APEX: $it") } } + storageInfo.usesSystemAsRoot?.let { item { Text("使用 System-as-Root: $it") } } + storageInfo.usesAb?.let { item { Text("使用 A/B 更新: $it") } } + storageInfo.abOtaPartitions?.let { item { Text("A/B OTA 分区: ${it.joinToString()}") } } + storageInfo.usesDynamicPartitions?.let { item { Text("使用动态分区: $it") } } + storageInfo.usesRetrofittedDynamicPartitions?.let { item { Text("使用改造的动态分区: $it") } } + storageInfo.usesVirtualAb?.let { item { Text("使用虚拟 A/B: $it") } } + storageInfo.usesRetrofittedVirtualAb?.let { item { Text("使用改造的虚拟 A/B: $it") } } + storageInfo.usesCompressedVirtualAb?.let { item { Text("使用压缩虚拟 A/B: $it") } } + } + }, + confirmButton = { + TextButton(onClick = { showStorageDialog = false }) { + Text("确认") + } + } + ) + } }