69 lines
2.5 KiB
CMake
69 lines
2.5 KiB
CMake
# Embeds the native renderer HLSL sources (src/native/shaders/*.hlsl) into a
|
|
# generated C++ header so the exe stays self-contained. Run as a script:
|
|
# cmake -DSHADER_DIR=<dir> -DOUT=<header> -P EmbedShaders.cmake
|
|
# Each shader becomes `inline constexpr char <var>[] = R"__hlsl__(...)__hlsl__";`
|
|
# with a leading newline, matching the original in-cpp raw string literals
|
|
# (consumers use sizeof(kX) - 1).
|
|
|
|
set(SHADER_VARS
|
|
kShaderSource
|
|
kShadowBlurSource
|
|
kResolveShaderSource
|
|
kBlurShaderSource
|
|
kOutlineShaderSource
|
|
kShader2dSource
|
|
kShaderSplineSource
|
|
kPhotoFxShaderSource
|
|
kSsaoShaderSource
|
|
kHdrShaderSource
|
|
kSsrShaderSource
|
|
)
|
|
set(SHADER_FILES
|
|
scene.hlsl
|
|
shadow_blur.hlsl
|
|
resolve.hlsl
|
|
blur.hlsl
|
|
outline.hlsl
|
|
overlay2d.hlsl
|
|
spline.hlsl
|
|
photo_fx.hlsl
|
|
ssao.hlsl
|
|
hdr.hlsl
|
|
ssr.hlsl
|
|
)
|
|
|
|
set(content "// Generated by cmake/EmbedShaders.cmake from src/native/shaders/*.hlsl.\n")
|
|
string(APPEND content "// DO NOT EDIT - edit the .hlsl files instead.\n")
|
|
string(APPEND content "#pragma once\n\n")
|
|
|
|
foreach(var file IN ZIP_LISTS SHADER_VARS SHADER_FILES)
|
|
file(READ "${SHADER_DIR}/${file}" src)
|
|
# Inline `#include "x.hlsli"` directives so every embedded shader stays a
|
|
# single self-contained string: the D3D12 backend hands the text to
|
|
# D3DCompile without an include handler, and the shader bytecode cache
|
|
# hashes the full text; pre-expanding means an include edit changes the
|
|
# embedded source and invalidates cached bytecode naturally. The loop
|
|
# rescans after each replacement, so nested includes expand too; the
|
|
# iteration guard catches cycles.
|
|
set(guard 0)
|
|
while(src MATCHES "#include \"([^\"]+)\"")
|
|
set(inc "${CMAKE_MATCH_1}")
|
|
if(NOT EXISTS "${SHADER_DIR}/${inc}")
|
|
message(FATAL_ERROR "${file}: include not found: ${inc}")
|
|
endif()
|
|
file(READ "${SHADER_DIR}/${inc}" inc_src)
|
|
string(REPLACE "#include \"${inc}\"" "${inc_src}" src "${src}")
|
|
math(EXPR guard "${guard} + 1")
|
|
if(guard GREATER 32)
|
|
message(FATAL_ERROR "${file}: include expansion did not converge (cycle?)")
|
|
endif()
|
|
endwhile()
|
|
string(FIND "${src}" ")__hlsl__" collision)
|
|
if(NOT collision EQUAL -1)
|
|
message(FATAL_ERROR "${file} contains the raw-string delimiter )__hlsl__")
|
|
endif()
|
|
string(APPEND content "// ${file}\n")
|
|
string(APPEND content "inline constexpr char ${var}[] = R\"__hlsl__(\n${src})__hlsl__\";\n\n")
|
|
endforeach()
|
|
|
|
file(WRITE "${OUT}" "${content}")
|