feat: 切换后端至PaddleOCR-NCNN,切换工程为CMake
1.项目后端整体迁移至PaddleOCR-NCNN算法,已通过基本的兼容性测试 2.工程改为使用CMake组织,后续为了更好地兼容第三方库,不再提供QMake工程 3.重整权利声明文件,重整代码工程,确保最小化侵权风险 Log: 切换后端至PaddleOCR-NCNN,切换工程为CMake Change-Id: I4d5d2c5d37505a4a24b389b1a4c5d12f17bfa38c
This commit is contained in:
38
3rdparty/ncnn/cmake/ncnnConfig.cmake.in
vendored
Normal file
38
3rdparty/ncnn/cmake/ncnnConfig.cmake.in
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
set(NCNN_OPENMP @NCNN_OPENMP@)
|
||||
set(NCNN_THREADS @NCNN_THREADS@)
|
||||
set(NCNN_VULKAN @NCNN_VULKAN@)
|
||||
set(NCNN_SHARED_LIB @NCNN_SHARED_LIB@)
|
||||
set(NCNN_SYSTEM_GLSLANG @NCNN_SYSTEM_GLSLANG@)
|
||||
|
||||
if(NCNN_OPENMP)
|
||||
find_package(OpenMP)
|
||||
endif()
|
||||
|
||||
if(NCNN_THREADS)
|
||||
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
|
||||
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
|
||||
find_package(Threads REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NCNN_VULKAN)
|
||||
find_package(Vulkan REQUIRED)
|
||||
|
||||
if(NOT NCNN_SHARED_LIB)
|
||||
if(NCNN_SYSTEM_GLSLANG)
|
||||
set(GLSLANG_TARGET_DIR "@GLSLANG_TARGET_DIR@")
|
||||
else()
|
||||
set(GLSLANG_TARGET_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../@CMAKE_INSTALL_LIBDIR@/cmake")
|
||||
endif(NCNN_SYSTEM_GLSLANG)
|
||||
|
||||
include(${GLSLANG_TARGET_DIR}/OSDependentTargets.cmake)
|
||||
include(${GLSLANG_TARGET_DIR}/OGLCompilerTargets.cmake)
|
||||
if(EXISTS "${GLSLANG_TARGET_DIR}/HLSLTargets.cmake")
|
||||
# hlsl support can be optional
|
||||
include("${GLSLANG_TARGET_DIR}/HLSLTargets.cmake")
|
||||
endif()
|
||||
include(${GLSLANG_TARGET_DIR}/glslangTargets.cmake)
|
||||
include(${GLSLANG_TARGET_DIR}/SPIRVTargets.cmake)
|
||||
endif()
|
||||
endif(NCNN_VULKAN)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/ncnn.cmake)
|
244
3rdparty/ncnn/cmake/ncnn_add_layer.cmake
vendored
Normal file
244
3rdparty/ncnn/cmake/ncnn_add_layer.cmake
vendored
Normal file
@ -0,0 +1,244 @@
|
||||
|
||||
macro(ncnn_add_arch_opt_layer class NCNN_TARGET_ARCH_OPT NCNN_TARGET_ARCH_OPT_CFLAGS)
|
||||
set(NCNN_${NCNN_TARGET_ARCH}_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}.h)
|
||||
set(NCNN_${NCNN_TARGET_ARCH}_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}.cpp)
|
||||
|
||||
if(WITH_LAYER_${name} AND EXISTS ${NCNN_${NCNN_TARGET_ARCH}_HEADER} AND EXISTS ${NCNN_${NCNN_TARGET_ARCH}_SOURCE})
|
||||
|
||||
set(NCNN_${NCNN_TARGET_ARCH_OPT}_HEADER ${CMAKE_CURRENT_BINARY_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.h)
|
||||
set(NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.cpp)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${NCNN_${NCNN_TARGET_ARCH_OPT}_HEADER}
|
||||
COMMAND ${CMAKE_COMMAND} -DSRC=${NCNN_${NCNN_TARGET_ARCH}_HEADER} -DDST=${NCNN_${NCNN_TARGET_ARCH_OPT}_HEADER} -DCLASS=${class} -P "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ncnn_generate_${NCNN_TARGET_ARCH_OPT}_source.cmake"
|
||||
DEPENDS ${NCNN_${NCNN_TARGET_ARCH}_HEADER}
|
||||
COMMENT "Generating source ${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.h"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${NCNN_${NCNN_TARGET_ARCH_OPT}_HEADER} PROPERTIES GENERATED TRUE)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE}
|
||||
COMMAND ${CMAKE_COMMAND} -DSRC=${NCNN_${NCNN_TARGET_ARCH}_SOURCE} -DDST=${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE} -DCLASS=${class} -P "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ncnn_generate_${NCNN_TARGET_ARCH_OPT}_source.cmake"
|
||||
DEPENDS ${NCNN_${NCNN_TARGET_ARCH}_SOURCE}
|
||||
COMMENT "Generating source ${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.cpp"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
set_source_files_properties(${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE} PROPERTIES COMPILE_FLAGS ${NCNN_TARGET_ARCH_OPT_CFLAGS})
|
||||
|
||||
list(APPEND ncnn_SRCS ${NCNN_${NCNN_TARGET_ARCH_OPT}_HEADER} ${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE})
|
||||
|
||||
# generate layer_declaration and layer_registry file
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/${name}.h\"\n")
|
||||
set(layer_declaration_class "class ${class}_final_${NCNN_TARGET_ARCH_OPT} : virtual public ${class}")
|
||||
set(create_pipeline_content " { int ret = ${class}::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " { int ret = ${class}::destroy_pipeline(opt); if (ret) return ret; }\n")
|
||||
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.h\"\n")
|
||||
set(layer_declaration_class "${layer_declaration_class}, virtual public ${class}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}")
|
||||
set(create_pipeline_content "${create_pipeline_content} { int ret = ${class}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " { int ret = ${class}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}")
|
||||
|
||||
if(WITH_LAYER_${name}_vulkan)
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/vulkan/${name}_vulkan.h\"\n")
|
||||
set(layer_declaration_class "${layer_declaration_class}, virtual public ${class}_vulkan")
|
||||
set(create_pipeline_content "${create_pipeline_content} if (vkdev) { int ret = ${class}_vulkan::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " if (vkdev) { int ret = ${class}_vulkan::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}")
|
||||
endif()
|
||||
|
||||
set(layer_declaration "${layer_declaration}namespace ncnn {\n${layer_declaration_class}\n{\n")
|
||||
set(layer_declaration "${layer_declaration}public:\n")
|
||||
set(layer_declaration "${layer_declaration} virtual int create_pipeline(const Option& opt) {\n${create_pipeline_content} return 0;\n }\n")
|
||||
set(layer_declaration "${layer_declaration} virtual int destroy_pipeline(const Option& opt) {\n${destroy_pipeline_content} return 0;\n }\n")
|
||||
set(layer_declaration "${layer_declaration}};\n")
|
||||
set(layer_declaration "${layer_declaration}DEFINE_LAYER_CREATOR(${class}_final_${NCNN_TARGET_ARCH_OPT})\n} // namespace ncnn\n\n")
|
||||
|
||||
set(layer_registry_${NCNN_TARGET_ARCH_OPT} "${layer_registry_${NCNN_TARGET_ARCH_OPT}}#if NCNN_STRING\n{\"${class}\", ${class}_final_${NCNN_TARGET_ARCH_OPT}_layer_creator},\n#else\n{${class}_final_${NCNN_TARGET_ARCH_OPT}_layer_creator},\n#endif\n")
|
||||
else()
|
||||
# no arm optimized version
|
||||
if(WITH_LAYER_${name})
|
||||
set(layer_registry_${NCNN_TARGET_ARCH_OPT} "${layer_registry_${NCNN_TARGET_ARCH_OPT}}#if NCNN_STRING\n{\"${class}\", ${class}_final_layer_creator},\n#else\n{${class}_final_layer_creator},\n#endif\n")
|
||||
else()
|
||||
set(layer_registry_${NCNN_TARGET_ARCH_OPT} "${layer_registry_${NCNN_TARGET_ARCH_OPT}}#if NCNN_STRING\n{\"${class}\", 0},\n#else\n{0},\n#endif\n")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endmacro()
|
||||
|
||||
macro(ncnn_add_arch_opt_source class NCNN_TARGET_ARCH_OPT NCNN_TARGET_ARCH_OPT_CFLAGS)
|
||||
set(NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}_${NCNN_TARGET_ARCH_OPT}.cpp)
|
||||
|
||||
if(WITH_LAYER_${name} AND EXISTS ${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE})
|
||||
set_source_files_properties(${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE} PROPERTIES COMPILE_FLAGS ${NCNN_TARGET_ARCH_OPT_CFLAGS})
|
||||
list(APPEND ncnn_SRCS ${NCNN_${NCNN_TARGET_ARCH_OPT}_SOURCE})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(ncnn_add_layer class)
|
||||
string(TOLOWER ${class} name)
|
||||
|
||||
# WITH_LAYER_xxx option
|
||||
if(${ARGC} EQUAL 2)
|
||||
option(WITH_LAYER_${name} "build with layer ${name}" ${ARGV1})
|
||||
else()
|
||||
option(WITH_LAYER_${name} "build with layer ${name}" ON)
|
||||
endif()
|
||||
|
||||
if(NCNN_CMAKE_VERBOSE)
|
||||
message(STATUS "WITH_LAYER_${name} = ${WITH_LAYER_${name}}")
|
||||
endif()
|
||||
|
||||
if(WITH_LAYER_${name})
|
||||
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
|
||||
set(LAYER_ARCH_SRC ${CMAKE_CURRENT_SOURCE_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}.cpp)
|
||||
if(EXISTS ${LAYER_ARCH_SRC})
|
||||
set(WITH_LAYER_${name}_${NCNN_TARGET_ARCH} 1)
|
||||
list(APPEND ncnn_SRCS ${LAYER_ARCH_SRC})
|
||||
endif()
|
||||
|
||||
set(LAYER_VULKAN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/layer/vulkan/${name}_vulkan.cpp)
|
||||
if(NCNN_VULKAN AND EXISTS ${LAYER_VULKAN_SRC})
|
||||
set(WITH_LAYER_${name}_vulkan 1)
|
||||
list(APPEND ncnn_SRCS ${LAYER_VULKAN_SRC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# generate layer_declaration and layer_registry file
|
||||
if(WITH_LAYER_${name})
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/${name}.h\"\n")
|
||||
set(layer_declaration_class "class ${class}_final : virtual public ${class}")
|
||||
set(create_pipeline_content " { int ret = ${class}::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " { int ret = ${class}::destroy_pipeline(opt); if (ret) return ret; }\n")
|
||||
|
||||
source_group ("sources\\\\layers" FILES "${CMAKE_CURRENT_SOURCE_DIR}/layer/${name}.cpp")
|
||||
endif()
|
||||
|
||||
if(WITH_LAYER_${name}_${NCNN_TARGET_ARCH})
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}.h\"\n")
|
||||
set(layer_declaration_class "${layer_declaration_class}, virtual public ${class}_${NCNN_TARGET_ARCH}")
|
||||
set(create_pipeline_content "${create_pipeline_content} { int ret = ${class}_${NCNN_TARGET_ARCH}::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " { int ret = ${class}_${NCNN_TARGET_ARCH}::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}")
|
||||
|
||||
source_group ("sources\\\\layers\\\\${NCNN_TARGET_ARCH}" FILES "${CMAKE_CURRENT_SOURCE_DIR}/layer/${NCNN_TARGET_ARCH}/${name}_${NCNN_TARGET_ARCH}.cpp")
|
||||
endif()
|
||||
|
||||
if(WITH_LAYER_${name}_vulkan)
|
||||
set(layer_declaration "${layer_declaration}#include \"layer/vulkan/${name}_vulkan.h\"\n")
|
||||
set(layer_declaration_class "${layer_declaration_class}, virtual public ${class}_vulkan")
|
||||
set(create_pipeline_content "${create_pipeline_content} if (vkdev) { int ret = ${class}_vulkan::create_pipeline(opt); if (ret) return ret; }\n")
|
||||
set(destroy_pipeline_content " if (vkdev) { int ret = ${class}_vulkan::destroy_pipeline(opt); if (ret) return ret; }\n${destroy_pipeline_content}")
|
||||
|
||||
file(GLOB_RECURSE NCNN_SHADER_SRCS "layer/vulkan/shader/${name}.comp")
|
||||
file(GLOB_RECURSE NCNN_SHADER_SUBSRCS "layer/vulkan/shader/${name}_*.comp")
|
||||
list(APPEND NCNN_SHADER_SRCS ${NCNN_SHADER_SUBSRCS})
|
||||
foreach(NCNN_SHADER_SRC ${NCNN_SHADER_SRCS})
|
||||
ncnn_add_shader(${NCNN_SHADER_SRC})
|
||||
endforeach()
|
||||
|
||||
source_group ("sources\\\\layers\\\\vulkan" FILES "${CMAKE_CURRENT_SOURCE_DIR}/layer/vulkan/${name}_vulkan.cpp")
|
||||
endif()
|
||||
|
||||
if(WITH_LAYER_${name})
|
||||
set(layer_declaration "${layer_declaration}namespace ncnn {\n${layer_declaration_class}\n{\n")
|
||||
set(layer_declaration "${layer_declaration}public:\n")
|
||||
set(layer_declaration "${layer_declaration} virtual int create_pipeline(const Option& opt) {\n${create_pipeline_content} return 0;\n }\n")
|
||||
set(layer_declaration "${layer_declaration} virtual int destroy_pipeline(const Option& opt) {\n${destroy_pipeline_content} return 0;\n }\n")
|
||||
set(layer_declaration "${layer_declaration}};\n")
|
||||
set(layer_declaration "${layer_declaration}DEFINE_LAYER_CREATOR(${class}_final)\n} // namespace ncnn\n\n")
|
||||
endif()
|
||||
|
||||
if(WITH_LAYER_${name})
|
||||
set(layer_registry "${layer_registry}#if NCNN_STRING\n{\"${class}\", ${class}_final_layer_creator},\n#else\n{${class}_final_layer_creator},\n#endif\n")
|
||||
else()
|
||||
set(layer_registry "${layer_registry}#if NCNN_STRING\n{\"${class}\", 0},\n#else\n{0},\n#endif\n")
|
||||
endif()
|
||||
|
||||
if(NCNN_RUNTIME_CPU AND NCNN_TARGET_ARCH STREQUAL "x86")
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC" OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_SIMULATE_ID MATCHES "MSVC" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "MSVC"))
|
||||
if(NCNN_AVX512)
|
||||
ncnn_add_arch_opt_layer(${class} avx512 "/arch:AVX512 /D__FMA__ /D__F16C__")
|
||||
endif()
|
||||
if(NCNN_FMA)
|
||||
ncnn_add_arch_opt_layer(${class} fma "/arch:AVX /D__FMA__ /D__F16C__")
|
||||
endif()
|
||||
if(NCNN_AVX)
|
||||
ncnn_add_arch_opt_layer(${class} avx "/arch:AVX")
|
||||
endif()
|
||||
if(NCNN_AVX512VNNI)
|
||||
ncnn_add_arch_opt_source(${class} avx512vnni "/arch:AVX512 /D__FMA__ /D__F16C__ /D__AVX512VNNI__")
|
||||
endif()
|
||||
if(NCNN_AVXVNNI)
|
||||
ncnn_add_arch_opt_source(${class} avxvnni "/arch:AVX2 /D__FMA__ /D__F16C__ /D__AVXVNNI__")
|
||||
endif()
|
||||
if(NCNN_AVX2)
|
||||
ncnn_add_arch_opt_source(${class} avx2 "/arch:AVX2 /D__FMA__ /D__F16C__")
|
||||
endif()
|
||||
if(NCNN_XOP)
|
||||
ncnn_add_arch_opt_source(${class} xop "/arch:AVX /D__XOP__")
|
||||
endif()
|
||||
if(NCNN_F16C)
|
||||
ncnn_add_arch_opt_source(${class} f16c "/arch:AVX /D__F16C__")
|
||||
endif()
|
||||
else()
|
||||
if(NCNN_AVX512)
|
||||
ncnn_add_arch_opt_layer(${class} avx512 "-mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl -mfma -mf16c")
|
||||
endif()
|
||||
if(NCNN_FMA)
|
||||
ncnn_add_arch_opt_layer(${class} fma "-mavx -mfma")
|
||||
endif()
|
||||
if(NCNN_AVX)
|
||||
ncnn_add_arch_opt_layer(${class} avx "-mavx")
|
||||
endif()
|
||||
if(NCNN_AVX512VNNI)
|
||||
ncnn_add_arch_opt_source(${class} avx512vnni "-mavx512f -mavx512cd -mavx512bw -mavx512dq -mavx512vl -mfma -mf16c -mavx512vnni")
|
||||
endif()
|
||||
if(NCNN_AVXVNNI)
|
||||
ncnn_add_arch_opt_source(${class} avxvnni "-mavx2 -mfma -mf16c -mavxvnni")
|
||||
endif()
|
||||
if(NCNN_AVX2)
|
||||
ncnn_add_arch_opt_source(${class} avx2 "-mavx2 -mfma -mf16c")
|
||||
endif()
|
||||
if(NCNN_XOP)
|
||||
ncnn_add_arch_opt_source(${class} xop "-mavx -mxop")
|
||||
endif()
|
||||
if(NCNN_F16C)
|
||||
ncnn_add_arch_opt_source(${class} f16c "-mavx -mf16c")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NCNN_RUNTIME_CPU AND ((IOS AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64") OR (APPLE AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)")))
|
||||
if(NCNN_ARM82)
|
||||
ncnn_add_arch_opt_layer(${class} arm82 "-march=armv8.2-a+fp16")
|
||||
endif()
|
||||
if(NCNN_ARM82DOT)
|
||||
ncnn_add_arch_opt_source(${class} arm82dot "-march=armv8.2-a+fp16+dotprod")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NCNN_RUNTIME_CPU AND NCNN_TARGET_ARCH STREQUAL "mips")
|
||||
if(NCNN_MSA)
|
||||
ncnn_add_arch_opt_layer(${class} msa "-mmsa")
|
||||
endif()
|
||||
if(NCNN_MMI)
|
||||
ncnn_add_arch_opt_source(${class} mmi "-mloongson-mmi")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NCNN_RUNTIME_CPU AND NCNN_RVV AND NCNN_TARGET_ARCH STREQUAL "riscv")
|
||||
if(NCNN_COMPILER_SUPPORT_RVV_FP16)
|
||||
ncnn_add_arch_opt_layer(${class} rvv "-march=rv64gcv_zfh")
|
||||
elseif(NCNN_COMPILER_SUPPORT_RVV)
|
||||
ncnn_add_arch_opt_layer(${class} rvv "-march=rv64gcv")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# generate layer_type_enum file
|
||||
set(layer_type_enum "${layer_type_enum}${class} = ${__LAYER_TYPE_ENUM_INDEX},\n")
|
||||
math(EXPR __LAYER_TYPE_ENUM_INDEX "${__LAYER_TYPE_ENUM_INDEX}+1")
|
||||
endmacro()
|
27
3rdparty/ncnn/cmake/ncnn_add_shader.cmake
vendored
Normal file
27
3rdparty/ncnn/cmake/ncnn_add_shader.cmake
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
|
||||
macro(ncnn_add_shader NCNN_SHADER_SRC)
|
||||
get_filename_component(NCNN_SHADER_SRC_NAME_WE ${NCNN_SHADER_SRC} NAME_WE)
|
||||
set(NCNN_SHADER_COMP_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${NCNN_SHADER_SRC_NAME_WE}.comp.hex.h)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${NCNN_SHADER_COMP_HEADER}
|
||||
COMMAND ${CMAKE_COMMAND} -DSHADER_SRC=${NCNN_SHADER_SRC} -DSHADER_COMP_HEADER=${NCNN_SHADER_COMP_HEADER} -P "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ncnn_generate_shader_comp_header.cmake"
|
||||
DEPENDS ${NCNN_SHADER_SRC}
|
||||
COMMENT "Preprocessing shader source ${NCNN_SHADER_SRC_NAME_WE}.comp"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${NCNN_SHADER_COMP_HEADER} PROPERTIES GENERATED TRUE)
|
||||
|
||||
get_filename_component(NCNN_SHADER_COMP_HEADER_NAME ${NCNN_SHADER_COMP_HEADER} NAME)
|
||||
string(APPEND layer_shader_spv_data "#include \"${NCNN_SHADER_COMP_HEADER_NAME}\"\n")
|
||||
|
||||
get_filename_component(NCNN_SHADER_SRC_NAME_WE ${NCNN_SHADER_SRC} NAME_WE)
|
||||
string(APPEND layer_shader_registry "{${NCNN_SHADER_SRC_NAME_WE}_comp_data,sizeof(${NCNN_SHADER_SRC_NAME_WE}_comp_data)},\n")
|
||||
|
||||
list(APPEND NCNN_SHADER_SPV_HEX_FILES ${NCNN_SHADER_COMP_HEADER})
|
||||
|
||||
# generate layer_shader_type_enum file
|
||||
set(layer_shader_type_enum "${layer_shader_type_enum}${NCNN_SHADER_SRC_NAME_WE} = ${__LAYER_SHADER_TYPE_ENUM_INDEX},\n")
|
||||
math(EXPR __LAYER_SHADER_TYPE_ENUM_INDEX "${__LAYER_SHADER_TYPE_ENUM_INDEX}+1")
|
||||
endmacro()
|
||||
|
14
3rdparty/ncnn/cmake/ncnn_generate_arm82_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_arm82_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_ARM_H" "LAYER_${CLASS_UPPER}_ARM_ARM82_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_arm" "${CLASS}_arm_arm82" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_arm.h\"" "#include \"${CLASS_LOWER}_arm_arm82.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
14
3rdparty/ncnn/cmake/ncnn_generate_avx512_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_avx512_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_X86_H" "LAYER_${CLASS_UPPER}_X86_AVX512_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_x86" "${CLASS}_x86_avx512" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_x86.h\"" "#include \"${CLASS_LOWER}_x86_avx512.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
14
3rdparty/ncnn/cmake/ncnn_generate_avx_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_avx_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_X86_H" "LAYER_${CLASS_UPPER}_X86_AVX_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_x86" "${CLASS}_x86_avx" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_x86.h\"" "#include \"${CLASS_LOWER}_x86_avx.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
14
3rdparty/ncnn/cmake/ncnn_generate_fma_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_fma_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_X86_H" "LAYER_${CLASS_UPPER}_X86_FMA_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_x86" "${CLASS}_x86_fma" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_x86.h\"" "#include \"${CLASS_LOWER}_x86_fma.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
14
3rdparty/ncnn/cmake/ncnn_generate_msa_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_msa_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_MIPS_H" "LAYER_${CLASS_UPPER}_MIPS_MSA_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_mips" "${CLASS}_mips_msa" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_mips.h\"" "#include \"${CLASS_LOWER}_mips_msa.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
14
3rdparty/ncnn/cmake/ncnn_generate_rvv_source.cmake
vendored
Normal file
14
3rdparty/ncnn/cmake/ncnn_generate_rvv_source.cmake
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
# must define SRC DST CLASS
|
||||
|
||||
file(READ ${SRC} source_data)
|
||||
|
||||
# replace
|
||||
string(TOUPPER ${CLASS} CLASS_UPPER)
|
||||
string(TOLOWER ${CLASS} CLASS_LOWER)
|
||||
|
||||
string(REGEX REPLACE "LAYER_${CLASS_UPPER}_RISCV_H" "LAYER_${CLASS_UPPER}_RISCV_RVV_H" source_data "${source_data}")
|
||||
string(REGEX REPLACE "${CLASS}_riscv" "${CLASS}_riscv_rvv" source_data "${source_data}")
|
||||
string(REGEX REPLACE "#include \"${CLASS_LOWER}_riscv.h\"" "#include \"${CLASS_LOWER}_riscv_rvv.h\"" source_data "${source_data}")
|
||||
|
||||
file(WRITE ${DST} "${source_data}")
|
24
3rdparty/ncnn/cmake/ncnn_generate_shader_comp_header.cmake
vendored
Normal file
24
3rdparty/ncnn/cmake/ncnn_generate_shader_comp_header.cmake
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
# must define SHADER_COMP_HEADER SHADER_SRC
|
||||
|
||||
file(READ ${SHADER_SRC} comp_data)
|
||||
|
||||
# skip leading comment
|
||||
string(FIND "${comp_data}" "#version" version_start)
|
||||
if(NOT ${version_start} EQUAL -1)
|
||||
string(SUBSTRING "${comp_data}" ${version_start} -1 comp_data)
|
||||
endif()
|
||||
|
||||
# remove whitespace
|
||||
string(REGEX REPLACE "\n +" "\n" comp_data "${comp_data}")
|
||||
|
||||
get_filename_component(SHADER_SRC_NAME_WE ${SHADER_SRC} NAME_WE)
|
||||
|
||||
# text to hex
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.text2hex.txt "${comp_data}")
|
||||
file(READ ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.text2hex.txt comp_data_hex HEX)
|
||||
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," comp_data_hex ${comp_data_hex})
|
||||
string(FIND "${comp_data_hex}" "," tail_comma REVERSE)
|
||||
string(SUBSTRING "${comp_data_hex}" 0 ${tail_comma} comp_data_hex)
|
||||
|
||||
file(WRITE ${SHADER_COMP_HEADER} "static const char ${SHADER_SRC_NAME_WE}_comp_data[] = {${comp_data_hex}};\n")
|
581
3rdparty/ncnn/cmake/ncnn_generate_shader_spv_header.cmake
vendored
Normal file
581
3rdparty/ncnn/cmake/ncnn_generate_shader_spv_header.cmake
vendored
Normal file
@ -0,0 +1,581 @@
|
||||
|
||||
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 -Dsfpvec8=mat2x4 -Dsfpmat4=mat4
|
||||
-Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=vec4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a]);}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=mat2x4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a],sbuf[sii4.r],sbuf[sii4.g],sbuf[sii4.b],sbuf[sii4.a]);}"
|
||||
"-D buffer_ld2(buf,i)=buf[i]"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=buf[i]"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={vec4 _v=sbuf[si]; buf[i4.r]=_v.r;buf[i4.g]=_v.g;buf[i4.b]=_v.b;buf[i4.a]=_v.a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=mat2x4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=buf[i]"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={mat2x4 _v=sbuf[si]; buf[i4.r]=_v[0].r;buf[i4.g]=_v[0].g;buf[i4.b]=_v[0].b;buf[i4.a]=_v[0].a; buf[ii4.r]=_v[1].r;buf[ii4.g]=_v[1].g;buf[ii4.b]=_v[1].b;buf[ii4.a]=_v[1].a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={mat2x4 _v=sbuf[si]; buf[i2.r]=_v[0];buf[i2.g]=_v[1];}"
|
||||
"-D sfp2afpmat4(v)=v"
|
||||
"-D afp2sfpmat4(v)=v"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-V -s -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 -Dsfpvec8=uvec4
|
||||
-Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=uvec2(packHalf2x16(vec2(sbuf[si4.r],sbuf[si4.g])),packHalf2x16(vec2(sbuf[si4.b],sbuf[si4.a])));}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=uvec4(packHalf2x16(vec2(sbuf[si4.r],sbuf[si4.g])),packHalf2x16(vec2(sbuf[si4.b],sbuf[si4.a])),packHalf2x16(vec2(sbuf[sii4.r],sbuf[sii4.g])),packHalf2x16(vec2(sbuf[sii4.b],sbuf[sii4.a])));}"
|
||||
"-D buffer_ld2(buf,i)=unpackHalf2x16(buf[i])"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=packHalf2x16(v)}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=vec4(unpackHalf2x16(buf[i].x),unpackHalf2x16(buf[i].y))"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=uvec2(packHalf2x16(v.rg),packHalf2x16(v.ba));}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={uvec2 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.x);vec2 _v1=unpackHalf2x16(_v.y); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=uvec4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=mat2x4(vec4(unpackHalf2x16(buf[i].r),unpackHalf2x16(buf[i].g)),vec4(unpackHalf2x16(buf[i].b),unpackHalf2x16(buf[i].a)))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=uvec4(uvec2(packHalf2x16(v[0].rg),packHalf2x16(v[0].ba)),uvec2(packHalf2x16(v[1].rg),packHalf2x16(v[1].ba)));}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={uvec4 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.r);vec2 _v1=unpackHalf2x16(_v.g);vec2 _v2=unpackHalf2x16(_v.b);vec2 _v3=unpackHalf2x16(_v.a); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g; buf[ii4.r]=_v2.r;buf[ii4.g]=_v2.g;buf[ii4.b]=_v3.r;buf[ii4.a]=_v3.g;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={uvec4 _v=sbuf[si]; buf[i2.r]=_v.rg;buf[i2.g]=_v.ba;}"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_fp16_packed=1
|
||||
-V -s -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 packed + fp16 arithmetic
|
||||
set(SHADER_fp16pa_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16pa")
|
||||
|
||||
set(SHADER_fp16pa_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16pa_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_fp16pa_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float -Dsfpvec2=uint -Dsfpvec4=uvec2 -Dsfpvec8=uvec4
|
||||
-Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpvec8=f16mat2x4 -Dafpmat4=f16mat4
|
||||
"-D buffer_ld1(buf,i)=float16_t(buf[i])"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=float(v);}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=uvec2(packHalf2x16(vec2(f16vec2(sbuf[si4.r],sbuf[si4.g]))),packHalf2x16(vec2(f16vec2(sbuf[si4.b],sbuf[si4.a]))));}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=uvec4(packHalf2x16(vec2(f16vec2(sbuf[si4.r],sbuf[si4.g]))),packHalf2x16(vec2(f16vec2(sbuf[si4.b],sbuf[si4.a]))),packHalf2x16(vec2(f16vec2(sbuf[sii4.r],sbuf[sii4.g]))),packHalf2x16(vec2(f16vec2(sbuf[sii4.b],sbuf[sii4.a]))));}"
|
||||
"-D buffer_ld2(buf,i)=f16vec2(unpackHalf2x16(buf[i]))"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=packHalf2x16(vec2(v))}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=f16vec4(vec4(unpackHalf2x16(buf[i].x),unpackHalf2x16(buf[i].y)))"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=uvec2(packHalf2x16(vec2(v.rg)),packHalf2x16(vec2(v.ba)));}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={uvec2 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.x);vec2 _v1=unpackHalf2x16(_v.y); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=uvec4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=f16mat2x4(f16vec4(vec4(unpackHalf2x16(buf[i].r),unpackHalf2x16(buf[i].g))),f16vec4(vec4(unpackHalf2x16(buf[i].b),unpackHalf2x16(buf[i].a))))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=uvec4(uvec2(packHalf2x16(vec2(v[0].rg)),packHalf2x16(vec2(v[0].ba))),uvec2(packHalf2x16(vec2(v[1].rg)),packHalf2x16(vec2(v[1].ba))));}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={uvec4 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.r);vec2 _v1=unpackHalf2x16(_v.g);vec2 _v2=unpackHalf2x16(_v.b);vec2 _v3=unpackHalf2x16(_v.a); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g; buf[ii4.r]=_v2.r;buf[ii4.g]=_v2.g;buf[ii4.b]=_v3.r;buf[ii4.a]=_v3.g;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={uvec4 _v=sbuf[si]; buf[i2.r]=_v.rg;buf[i2.g]=_v.ba;}"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_fp16_packed=1 -DNCNN_fp16_arithmetic=1
|
||||
-V -s -x -o ${SHADER_fp16pa_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_fp16pa_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_fp16pa_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 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
"-D buffer_ld1(buf,i)=float(buf[i])"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=float16_t(v);}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i].r=sbuf[si4.r];buf[i].g=sbuf[si4.g];buf[i].b=sbuf[si4.b];buf[i].a=sbuf[si4.a];}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i].abcd.r=sbuf[si4.r];buf[i].abcd.g=sbuf[si4.g];buf[i].abcd.b=sbuf[si4.b];buf[i].abcd.a=sbuf[si4.a];buf[i].efgh.r=sbuf[sii4.r];buf[i].efgh.g=sbuf[sii4.g];buf[i].efgh.b=sbuf[sii4.b];buf[i].efgh.a=sbuf[sii4.a];}"
|
||||
"-D buffer_ld2(buf,i)=vec2(buf[i])"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=f16vec2(v);}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=vec4(buf[i])"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=f16vec4(v);}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={buf[i4.r]=sbuf[si].r;buf[i4.g]=sbuf[si].g;buf[i4.b]=sbuf[si].b;buf[i4.a]=sbuf[si].a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i].abcd=sbuf[si2.r];buf[i].efgh=sbuf[si2.g];}"
|
||||
"-D buffer_ld8(buf,i)=mat2x4(vec4(buf[i].abcd),vec4(buf[i].efgh))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i].abcd=f16vec4(v[0]);buf[i].efgh=f16vec4(v[1]);}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i].abcd=sbuf[si].abcd;buf[i].efgh=sbuf[si].efgh;}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={buf[i4.r]=sbuf[si].abcd.r;buf[i4.g]=sbuf[si].abcd.g;buf[i4.b]=sbuf[si].abcd.b;buf[i4.a]=sbuf[si].abcd.a; buf[ii4.r]=sbuf[si].efgh.r;buf[ii4.g]=sbuf[si].efgh.g;buf[ii4.b]=sbuf[si].efgh.b;buf[ii4.a]=sbuf[si].efgh.a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={buf[i2.r]=sbuf[si].abcd;buf[i2.g]=sbuf[si].efgh;}"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_fp16_storage=1
|
||||
-V -s -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_fp16sa_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_fp16sa")
|
||||
|
||||
set(SHADER_fp16sa_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_fp16sa_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_fp16sa_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dsfpvec8=f16mat2x4 -Dsfpmat4=f16mat4
|
||||
-Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpvec8=f16mat2x4 -Dafpmat4=f16mat4
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=f16vec4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a]);}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=f16mat2x4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a],sbuf[sii4.r],sbuf[sii4.g],sbuf[sii4.b],sbuf[sii4.a]);}"
|
||||
"-D buffer_ld2(buf,i)=buf[i]"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=buf[i]"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={buf[i4.r]=sbuf[si].r;buf[i4.g]=sbuf[si].g;buf[i4.b]=sbuf[si].b;buf[i4.a]=sbuf[si].a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=f16mat2x4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=buf[i]"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={f16mat2x4 _v=sbuf[si]; buf[i4.r]=_v[0].r;buf[i4.g]=_v[0].g;buf[i4.b]=_v[0].b;buf[i4.a]=_v[0].a; buf[ii4.r]=_v[1].r;buf[ii4.g]=_v[1].g;buf[ii4.b]=_v[1].b;buf[ii4.a]=_v[1].a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={f16mat2x4 _v=sbuf[si]; buf[i2.r]=_v[0];buf[i2.g]=_v[1];}"
|
||||
"-D sfp2afpmat4(v)=v"
|
||||
"-D afp2sfpmat4(v)=v"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_fp16_storage=1 -DNCNN_fp16_arithmetic=1
|
||||
-V -s -x -o ${SHADER_fp16sa_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_fp16sa_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_fp16sa_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
# image + fp32
|
||||
set(SHADER_image_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_image")
|
||||
|
||||
set(SHADER_image_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_image_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_image_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float -Dsfpvec2=vec2 -Dsfpvec4=vec4 -Dsfpvec8=mat2x4 -Dsfpmat4=mat4
|
||||
-Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
|
||||
-Dimfmtc1=r32f -Dimfmtc4=rgba32f
|
||||
-Dunfp=highp
|
||||
|
||||
"-D image1d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image2d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image3d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image1d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image2d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image3d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image1d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image2d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image3d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image1d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image2d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image3d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image1d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld8(tex,p)=mat2x4(texelFetch(tex,(p)*2,0),texelFetch(tex,(p)*2+1,0))"
|
||||
"-D image2d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec2(p.x*2,p.y),0),texelFetch(tex,ivec2(p.x*2+1,p.y),0))"
|
||||
"-D image3d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec3(p.x*2,p.y,p.z),0),texelFetch(tex,ivec3(p.x*2+1,p.y,p.z),0))"
|
||||
"-D image1d_st8(img,p,v)={imageStore(img,(p)*2,v[0]);imageStore(img,(p)*2+1,v[1]);}"
|
||||
"-D image2d_st8(img,p,v)={imageStore(img,ivec2(p.x*2,p.y),v[0]);imageStore(img,ivec2(p.x*2+1,p.y),v[1]);}"
|
||||
"-D image3d_st8(img,p,v)={imageStore(img,ivec3(p.x*2,p.y,p.z),v[0]);imageStore(img,ivec3(p.x*2+1,p.y,p.z),v[1]);}"
|
||||
"-D image1d_cp8(img,p,tex,sp)={imageStore(img,(p)*2,texelFetch(tex,sp*2,0));imageStore(img,(p)*2+1,texelFetch(tex,sp*2+1,0));}"
|
||||
"-D image2d_cp8(img,p,tex,sp)={imageStore(img,ivec2(p.x*2,p.y),texelFetch(tex,ivec2(sp.x*2,sp.y),0));imageStore(img,ivec2(p.x*2+1,p.y),texelFetch(tex,ivec2(sp.x*2+1,sp.y),0));}"
|
||||
"-D image3d_cp8(img,p,tex,sp)={imageStore(img,ivec3(p.x*2,p.y,p.z),texelFetch(tex,ivec3(sp.x*2,sp.y,sp.z),0));imageStore(img,ivec3(p.x*2+1,p.y,p.z),texelFetch(tex,ivec3(sp.x*2+1,sp.y,sp.z),0));}"
|
||||
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=vec4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a]);}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=mat2x4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a],sbuf[sii4.r],sbuf[sii4.g],sbuf[sii4.b],sbuf[sii4.a]);}"
|
||||
"-D buffer_ld2(buf,i)=buf[i]"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=buf[i]"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={vec4 _v=sbuf[si]; buf[i4.r]=_v.r;buf[i4.g]=_v.g;buf[i4.b]=_v.b;buf[i4.a]=_v.a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=mat2x4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=buf[i]"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={mat2x4 _v=sbuf[si]; buf[i4.r]=_v[0].r;buf[i4.g]=_v[0].g;buf[i4.b]=_v[0].b;buf[i4.a]=_v[0].a; buf[ii4.r]=_v[1].r;buf[ii4.g]=_v[1].g;buf[ii4.b]=_v[1].b;buf[ii4.a]=_v[1].a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={mat2x4 _v=sbuf[si]; buf[i2.r]=_v[0];buf[i2.g]=_v[1];}"
|
||||
|
||||
"-D sfp2afpmat4(v)=v"
|
||||
"-D afp2sfpmat4(v)=v"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_image_shader=1
|
||||
-V -s -x -o ${SHADER_image_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_image_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_image_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
# image + fp16p
|
||||
set(SHADER_image_fp16p_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_image_fp16p")
|
||||
|
||||
set(SHADER_image_fp16p_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_image_fp16p_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_image_fp16p_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float -Dsfpvec2=uint -Dsfpvec4=uvec2 -Dsfpvec8=uvec4
|
||||
-Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
|
||||
-Dimfmtc1=r32f -Dimfmtc4=rgba16f
|
||||
-Dunfp=mediump
|
||||
|
||||
"-D image1d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image2d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image3d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image1d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image2d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image3d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image1d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image2d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image3d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image1d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image2d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image3d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image1d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld8(tex,p)=mat2x4(texelFetch(tex,(p)*2,0),texelFetch(tex,(p)*2+1,0))"
|
||||
"-D image2d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec2(p.x*2,p.y),0),texelFetch(tex,ivec2(p.x*2+1,p.y),0))"
|
||||
"-D image3d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec3(p.x*2,p.y,p.z),0),texelFetch(tex,ivec3(p.x*2+1,p.y,p.z),0))"
|
||||
"-D image1d_st8(img,p,v)={imageStore(img,(p)*2,v[0]);imageStore(img,(p)*2+1,v[1]);}"
|
||||
"-D image2d_st8(img,p,v)={imageStore(img,ivec2(p.x*2,p.y),v[0]);imageStore(img,ivec2(p.x*2+1,p.y),v[1]);}"
|
||||
"-D image3d_st8(img,p,v)={imageStore(img,ivec3(p.x*2,p.y,p.z),v[0]);imageStore(img,ivec3(p.x*2+1,p.y,p.z),v[1]);}"
|
||||
"-D image1d_cp8(img,p,tex,sp)={imageStore(img,(p)*2,texelFetch(tex,sp*2,0));imageStore(img,(p)*2+1,texelFetch(tex,sp*2+1,0));}"
|
||||
"-D image2d_cp8(img,p,tex,sp)={imageStore(img,ivec2(p.x*2,p.y),texelFetch(tex,ivec2(sp.x*2,sp.y),0));imageStore(img,ivec2(p.x*2+1,p.y),texelFetch(tex,ivec2(sp.x*2+1,sp.y),0));}"
|
||||
"-D image3d_cp8(img,p,tex,sp)={imageStore(img,ivec3(p.x*2,p.y,p.z),texelFetch(tex,ivec3(sp.x*2,sp.y,sp.z),0));imageStore(img,ivec3(p.x*2+1,p.y,p.z),texelFetch(tex,ivec3(sp.x*2+1,sp.y,sp.z),0));}"
|
||||
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=uvec2(packHalf2x16(vec2(sbuf[si4.r],sbuf[si4.g])),packHalf2x16(vec2(sbuf[si4.b],sbuf[si4.a])));}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=uvec4(packHalf2x16(vec2(sbuf[si4.r],sbuf[si4.g])),packHalf2x16(vec2(sbuf[si4.b],sbuf[si4.a])),packHalf2x16(vec2(sbuf[sii4.r],sbuf[sii4.g])),packHalf2x16(vec2(sbuf[sii4.b],sbuf[sii4.a])));}"
|
||||
"-D buffer_ld2(buf,i)=unpackHalf2x16(buf[i])"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=packHalf2x16(v)}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=vec4(unpackHalf2x16(buf[i].x),unpackHalf2x16(buf[i].y))"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=uvec2(packHalf2x16(v.rg),packHalf2x16(v.ba));}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={uvec2 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.x);vec2 _v1=unpackHalf2x16(_v.y); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=uvec4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=mat2x4(vec4(unpackHalf2x16(buf[i].r),unpackHalf2x16(buf[i].g)),vec4(unpackHalf2x16(buf[i].b),unpackHalf2x16(buf[i].a)))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=uvec4(uvec2(packHalf2x16(v[0].rg),packHalf2x16(v[0].ba)),uvec2(packHalf2x16(v[1].rg),packHalf2x16(v[1].ba)));}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={uvec4 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.r);vec2 _v1=unpackHalf2x16(_v.g);vec2 _v2=unpackHalf2x16(_v.b);vec2 _v3=unpackHalf2x16(_v.a); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g; buf[ii4.r]=_v2.r;buf[ii4.g]=_v2.g;buf[ii4.b]=_v3.r;buf[ii4.a]=_v3.g;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={uvec4 _v=sbuf[si]; buf[i2.r]=_v.rg;buf[i2.g]=_v.ba;}"
|
||||
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_image_shader=1 -DNCNN_fp16_packed=1
|
||||
-V -s -x -o ${SHADER_image_fp16p_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_image_fp16p_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_image_fp16p_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
# image + fp16p + fp16a
|
||||
set(SHADER_image_fp16pa_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_image_fp16pa")
|
||||
|
||||
set(SHADER_image_fp16pa_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_image_fp16pa_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_image_fp16pa_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float -Dsfpvec2=uint -Dsfpvec4=uvec2 -Dsfpvec8=uvec4
|
||||
-Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpvec8=f16mat2x4 -Dafpmat4=f16mat4
|
||||
|
||||
-Dimfmtc1=r32f -Dimfmtc4=rgba16f
|
||||
-Dunfp=mediump
|
||||
|
||||
"-D image1d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image2d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image3d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image1d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image2d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image3d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image1d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image2d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image3d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image1d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image2d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image3d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image1d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld8(tex,p)=f16mat2x4(texelFetch(tex,(p)*2,0),texelFetch(tex,(p)*2+1,0))"
|
||||
"-D image2d_ld8(tex,p)=f16mat2x4(texelFetch(tex,ivec2(p.x*2,p.y),0),texelFetch(tex,ivec2(p.x*2+1,p.y),0))"
|
||||
"-D image3d_ld8(tex,p)=f16mat2x4(texelFetch(tex,ivec3(p.x*2,p.y,p.z),0),texelFetch(tex,ivec3(p.x*2+1,p.y,p.z),0))"
|
||||
"-D image1d_st8(img,p,v)={imageStore(img,(p)*2,v[0]);imageStore(img,(p)*2+1,v[1]);}"
|
||||
"-D image2d_st8(img,p,v)={imageStore(img,ivec2(p.x*2,p.y),v[0]);imageStore(img,ivec2(p.x*2+1,p.y),v[1]);}"
|
||||
"-D image3d_st8(img,p,v)={imageStore(img,ivec3(p.x*2,p.y,p.z),v[0]);imageStore(img,ivec3(p.x*2+1,p.y,p.z),v[1]);}"
|
||||
"-D image1d_cp8(img,p,tex,sp)={imageStore(img,(p)*2,texelFetch(tex,sp*2,0));imageStore(img,(p)*2+1,texelFetch(tex,sp*2+1,0));}"
|
||||
"-D image2d_cp8(img,p,tex,sp)={imageStore(img,ivec2(p.x*2,p.y),texelFetch(tex,ivec2(sp.x*2,sp.y),0));imageStore(img,ivec2(p.x*2+1,p.y),texelFetch(tex,ivec2(sp.x*2+1,sp.y),0));}"
|
||||
"-D image3d_cp8(img,p,tex,sp)={imageStore(img,ivec3(p.x*2,p.y,p.z),texelFetch(tex,ivec3(sp.x*2,sp.y,sp.z),0));imageStore(img,ivec3(p.x*2+1,p.y,p.z),texelFetch(tex,ivec3(sp.x*2+1,sp.y,sp.z),0));}"
|
||||
|
||||
"-D buffer_ld1(buf,i)=float16_t(buf[i])"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=float(v);}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=uvec2(packHalf2x16(vec2(f16vec2(sbuf[si4.r],sbuf[si4.g]))),packHalf2x16(vec2(f16vec2(sbuf[si4.b],sbuf[si4.a]))));}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=uvec4(packHalf2x16(vec2(f16vec2(sbuf[si4.r],sbuf[si4.g]))),packHalf2x16(vec2(f16vec2(sbuf[si4.b],sbuf[si4.a]))),packHalf2x16(vec2(f16vec2(sbuf[sii4.r],sbuf[sii4.g]))),packHalf2x16(vec2(f16vec2(sbuf[sii4.b],sbuf[sii4.a]))));}"
|
||||
"-D buffer_ld2(buf,i)=f16vec2(unpackHalf2x16(buf[i]))"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=packHalf2x16(vec2(v))}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=f16vec4(vec4(unpackHalf2x16(buf[i].x),unpackHalf2x16(buf[i].y)))"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=uvec2(packHalf2x16(vec2(v.rg)),packHalf2x16(vec2(v.ba)));}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={uvec2 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.x);vec2 _v1=unpackHalf2x16(_v.y); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=uvec4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=f16mat2x4(f16vec4(vec4(unpackHalf2x16(buf[i].r),unpackHalf2x16(buf[i].g))),f16vec4(vec4(unpackHalf2x16(buf[i].b),unpackHalf2x16(buf[i].a))))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=uvec4(uvec2(packHalf2x16(vec2(v[0].rg)),packHalf2x16(vec2(v[0].ba))),uvec2(packHalf2x16(vec2(v[1].rg)),packHalf2x16(vec2(v[1].ba))));}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={uvec4 _v=sbuf[si]; vec2 _v0=unpackHalf2x16(_v.r);vec2 _v1=unpackHalf2x16(_v.g);vec2 _v2=unpackHalf2x16(_v.b);vec2 _v3=unpackHalf2x16(_v.a); buf[i4.r]=_v0.r;buf[i4.g]=_v0.g;buf[i4.b]=_v1.r;buf[i4.a]=_v1.g; buf[ii4.r]=_v2.r;buf[ii4.g]=_v2.g;buf[ii4.b]=_v3.r;buf[ii4.a]=_v3.g;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={uvec4 _v=sbuf[si]; buf[i2.r]=_v.rg;buf[i2.g]=_v.ba;}"
|
||||
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_image_shader=1 -DNCNN_fp16_packed=1 -DNCNN_fp16_arithmetic=1
|
||||
-V -s -x -o ${SHADER_image_fp16pa_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_image_fp16pa_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_image_fp16pa_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
# image + fp16s
|
||||
set(SHADER_image_fp16s_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_image_fp16s")
|
||||
|
||||
set(SHADER_image_fp16s_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_image_fp16s_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_image_fp16s_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4
|
||||
-Dafp=float -Dafpvec2=vec2 -Dafpvec4=vec4 -Dafpvec8=mat2x4 -Dafpmat4=mat4
|
||||
|
||||
-Dimfmtc1=r16f -Dimfmtc4=rgba16f
|
||||
-Dunfp=mediump
|
||||
|
||||
"-D image1d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image2d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image3d_ld1(tex,p)=texelFetch(tex,p,0).r"
|
||||
"-D image1d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image2d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image3d_st1(img,p,v)={vec4 _v;_v.r=v;imageStore(img,p,_v);}"
|
||||
"-D image1d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image2d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image3d_ld4(tex,p)=texelFetch(tex,p,0)"
|
||||
"-D image1d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image2d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image3d_st4(img,p,v)={imageStore(img,p,v);}"
|
||||
"-D image1d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld8(tex,p)=mat2x4(texelFetch(tex,(p)*2,0),texelFetch(tex,(p)*2+1,0))"
|
||||
"-D image2d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec2(p.x*2,p.y),0),texelFetch(tex,ivec2(p.x*2+1,p.y),0))"
|
||||
"-D image3d_ld8(tex,p)=mat2x4(texelFetch(tex,ivec3(p.x*2,p.y,p.z),0),texelFetch(tex,ivec3(p.x*2+1,p.y,p.z),0))"
|
||||
"-D image1d_st8(img,p,v)={imageStore(img,(p)*2,v[0]);imageStore(img,(p)*2+1,v[1]);}"
|
||||
"-D image2d_st8(img,p,v)={imageStore(img,ivec2(p.x*2,p.y),v[0]);imageStore(img,ivec2(p.x*2+1,p.y),v[1]);}"
|
||||
"-D image3d_st8(img,p,v)={imageStore(img,ivec3(p.x*2,p.y,p.z),v[0]);imageStore(img,ivec3(p.x*2+1,p.y,p.z),v[1]);}"
|
||||
"-D image1d_cp8(img,p,tex,sp)={imageStore(img,(p)*2,texelFetch(tex,sp*2,0));imageStore(img,(p)*2+1,texelFetch(tex,sp*2+1,0));}"
|
||||
"-D image2d_cp8(img,p,tex,sp)={imageStore(img,ivec2(p.x*2,p.y),texelFetch(tex,ivec2(sp.x*2,sp.y),0));imageStore(img,ivec2(p.x*2+1,p.y),texelFetch(tex,ivec2(sp.x*2+1,sp.y),0));}"
|
||||
"-D image3d_cp8(img,p,tex,sp)={imageStore(img,ivec3(p.x*2,p.y,p.z),texelFetch(tex,ivec3(sp.x*2,sp.y,sp.z),0));imageStore(img,ivec3(p.x*2+1,p.y,p.z),texelFetch(tex,ivec3(sp.x*2+1,sp.y,sp.z),0));}"
|
||||
|
||||
"-D buffer_ld1(buf,i)=float(buf[i])"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=float16_t(v);}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i].r=sbuf[si4.r];buf[i].g=sbuf[si4.g];buf[i].b=sbuf[si4.b];buf[i].a=sbuf[si4.a];}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i].abcd.r=sbuf[si4.r];buf[i].abcd.g=sbuf[si4.g];buf[i].abcd.b=sbuf[si4.b];buf[i].abcd.a=sbuf[si4.a];buf[i].efgh.r=sbuf[sii4.r];buf[i].efgh.g=sbuf[sii4.g];buf[i].efgh.b=sbuf[sii4.b];buf[i].efgh.a=sbuf[sii4.a];}"
|
||||
"-D buffer_ld2(buf,i)=vec2(buf[i])"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=f16vec2(v);}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=vec4(buf[i])"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=f16vec4(v);}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={buf[i4.r]=sbuf[si].r;buf[i4.g]=sbuf[si].g;buf[i4.b]=sbuf[si].b;buf[i4.a]=sbuf[si].a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i].abcd=sbuf[si2.r];buf[i].efgh=sbuf[si2.g];}"
|
||||
"-D buffer_ld8(buf,i)=mat2x4(vec4(buf[i].abcd),vec4(buf[i].efgh))"
|
||||
"-D buffer_st8(buf,i,v)={buf[i].abcd=f16vec4(v[0]);buf[i].efgh=f16vec4(v[1]);}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i].abcd=sbuf[si].abcd;buf[i].efgh=sbuf[si].efgh;}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={buf[i4.r]=sbuf[si].abcd.r;buf[i4.g]=sbuf[si].abcd.g;buf[i4.b]=sbuf[si].abcd.b;buf[i4.a]=sbuf[si].abcd.a; buf[ii4.r]=sbuf[si].efgh.r;buf[ii4.g]=sbuf[si].efgh.g;buf[ii4.b]=sbuf[si].efgh.b;buf[ii4.a]=sbuf[si].efgh.a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={buf[i2.r]=sbuf[si].abcd;buf[i2.g]=sbuf[si].efgh;}"
|
||||
|
||||
"-D sfp2afpmat4(v)=v"
|
||||
"-D afp2sfpmat4(v)=v"
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_image_shader=1 -DNCNN_fp16_storage=1
|
||||
-V -s -x -o ${SHADER_image_fp16s_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_image_fp16s_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_image_fp16s_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
# image + fp16s + fp16a
|
||||
set(SHADER_image_fp16sa_SRC_NAME_WE "${SHADER_SRC_NAME_WE}_image_fp16sa")
|
||||
|
||||
set(SHADER_image_fp16sa_SPV_HEX_FILE ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_image_fp16sa_SRC_NAME_WE}.spv.hex.h)
|
||||
add_custom_command(
|
||||
OUTPUT ${SHADER_image_fp16sa_SPV_HEX_FILE}
|
||||
COMMAND ${GLSLANGVALIDATOR_EXECUTABLE}
|
||||
ARGS -Dsfp=float16_t -Dsfpvec2=f16vec2 -Dsfpvec4=f16vec4 -Dsfpvec8=f16mat2x4 -Dsfpmat4=f16mat4
|
||||
-Dafp=float16_t -Dafpvec2=f16vec2 -Dafpvec4=f16vec4 -Dafpvec8=f16mat2x4 -Dafpmat4=f16mat4
|
||||
|
||||
-Dimfmtc1=r16f -Dimfmtc4=rgba16f
|
||||
-Dunfp=mediump
|
||||
|
||||
"-D image1d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image2d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image3d_ld1(tex,p)=float16_t(texelFetch(tex,p,0).r)"
|
||||
"-D image1d_st1(img,p,v)={f16vec4 _v;_v.r=float16_t(v);imageStore(img,p,_v);}"
|
||||
"-D image2d_st1(img,p,v)={f16vec4 _v;_v.r=float16_t(v);imageStore(img,p,_v);}"
|
||||
"-D image3d_st1(img,p,v)={f16vec4 _v;_v.r=float16_t(v);imageStore(img,p,_v);}"
|
||||
"-D image1d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp1(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image2d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image3d_ld4(tex,p)=f16vec4(texelFetch(tex,p,0))"
|
||||
"-D image1d_st4(img,p,v)={imageStore(img,p,vec4(v));}"
|
||||
"-D image2d_st4(img,p,v)={imageStore(img,p,vec4(v));}"
|
||||
"-D image3d_st4(img,p,v)={imageStore(img,p,vec4(v));}"
|
||||
"-D image1d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image2d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
"-D image3d_cp4(img,p,tex,sp)={imageStore(img,p,texelFetch(tex,sp,0));}"
|
||||
|
||||
"-D image1d_ld8(tex,p)=f16mat2x4(texelFetch(tex,(p)*2,0),texelFetch(tex,(p)*2+1,0))"
|
||||
"-D image2d_ld8(tex,p)=f16mat2x4(texelFetch(tex,ivec2(p.x*2,p.y),0),texelFetch(tex,ivec2(p.x*2+1,p.y),0))"
|
||||
"-D image3d_ld8(tex,p)=f16mat2x4(texelFetch(tex,ivec3(p.x*2,p.y,p.z),0),texelFetch(tex,ivec3(p.x*2+1,p.y,p.z),0))"
|
||||
"-D image1d_st8(img,p,v)={imageStore(img,(p)*2,vec4(v[0]));imageStore(img,(p)*2+1,vec4(v[1]));}"
|
||||
"-D image2d_st8(img,p,v)={imageStore(img,ivec2(p.x*2,p.y),vec4(v[0]));imageStore(img,ivec2(p.x*2+1,p.y),vec4(v[1]));}"
|
||||
"-D image3d_st8(img,p,v)={imageStore(img,ivec3(p.x*2,p.y,p.z),vec4(v[0]));imageStore(img,ivec3(p.x*2+1,p.y,p.z),vec4(v[1]));}"
|
||||
"-D image1d_cp8(img,p,tex,sp)={imageStore(img,(p)*2,texelFetch(tex,sp*2,0));imageStore(img,(p)*2+1,texelFetch(tex,sp*2+1,0));}"
|
||||
"-D image2d_cp8(img,p,tex,sp)={imageStore(img,ivec2(p.x*2,p.y),texelFetch(tex,ivec2(sp.x*2,sp.y),0));imageStore(img,ivec2(p.x*2+1,p.y),texelFetch(tex,ivec2(sp.x*2+1,sp.y),0));}"
|
||||
"-D image3d_cp8(img,p,tex,sp)={imageStore(img,ivec3(p.x*2,p.y,p.z),texelFetch(tex,ivec3(sp.x*2,sp.y,sp.z),0));imageStore(img,ivec3(p.x*2+1,p.y,p.z),texelFetch(tex,ivec3(sp.x*2+1,sp.y,sp.z),0));}"
|
||||
|
||||
"-D buffer_ld1(buf,i)=buf[i]"
|
||||
"-D buffer_st1(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp1(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp1to4(buf,i,sbuf,si4)={buf[i]=f16vec4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a]);}"
|
||||
"-D buffer_cp1to8(buf,i,sbuf,si4,sii4)={buf[i]=f16mat2x4(sbuf[si4.r],sbuf[si4.g],sbuf[si4.b],sbuf[si4.a],sbuf[sii4.r],sbuf[sii4.g],sbuf[sii4.b],sbuf[sii4.a]);}"
|
||||
"-D buffer_ld2(buf,i)=buf[i]"
|
||||
"-D buffer_st2(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp2(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_ld4(buf,i)=buf[i]"
|
||||
"-D buffer_st4(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp4(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp4to1(buf,i4,sbuf,si)={buf[i4.r]=sbuf[si].r;buf[i4.g]=sbuf[si].g;buf[i4.b]=sbuf[si].b;buf[i4.a]=sbuf[si].a;}"
|
||||
"-D buffer_cp4to8(buf,i,sbuf,si2)={buf[i]=f16mat2x4(sbuf[si2.r],sbuf[si2.g]);}"
|
||||
"-D buffer_ld8(buf,i)=buf[i]"
|
||||
"-D buffer_st8(buf,i,v)={buf[i]=v;}"
|
||||
"-D buffer_cp8(buf,i,sbuf,si)={buf[i]=sbuf[si];}"
|
||||
"-D buffer_cp8to1(buf,i4,ii4,sbuf,si)={f16mat2x4 _v=sbuf[si]; buf[i4.r]=_v[0].r;buf[i4.g]=_v[0].g;buf[i4.b]=_v[0].b;buf[i4.a]=_v[0].a; buf[ii4.r]=_v[1].r;buf[ii4.g]=_v[1].g;buf[ii4.b]=_v[1].b;buf[ii4.a]=_v[1].a;}"
|
||||
"-D buffer_cp8to4(buf,i2,sbuf,si)={f16mat2x4 _v=sbuf[si]; buf[i2.r]=_v[0];buf[i2.g]=_v[1];}"
|
||||
"-D sfp2afpmat4(v)=v"
|
||||
"-D afp2sfpmat4(v)=v"
|
||||
|
||||
"-D psc(x)=(x==0?p.x:x)"
|
||||
-DNCNN_image_shader=1 -DNCNN_fp16_storage=1 -DNCNN_fp16_arithmetic=1
|
||||
-V -s -x -o ${SHADER_image_fp16sa_SPV_HEX_FILE} ${SHADER_SRC}
|
||||
DEPENDS ${SHADER_SRC}
|
||||
COMMENT "Building SPIR-V module ${SHADER_image_fp16sa_SRC_NAME_WE}.spv"
|
||||
VERBATIM
|
||||
)
|
||||
set_source_files_properties(${SHADER_image_fp16sa_SPV_HEX_FILE} PROPERTIES GENERATED TRUE)
|
||||
|
||||
set(LOCAL_SHADER_SPV_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${SHADER_SRC_NAME_WE}.spv.h)
|
||||
|
||||
file(WRITE ${LOCAL_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_fp16pa_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16pa_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_fp16sa_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_fp16sa_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
"static const uint32_t ${SHADER_image_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_image_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
"static const uint32_t ${SHADER_image_fp16p_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_image_fp16p_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
"static const uint32_t ${SHADER_image_fp16pa_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_image_fp16pa_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
"static const uint32_t ${SHADER_image_fp16s_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_image_fp16s_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
"static const uint32_t ${SHADER_image_fp16sa_SRC_NAME_WE}_spv_data[] = {\n#include \"${SHADER_image_fp16sa_SRC_NAME_WE}.spv.hex.h\"\n};\n"
|
||||
)
|
||||
|
||||
set_source_files_properties(${LOCAL_SHADER_SPV_HEADER} PROPERTIES GENERATED TRUE)
|
||||
|
||||
set(LOCAL_SHADER_SPV_HEX_HEADERS
|
||||
${SHADER_SPV_HEX_FILE}
|
||||
${SHADER_fp16p_SPV_HEX_FILE}
|
||||
${SHADER_fp16pa_SPV_HEX_FILE}
|
||||
${SHADER_fp16s_SPV_HEX_FILE}
|
||||
${SHADER_fp16sa_SPV_HEX_FILE}
|
||||
${SHADER_image_SPV_HEX_FILE}
|
||||
${SHADER_image_fp16p_SPV_HEX_FILE}
|
||||
${SHADER_image_fp16pa_SPV_HEX_FILE}
|
||||
${SHADER_image_fp16s_SPV_HEX_FILE}
|
||||
${SHADER_image_fp16sa_SPV_HEX_FILE}
|
||||
)
|
||||
|
||||
set(${SHADER_SPV_HEADER} ${LOCAL_SHADER_SPV_HEADER} PARENT_SCOPE)
|
||||
set(${SHADER_SPV_HEX_HEADERS} ${LOCAL_SHADER_SPV_HEX_HEADERS} PARENT_SCOPE)
|
||||
|
||||
endfunction()
|
5
3rdparty/ncnn/cmake/run_test.cmake
vendored
Normal file
5
3rdparty/ncnn/cmake/run_test.cmake
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
execute_process(COMMAND $ENV{TESTS_EXECUTABLE_LOADER} $ENV{TESTS_EXECUTABLE_LOADER_ARGUMENTS} ${TEST_EXECUTABLE} $ENV{TESTS_ARGUMENTS} RESULT_VARIABLE result)
|
||||
if(NOT "${result}" STREQUAL "0")
|
||||
message(FATAL_ERROR "Test failed with return value '${result}'")
|
||||
endif()
|
Reference in New Issue
Block a user