diff --git a/CMakeLists.txt b/CMakeLists.txt index e2cb97a..4e5e9a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,9 +80,18 @@ if (WIN32) endif () SetupVulkan(openVulkanoCpp) + +set(BASH_EXECUTABLE "" CACHE FILEPATH "Path to bash executable") +if ("${BASH_EXECUTABLE}" STREQUAL "") + find_program(BASH_PROGRAM bash NO_CACHE REQUIRED) + set(BASH_EXECUTABLE ${BASH_PROGRAM} CACHE FILEPATH "Path to bash executable" FORCE) +endif() +set(ROOT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/TryCompileShaders.cmake.in ${CMAKE_BINARY_DIR}/TryCompileShaders.cmake @ONLY) +execute_process(COMMAND ${BASH_EXECUTABLE} CompileShaders.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Scripts) SetShaderDependency(openVulkanoCpp - ${CMAKE_CURRENT_SOURCE_DIR}/openVulkanoCpp/Shader - ${CMAKE_SOURCE_DIR}/openVulkanoCpp/GeneratedShaderData) + ${CMAKE_CURRENT_SOURCE_DIR}/openVulkanoCpp/Shader + ${CMAKE_CURRENT_SOURCE_DIR}/openVulkanoCpp/GeneratedShaderData) if (NOT ANDROID AND NOT IOS) target_link_libraries(openVulkanoCpp PRIVATE glfw pugixml) diff --git a/Scripts/CompileShaders.sh b/Scripts/CompileShaders.sh index b7c9f6c..db33bbb 100755 --- a/Scripts/CompileShaders.sh +++ b/Scripts/CompileShaders.sh @@ -1,7 +1,14 @@ #!/bin/bash -GENERATED_DATA_PATH="../openVulkanoCpp/GeneratedShaderData" -SHADER_PATH="../openVulkanoCpp/Shader" +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +GENERATED_DATA_PATH="$(dirname "$SCRIPT_DIR")/openVulkanoCpp/GeneratedShaderData" +SHADER_PATH="$(dirname "$SCRIPT_DIR")/openVulkanoCpp/Shader" + +if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then + SCRIPT_DIR=$(cygpath -w "$SCRIPT_DIR") + GENERATED_DATA_PATH=$(cygpath -w "$GENERATED_DATA_PATH") + SHADER_PATH=$(cygpath -w "$SHADER_PATH") +fi check_return_code() { # return code of last executed command @@ -11,41 +18,54 @@ check_return_code() { fi } -generate_general_shader_header() { - rm -f $GENERATED_DATA_PATH/GeneratedShaderData.h - touch $GENERATED_DATA_PATH/GeneratedShaderData.h -} - rm -f *.spv -rm -f $GENERATED_DATA_PATH/*.h $GENERATED_DATA_PATH/*.c +rm "$GENERATED_DATA_PATH"/* +touch "$GENERATED_DATA_PATH"/GeneratedShaderData.h -generate_general_shader_header -echo "// Auto generated file" >> $GENERATED_DATA_PATH/GeneratedShaderData.h -sed -i "$ a #ifndef GeneratedShaderData_H_INCLUDED\n#define GeneratedShaderData_H_INCLUDED\n" $GENERATED_DATA_PATH/GeneratedShaderData.h -sed -i "$ a extern \"C\" {" $GENERATED_DATA_PATH/GeneratedShaderData.h +echo "// Auto generated file" >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h +echo -e "#ifndef GeneratedShaderData_H_INCLUDED\n#define GeneratedShaderData_H_INCLUDED\n" >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h +echo -e "extern \"C\" {\n" >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h # put data from all files with same name into single file -unique_file_names=($(find $SHADER_PATH/ -type f ! -name '*.hpp' ! -name '*.cpp' | awk -F/ '{print $NF}' | awk -F. '{print $1}' | sort | uniq -d)) +unique_file_names=($(find $SHADER_PATH/ -type f ! -name '*.hpp' ! -name '*.cpp' | awk -F/ '{print $NF}' | awk -F. '{print $1}' | sort | uniq)) +entriesCount="\nconst unsigned int entriesCount[] = {" +entries="const TFileTableEntry* entries[] = {" +len=${#unique_file_names[@]} +i=0 for unique_name in ${unique_file_names[@]} ; do same_files=$(find $SHADER_PATH/ -type f -name "${unique_name}.*") for same_file in ${same_files[@]} ; do filename_with_ext_no_path=$(basename -- "$same_file") - glslang -V $same_file -o $filename_with_ext_no_path.spv + glslangValidator -V $same_file -o $filename_with_ext_no_path.spv check_return_code done - bin2c -t -d $GENERATED_DATA_PATH/$unique_name.h -o $GENERATED_DATA_PATH/$unique_name.c *.spv + bin2c -t -d "$GENERATED_DATA_PATH"/$unique_name.h -o "$GENERATED_DATA_PATH"/$unique_name.c *.spv check_return_code - sed -i "$ a #include \"${unique_name}.h\"" $GENERATED_DATA_PATH/GeneratedShaderData.h + sed -i "$ a #include \"${unique_name}.h\"" "$GENERATED_DATA_PATH"/GeneratedShaderData.h rm *.spv filename_no_ext_first_upper="${unique_name^}" - sed -i 's/char \*entryName/const char *entryName/' $GENERATED_DATA_PATH/$unique_name.h - sed -i 's/const char \*data/const unsigned char *data/' $GENERATED_DATA_PATH/$unique_name.h + entriesCount+="fileTable${filename_no_ext_first_upper}Size" + entries+="fileTable${filename_no_ext_first_upper}" + + if [ $i -ne $((len-1)) ]; then + entriesCount+=",\n\t\t" + entries+=",\n\t\t" + fi + + sed -i "3s/.*/#include \"${unique_name}.h\"/" "$GENERATED_DATA_PATH"/$unique_name.c + sed -i 's/char \*entryName/const char *entryName/' "$GENERATED_DATA_PATH"/$unique_name.h + sed -i 's/const char \*data/const unsigned char *data/' "$GENERATED_DATA_PATH"/$unique_name.h # avoid ODR violation - sed -i "s/fileTable/fileTable${filename_no_ext_first_upper}/" $GENERATED_DATA_PATH/$unique_name.h $GENERATED_DATA_PATH/$unique_name.c - sed -i "s/typedef struct {/#ifndef TFileTableEntry_H_INCLUDED\n#define TFileTableEntry_H_INCLUDED\ntypedef struct {/" $GENERATED_DATA_PATH/$unique_name.h - sed -i "s/} TFileTableEntry;/} TFileTableEntry;\n#endif \/*TFileTableEntry_H_INCLUDED*\//" $GENERATED_DATA_PATH/$unique_name.h + sed -i "s/fileTable/fileTable${filename_no_ext_first_upper}/" "$GENERATED_DATA_PATH"/$unique_name.h $GENERATED_DATA_PATH/$unique_name.c + sed -i "s/typedef struct {/#ifndef TFileTableEntry_H_INCLUDED\n#define TFileTableEntry_H_INCLUDED\ntypedef struct {/" "$GENERATED_DATA_PATH"/$unique_name.h + sed -i "s/} TFileTableEntry;/} TFileTableEntry;\n#endif \/*TFileTableEntry_H_INCLUDED*\//" "$GENERATED_DATA_PATH"/$unique_name.h + ((i++)) done -sed -i "$ a }\n#endif \/*GeneratedShaderData_H_INCLUDED*\/" $GENERATED_DATA_PATH/GeneratedShaderData.h +entriesCount+=" };" +entries+=" };" +echo -e $entriesCount >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h +echo -e $entries >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h +echo -e "}\n#endif /*GeneratedShaderData_H_INCLUDED*/" >> "$GENERATED_DATA_PATH"/GeneratedShaderData.h diff --git a/cmake/SetShaderDependency.cmake b/cmake/SetShaderDependency.cmake index 432d5c4..ff78b1a 100644 --- a/cmake/SetShaderDependency.cmake +++ b/cmake/SetShaderDependency.cmake @@ -7,7 +7,8 @@ function(SetShaderDependency TARGET SHADER_SRC_FOLDER SHADER_OUTPUT_FOLDER) list(FILTER SHADER_SRC_FILES EXCLUDE REGEX ".*\\.(hpp|cpp)$") foreach(SHADER_FILE ${SHADER_SRC_FILES}) get_filename_component(FILENAME ${SHADER_FILE} NAME_WLE) - if (NOT ${FILENAME} IN_LIST OUTPUT_HEADERS) + if (NOT ${FILENAME} IN_LIST PROCESSED_FILES) + list(APPEND PROCESSED_FILES ${FILENAME}) list(APPEND OUTPUT_HEADERS ${SHADER_OUTPUT_FOLDER}/${FILENAME}.h) list(APPEND OUTPUT_SOURCES ${SHADER_OUTPUT_FOLDER}/${FILENAME}.c) endif() @@ -15,7 +16,7 @@ function(SetShaderDependency TARGET SHADER_SRC_FOLDER SHADER_OUTPUT_FOLDER) set(SHADER_EXPECTED_OUTPUT ${OUTPUT_HEADERS} ${OUTPUT_SOURCES}) add_custom_command(OUTPUT ${SHADER_EXPECTED_OUTPUT} - COMMAND ${CMAKE_COMMAND} -DROOT_FOLDER=${CMAKE_SOURCE_DIR} -P ${CMAKE_SOURCE_DIR}/cmake/TryCompileShaders.cmake + COMMAND ${CMAKE_COMMAND} -DROOT_FOLDER=${CMAKE_SOURCE_DIR} -P ${CMAKE_BINARY_DIR}/TryCompileShaders.cmake DEPENDS ${SHADER_SRC_FILES} COMMENT "Recompiling shaders") add_custom_target(RecompileShaders ALL diff --git a/cmake/TryCompileShaders.cmake b/cmake/TryCompileShaders.cmake deleted file mode 100644 index 20f103b..0000000 --- a/cmake/TryCompileShaders.cmake +++ /dev/null @@ -1,4 +0,0 @@ -execute_process(COMMAND bash -c "${ROOT_FOLDER}/Scripts/CompileShaders.sh" RESULT_VARIABLE res_var) -if(NOT "${res_var}" STREQUAL "0") - message(FATAL_ERROR "Failed to recompile shaders") -endif() diff --git a/cmake/TryCompileShaders.cmake.in b/cmake/TryCompileShaders.cmake.in new file mode 100644 index 0000000..fb957bc --- /dev/null +++ b/cmake/TryCompileShaders.cmake.in @@ -0,0 +1,4 @@ +execute_process(COMMAND "@BASH_EXECUTABLE@" CompileShaders.sh WORKING_DIRECTORY "@ROOT_FOLDER@/Scripts" RESULT_VARIABLE res_var) +if(NOT "${res_var}" STREQUAL "0") + message(FATAL_ERROR "Failed to recompile shaders") +endif() diff --git a/openVulkanoCpp/Shader/ShaderRegistry.cpp b/openVulkanoCpp/Shader/ShaderRegistry.cpp index f271def..479c1ea 100644 --- a/openVulkanoCpp/Shader/ShaderRegistry.cpp +++ b/openVulkanoCpp/Shader/ShaderRegistry.cpp @@ -5,6 +5,7 @@ */ #include "ShaderRegistry.hpp" +#include extern "C" { @@ -21,9 +22,12 @@ namespace OpenVulkano ShaderRegistry::ShaderRegistry() { - RegisterShaderTable(reinterpret_cast(fileTableBackground), fileTableBackgroundSize); - RegisterShaderTable(reinterpret_cast(fileTableBasic), fileTableBasicSize); - RegisterShaderTable(reinterpret_cast(fileTableGrid), fileTableGridSize); + assert(std::size(entriesCount) == std::size(entries)); + const unsigned int sz = std::size(entriesCount); + for (unsigned int i = 0; i < sz; i++) + { + RegisterShaderTable(reinterpret_cast(entries[i]), entriesCount[i]); + } } void ShaderRegistry::RegisterShaderTable(const ShaderTableEntry* table, uint32_t size)