From 839fc84d6916dc21148a31047fec35e6c348086d Mon Sep 17 00:00:00 2001 From: saschawillems Date: Wed, 18 Jan 2017 19:21:40 +0100 Subject: [PATCH] Moved android_app object to global scope --- base/VulkanModelLoader.hpp | 8 ++---- base/vulkanTextureLoader.hpp | 16 ++--------- base/vulkanandroid.cpp | 54 +++++++++++++++++++----------------- base/vulkanandroid.h | 4 +++ base/vulkanexamplebase.cpp | 5 +--- base/vulkanexamplebase.h | 3 +- vulkanExamples.sln | 1 + 7 files changed, 40 insertions(+), 51 deletions(-) diff --git a/base/VulkanModelLoader.hpp b/base/VulkanModelLoader.hpp index 90d3ac40..07111461 100644 --- a/base/VulkanModelLoader.hpp +++ b/base/VulkanModelLoader.hpp @@ -87,10 +87,6 @@ namespace vks uint32_t indexCount = 0; uint32_t vertexCount = 0; -#if defined(__ANDROID__) - AAssetManager* assetManager = nullptr; -#endif - /** @brief Stores vertex and index base and counts for each part of a model */ struct ModelPart { uint32_t vertexBase; @@ -121,7 +117,7 @@ namespace vks } } - boolean loadFromFile( + bool loadFromFile( vk::VulkanDevice *device, const std::string& filename, vks::VertexLayout layout, @@ -139,7 +135,7 @@ namespace vks // Meshes are stored inside the apk on Android (compressed) // So they need to be loaded via the asset manager - AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_STREAMING); + AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING); assert(asset); size_t size = AAsset_getLength(asset); diff --git a/base/vulkanTextureLoader.hpp b/base/vulkanTextureLoader.hpp index 78424b70..2f05ebe4 100644 --- a/base/vulkanTextureLoader.hpp +++ b/base/vulkanTextureLoader.hpp @@ -67,10 +67,6 @@ namespace vkTools VkCommandBuffer cmdBuffer; VkCommandPool cmdPool; public: -#if defined(__ANDROID__) - AAssetManager* assetManager = nullptr; -#endif - /** * Default constructor * @@ -126,11 +122,9 @@ namespace vkTools VkImageLayout imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { #if defined(__ANDROID__) - assert(assetManager != nullptr); - // Textures are stored inside the apk on Android (compressed) // So they need to be loaded via the asset manager - AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_STREAMING); + AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING); assert(asset); size_t size = AAsset_getLength(asset); assert(size > 0); @@ -457,11 +451,9 @@ namespace vkTools VkImageLayout imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { #if defined(__ANDROID__) - assert(assetManager != nullptr); - // Textures are stored inside the apk on Android (compressed) // So they need to be loaded via the asset manager - AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_STREAMING); + AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING); assert(asset); size_t size = AAsset_getLength(asset); assert(size > 0); @@ -680,11 +672,9 @@ namespace vkTools VkImageLayout imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { #if defined(__ANDROID__) - assert(assetManager != nullptr); - // Textures are stored inside the apk on Android (compressed) // So they need to be loaded via the asset manager - AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_STREAMING); + AAsset* asset = AAssetManager_open(androidApp->activity->assetManager, filename.c_str(), AASSET_MODE_STREAMING); assert(asset); size_t size = AAsset_getLength(asset); assert(size > 0); diff --git a/base/vulkanandroid.cpp b/base/vulkanandroid.cpp index a0a27822..0a503c9e 100644 --- a/base/vulkanandroid.cpp +++ b/base/vulkanandroid.cpp @@ -9,8 +9,10 @@ #include "vulkanandroid.h" #if defined(__ANDROID__) - #include - #include + #include + #include + +android_app* androidApp; PFN_vkCreateInstance vkCreateInstance; PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; @@ -122,40 +124,40 @@ void *libVulkan; // Dynamically load Vulkan library and base function pointers bool loadVulkanLibrary() { - __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading libvulkan.so...\n"); + __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading libvulkan.so...\n"); - // Load vulkan library - libVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); - if (!libVulkan) - { - __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Could not load vulkan library : %s!\n", dlerror()); - return false; - } + // Load vulkan library + libVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); + if (!libVulkan) + { + __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Could not load vulkan library : %s!\n", dlerror()); + return false; + } - // Load base function pointers - vkEnumerateInstanceExtensionProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceExtensionProperties")); - vkEnumerateInstanceLayerProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceLayerProperties")); - vkCreateInstance = reinterpret_cast(dlsym(libVulkan, "vkCreateInstance")); - vkGetInstanceProcAddr = reinterpret_cast(dlsym(libVulkan, "vkGetInstanceProcAddr")); + // Load base function pointers + vkEnumerateInstanceExtensionProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceExtensionProperties")); + vkEnumerateInstanceLayerProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceLayerProperties")); + vkCreateInstance = reinterpret_cast(dlsym(libVulkan, "vkCreateInstance")); + vkGetInstanceProcAddr = reinterpret_cast(dlsym(libVulkan, "vkGetInstanceProcAddr")); vkGetDeviceProcAddr = reinterpret_cast(dlsym(libVulkan, "vkGetDeviceProcAddr")); - return true; + return true; } // Load instance based Vulkan function pointers void loadVulkanFunctions(VkInstance instance) { - __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading instance based function pointers...\n"); + __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading instance based function pointers...\n"); - vkEnumeratePhysicalDevices = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices")); - vkGetPhysicalDeviceProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties")); - vkEnumerateDeviceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties")); - vkEnumerateDeviceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties")); - vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties")); - vkGetPhysicalDeviceFeatures = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures")); - vkCreateDevice = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDevice")); - vkGetPhysicalDeviceFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties")); - vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties")); + vkEnumeratePhysicalDevices = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices")); + vkGetPhysicalDeviceProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties")); + vkEnumerateDeviceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties")); + vkEnumerateDeviceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties")); + vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties")); + vkGetPhysicalDeviceFeatures = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures")); + vkCreateDevice = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDevice")); + vkGetPhysicalDeviceFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties")); + vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties")); vkCmdPipelineBarrier = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier")); vkCreateShaderModule = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateShaderModule")); diff --git a/base/vulkanandroid.h b/base/vulkanandroid.h index 66adcaf5..828a8ce6 100644 --- a/base/vulkanandroid.h +++ b/base/vulkanandroid.h @@ -23,6 +23,7 @@ #if defined(__ANDROID__) #include +#include #include // Missing from the NDK @@ -35,6 +36,9 @@ namespace std } } +// Global reference to android application object +extern android_app* androidApp; + #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "vulkanExample", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "vulkanExample", __VA_ARGS__)) #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "vulkanExample", __VA_ARGS__)) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index b5425f52..cdcece9a 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -173,9 +173,6 @@ void VulkanExampleBase::prepare() setupFrameBuffer(); // Create a simple texture loader class textureLoader = new vkTools::VulkanTextureLoader(vulkanDevice, queue, cmdPool); -#if defined(__ANDROID__) - textureLoader->assetManager = androidApp->activity->assetManager; -#endif if (enableTextOverlay) { // Load the text rendering shaders @@ -1101,7 +1098,7 @@ void VulkanExampleBase::handleAppCommand(android_app * app, int32_t cmd) break; case APP_CMD_INIT_WINDOW: LOGD("APP_CMD_INIT_WINDOW"); - if (vulkanExample->androidApp->window != NULL) + if (androidApp->window != NULL) { vulkanExample->initVulkan(); vulkanExample->initSwapchain(); diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index 09124154..1d6e17e0 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -188,7 +188,6 @@ public: HWND window; HINSTANCE windowInstance; #elif defined(__ANDROID__) - android_app* androidApp; // true if application has focused, false if moved to background bool focused = false; #elif defined(__linux__) @@ -359,7 +358,7 @@ void android_main(android_app* state) \ state->userData = vulkanExample; \ state->onAppCmd = VulkanExample::handleAppCommand; \ state->onInputEvent = VulkanExample::handleAppInput; \ - vulkanExample->androidApp = state; \ + androidApp = state; \ vulkanExample->renderLoop(); \ delete(vulkanExample); \ } diff --git a/vulkanExamples.sln b/vulkanExamples.sln index feaa06b2..1427c4ae 100644 --- a/vulkanExamples.sln +++ b/vulkanExamples.sln @@ -90,6 +90,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Base", "Base", "{09B9A54B-F base\vulkanheightmap.hpp = base\vulkanheightmap.hpp base\VulkanInitializers.hpp = base\VulkanInitializers.hpp base\vulkanMeshLoader.hpp = base\vulkanMeshLoader.hpp + base\VulkanModelLoader.hpp = base\VulkanModelLoader.hpp base\vulkanscene.hpp = base\vulkanscene.hpp base\vulkanswapchain.hpp = base\vulkanswapchain.hpp base\vulkantextoverlay.hpp = base\vulkantextoverlay.hpp