diff --git a/base/vulkantools.cpp b/base/vulkantools.cpp index 8bdd9135..492cf7d0 100644 --- a/base/vulkantools.cpp +++ b/base/vulkantools.cpp @@ -8,10 +8,6 @@ #include "vulkantools.h" -#ifdef __ANDROID__ -#include "vulkanandroid.h" -#endif - namespace vkTools { @@ -301,6 +297,37 @@ namespace vkTools return (char*)shader_code; } +#if defined(__ANDROID__) + // Android shaders are stored as assets in the apk + // So they need to be loaded via the asset manager + VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage) + { + // Load shader from compressed asset + AAsset* asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_STREAMING); + assert(asset); + size_t size = AAsset_getLength(asset); + assert(size > 0); + + char *shaderCode = new char[size]; + AAsset_read(asset, shaderCode, size); + AAsset_close(asset); + + VkShaderModule shaderModule; + VkShaderModuleCreateInfo moduleCreateInfo; + VkResult err; + + moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + moduleCreateInfo.pNext = NULL; + + moduleCreateInfo.codeSize = size; + moduleCreateInfo.pCode = (uint32_t*)shaderCode; + moduleCreateInfo.flags = 0; + err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule); + assert(!err); + + return shaderModule; + } +#else VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage) { size_t size = 0; @@ -322,7 +349,7 @@ namespace vkTools return shaderModule; } - +#endif VkShaderModule loadShaderGLSL(const char *fileName, VkDevice device, VkShaderStageFlagBits stage) { diff --git a/base/vulkantools.h b/base/vulkantools.h index 5f76199f..6c7f8c75 100644 --- a/base/vulkantools.h +++ b/base/vulkantools.h @@ -20,11 +20,13 @@ #include #include #include -#ifdef _WIN32 +#if defined(_WIN32) #include #include #include -#else +#elif defined(__ANDROID__) +#include "vulkanandroid.h" +#include #endif // Custom define for better code readability @@ -69,8 +71,14 @@ namespace vkTools std::string readTextFile(const char *fileName); // Load a binary file into a buffer (e.g. SPIR-V) char *readBinaryFile(const char *filename, size_t *psize); + // Load a SPIR-V shader +#if defined(__ANDROID__) + VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage); +#else VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); +#endif + // Load a GLSL shader // Note : Only for testing purposes, support for directly feeding GLSL shaders into Vulkan // may be dropped at some point