EmbedShaders.cmake 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. find_program(PYTHON_EXECUTABLE python3 REQUIRED)
  2. function(process_shader shader_file output_file_var generated_dir)
  3. get_filename_component(shader_name "${shader_file}" NAME)
  4. set(output_file "${generated_dir}/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 "${generated_dir}/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. if(NOT DEFINED R3D_GENERATED_INCLUDE_DIR)
  26. message(FATAL_ERROR "embed_shaders: R3D_GENERATED_INCLUDE_DIR is not defined")
  27. endif()
  28. set(output_files)
  29. list(LENGTH shader_files shader_count)
  30. message(STATUS "Configuring processing of ${shader_count} shader(s) for target ${target_name}...")
  31. foreach(shader_file ${shader_files})
  32. if(NOT EXISTS "${shader_file}")
  33. message(FATAL_ERROR "embed_shaders: Shader file not found: ${shader_file}")
  34. endif()
  35. process_shader("${shader_file}" output_file "${R3D_GENERATED_INCLUDE_DIR}")
  36. list(APPEND output_files "${output_file}")
  37. message(STATUS " - ${shader_file} -> ${output_file}")
  38. endforeach()
  39. set(shader_target "${target_name}_shaders")
  40. add_custom_target(${shader_target}
  41. DEPENDS ${output_files}
  42. COMMENT "Generating shader headers for ${target_name}"
  43. )
  44. add_dependencies(${target_name} ${shader_target})
  45. message(STATUS "Target ${shader_target} created with ${shader_count} shader(s)")
  46. endfunction()