From 6b257a204ce104add15dfe6bb661ee2add1dd108 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Mon, 12 Jun 2017 13:32:36 -0600 Subject: [PATCH 1/2] layers:Remove includes of vk_safe_struct.cpp After looking at these includes of vk_safe_struct.cpp I believe it was just a hack that worked and has persisted in the code. This change pulls the source into the layers that depend on it at build time and is a better solution, in my opinion. The one quirk is that the we now generate vk_struct.cpp in the base dir and in the layers dir. Since the file is required by some layer shared libs I had to generate in the layers dir, but there are also some dependencies on the file in the top-level dir that I didn't care to investigate further so I just genrate it in two places. I'm sure this could be cleaned up if someone with more cmake knowledge and/or patience than me cares to look into it further. For the android build updated the codegen to put vk_safe_struct.cpp in common dir so it could be added to libs from there. --- build-android/android-generate.bat | 3 ++- build-android/android-generate.sh | 2 +- build-android/jni/Android.mk | 2 ++ layers/CMakeLists.txt | 6 ++++-- layers/core_validation.cpp | 3 --- layers/unique_objects.cpp | 3 --- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/build-android/android-generate.bat b/build-android/android-generate.bat index b3982f2919..e91c14d6a0 100644 --- a/build-android/android-generate.bat +++ b/build-android/android-generate.bat @@ -19,9 +19,10 @@ if exist generated ( ) mkdir generated\include generated\common +cd generated/common +py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.cpp cd generated/include py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.h -py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.cpp py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_struct_size_helper.h py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_struct_size_helper.c py -3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_enum_string_helper.h diff --git a/build-android/android-generate.sh b/build-android/android-generate.sh index 6058f00eac..ddb346e7ea 100755 --- a/build-android/android-generate.sh +++ b/build-android/android-generate.sh @@ -22,7 +22,7 @@ rm -rf generated mkdir -p generated/include generated/common ( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.h ) -( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.cpp ) +( cd generated/common; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_safe_struct.cpp ) ( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_struct_size_helper.h ) ( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_struct_size_helper.c ) ( cd generated/include; python3 ../../../scripts/lvl_genvk.py -registry ../../../scripts/vk.xml vk_enum_string_helper.h ) diff --git a/build-android/jni/Android.mk b/build-android/jni/Android.mk index 2915de100a..40bcfcee6c 100644 --- a/build-android/jni/Android.mk +++ b/build-android/jni/Android.mk @@ -38,6 +38,7 @@ LOCAL_SRC_FILES += $(SRC_DIR)/layers/descriptor_sets.cpp LOCAL_SRC_FILES += $(SRC_DIR)/layers/buffer_validation.cpp LOCAL_SRC_FILES += $(SRC_DIR)/layers/shader_validation.cpp LOCAL_SRC_FILES += $(SRC_DIR)/layers/vk_layer_table.cpp +LOCAL_SRC_FILES += $(LAYER_DIR)/common/vk_safe_struct.cpp LOCAL_SRC_FILES += $(SRC_DIR)/layers/xxhash.c LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SRC_DIR)/include \ $(LOCAL_PATH)/$(SRC_DIR)/layers \ @@ -105,6 +106,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := VkLayer_unique_objects LOCAL_SRC_FILES += $(SRC_DIR)/layers/unique_objects.cpp LOCAL_SRC_FILES += $(SRC_DIR)/layers/vk_layer_table.cpp +LOCAL_SRC_FILES += $(LAYER_DIR)/common/vk_safe_struct.cpp LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SRC_DIR)/include \ $(LOCAL_PATH)/$(SRC_DIR)/layers \ $(LOCAL_PATH)/$(LAYER_DIR)/include \ diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt index 218df5cbda..aad3579368 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt @@ -202,6 +202,8 @@ run_vk_xml_generate(unique_objects_generator.py unique_objects_wrappers.h) run_vk_xml_generate(dispatch_table_helper_generator.py vk_dispatch_table_helper.h) run_vk_xml_generate(object_tracker_generator.py object_tracker.cpp) +run_vk_xml_generate(helper_file_generator.py vk_safe_struct.cpp) + # Layer Utils Library # For Windows, we use a static lib because the Windows loader has a fairly restrictive loader search # path that can't be easily modified to point it to the same directory that contains the layers. @@ -215,11 +217,11 @@ else() endif() add_dependencies(VkLayer_utils generate_helper_files) -add_vk_layer(core_validation core_validation.cpp vk_layer_table.cpp descriptor_sets.cpp buffer_validation.cpp shader_validation.cpp xxhash.c) +add_vk_layer(core_validation core_validation.cpp vk_layer_table.cpp descriptor_sets.cpp buffer_validation.cpp shader_validation.cpp xxhash.c vk_safe_struct.cpp) add_vk_layer(object_tracker object_tracker.cpp object_tracker_utils.cpp vk_layer_table.cpp) # generated add_vk_layer(threading threading.cpp thread_check.h vk_layer_table.cpp) -add_vk_layer(unique_objects unique_objects.cpp unique_objects_wrappers.h vk_layer_table.cpp) +add_vk_layer(unique_objects unique_objects.cpp unique_objects_wrappers.h vk_layer_table.cpp vk_safe_struct.cpp) add_vk_layer(parameter_validation parameter_validation.cpp parameter_validation_utils.cpp parameter_validation.h vk_layer_table.cpp vk_validation_error_messages.h) # Core validation has additional dependencies diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 68575f672d..ff247763f9 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -81,9 +81,6 @@ } #endif -// This intentionally includes a cpp file -#include "vk_safe_struct.cpp" - using mutex_t = std::mutex; using lock_guard_t = std::lock_guard; using unique_lock_t = std::unique_lock; diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index 0fa94a7f58..905ab1353c 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -48,9 +48,6 @@ #include "vk_object_types.h" #include "vulkan/vk_layer.h" -// This intentionally includes a cpp file -#include "vk_safe_struct.cpp" - #include "unique_objects_wrappers.h" namespace unique_objects { From 88070f9fd6f58888f5c116e88479142adf51cff3 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Fri, 15 Dec 2017 16:35:25 -0700 Subject: [PATCH 2/2] layers:Prevent parallel build conflict Core validation and unique_objects layers both use generated safe_struct.cpp file. To prevent a potential build race condition on the windows build, add a dependency between those two layers. --- layers/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt index aad3579368..c90ed72c17 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt @@ -225,6 +225,9 @@ add_vk_layer(unique_objects unique_objects.cpp unique_objects_wrappers.h vk_laye add_vk_layer(parameter_validation parameter_validation.cpp parameter_validation_utils.cpp parameter_validation.h vk_layer_table.cpp vk_validation_error_messages.h) # Core validation has additional dependencies +# Dependency on unique_objects is only to prevent parallel build of both layers. +# Visual Studio has trouble with clobbering vk_safe_struct.cpp if both build in parallel. +add_dependencies(VkLayer_core_validation VkLayer_unique_objects) target_include_directories(VkLayer_core_validation PRIVATE ${GLSLANG_SPIRV_INCLUDE_DIR}) target_include_directories(VkLayer_core_validation PRIVATE ${SPIRV_TOOLS_INCLUDE_DIR}) target_link_libraries(VkLayer_core_validation ${SPIRV_TOOLS_LIBRARIES})