@@ -55,36 +55,43 @@ macro(ncnn_add_layer class)
5555 else ()
5656 set (arch x86)
5757 endif ()
58- set (LAYER_SRC ${CMAKE_CURRENT_SOURCE_DIR} /layer/${arch} /${name} _${arch} .cpp)
59- if (EXISTS ${LAYER_SRC} )
58+
59+ set (LAYER_ARCH_SRC ${CMAKE_CURRENT_SOURCE_DIR} /layer/${arch} /${name} _${arch} .cpp)
60+ if (EXISTS ${LAYER_ARCH_SRC} )
6061 set (WITH_LAYER_${name} _${arch} 1)
61- list (APPEND ncnn_SRCS ${LAYER_SRC} )
62- if (NCNN_CMAKE_VERBOSE)
63- message (STATUS "Adding layer: ${LAYER_SRC} " )
64- endif ()
62+ list (APPEND ncnn_SRCS ${LAYER_ARCH_SRC} )
63+ endif ()
64+
65+ set (LAYER_VULKAN_SRC ${CMAKE_CURRENT_SOURCE_DIR} /layer/vulkan/${name} _vulkan.cpp)
66+ if (NCNN_VULKAN AND EXISTS ${LAYER_VULKAN_SRC} )
67+ set (WITH_LAYER_${name} _vulkan 1)
68+ list (APPEND ncnn_SRCS ${LAYER_VULKAN_SRC} )
6569 endif ()
6670 endif ()
6771
6872 # generate layer_declaration and layer_registry file
6973 if (WITH_LAYER_${name} )
70- if (WITH_LAYER_${name} _${arch} )
71- string (APPEND layer_declaration
72- "extern Layer* ${class} _${arch} _layer_creator();\n " )
73- string (APPEND layer_registry
74- "#if NCNN_STRING\n {\" ${class} \" ,${class} _${arch} _layer_creator},\n #else\n {${class} _${arch} _layer_creator},\n #endif\n " )
75- else ()
76- string (APPEND layer_declaration
77- "extern Layer* ${class} _layer_creator();\n " )
78- string (APPEND layer_registry
79- "#if NCNN_STRING\n {\" ${class} \" ,${class} _layer_creator},\n #else\n {${class} _layer_creator},\n #endif\n " )
80- endif ()
81- else ()
82- string (APPEND layer_registry "#if NCNN_STRING\n {\" ${class} \" ,0},\n #else\n {0},\n #endif\n " )
74+ set (layer_declaration "${layer_declaration} #include \" layer/${name} .h\"\n " )
75+ set (layer_declaration_class "class ${class} _final : virtual public ${class} " )
76+ set (create_pipeline_content " { int ret = ${class} ::create_pipeline(opt); if (ret) return ret; }\n " )
77+ set (destroy_pipeline_content " { int ret = ${class} ::destroy_pipeline(opt); if (ret) return ret; }\n " )
78+ endif ()
79+
80+ if (WITH_LAYER_${name} _${arch} )
81+ set (layer_declaration "${layer_declaration} #include \" layer/${arch} /${name} _${arch} .h\"\n " )
82+ set (layer_declaration_class "${layer_declaration_class} , virtual public ${class} _${arch} " )
83+ set (create_pipeline_content "${create_pipeline_content} { int ret = ${class} _${arch} ::create_pipeline(opt); if (ret) return ret; }\n " )
84+ set (destroy_pipeline_content " { int ret = ${class} _${arch} ::destroy_pipeline(opt); if (ret) return ret; }\n ${destroy_pipeline_content} " )
8385 endif ()
8486
85- if (WITH_LAYER_${name} AND NCNN_VULKAN)
86- file (GLOB_RECURSE SHADER_SRCS "layer/shader/${name} .comp" )
87- file (GLOB_RECURSE SHADER_SUBSRCS "layer/shader/${name} _*.comp" )
87+ if (WITH_LAYER_${name} _vulkan)
88+ set (layer_declaration "${layer_declaration} #include \" layer/vulkan/${name} _vulkan.h\"\n " )
89+ set (layer_declaration_class "${layer_declaration_class} , virtual public ${class} _vulkan" )
90+ set (create_pipeline_content "${create_pipeline_content} if (opt.vulkan_compute) { int ret = ${class} _vulkan::create_pipeline(opt); if (ret) return ret; }\n " )
91+ set (destroy_pipeline_content " if (opt.vulkan_compute) { int ret = ${class} _vulkan::destroy_pipeline(opt); if (ret) return ret; }\n ${destroy_pipeline_content} " )
92+
93+ file (GLOB_RECURSE SHADER_SRCS "layer/vulkan/shader/${name} .comp" )
94+ file (GLOB_RECURSE SHADER_SUBSRCS "layer/vulkan/shader/${name} _*.comp" )
8895 list (APPEND SHADER_SRCS ${SHADER_SUBSRCS} )
8996 foreach (SHADER_SRC ${SHADER_SRCS} )
9097 get_filename_component (SHADER_SRC_NAME_WE ${SHADER_SRC} NAME_WE )
@@ -145,6 +152,21 @@ macro(ncnn_add_layer class)
145152 endforeach ()
146153 endif ()
147154
155+ if (WITH_LAYER_${name} )
156+ set (layer_declaration "${layer_declaration} namespace ncnn {\n ${layer_declaration_class} \n {\n " )
157+ set (layer_declaration "${layer_declaration} public:\n " )
158+ set (layer_declaration "${layer_declaration} virtual int create_pipeline(const Option& opt) {\n ${create_pipeline_content} return 0;\n }\n " )
159+ set (layer_declaration "${layer_declaration} virtual int destroy_pipeline(const Option& opt) {\n ${destroy_pipeline_content} return 0;\n }\n " )
160+ set (layer_declaration "${layer_declaration} };\n " )
161+ set (layer_declaration "${layer_declaration} DEFINE_LAYER_CREATOR(${class} _final)\n } // namespace ncnn\n\n " )
162+ endif ()
163+
164+ if (WITH_LAYER_${name} )
165+ set (layer_registry "${layer_registry} #if NCNN_STRING\n {\" ${class} \" ,${class} _final_layer_creator},\n #else\n {${class} _final_layer_creator},\n #endif\n " )
166+ else ()
167+ set (layer_registry "${layer_registry} #if NCNN_STRING\n {\" ${class} \" ,0},\n #else\n {0},\n #endif\n " )
168+ endif ()
169+
148170 # generate layer_type_enum file
149171 string (APPEND layer_type_enum "${class} = ${__LAYER_TYPE_ENUM_INDEX} ,\n " )
150172 math (EXPR __LAYER_TYPE_ENUM_INDEX "${__LAYER_TYPE_ENUM_INDEX} +1" )
0 commit comments