import std; import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; // Compile a tiny GLSL fragment shader directly via the Shader API. Verifies // the SPIR-V output lands in the target dir and starts with the SPIR-V magic // number, without dragging in the full Build() pipeline. int main() { fs::path src = fs::current_path() / "tests" / "ShaderCompile" / "fixture" / "triangle.frag"; if (!fs::exists(src)) { std::println(std::cerr, "fixture missing: {}", src.string()); return 1; } fs::path outDir = fs::temp_directory_path() / "crafter-build-shader-test"; std::error_code ec; fs::remove_all(outDir, ec); fs::create_directories(outDir); Shader shader(fs::path(src), "main", ShaderType::Fragment); std::array includeDirs = {}; std::string err = shader.Compile(outDir, includeDirs); if (!err.empty()) { std::println(std::cerr, "shader compile failed: {}", err); return 1; } fs::path spv = outDir / "triangle.spv"; if (!fs::exists(spv)) { std::println(std::cerr, "spv not produced at {}", spv.string()); return 1; } // SPIR-V binaries start with the magic number 0x07230203 (little-endian // when written by glslang on x86). Read the first four bytes to confirm // the produced file is real SPIR-V, not a fluke empty file. std::ifstream in(spv, std::ios::binary); std::uint32_t magic = 0; in.read(reinterpret_cast(&magic), sizeof(magic)); if (!in || magic != 0x07230203u) { std::println(std::cerr, "spv has wrong magic: 0x{:08x}", magic); return 1; } // Compiling again should be a no-op since the source isn't newer. if (!shader.Check(outDir)) { std::println(std::cerr, "Shader::Check returned false on an up-to-date spv"); return 1; } return 0; }