Merge remote-tracking branch 'aosp/Vulkan-ValidationLayers-upstream-master' into 20181031-merge-vulkan_update
Change-Id: Ib0b60317d7438a2fb6408162098bc839656d2f54
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..c948812
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,2 @@
+# Leave this Android.mk empty, deleting it unmasks
+# invalid Android.mks in subdirectories.
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..3c65815
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,170 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as
+defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner
+that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that
+control, are controlled by, or are under common control with that entity. For the
+purposes of this definition, "control" means (i) the power, direct or indirect, to
+cause the direction or management of such entity, whether by contract or otherwise,
+or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or
+(iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions
+granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not
+limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included in or
+attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based
+on (or derived from) the Work and for which the editorial revisions, annotations,
+elaborations, or other modifications represent, as a whole, an original work of
+authorship. For the purposes of this License, Derivative Works shall not include works
+that remain separable from, or merely link (or bind by name) to the interfaces of, the
+Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the
+Work and any modifications or additions to that Work or Derivative Works thereof, that
+is intentionally submitted to Licensor for inclusion in the Work by the copyright owner
+or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.
+For the purposes of this definition, "submitted" means any form of electronic, verbal,
+or written communication sent to the Licensor or its representatives, including but not
+limited to communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose
+of discussing and improving the Work, but excluding communication that is conspicuously
+marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a
+Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each
+Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
+royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each
+Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
+royalty-free, irrevocable (except as stated in this section) patent license to make,
+have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such
+license applies only to those patent claims licensable by such Contributor that are
+necessarily infringed by their Contribution(s) alone or by combination of their
+Contribution(s) with the Work to which such Contribution(s) was submitted. If You
+institute patent litigation against any entity (including a cross-claim or counterclaim
+in a lawsuit) alleging that the Work or a Contribution incorporated within the Work
+constitutes direct or contributory patent infringement, then any patent licenses granted
+to You under this License for that Work shall terminate as of the date such litigation
+is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative
+Works thereof in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this
+License; and
+You must cause any modified files to carry prominent notices stating that You changed
+the files; and
+You must retain, in the Source form of any Derivative Works that You distribute, all
+copyright, patent, trademark, and attribution notices from the Source form of the Work,
+excluding those notices that do not pertain to any part of the Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the attribution
+notices contained within such NOTICE file, excluding those notices that do not pertain
+to any part of the Derivative Works, in at least one of the following places: within a
+NOTICE text file distributed as part of the Derivative Works; within the Source form or
+documentation, if provided along with the Derivative Works; or, within a display
+generated by the Derivative Works, if and wherever such third-party notices normally
+appear. The contents of the NOTICE file are for informational purposes only and do not
+modify the License. You may add Your own attribution notices within Derivative Works
+that You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as modifying
+the License.
+
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies with
+the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution
+intentionally submitted for inclusion in the Work by You to the Licensor shall be under
+the terms and conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of any
+separate license agreement you may have executed with Licensor regarding such
+Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names,
+trademarks, service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and reproducing the
+content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing,
+Licensor provides the Work (and each Contributor provides its Contributions) on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+ including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
+ MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
+ determining the appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort
+(including negligence), contract, or otherwise, unless required by applicable law (such
+as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor
+be liable to You for damages, including any direct, indirect, special, incidental, or
+consequential damages of any character arising as a result of this License or out of the
+use or inability to use the Work (including but not limited to damages for loss of
+goodwill, work stoppage, computer failure or malfunction, or any and all other
+commercial damages or losses), even if such Contributor has been advised of the
+possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or
+Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of
+support, warranty, indemnity, or other liability obligations and/or rights consistent
+with this License. However, in accepting such obligations, You may act only on Your own
+behalf and on Your sole responsibility, not on behalf of any other Contributor, and only
+if You agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your accepting
+any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: HOW TO APPLY THE APACHE LICENSE TO YOUR WORK
+To apply the Apache License to your work, attach the following boilerplate notice, with
+the fields enclosed by brackets "[]" replaced with your own identifying information.
+(Don't include the brackets!) The text should be enclosed in the appropriate comment
+syntax for the file format. We also recommend that a file or class name and description
+of purpose be included on the same "printed page" as the copyright notice for easier
+identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
diff --git a/build-android/android-generate.sh b/build-android/android-generate.sh
index c6b1bfb..e5bbfb5 100755
--- a/build-android/android-generate.sh
+++ b/build-android/android-generate.sh
@@ -20,7 +20,7 @@
rm -rf generated
mkdir -p generated/include generated/common
-HEADERS_REGISTRY_PATH=$dir/third_party/Vulkan-Headers/registry
+HEADERS_REGISTRY_PATH="$1"
echo HEADERS_REGISTRY_PATH defined as $HEADERS_REGISTRY_PATH
( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry $HEADERS_REGISTRY_PATH/vk.xml -scripts $HEADERS_REGISTRY_PATH vk_safe_struct.h )
@@ -57,7 +57,7 @@
echo No spirv-tools git_dir found, generating UUID for external_revision_generator.py
# Ensure uuidgen is installed, this should error if not found
- uuidgen --v
+ type uuidgen
uuidgen > $SPIRV_TOOLS_UUID;
cat $SPIRV_TOOLS_UUID;
diff --git a/build-android/build.py b/build-android/build.py
new file mode 100755
index 0000000..ab21c55
--- /dev/null
+++ b/build-android/build.py
@@ -0,0 +1,323 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import argparse
+import multiprocessing
+import os
+import shutil
+import subprocess
+import sys
+import time
+
+from subprocess import PIPE, STDOUT
+
+def install_file(file_name, src_dir, dst_dir):
+ src_file = os.path.join(src_dir, file_name)
+ dst_file = os.path.join(dst_dir, file_name)
+
+ print('Copying {} to {}...'.format(src_file, dst_file))
+ if os.path.isdir(src_file):
+ _install_dir(src_file, dst_file)
+ elif os.path.islink(src_file):
+ _install_symlink(src_file, dst_file)
+ else:
+ _install_file(src_file, dst_file)
+
+
+def _install_dir(src_dir, dst_dir):
+ parent_dir = os.path.normpath(os.path.join(dst_dir, '..'))
+ if not os.path.exists(parent_dir):
+ os.makedirs(parent_dir)
+ shutil.copytree(src_dir, dst_dir, symlinks=True)
+
+
+def _install_symlink(src_file, dst_file):
+ dirname = os.path.dirname(dst_file)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+ link_target = os.readlink(src_file)
+ os.symlink(link_target, dst_file)
+
+
+def _install_file(src_file, dst_file):
+ dirname = os.path.dirname(dst_file)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+ # copy2 is just copy followed by copystat (preserves file metadata).
+ shutil.copy2(src_file, dst_file)
+
+THIS_DIR = os.path.realpath(os.path.dirname(__file__))
+
+ALL_ARCHITECTURES = (
+ 'arm',
+ 'arm64',
+ 'mips',
+ 'mips64',
+ 'x86',
+ 'x86_64',
+)
+
+# According to vk_platform.h, armeabi is not supported for Vulkan
+# so remove it from the abis list.
+ALL_ABIS = (
+ 'armeabi-v7a',
+ 'arm64-v8a',
+ 'mips',
+ 'mips64',
+ 'x86',
+ 'x86_64',
+)
+
+def jobs_arg():
+ return '-j{}'.format(multiprocessing.cpu_count() * 2)
+
+def arch_to_abis(arch):
+ return {
+ 'arm': ['armeabi-v7a'],
+ 'arm64': ['arm64-v8a'],
+ 'mips': ['mips'],
+ 'mips64': ['mips64'],
+ 'x86': ['x86'],
+ 'x86_64': ['x86_64'],
+ }[arch]
+
+class ArgParser(argparse.ArgumentParser):
+ def __init__(self):
+ super(ArgParser, self).__init__()
+
+ self.add_argument(
+ '--out-dir', help='Directory to place temporary build files.',
+ type=os.path.realpath, default=os.path.join(THIS_DIR, 'out'))
+
+ self.add_argument(
+ '--arch', choices=ALL_ARCHITECTURES,
+ help='Architectures to build. Builds all if not present.')
+
+ self.add_argument('--installdir', dest='installdir', required=True,
+ help='Installation directory. Required.')
+
+ # The default for --dist-dir has to be handled after parsing all
+ # arguments because the default is derived from --out-dir. This is
+ # handled in run().
+ self.add_argument(
+ '--dist-dir', help='Directory to place the packaged artifact.',
+ type=os.path.realpath)
+
+
+def main():
+ print('THIS_DIR: %s' % THIS_DIR)
+ parser = ArgParser()
+ args = parser.parse_args()
+
+ arches = ALL_ARCHITECTURES
+ if args.arch is not None:
+ arches = [args.arch]
+
+ # Make paths absolute, and ensure directories exist.
+ installdir = os.path.abspath(args.installdir)
+
+ abis = []
+ for arch in arches:
+ abis.extend(arch_to_abis(arch))
+
+ shaderc_path = installdir + '/shaderc/android_test'
+ print('shaderc_path = %s' % shaderc_path)
+
+ ndk_dir = os.path.join(THIS_DIR, '../../../prebuilts/toolchain')
+
+ ndk_build = os.path.join(ndk_dir, 'ndk-build')
+ platforms_root = os.path.join(ndk_dir, 'platforms')
+ toolchains_root = os.path.join(ndk_dir, 'toolchains')
+ build_dir = installdir
+
+ print('installdir: %s' % installdir)
+ print('ndk_dir: %s' % ndk_dir)
+ print('ndk_build: %s' % ndk_build)
+ print('platforms_root: %s' % platforms_root)
+
+ compiler = 'clang'
+ stl = 'c++_static'
+ obj_out = os.path.join(THIS_DIR, stl, 'obj')
+ lib_out = os.path.join(THIS_DIR, 'jniLibs')
+
+ print('obj_out: %s' % obj_out)
+ print('lib_out: %s' % lib_out)
+
+ print('Constructing shaderc build tree...')
+ shaderc_root_dir = os.path.join(THIS_DIR, '../../shaderc')
+
+ print('Pulling in vulkan headers and layers...')
+ vulkan_root_dir = os.path.join(THIS_DIR, '../../vulkan-validation-layers')
+ vulkan_headers_root_dir = os.path.join(THIS_DIR, '../../vulkan-headers')
+
+ copies = [
+ {
+ 'source_dir': os.path.join(shaderc_root_dir, 'shaderc'),
+ 'dest_dir': 'third_party/shaderc',
+ 'files': [
+ 'Android.mk', 'libshaderc/Android.mk',
+ 'libshaderc_util/Android.mk',
+ 'third_party/Android.mk',
+ 'utils/update_build_version.py',
+ 'CHANGES',
+ ],
+ 'dirs': [
+ 'libshaderc/include', 'libshaderc/src',
+ 'libshaderc_util/include', 'libshaderc_util/src',
+ 'android_test'
+ ],
+ },
+ {
+ 'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'),
+ 'dest_dir': 'third_party/shaderc/third_party/spirv-tools',
+ 'files': [
+ 'utils/generate_grammar_tables.py',
+ 'utils/generate_language_headers.py',
+ 'utils/generate_registry_tables.py',
+ 'utils/update_build_version.py',
+ 'Android.mk',
+ 'CHANGES',
+ ],
+ 'dirs': ['include', 'source'],
+ },
+ {
+ 'source_dir': os.path.join(shaderc_root_dir, 'spirv-headers'),
+ 'dest_dir':
+ 'third_party/shaderc/third_party/spirv-tools/external/spirv-headers',
+ 'dirs': ['include',],
+ 'files': [
+ 'include/spirv/1.0/spirv.py',
+ 'include/spirv/1.1/spirv.py',
+ 'include/spirv/1.2/spirv.py',
+ ],
+ },
+ {
+ 'source_dir': os.path.join(shaderc_root_dir, 'glslang'),
+ 'dest_dir': 'third_party/shaderc/third_party/glslang',
+ 'files': ['glslang/OSDependent/osinclude.h'],
+ 'dirs': [
+ 'SPIRV',
+ 'OGLCompilersDLL',
+ 'glslang/GenericCodeGen',
+ 'hlsl',
+ 'glslang/Include',
+ 'glslang/MachineIndependent',
+ 'glslang/OSDependent/Unix',
+ 'glslang/Public',
+ ],
+ },
+ {
+ 'source_dir': vulkan_root_dir,
+ 'dest_dir': 'vulkan/src',
+ 'files': [
+ ],
+ 'dirs': [
+ 'layers', 'scripts', 'build-android'
+ ],
+ },
+
+ {
+ 'source_dir': vulkan_headers_root_dir,
+ 'dest_dir': 'vulkan/src',
+ 'files': [
+ ],
+ 'dirs': [
+ 'include', 'registry'
+ ],
+ },
+ ]
+
+ default_ignore_patterns = shutil.ignore_patterns(
+ "*CMakeLists.txt",
+ "*test.h",
+ "*test.cc")
+
+ for properties in copies:
+ source_dir = properties['source_dir']
+ dest_dir = os.path.join(installdir, properties['dest_dir'])
+ for d in properties['dirs']:
+ src = os.path.join(source_dir, d)
+ dst = os.path.join(dest_dir, d)
+ print(src, " -> ", dst)
+ shutil.copytree(src, dst,
+ ignore=default_ignore_patterns)
+ for f in properties['files']:
+ print(source_dir, ':', dest_dir, ":", f)
+ # Only copy if the source file exists. That way
+ # we can update this script in anticipation of
+ # source files yet-to-come.
+ if os.path.exists(os.path.join(source_dir, f)):
+ install_file(f, source_dir, dest_dir)
+ else:
+ print(source_dir, ':', dest_dir, ":", f, "SKIPPED")
+
+ print('Constructing Vulkan validation layer source...')
+
+ build_cmd = [
+ 'bash', build_dir + '/vulkan/src/build-android/android-generate.sh',
+ build_dir + '/vulkan/src/registry'
+ ]
+ print('Generating generated layers...')
+ subprocess.check_call(build_cmd)
+ print('Generation finished')
+
+ build_cmd = [
+ 'bash', ndk_build, '-C', build_dir + '/vulkan/src/build-android',
+ jobs_arg(),
+ 'APP_ABI=' + ' '.join(abis),
+ # Use the prebuilt platforms and toolchains.
+ 'NDK_PLATFORMS_ROOT=' + platforms_root,
+ 'NDK_TOOLCHAINS_ROOT=' + toolchains_root,
+ 'NDK_MODULE_PATH=' + installdir,
+ 'GNUSTL_PREFIX=',
+ 'APP_STL=' + stl,
+ 'NDK_TOOLCHAIN_VERSION=' + compiler,
+
+ # Tell ndk-build where to put the results
+ 'NDK_OUT=' + obj_out,
+ 'NDK_LIBS_OUT=' + lib_out,
+ ]
+
+ print('Building Vulkan validation layers for ABIs:' +
+ ' {}'.format(', '.join(abis)) + "...")
+ print(' '.join(build_cmd))
+
+ subprocess.check_call(build_cmd)
+
+ print('Finished building Vulkan validation layers')
+ out_package = os.path.join(installdir, 'vulkan_validation_layers.zip')
+ os.chdir(lib_out)
+ build_cmd = [
+ 'zip', '-9qr', out_package, "."
+ ]
+
+ print('Packaging Vulkan validation layers')
+ subprocess.check_call(build_cmd)
+ print('Finished Packaging Vulkan validation layers')
+
+ for properties in copies:
+ dest_dir = os.path.join(installdir, properties['dest_dir'])
+ for d in properties['dirs']:
+ dst = os.path.join(dest_dir, d)
+ print('Remove: %s' % dst)
+ shutil.rmtree(dst)
+
+ return 0
+
+
+if __name__ == '__main__':
+ main()
diff --git a/build-android/jni/Android.mk b/build-android/jni/Android.mk
index e0824ae..26b237b 100644
--- a/build-android/jni/Android.mk
+++ b/build-android/jni/Android.mk
@@ -18,7 +18,7 @@
LAYER_DIR := ../generated
THIRD_PARTY := ../third_party
-VULKAN_INCLUDE := $(LOCAL_PATH)/$(THIRD_PARTY)/Vulkan-Headers/include
+VULKAN_INCLUDE := $(LOCAL_PATH)/$(SRC_DIR)/include
include $(CLEAR_VARS)
LOCAL_MODULE := layer_utils
diff --git a/build-android/jni/Application.mk b/build-android/jni/Application.mk
index a80a357..3cfea11 100644
--- a/build-android/jni/Application.mk
+++ b/build-android/jni/Application.mk
@@ -16,5 +16,6 @@
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_PLATFORM := android-22
APP_STL := c++_static
+APP_MODULES := VkLayer_core_validation VkLayer_parameter_validation VkLayer_object_tracker VkLayer_threading VkLayer_unique_objects
NDK_TOOLCHAIN_VERSION := clang
NDK_MODULE_PATH := .