android: Update gradle layer build to use cmake
diff --git a/build-android/cmake/README.md b/build-android/cmake/README.md
new file mode 100644
index 0000000..70f68cd
--- /dev/null
+++ b/build-android/cmake/README.md
@@ -0,0 +1,40 @@
+Build Validation Layers with Android CMake
+=========================================
+Gradle's CMake library project in this directory builds layers into AAR;
+the project could be directly added into application's gradle projects
+
+Pre-requirements
+----------------
+Build ShaderC binary
+- Building from Github Repo source
+1. cd android-build
+2. ./update_external_sources_android.sh
+3. ./android-generate.sh
+
+Extra Steps if building from NDK's source tree
+```
+ cd ${your ANDROID_NDK_ROOT}/sources/third_party/shaderc
+ ndk-build APP_ABI=armeabi-v7a APP_STL=gnustl_static NDK_TOOLCHAIN_VERSION=clang NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk libshaderc_combined
+```
+
+Adding layer module into Android Studio application project
+--------------------------------------------------------
+1. app's settings.gradle, add
+```java
+ include ':layerLib'
+ project(':layerLib').projectDir = new File('/path/to/cmake/layerlib')
+```
+2. app's build.gradle:
+```java
+dependencies {
+ // force debug layer lib for packing
+ compile project(path: ':layerlib', configuration: 'debug')
+}
+```
+BUILD_IN_NDK variable in layerlib/CMakeLists.txt could detect whether the source is
+from NDK or github repo clone, and would configure the file paths accordingly
+
+Tested
+-----
+ Build on Mac OS, Nexus 5X test phone. Equvilaent build scripts for Windows OS are at the same directory.
+
diff --git a/build-android/cmake/layerlib/CMakeLists.txt b/build-android/cmake/layerlib/CMakeLists.txt
new file mode 100644
index 0000000..f7c27e8
--- /dev/null
+++ b/build-android/cmake/layerlib/CMakeLists.txt
@@ -0,0 +1,128 @@
+cmake_minimum_required(VERSION 3.4.1)
+
+# Validation layers could be built with code from
+# github repo OR
+# ndk's snapshot
+# The file structure for glslang spir-V is different, adding BUILD_IN_NDK variable
+set(BUILD_IN_NDK OFF)
+if (CMAKE_CURRENT_SOURCE_DIR MATCHES "sources/third_party/vulkan/src")
+ set(BUILD_IN_NDK ON)
+endif()
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror \
+ -Wno-unused-function -Wno-unused-const-variable \
+ -Wno-c++98-compat-pedantic -DVK_PROTOTYPES \
+ -DVK_USE_PLATFORM_ANDROID_KHR")
+
+if (BUILD_IN_NDK)
+ # NDK directory structure:
+ # $ANDROID_NDK/sources/third_party/
+ # vulkan/src
+ # shaderc/third_party (for glslang & spirv-tools )
+ # this build uses combined lib libshaderc.a for libSPIRV-Tools.a purpose
+ get_filename_component(SRC_DIR
+ "${ANDROID_NDK}/sources/third_party/vulkan/src" ABSOLUTE)
+ get_filename_component(EXTERNAL_DIR
+ "${SRC_DIR}/../../shaderc/third_party" ABSOLUTE)
+ get_filename_component(SPIRV_LIB
+ "${SRC_DIR}/../../shaderc/libs/${ANDROID_STL}/${ANDROID_ABI}/libshaderc.a"
+ ABSOLUTE)
+else ()
+ # github directory structure:
+ # ${SRC_DIR}
+ # ${SRC_DIR}/build-android/external (for glslang, spirv-tools & shaderc )
+ get_filename_component(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../.." ABSOLUTE)
+ set(EXTERNAL_DIR "${SRC_DIR}/build-android/external")
+ set(SPIRV_LIB
+ "${EXTERNAL_DIR}/shaderc/android_test/obj/local/${ANDROID_ABI}/libSPIRV-Tools.a")
+endif()
+set(COMMON_DIR "${SRC_DIR}/build-android/generated")
+
+set(CMAKE_CXX_clone "${CMAKE_CXX_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_ANDROID_KHR \
+ -fvisibility=hidden")
+include_directories(${SRC_DIR}/include
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/layers
+ ${SRC_DIR}/loader)
+add_library(layer_utils STATIC
+ ${SRC_DIR}/layers/vk_layer_config.cpp
+ ${SRC_DIR}/layers/vk_layer_extension_utils.cpp
+ ${SRC_DIR}/layers/vk_layer_utils.cpp
+ ${SRC_DIR}/layers/vk_format_utils.cpp)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_clone}")
+
+# assume shaderc already built externally
+add_library(SPIRV-Tools-prebuilt STATIC IMPORTED)
+set_target_properties(SPIRV-Tools-prebuilt PROPERTIES IMPORTED_LOCATION
+ ${SPIRV_LIB})
+
+# build core_validation layers which including shader validation
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_ANDROID_KHR \
+ -fvisibility=hidden")
+add_library(VkLayer_core_validation SHARED
+ ${SRC_DIR}/layers/core_validation.cpp
+ ${SRC_DIR}/layers/descriptor_sets.cpp
+ ${SRC_DIR}/layers/buffer_validation.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_core_validation PRIVATE
+ ${SRC_DIR}/include
+ ${SRC_DIR}/layers
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/loader
+ ${EXTERNAL_DIR}/glslang
+ ${EXTERNAL_DIR}/spirv-tools/include)
+target_link_libraries(VkLayer_core_validation PRIVATE
+ log layer_utils SPIRV-Tools-prebuilt)
+
+add_library(VkLayer_parameter_validation SHARED
+ ${SRC_DIR}/layers/parameter_validation.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_parameter_validation PRIVATE
+ ${SRC_DIR}/include
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/layers
+ ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_parameter_validation PRIVATE log layer_utils)
+
+add_library(VkLayer_object_tracker SHARED
+ ${SRC_DIR}/layers/object_tracker.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_object_tracker PRIVATE
+ ${SRC_DIR}/include
+ ${SRC_DIR}/layers
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_object_tracker PRIVATE log layer_utils)
+
+add_library(VkLayer_threading SHARED
+ ${SRC_DIR}/layers/threading.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_threading PRIVATE
+ ${SRC_DIR}/include
+ ${SRC_DIR}/layers
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_threading PRIVATE log layer_utils)
+
+add_library(VkLayer_unique_objects SHARED
+ ${SRC_DIR}/layers/unique_objects.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_unique_objects PRIVATE
+ ${SRC_DIR}/include
+ ${SRC_DIR}/layers
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_unique_objects PRIVATE log layer_utils)
+
+add_library(VkLayer_swapchain SHARED
+ ${SRC_DIR}/layers/swapchain.cpp
+ ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_swapchain PRIVATE
+ ${SRC_DIR}/include
+ ${SRC_DIR}/layers
+ ${COMMON_DIR}/include
+ ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_swapchain PRIVATE log layer_utils)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_clone}")
diff --git a/build-android/cmake/layerlib/build.gradle b/build-android/cmake/layerlib/build.gradle
new file mode 100644
index 0000000..efa8472
--- /dev/null
+++ b/build-android/cmake/layerlib/build.gradle
@@ -0,0 +1,39 @@
+apply plugin: 'com.android.library'
+
+android {
+ /*
+ * we are interested in only the debug version of layers, so ONLY publish debug version
+ * library, which will enforce building ONLY debug version, and packing only the debug
+ * version of layers. The document is at:
+ * https://developer.android.com/studio/build/build-variants.html
+ * http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication
+ */
+ publishNonDefault true
+
+ compileSdkVersion 25
+ buildToolsVersion "25.0.2"
+
+ defaultConfig {
+ minSdkVersion 24
+ targetSdkVersion 24
+ versionCode 1
+ versionName "1.0"
+ ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
+ externalNativeBuild {
+ cmake.arguments '-DANDROID_TOOLCHAIN=clang',
+ '-DANDROID_STL=gnustl_static',
+ '-DANDROID_PLATFORM=android-24'
+ }
+ }
+ externalNativeBuild {
+ cmake.path 'CMakeLists.txt'
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'),
+ 'proguard-rules.pro'
+ }
+ }
+}
+
diff --git a/build-android/cmake/layerlib/proguard-rules.pro b/build-android/cmake/layerlib/proguard-rules.pro
new file mode 100644
index 0000000..b41fe70
--- /dev/null
+++ b/build-android/cmake/layerlib/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${ANDROID_SDK}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/build-android/cmake/layerlib/src/main/AndroidManifest.xml b/build-android/cmake/layerlib/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..78c3704
--- /dev/null
+++ b/build-android/cmake/layerlib/src/main/AndroidManifest.xml
@@ -0,0 +1,9 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.layerlib">
+
+ <application android:allowBackup="true" android:label="@string/app_name"
+ android:supportsRtl="true">
+
+ </application>
+
+</manifest>
diff --git a/build-android/cmake/layerlib/src/main/res/values/strings.xml b/build-android/cmake/layerlib/src/main/res/values/strings.xml
new file mode 100644
index 0000000..66f8389
--- /dev/null
+++ b/build-android/cmake/layerlib/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">Layer Library</string>
+</resources>