unifica shader compile script com a compile_spirv.cmake i regenera headers
This commit is contained in:
+30
-39
@@ -65,52 +65,43 @@ endif()
|
|||||||
if(NOT APPLE AND NOT EMSCRIPTEN)
|
if(NOT APPLE AND NOT EMSCRIPTEN)
|
||||||
find_program(GLSLC_EXE NAMES glslc)
|
find_program(GLSLC_EXE NAMES glslc)
|
||||||
|
|
||||||
set(SHADER_VERT_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.vert")
|
set(SHADERS_DIR "${CMAKE_SOURCE_DIR}/data/shaders")
|
||||||
set(SHADER_FRAG_SRC "${CMAKE_SOURCE_DIR}/data/shaders/postfx.frag")
|
set(HEADERS_DIR "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv")
|
||||||
set(SHADER_CRTPI_SRC "${CMAKE_SOURCE_DIR}/data/shaders/crtpi_frag.glsl")
|
|
||||||
set(SHADER_UPSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/upscale.frag")
|
|
||||||
set(SHADER_DOWNSCALE_SRC "${CMAKE_SOURCE_DIR}/data/shaders/downscale.frag")
|
|
||||||
|
|
||||||
set(SHADER_VERT_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/postfx_vert_spv.h")
|
set(ALL_SHADER_HEADERS
|
||||||
set(SHADER_FRAG_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/postfx_frag_spv.h")
|
"${HEADERS_DIR}/postfx_vert_spv.h"
|
||||||
set(SHADER_CRTPI_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/crtpi_frag_spv.h")
|
"${HEADERS_DIR}/postfx_frag_spv.h"
|
||||||
set(SHADER_UPSCALE_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/upscale_frag_spv.h")
|
"${HEADERS_DIR}/upscale_frag_spv.h"
|
||||||
set(SHADER_DOWNSCALE_H "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu/spv/downscale_frag_spv.h")
|
"${HEADERS_DIR}/downscale_frag_spv.h"
|
||||||
|
"${HEADERS_DIR}/crtpi_frag_spv.h"
|
||||||
set(ALL_SHADER_HEADERS "${SHADER_VERT_H}" "${SHADER_FRAG_H}" "${SHADER_CRTPI_H}" "${SHADER_UPSCALE_H}" "${SHADER_DOWNSCALE_H}")
|
)
|
||||||
|
set(ALL_SHADER_SOURCES
|
||||||
|
"${SHADERS_DIR}/postfx.vert"
|
||||||
|
"${SHADERS_DIR}/postfx.frag"
|
||||||
|
"${SHADERS_DIR}/upscale.frag"
|
||||||
|
"${SHADERS_DIR}/downscale.frag"
|
||||||
|
"${SHADERS_DIR}/crtpi_frag.glsl"
|
||||||
|
)
|
||||||
|
|
||||||
if(GLSLC_EXE)
|
if(GLSLC_EXE)
|
||||||
set(COMPILE_SHADER_SCRIPT "${CMAKE_SOURCE_DIR}/tools/shaders/compile_shader.cmake")
|
add_custom_command(
|
||||||
|
OUTPUT ${ALL_SHADER_HEADERS}
|
||||||
macro(add_shader SRC_FILE OUT_H VAR_NAME)
|
COMMAND ${CMAKE_COMMAND}
|
||||||
cmake_parse_arguments(S "" "STAGE" "" ${ARGN})
|
-D GLSLC=${GLSLC_EXE}
|
||||||
add_custom_command(
|
-D SHADERS_DIR=${SHADERS_DIR}
|
||||||
OUTPUT "${OUT_H}"
|
-D HEADERS_DIR=${HEADERS_DIR}
|
||||||
COMMAND ${CMAKE_COMMAND}
|
-P ${CMAKE_SOURCE_DIR}/tools/shaders/compile_spirv.cmake
|
||||||
"-DGLSLC=${GLSLC_EXE}"
|
DEPENDS ${ALL_SHADER_SOURCES}
|
||||||
"-DSRC=${SRC_FILE}"
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||||
"-DOUT_H=${OUT_H}"
|
COMMENT "Compilando shaders SPIR-V..."
|
||||||
"-DVAR=${VAR_NAME}"
|
)
|
||||||
"-DSTAGE=${S_STAGE}"
|
|
||||||
-P "${COMPILE_SHADER_SCRIPT}"
|
|
||||||
DEPENDS "${SRC_FILE}" "${COMPILE_SHADER_SCRIPT}"
|
|
||||||
COMMENT "Compilando shader: ${VAR_NAME}"
|
|
||||||
)
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
add_shader("${SHADER_VERT_SRC}" "${SHADER_VERT_H}" "postfx_vert_spv")
|
|
||||||
add_shader("${SHADER_FRAG_SRC}" "${SHADER_FRAG_H}" "postfx_frag_spv")
|
|
||||||
add_shader("${SHADER_CRTPI_SRC}" "${SHADER_CRTPI_H}" "crtpi_frag_spv" STAGE fragment)
|
|
||||||
add_shader("${SHADER_UPSCALE_SRC}" "${SHADER_UPSCALE_H}" "upscale_frag_spv")
|
|
||||||
add_shader("${SHADER_DOWNSCALE_SRC}" "${SHADER_DOWNSCALE_H}" "downscale_frag_spv")
|
|
||||||
|
|
||||||
add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS})
|
add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS})
|
||||||
message(STATUS "glslc encontrado: shaders se compilarán automáticamente")
|
message(STATUS "glslc encontrado: shaders se compilarán automáticamente")
|
||||||
else()
|
else()
|
||||||
foreach(_h IN LISTS ALL_SHADER_HEADERS)
|
foreach(HDR ${ALL_SHADER_HEADERS})
|
||||||
if(NOT EXISTS "${_h}")
|
if(NOT EXISTS "${HDR}")
|
||||||
message(FATAL_ERROR
|
message(FATAL_ERROR
|
||||||
"glslc no encontrado y header SPIR-V no existe: ${_h}\n"
|
"glslc no encontrado y header SPIR-V no existe: ${HDR}\n"
|
||||||
" Instala glslc: sudo apt install glslang-tools (Linux)\n"
|
" Instala glslc: sudo apt install glslang-tools (Linux)\n"
|
||||||
" choco install vulkan-sdk (Windows)"
|
" choco install vulkan-sdk (Windows)"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10357,5 +10357,6 @@ static const uint8_t kcrtpi_frag_spv[] = {
|
|||||||
0x38,
|
0x38,
|
||||||
0x00,
|
0x00,
|
||||||
0x01,
|
0x01,
|
||||||
0x00};
|
0x00,
|
||||||
|
};
|
||||||
static const size_t kcrtpi_frag_spv_size = 10356;
|
static const size_t kcrtpi_frag_spv_size = 10356;
|
||||||
|
|||||||
@@ -4249,5 +4249,6 @@ static const uint8_t kdownscale_frag_spv[] = {
|
|||||||
0x38,
|
0x38,
|
||||||
0x00,
|
0x00,
|
||||||
0x01,
|
0x01,
|
||||||
0x00};
|
0x00,
|
||||||
|
};
|
||||||
static const size_t kdownscale_frag_spv_size = 4248;
|
static const size_t kdownscale_frag_spv_size = 4248;
|
||||||
|
|||||||
@@ -11241,5 +11241,6 @@ static const uint8_t kpostfx_frag_spv[] = {
|
|||||||
0x38,
|
0x38,
|
||||||
0x00,
|
0x00,
|
||||||
0x01,
|
0x01,
|
||||||
0x00};
|
0x00,
|
||||||
|
};
|
||||||
static const size_t kpostfx_frag_spv_size = 11240;
|
static const size_t kpostfx_frag_spv_size = 11240;
|
||||||
|
|||||||
@@ -1445,5 +1445,6 @@ static const uint8_t kpostfx_vert_spv[] = {
|
|||||||
0x38,
|
0x38,
|
||||||
0x00,
|
0x00,
|
||||||
0x01,
|
0x01,
|
||||||
0x00};
|
0x00,
|
||||||
|
};
|
||||||
static const size_t kpostfx_vert_spv_size = 1444;
|
static const size_t kpostfx_vert_spv_size = 1444;
|
||||||
|
|||||||
@@ -629,5 +629,6 @@ static const uint8_t kupscale_frag_spv[] = {
|
|||||||
0x38,
|
0x38,
|
||||||
0x00,
|
0x00,
|
||||||
0x01,
|
0x01,
|
||||||
0x00};
|
0x00,
|
||||||
|
};
|
||||||
static const size_t kupscale_frag_spv_size = 628;
|
static const size_t kupscale_frag_spv_size = 628;
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
# compile_shader.cmake
|
|
||||||
# Compila un shader GLSL a header C++ embebible con datos SPIR-V.
|
|
||||||
# Funciona en Windows, Linux y macOS sin bash ni herramientas Unix.
|
|
||||||
#
|
|
||||||
# Variables requeridas (pasar con -D al invocar cmake -P):
|
|
||||||
# GLSLC - ruta al ejecutable glslc
|
|
||||||
# SRC - archivo fuente GLSL
|
|
||||||
# OUT_H - archivo header de salida
|
|
||||||
# VAR - nombre base de la variable C++ (e.g. "postfx_vert_spv")
|
|
||||||
# STAGE - (opcional) stage explícito para glslc (e.g. "fragment")
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.10)
|
|
||||||
|
|
||||||
# Nom intermedi únic per stage (vert/frag/comp) per evitar col·lisions en
|
|
||||||
# builds paral·lels: postfx.vert i postfx.frag generarien el mateix
|
|
||||||
# `postfx.spv` si féssim servir el nom del SRC. Usem el del OUT_H, que ja
|
|
||||||
# inclou el stage (p.ex. `postfx_frag_spv.h` → `postfx_frag_spv.spv`).
|
|
||||||
get_filename_component(OUT_DIR "${OUT_H}" DIRECTORY)
|
|
||||||
get_filename_component(OUT_NAME "${OUT_H}" NAME_WE)
|
|
||||||
set(OUT_SPV "${OUT_DIR}/${OUT_NAME}.spv")
|
|
||||||
|
|
||||||
# Compilar GLSL → SPIR-V
|
|
||||||
if(DEFINED STAGE AND NOT STAGE STREQUAL "")
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GLSLC}" "-fshader-stage=${STAGE}" "${SRC}" -o "${OUT_SPV}"
|
|
||||||
RESULT_VARIABLE RESULT
|
|
||||||
ERROR_VARIABLE ERROR_MSG
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GLSLC}" "${SRC}" -o "${OUT_SPV}"
|
|
||||||
RESULT_VARIABLE RESULT
|
|
||||||
ERROR_VARIABLE ERROR_MSG
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT RESULT EQUAL 0)
|
|
||||||
message(FATAL_ERROR "glslc falló compilando ${SRC}:\n${ERROR_MSG}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Leer binario SPIR-V como cadena hexadecimal
|
|
||||||
file(READ "${OUT_SPV}" SPV_HEX HEX)
|
|
||||||
file(REMOVE "${OUT_SPV}")
|
|
||||||
|
|
||||||
string(LENGTH "${SPV_HEX}" HEX_LEN)
|
|
||||||
math(EXPR BYTE_COUNT "${HEX_LEN} / 2")
|
|
||||||
|
|
||||||
# Convertir a array C++ con formato " 0xXX,\n" por byte
|
|
||||||
string(REGEX REPLACE "([0-9a-f][0-9a-f])" " 0x\\1,\n" SPV_BYTES "${SPV_HEX}")
|
|
||||||
# Eliminar la última coma y sustituir por el "}" de cierre
|
|
||||||
string(REGEX REPLACE ",\n$" "}" SPV_BYTES "${SPV_BYTES}")
|
|
||||||
|
|
||||||
# Escribir el header
|
|
||||||
file(WRITE "${OUT_H}"
|
|
||||||
"#pragma once\n"
|
|
||||||
"#include <cstddef>\n"
|
|
||||||
"#include <cstdint>\n"
|
|
||||||
"static const uint8_t k${VAR}[] = {\n"
|
|
||||||
"${SPV_BYTES};\n"
|
|
||||||
"static const size_t k${VAR}_size = ${BYTE_COUNT};\n"
|
|
||||||
)
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# compile_spirv.cmake
|
||||||
|
# Compila shaders GLSL a SPIR-V y genera headers C++ embebibles.
|
||||||
|
# Multiplataforma: Windows, macOS, Linux (no requiere bash, xxd ni /tmp/).
|
||||||
|
#
|
||||||
|
# Invocado por CMakeLists.txt con:
|
||||||
|
# cmake -D GLSLC=<path> -D SHADERS_DIR=<path> -D HEADERS_DIR=<path> -P compile_spirv.cmake
|
||||||
|
#
|
||||||
|
# También puede ejecutarse manualmente desde la raíz del proyecto:
|
||||||
|
# cmake -D GLSLC=glslc -D SHADERS_DIR=data/shaders -D HEADERS_DIR=source/core/rendering/sdl3gpu -P tools/shaders/compile_spirv.cmake
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
cmake_policy(SET CMP0007 NEW)
|
||||||
|
|
||||||
|
# Lista de shaders: fuente relativa a SHADERS_DIR
|
||||||
|
set(SHADER_SOURCES
|
||||||
|
"postfx.vert"
|
||||||
|
"postfx.frag"
|
||||||
|
"upscale.frag"
|
||||||
|
"downscale.frag"
|
||||||
|
"crtpi_frag.glsl"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Nombre de la variable C++ para cada shader (mismo orden)
|
||||||
|
set(SHADER_VARS
|
||||||
|
"kpostfx_vert_spv"
|
||||||
|
"kpostfx_frag_spv"
|
||||||
|
"kupscale_frag_spv"
|
||||||
|
"kdownscale_frag_spv"
|
||||||
|
"kcrtpi_frag_spv"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Flags extra de glslc para cada shader (vacío si no hay)
|
||||||
|
set(SHADER_FLAGS
|
||||||
|
""
|
||||||
|
""
|
||||||
|
""
|
||||||
|
""
|
||||||
|
"-fshader-stage=frag"
|
||||||
|
)
|
||||||
|
|
||||||
|
list(LENGTH SHADER_SOURCES NUM_SHADERS)
|
||||||
|
math(EXPR LAST_IDX "${NUM_SHADERS} - 1")
|
||||||
|
|
||||||
|
foreach(IDX RANGE ${LAST_IDX})
|
||||||
|
list(GET SHADER_SOURCES ${IDX} SRC_NAME)
|
||||||
|
list(GET SHADER_VARS ${IDX} VAR)
|
||||||
|
list(GET SHADER_FLAGS ${IDX} EXTRA_FLAG)
|
||||||
|
|
||||||
|
# Derivar nombre del header desde la variable: kpostfx_vert_spv → postfx_vert_spv.h
|
||||||
|
string(REGEX REPLACE "^k" "" HDR_BASE "${VAR}")
|
||||||
|
set(SRC "${SHADERS_DIR}/${SRC_NAME}")
|
||||||
|
set(SPV "${HEADERS_DIR}/${HDR_BASE}.spv")
|
||||||
|
set(HDR "${HEADERS_DIR}/${HDR_BASE}.h")
|
||||||
|
|
||||||
|
message(STATUS "Compilando ${SRC} ...")
|
||||||
|
|
||||||
|
if(EXTRA_FLAG)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GLSLC}" "${EXTRA_FLAG}" "${SRC}" -o "${SPV}"
|
||||||
|
RESULT_VARIABLE GLSLC_RESULT
|
||||||
|
ERROR_VARIABLE GLSLC_ERROR
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GLSLC}" "${SRC}" -o "${SPV}"
|
||||||
|
RESULT_VARIABLE GLSLC_RESULT
|
||||||
|
ERROR_VARIABLE GLSLC_ERROR
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT GLSLC_RESULT EQUAL 0)
|
||||||
|
message(FATAL_ERROR "glslc falló para ${SRC}:\n${GLSLC_ERROR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Leer binario SPV como hex (sin separadores: "0302230700...")
|
||||||
|
file(READ "${SPV}" HEX_DATA HEX)
|
||||||
|
# Dividir en pares de caracteres hex → lista de bytes
|
||||||
|
string(REGEX MATCHALL ".." BYTES "${HEX_DATA}")
|
||||||
|
list(LENGTH BYTES NUM_BYTES)
|
||||||
|
|
||||||
|
# Construir el cuerpo del array C++ con un byte por línea
|
||||||
|
set(ARRAY_BODY "")
|
||||||
|
foreach(BYTE ${BYTES})
|
||||||
|
string(APPEND ARRAY_BODY " 0x${BYTE},\n")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
file(WRITE "${HDR}"
|
||||||
|
"#pragma once\n"
|
||||||
|
"#include <cstddef>\n"
|
||||||
|
"#include <cstdint>\n"
|
||||||
|
"static const uint8_t ${VAR}[] = {\n"
|
||||||
|
"${ARRAY_BODY}"
|
||||||
|
"};\n"
|
||||||
|
"static const size_t ${VAR}_size = ${NUM_BYTES};\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
file(REMOVE "${SPV}")
|
||||||
|
message(STATUS " -> ${HDR} (${NUM_BYTES} bytes)")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
message(STATUS "Shaders SPIR-V compilados correctamente.")
|
||||||
Reference in New Issue
Block a user