From 299541430caa2779e212b94072e2419fe9c474b8 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Mon, 19 Jul 2021 17:55:47 +0200 Subject: [PATCH] [#100] Adjusted cmake magic to process shaders into source files Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- config/ext/IncludeShader.cmake | 100 ++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/config/ext/IncludeShader.cmake b/config/ext/IncludeShader.cmake index 7eea0df4..e67a8716 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() -- GitLab