EmbedShaders.cmake 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. find_program(PYTHON_EXECUTABLE python3 REQUIRED)
  2. function(process_shader shader_file output_file_var)
  3. get_filename_component(shader_name "${shader_file}" NAME)
  4. set(output_file "${CMAKE_BINARY_DIR}/generated/include/shaders/${shader_name}.h")
  5. set("${output_file_var}" "${output_file}" PARENT_SCOPE)
  6. add_custom_command(
  7. OUTPUT "${output_file}"
  8. COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/generated/include/shaders"
  9. COMMAND "${PYTHON_EXECUTABLE}" "${R3D_ROOT_PATH}/scripts/glsl_processor.py"
  10. "${shader_file}" "${CMAKE_CURRENT_BINARY_DIR}/shader_${shader_name}.tmp"
  11. COMMAND "${PYTHON_EXECUTABLE}" "${R3D_ROOT_PATH}/scripts/bin2c.py"
  12. --file "${CMAKE_CURRENT_BINARY_DIR}/shader_${shader_name}.tmp"
  13. --name "${shader_name}" --mode text "${output_file}"
  14. COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_CURRENT_BINARY_DIR}/shader_${shader_name}.tmp"
  15. DEPENDS "${shader_file}"
  16. COMMENT "Processing shader: ${shader_file}"
  17. VERBATIM
  18. )
  19. endfunction()
  20. function(embed_shaders target_name)
  21. set(shader_files ${ARGN})
  22. if(NOT shader_files)
  23. message(FATAL_ERROR "embed_shaders: No shader file specified")
  24. endif()
  25. set(output_files)
  26. list(LENGTH shader_files shader_count)
  27. message(STATUS "Configuring processing of ${shader_count} shader(s) for target ${target_name}...")
  28. foreach(shader_file ${shader_files})
  29. if(NOT EXISTS "${shader_file}")
  30. message(FATAL_ERROR "embed_shaders: Shader file not found: ${shader_file}")
  31. endif()
  32. process_shader("${shader_file}" output_file)
  33. list(APPEND output_files "${output_file}")
  34. message(STATUS " - ${shader_file} -> ${output_file}")
  35. endforeach()
  36. set(shader_target "${target_name}_shaders")
  37. add_custom_target(${shader_target}
  38. DEPENDS ${output_files}
  39. COMMENT "Generating shader headers for ${target_name}"
  40. )
  41. add_dependencies(${target_name} ${shader_target})
  42. target_include_directories(${target_name} PRIVATE "${CMAKE_BINARY_DIR}/generated/include")
  43. message(STATUS "Target ${shader_target} created with ${shader_count} shader(s)")
  44. endfunction()