diff --git a/config/ext/IncludeShader.cmake b/config/ext/IncludeShader.cmake index 7eea0df42da0f1f3ceebd6b0fa3498127cf63976..e67a8716fb32a953c93a3c6624f0d459a025e950 100644 --- a/config/ext/IncludeShader.cmake +++ b/config/ext/IncludeShader.cmake @@ -1,41 +1,75 @@ function(include_shader shader include_dir source_dir) - get_filename_component(filename ${shader} NAME) - file(SIZE ${shader} filesize) - - string(TOUPPER ${filename} varname) - string(REPLACE "." "_" varname ${varname}) - - set(shader_header "") - string(APPEND shader_header "#pragma once\n") - string(APPEND shader_header "extern unsigned char ${varname} [${filesize}]\;\n") - string(APPEND shader_header "extern unsigned int ${varname}_LEN\;\n") - string(APPEND shader_header "const std::string ${varname}_SHADER (reinterpret_cast<const char*>(${varname}), ${varname}_LEN)\;") - - set(shader_source "") - string(APPEND shader_source "unsigned char ${varname}[] = {") - - math(EXPR max_fileoffset "${filesize} - 1" OUTPUT_FORMAT DECIMAL) - - foreach(fileoffset RANGE ${max_fileoffset}) - file(READ ${shader} shader_source_byte OFFSET ${fileoffset} LIMIT 1 HEX) + if (NOT EXISTS ${shader}) + message(WARNING "Shader file does not exist: ${shader}") + else() + get_filename_component(filename ${shader} NAME) + file(SIZE ${shader} filesize) - math(EXPR offset_modulo "${fileoffset} % 12" OUTPUT_FORMAT DECIMAL) + set(include_target_file ${include_dir}/${filename}.hxx) + set(source_target_file ${source_dir}/${filename}.cxx) - if (${offset_modulo} EQUAL 0) - string(APPEND shader_source "\n ") + if ((EXISTS ${source_target_file}) AND (EXISTS ${include_target_file})) + file(TIMESTAMP ${shader} shader_timestamp "%Y-%m-%dT%H:%M:%S") + file(TIMESTAMP ${source_target_file} source_timestamp "%Y-%m-%dT%H:%M:%S") + + string(COMPARE GREATER ${shader_timestamp} ${source_timestamp} shader_update) + else() + set(shader_update true) endif() - if (${fileoffset} LESS ${max_fileoffset}) - string(APPEND shader_source "0x${shader_source_byte}, ") - else() - string(APPEND shader_source "0x${shader_source_byte}\n") + if (shader_update) + string(TOUPPER ${filename} varname) + string(REPLACE "." "_" varname ${varname}) + + set(shader_header "#pragma once\n") + string(APPEND shader_header "// This file is auto-generated via cmake, so don't touch it!\n") + string(APPEND shader_header "extern unsigned char ${varname} [${filesize}]\;\n") + string(APPEND shader_header "extern unsigned int ${varname}_LEN\;\n") + string(APPEND shader_header "const std::string ${varname}_SHADER (reinterpret_cast<const char*>(${varname}), ${varname}_LEN)\;") + + file(WRITE ${include_target_file} ${shader_header}) + + find_program(xxd_program "xxd") + + if (EXISTS ${xxd_program}) + get_filename_component(shader_directory ${shader} DIRECTORY) + + add_custom_command( + OUTPUT ${source_target_file} + WORKING_DIRECTORY "${shader_directory}" + COMMAND xxd -i -C "${filename}" "${source_target_file}" + COMMENT "Processing shader into source files: ${shader}" + ) + else() + set(shader_source "// This file is auto-generated via cmake, so don't touch it!\n") + string(APPEND shader_source "unsigned char ${varname}[] = {") + + math(EXPR max_fileoffset "${filesize} - 1" OUTPUT_FORMAT DECIMAL) + + message(STATUS "Processing shader into source files: ${shader}") + + foreach(fileoffset RANGE ${max_fileoffset}) + file(READ ${shader} shader_source_byte OFFSET ${fileoffset} LIMIT 1 HEX) + + math(EXPR offset_modulo "${fileoffset} % 12" OUTPUT_FORMAT DECIMAL) + + if (${offset_modulo} EQUAL 0) + string(APPEND shader_source "\n ") + endif() + + if (${fileoffset} LESS ${max_fileoffset}) + string(APPEND shader_source "0x${shader_source_byte}, ") + else() + string(APPEND shader_source "0x${shader_source_byte}\n") + endif() + endforeach() + + string(APPEND shader_source "}\;\n") + string(APPEND shader_source "unsigned int ${varname}_LEN = ${filesize}\;") + + file(WRITE ${source_target_file} ${shader_source}) + endif() endif() - endforeach() - - string(APPEND shader_source "}\;\n") - string(APPEND shader_source "unsigned int ${varname}_LEN = ${filesize}\;") - - file(WRITE ${include_dir}/${filename}.hxx ${shader_header}) - file(WRITE ${source_dir}/${filename}.cxx ${shader_source}) + endif() endfunction()