pcbjam/wasm/cmake/WasmShaderOverride.cmake
Istvan Matejcsok a3478fe3a5 refactor(cmake): de-churn batches A-E (fork-cleanup doc 02)
- KICAD_WASM_LAYER cache var replaces 25 ${CMAKE_SOURCE_DIR}/../wasm reach-outs
- pcbnew Python install: wrap-and-reindent -> early-return guard
- list(REMOVE_ITEM) for PCBNEW_IO_LIBRARIES (cache-FORCE), eeschema importers, GAL_SRCS
- add_shader redefined via wasm/cmake/WasmShaderOverride.cmake (upstream calls reused)
- additive BUILD_KIWAY_DLL property overrides; api kiapi type var
- pcb_calculator whole-file fork -> wasm block + guarded native body

Upstream-byte-identical where possible. WASM build + e2e (9/9, -O1) verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:50:08 +02:00

56 lines
2.4 KiB
CMake

# WASM shader override.
#
# Redefines add_shader() to convert GLSL 1.20 -> GLSL ES 3.0 before embedding the shader as a
# C++ string, so common/gal/CMakeLists.txt's unconditional add_shader() calls produce ES3
# shaders on Emscripten while native keeps the upstream GLSL-1.20 path. The later definition
# wins, so this file must be include()d AFTER upstream's add_shader() definition and BEFORE the
# add_shader() calls. (Same conversion as tests/gal-regression/wasm/generate_shaders.py.)
#
# include()d (not add_subdirectory'd) from common/gal/CMakeLists.txt, so ${CMAKE_CURRENT_SOURCE_DIR}
# / ${CMAKE_CURRENT_BINARY_DIR} below resolve to that directory, exactly as the inline fork did.
find_program( PYTHON3_EXECUTABLE python3 REQUIRED )
function( add_shader outTarget inFile shaderName )
# Determine shader type from filename
string(FIND "${inFile}" "frag" _is_frag)
if(_is_frag GREATER -1)
set(SHADER_TYPE "fragment")
else()
set(SHADER_TYPE "vertex")
endif()
set(es3GlslFile "${CMAKE_CURRENT_BINARY_DIR}/${shaderName}_es3.glsl")
set(outCppName "${shaderName}.cpp")
set(outHeaderName "${shaderName}.h")
# Step 1: Convert GLSL 120 -> ES 3.0
add_custom_command(
OUTPUT ${es3GlslFile}
COMMAND ${PYTHON3_EXECUTABLE}
${CMAKE_CURRENT_SOURCE_DIR}/shaders/convert_glsl_es3.py
${CMAKE_CURRENT_SOURCE_DIR}/shaders/${inFile}
${es3GlslFile}
${SHADER_TYPE}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/shaders/${inFile}
${CMAKE_CURRENT_SOURCE_DIR}/shaders/convert_glsl_es3.py
)
# Step 2: Embed as C++ string (same as native path)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${outCppName}
${CMAKE_BINARY_DIR}/include/gal/shaders/${outHeaderName}
COMMAND ${CMAKE_COMMAND}
-DSOURCE_FILE="${es3GlslFile}"
-DOUT_CPP_DIR="${CMAKE_CURRENT_BINARY_DIR}/"
-DOUT_HEADER_DIR="${CMAKE_BINARY_DIR}/include/gal/shaders/"
-DOUT_CPP_FILENAME="${outCppName}"
-DOUT_HEADER_FILENAME="${outHeaderName}"
-DOUT_VAR_NAME="${shaderName}"
-P ${KICAD_CMAKE_MODULE_PATH}/BuildSteps/CreateShaderCpp.cmake
DEPENDS ${es3GlslFile}
)
target_sources( ${outTarget} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${outCppName} )
target_include_directories( ${outTarget} PUBLIC ${CMAKE_BINARY_DIR}/include/gal/shaders/ )
endfunction()