From eb9326002f8eef4df24e615656ba0996b4e74296 Mon Sep 17 00:00:00 2001 From: nihuini Date: Mon, 9 Dec 2019 17:21:25 +0800 Subject: [PATCH] cmake ncnn_generate_shader_spv_header function --- cmake/ncnn_generate_shader_spv_header.cmake | 81 ++++++++++++++++++++ src/CMakeLists.txt | 83 +++------------------ 2 files changed, 93 insertions(+), 71 deletions(-) create mode 100644 cmake/ncnn_generate_shader_spv_header.cmake diff --git a/cmake/ncnn_generate_shader_spv_header.cmake b/cmake/ncnn_generate_shader_spv_header.cmake new file mode 100644 index 000000000..12095c156 --- /dev/null +++ b/cmake/ncnn_generate_shader_spv_header.cmake @@ -0,0 +1,81 @@ + +function(ncnn_generate_shader_spv_header SHADER_SPV_HEADER SHADER_SPV_HEX_HEADERS SHADER_SRC) + + # fp32 + get_filename_component(SHADER_SRC_NAME_WE ${SHADER_SRC} NAME_WE) + + set(SHADER_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.spv.hex.h) + add_custom_command( + OUTPUT ${SHADER_SPV_HEX_FILE} + COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} + ARGS -Dsfp=float -Dsfpvec2=vec2 -Dsfpvec4=vec4 -Dsfpmat4=mat4 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=v -Dafp2sfpvec2\(v\)=v -Dsfp2afpvec4\(v\)=v -Dafp2sfpvec4\(v\)=v -Dsfp2afpmat4\(v\)=v -Dafp2sfpmat4\(v\)=v -V -s -e ${SHADER_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_SPV_HEX_FILE} ${SHADER_SRC} + DEPENDS ${SHADER_SRC} + COMMENT "Building SPIR-V module ${SHADER_SRC_NAME_WE}.spv" + VERBATIM + ) + set_source_files_properties(${SHADER_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) + + # fp16 packed + set(SHADER_fp16p_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16p") + + set(SHADER_fp16p_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16p_SRC_NAME_WE}.spv.hex.h) + add_custom_command( + OUTPUT ${SHADER_fp16p_SPV_HEX_FILE} + COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} + ARGS -Dsfp=float -Dsfpvec2=uint -Dsfpvec4=uvec2 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=unpackHalf2x16\(v\) -Dafp2sfpvec2\(v\)=packHalf2x16\(v\) -Dsfp2afpvec4\(v\)=vec4\(unpackHalf2x16\(v.x\),unpackHalf2x16\(v.y\)\) -Dafp2sfpvec4\(v\)=uvec2\(packHalf2x16\(v.rg\),packHalf2x16\(v.ba\)\) -DNCNN_fp16_packed=1 -V -s -e ${SHADER_fp16p_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16p_SPV_HEX_FILE} ${SHADER_SRC} + DEPENDS ${SHADER_SRC} + COMMENT "Building SPIR-V module ${SHADER_fp16p_SRC_NAME_WE}.spv" + VERBATIM + ) + set_source_files_properties(${SHADER_fp16p_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) + + # fp16 storage + set(SHADER_fp16s_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16s") + + set(SHADER_fp16s_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16s_SRC_NAME_WE}.spv.hex.h) + add_custom_command( + OUTPUT ${SHADER_fp16s_SPV_HEX_FILE} + COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} + ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=float\(v\) -Dafp2sfp\(v\)=float16_t\(v\) -Dsfp2afpvec2\(v\)=vec2\(v\) -Dafp2sfpvec2\(v\)=f16vec2\(v\) -Dsfp2afpvec4\(v\)=vec4\(v\) -Dafp2sfpvec4\(v\)=f16vec4\(v\) -DNCNN_fp16_storage=1 -V -s -e ${SHADER_fp16s_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16s_SPV_HEX_FILE} ${SHADER_SRC} + DEPENDS ${SHADER_SRC} + COMMENT "Building SPIR-V module ${SHADER_fp16s_SRC_NAME_WE}.spv" + VERBATIM + ) + set_source_files_properties(${SHADER_fp16s_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) + + # fp16 storage + fp16 arithmetic + set(SHADER_fp16a_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16a") + + set(SHADER_fp16a_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16a_SRC_NAME_WE}.spv.hex.h) + add_custom_command( + OUTPUT ${SHADER_fp16a_SPV_HEX_FILE} + COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} + ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dsfpmat4=f16mat4 -Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpmat4=f16mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=v -Dafp2sfpvec2\(v\)=v -Dsfp2afpvec4\(v\)=v -Dafp2sfpvec4\(v\)=v -Dsfp2afpmat4\(v\)=v -Dafp2sfpmat4\(v\)=v -DNCNN_fp16_storage=1 -DNCNN_fp16_arithmetic=1 -V -s -e ${SHADER_fp16a_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16a_SPV_HEX_FILE} ${SHADER_SRC} + DEPENDS ${SHADER_SRC} + COMMENT "Building SPIR-V module ${SHADER_fp16a_SRC_NAME_WE}.spv" + VERBATIM + ) + set_source_files_properties(${SHADER_fp16a_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) + + set(SHADER_SPV_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.spv.h) + + file(WRITE ${SHADER_SPV_HEADER} + "static const uint32_t ${SHADER_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_SRC_NAME_WE}.spv.hex.h\"\n};\n" + "static const uint32_t ${SHADER_fp16p_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16p_SRC_NAME_WE}.spv.hex.h\"\n};\n" + "static const uint32_t ${SHADER_fp16s_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16s_SRC_NAME_WE}.spv.hex.h\"\n};\n" + "static const uint32_t ${SHADER_fp16a_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16a_SRC_NAME_WE}.spv.hex.h\"\n};\n" + ) + + set_source_files_properties(${SHADER_SPV_HEADER} PROPERTIES GENERATED TRUE) + + set(SHADER_SPV_HEX_HEADERS + ${SHADER_SPV_HEX_FILE} + ${SHADER_fp16p_SPV_HEX_FILE} + ${SHADER_fp16s_SPV_HEX_FILE} + ${SHADER_fp16a_SPV_HEX_FILE} + ) + + set(SHADER_SPV_HEADER ${SHADER_SPV_HEADER} PARENT_SCOPE) + set(SHADER_SPV_HEX_HEADERS ${SHADER_SPV_HEX_HEADERS} PARENT_SCOPE) + +endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2ee696f33..e75b05b57 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,81 +33,22 @@ if(ANDROID) list(APPEND ncnn_SRCS mat_pixel_android.cpp) endif() +include(${CMAKE_SOURCE_DIR}/cmake/ncnn_generate_shader_spv_header.cmake) + macro(ncnn_add_shader SHADER_SRC) - get_filename_component(SHADER_SRC_NAME_WE ${SHADER_SRC} NAME_WE) + ncnn_generate_shader_spv_header(SHADER_SPV_HEADER SHADER_SPV_HEX_HEADERS ${SHADER_SRC}) - set(SHADER_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.spv.hex.h) - add_custom_command( - OUTPUT ${SHADER_SPV_HEX_FILE} - COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} - ARGS -Dsfp=float -Dsfpvec2=vec2 -Dsfpvec4=vec4 -Dsfpmat4=mat4 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=v -Dafp2sfpvec2\(v\)=v -Dsfp2afpvec4\(v\)=v -Dafp2sfpvec4\(v\)=v -Dsfp2afpmat4\(v\)=v -Dafp2sfpmat4\(v\)=v -V -s -e ${SHADER_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_SPV_HEX_FILE} ${SHADER_SRC} - DEPENDS ${SHADER_SRC} - COMMENT "Building SPIR-V module ${SHADER_SRC_NAME_WE}.spv" - VERBATIM - ) - set_source_files_properties(${SHADER_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) + get_filename_component(SHADER_SPV_HEADER_NAME ${SHADER_SPV_HEADER} NAME) + string(APPEND layer_shader_spv_data "#include \"${SHADER_SPV_HEADER_NAME}\"\n") - string(APPEND layer_shader_spv_data "static const uint32_t ${SHADER_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_SRC_NAME_WE}.spv.hex.h\"\n};\n") + get_filename_component(SHADER_SRC_NAME_WE ${SHADER_SRC} NAME_WE) string(APPEND layer_shader_registry "{\"${SHADER_SRC_NAME_WE}\",${SHADER_SRC_NAME_WE}_spv_data,sizeof(${SHADER_SRC_NAME_WE}_spv_data)},\n") + string(APPEND layer_shader_registry "{\"${SHADER_SRC_NAME_WE}_fp16p\",${SHADER_SRC_NAME_WE}_fp16p_spv_data,sizeof(${SHADER_SRC_NAME_WE}_fp16p_spv_data)},\n") + string(APPEND layer_shader_registry "{\"${SHADER_SRC_NAME_WE}_fp16s\",${SHADER_SRC_NAME_WE}_fp16s_spv_data,sizeof(${SHADER_SRC_NAME_WE}_fp16s_spv_data)},\n") + string(APPEND layer_shader_registry "{\"${SHADER_SRC_NAME_WE}_fp16a\",${SHADER_SRC_NAME_WE}_fp16a_spv_data,sizeof(${SHADER_SRC_NAME_WE}_fp16a_spv_data)},\n") - list(APPEND SHADER_SPV_HEX_FILES ${SHADER_SPV_HEX_FILE}) - - # fp16 packed - set(SHADER_fp16p_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16p") - - set(SHADER_fp16p_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16p_SRC_NAME_WE}.spv.hex.h) - add_custom_command( - OUTPUT ${SHADER_fp16p_SPV_HEX_FILE} - COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} - ARGS -Dsfp=float -Dsfpvec2=uint -Dsfpvec4=uvec2 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=unpackHalf2x16\(v\) -Dafp2sfpvec2\(v\)=packHalf2x16\(v\) -Dsfp2afpvec4\(v\)=vec4\(unpackHalf2x16\(v.x\),unpackHalf2x16\(v.y\)\) -Dafp2sfpvec4\(v\)=uvec2\(packHalf2x16\(v.rg\),packHalf2x16\(v.ba\)\) -DNCNN_fp16_packed=1 -V -s -e ${SHADER_fp16p_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16p_SPV_HEX_FILE} ${SHADER_SRC} - DEPENDS ${SHADER_SRC} - COMMENT "Building SPIR-V module ${SHADER_fp16p_SRC_NAME_WE}.spv" - VERBATIM - ) - set_source_files_properties(${SHADER_fp16p_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) - - string(APPEND layer_shader_spv_data "static const uint32_t ${SHADER_fp16p_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16p_SRC_NAME_WE}.spv.hex.h\"\n};\n") - string(APPEND layer_shader_registry "{\"${SHADER_fp16p_SRC_NAME_WE}\",${SHADER_fp16p_SRC_NAME_WE}_spv_data,sizeof(${SHADER_fp16p_SRC_NAME_WE}_spv_data)},\n") - - list(APPEND SHADER_SPV_HEX_FILES ${SHADER_fp16p_SPV_HEX_FILE}) - - # fp16 storage - set(SHADER_fp16s_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16s") - - set(SHADER_fp16s_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16s_SRC_NAME_WE}.spv.hex.h) - add_custom_command( - OUTPUT ${SHADER_fp16s_SPV_HEX_FILE} - COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} - ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpmat4=mat4 -Dsfp2afp\(v\)=float\(v\) -Dafp2sfp\(v\)=float16_t\(v\) -Dsfp2afpvec2\(v\)=vec2\(v\) -Dafp2sfpvec2\(v\)=f16vec2\(v\) -Dsfp2afpvec4\(v\)=vec4\(v\) -Dafp2sfpvec4\(v\)=f16vec4\(v\) -DNCNN_fp16_storage=1 -V -s -e ${SHADER_fp16s_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16s_SPV_HEX_FILE} ${SHADER_SRC} - DEPENDS ${SHADER_SRC} - COMMENT "Building SPIR-V module ${SHADER_fp16s_SRC_NAME_WE}.spv" - VERBATIM - ) - set_source_files_properties(${SHADER_fp16s_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) - - string(APPEND layer_shader_spv_data "static const uint32_t ${SHADER_fp16s_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16s_SRC_NAME_WE}.spv.hex.h\"\n};\n") - string(APPEND layer_shader_registry "{\"${SHADER_fp16s_SRC_NAME_WE}\",${SHADER_fp16s_SRC_NAME_WE}_spv_data,sizeof(${SHADER_fp16s_SRC_NAME_WE}_spv_data)},\n") - - list(APPEND SHADER_SPV_HEX_FILES ${SHADER_fp16s_SPV_HEX_FILE}) - - # fp16 storage + fp16 arithmetic - set(SHADER_fp16a_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16a") - - set(SHADER_fp16a_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16a_SRC_NAME_WE}.spv.hex.h) - add_custom_command( - OUTPUT ${SHADER_fp16a_SPV_HEX_FILE} - COMMAND ${GLSLANGVALIDATOR_EXECUTABLE} - ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dsfpmat4=f16mat4 -Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpmat4=f16mat4 -Dsfp2afp\(v\)=v -Dafp2sfp\(v\)=v -Dsfp2afpvec2\(v\)=v -Dafp2sfpvec2\(v\)=v -Dsfp2afpvec4\(v\)=v -Dafp2sfpvec4\(v\)=v -Dsfp2afpmat4\(v\)=v -Dafp2sfpmat4\(v\)=v -DNCNN_fp16_storage=1 -DNCNN_fp16_arithmetic=1 -V -s -e ${SHADER_fp16a_SRC_NAME_WE} --source-entrypoint main -x -o ${SHADER_fp16a_SPV_HEX_FILE} ${SHADER_SRC} - DEPENDS ${SHADER_SRC} - COMMENT "Building SPIR-V module ${SHADER_fp16a_SRC_NAME_WE}.spv" - VERBATIM - ) - set_source_files_properties(${SHADER_fp16a_SPV_HEX_FILE} PROPERTIES GENERATED TRUE) - - string(APPEND layer_shader_spv_data "static const uint32_t ${SHADER_fp16a_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16a_SRC_NAME_WE}.spv.hex.h\"\n};\n") - string(APPEND layer_shader_registry "{\"${SHADER_fp16a_SRC_NAME_WE}\",${SHADER_fp16a_SRC_NAME_WE}_spv_data,sizeof(${SHADER_fp16a_SRC_NAME_WE}_spv_data)},\n") - - list(APPEND SHADER_SPV_HEX_FILES ${SHADER_fp16a_SPV_HEX_FILE}) + list(APPEND SHADER_SPV_HEX_FILES ${SHADER_SPV_HEADER}) + list(APPEND SHADER_SPV_HEX_FILES ${SHADER_SPV_HEX_HEADERS}) endmacro() macro(ncnn_add_layer class) @@ -125,7 +66,7 @@ macro(ncnn_add_layer class) endif() if(WITH_LAYER_${name}) - list(APPEND ncnn_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/layer/${name}.cpp") + list(APPEND ncnn_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/layer/${name}.cpp) # look for arch specific implementation and append source # optimized implementation for armv7, aarch64 or x86