@@ -218,7 +218,28 @@ set (_imiv_shader_spv_16f_fp64 "${CMAKE_CURRENT_BINARY_DIR}/imiv_upload_to_rgba1
218218set (_imiv_shader_spv_32f_fp64 "${CMAKE_CURRENT_BINARY_DIR} /imiv_upload_to_rgba32f_fp64.comp.spv" )
219219set (_imiv_preview_vert_spv "${CMAKE_CURRENT_BINARY_DIR} /imiv_preview.vert.spv" )
220220set (_imiv_preview_frag_spv "${CMAKE_CURRENT_BINARY_DIR} /imiv_preview.frag.spv" )
221+ set (_imiv_shader_hdr_16f "${CMAKE_CURRENT_BINARY_DIR} /imiv_upload_to_rgba16f_spv.h" )
222+ set (_imiv_shader_hdr_32f "${CMAKE_CURRENT_BINARY_DIR} /imiv_upload_to_rgba32f_spv.h" )
223+ set (_imiv_shader_hdr_16f_fp64 "${CMAKE_CURRENT_BINARY_DIR} /imiv_upload_to_rgba16f_fp64_spv.h" )
224+ set (_imiv_shader_hdr_32f_fp64 "${CMAKE_CURRENT_BINARY_DIR} /imiv_upload_to_rgba32f_fp64_spv.h" )
225+ set (_imiv_preview_vert_hdr "${CMAKE_CURRENT_BINARY_DIR} /imiv_preview_vert_spv.h" )
226+ set (_imiv_preview_frag_hdr "${CMAKE_CURRENT_BINARY_DIR} /imiv_preview_frag_spv.h" )
221227set (_imiv_shader_outputs)
228+ set (_imiv_embedded_shader_headers)
229+
230+ function (_imiv_add_embedded_spirv_header input_spv output_hdr symbol_name )
231+ add_custom_command (
232+ OUTPUT "${output_hdr} "
233+ COMMAND ${CMAKE_COMMAND}
234+ -DINPUT= "${input_spv} "
235+ -DOUTPUT= "${output_hdr} "
236+ -DSYMBOL_NAME= "${symbol_name} "
237+ -P "${CMAKE_CURRENT_SOURCE_DIR} /embed_spirv_header.cmake"
238+ DEPENDS
239+ "${input_spv} "
240+ "${CMAKE_CURRENT_SOURCE_DIR} /embed_spirv_header.cmake"
241+ COMMENT "imiv: embedding Vulkan shader ${symbol_name} " )
242+ endfunction ()
222243
223244if (_imiv_want_vulkan)
224245 find_program (OIIO_IMIV_GLSLC_EXECUTABLE
@@ -294,14 +315,47 @@ if (_imiv_want_vulkan)
294315 -o "${_imiv_preview_frag_spv} "
295316 DEPENDS "${_imiv_preview_frag_src} "
296317 COMMENT "imiv: compiling Vulkan preview fragment shader" )
318+ _imiv_add_embedded_spirv_header (
319+ "${_imiv_shader_spv_16f} "
320+ "${_imiv_shader_hdr_16f} "
321+ "g_imiv_upload_to_rgba16f_spv" )
322+ _imiv_add_embedded_spirv_header (
323+ "${_imiv_shader_spv_32f} "
324+ "${_imiv_shader_hdr_32f} "
325+ "g_imiv_upload_to_rgba32f_spv" )
326+ _imiv_add_embedded_spirv_header (
327+ "${_imiv_shader_spv_16f_fp64} "
328+ "${_imiv_shader_hdr_16f_fp64} "
329+ "g_imiv_upload_to_rgba16f_fp64_spv" )
330+ _imiv_add_embedded_spirv_header (
331+ "${_imiv_shader_spv_32f_fp64} "
332+ "${_imiv_shader_hdr_32f_fp64} "
333+ "g_imiv_upload_to_rgba32f_fp64_spv" )
334+ _imiv_add_embedded_spirv_header (
335+ "${_imiv_preview_vert_spv} "
336+ "${_imiv_preview_vert_hdr} "
337+ "g_imiv_preview_vert_spv" )
338+ _imiv_add_embedded_spirv_header (
339+ "${_imiv_preview_frag_spv} "
340+ "${_imiv_preview_frag_hdr} "
341+ "g_imiv_preview_frag_spv" )
297342 set (_imiv_shader_outputs
298343 "${_imiv_shader_spv_16f} "
299344 "${_imiv_shader_spv_32f} "
300345 "${_imiv_shader_spv_16f_fp64} "
301346 "${_imiv_shader_spv_32f_fp64} "
302347 "${_imiv_preview_vert_spv} "
303348 "${_imiv_preview_frag_spv} " )
304- add_custom_target (imiv_shaders DEPENDS ${_imiv_shader_outputs} )
349+ set (_imiv_embedded_shader_headers
350+ "${_imiv_shader_hdr_16f} "
351+ "${_imiv_shader_hdr_32f} "
352+ "${_imiv_shader_hdr_16f_fp64} "
353+ "${_imiv_shader_hdr_32f_fp64} "
354+ "${_imiv_preview_vert_hdr} "
355+ "${_imiv_preview_frag_hdr} " )
356+ add_custom_target (imiv_shaders DEPENDS
357+ ${_imiv_shader_outputs}
358+ ${_imiv_embedded_shader_headers} )
305359 else ()
306360 message (STATUS
307361 "imiv: glslc not found; Vulkan compute upload shader generation disabled" )
@@ -857,14 +911,14 @@ source_group ("imgui_te" FILES
857911 ${_imiv_test_engine_sources}
858912 ${_imiv_test_engine_integration_sources}
859913 "${CMAKE_CURRENT_SOURCE_DIR} /imiv_test_engine.h" )
860- source_group ("imiv \\ shared " FILES ${_imiv_shared_sources} )
861- source_group ("imiv \\ platform\\ glfw" FILES ${_imiv_platform_glfw_sources} )
862- source_group ("imiv \\ renderer\\ vulkan" FILES ${_imiv_renderer_vulkan_sources} )
914+ source_group ("Source Files " FILES ${_imiv_shared_sources} )
915+ source_group ("Source Files \\ platform\\ glfw" FILES ${_imiv_platform_glfw_sources} )
916+ source_group ("Source Files \\ renderer\\ vulkan" FILES ${_imiv_renderer_vulkan_sources} )
863917if (_imiv_renderer_metal_sources)
864- source_group ("imiv \\ renderer\\ metal" FILES ${_imiv_renderer_metal_sources} )
918+ source_group ("Source Files \\ renderer\\ metal" FILES ${_imiv_renderer_metal_sources} )
865919endif ()
866920if (_imiv_renderer_opengl_sources)
867- source_group ("imiv \\ renderer\\ opengl" FILES ${_imiv_renderer_opengl_sources} )
921+ source_group ("Source Files \\ renderer\\ opengl" FILES ${_imiv_renderer_opengl_sources} )
868922endif ()
869923
870924if (TARGET imiv)
@@ -876,6 +930,11 @@ if (TARGET imiv)
876930 else ()
877931 target_compile_definitions (imiv PRIVATE IMIV_HAS_COMPUTE_UPLOAD_SHADERS=0 )
878932 endif ()
933+ if (_imiv_embedded_shader_headers)
934+ target_compile_definitions (imiv PRIVATE IMIV_HAS_EMBEDDED_VULKAN_SHADERS=1 )
935+ else ()
936+ target_compile_definitions (imiv PRIVATE IMIV_HAS_EMBEDDED_VULKAN_SHADERS=0 )
937+ endif ()
879938 if (_imiv_renderer_is_vulkan)
880939 target_compile_definitions (imiv PRIVATE IMIV_BACKEND_VULKAN_GLFW=1
881940 $<$<CONFIG :Debug >:IMIV_VULKAN_VALIDATION =1>)
0 commit comments