64 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <assets/shader.hpp>
 | |
| 
 | |
| inline void bake_shader(
 | |
|     const std::filesystem::path &in_path,
 | |
|     const std::filesystem::path &out_path,
 | |
|     lt::assets::ShaderAsset::Type type
 | |
| )
 | |
| {
 | |
| 	using lt::assets::ShaderAsset;
 | |
| 	using enum lt::assets::ShaderAsset::Type;
 | |
| 
 | |
| 	auto glsl_path = in_path.string();
 | |
| 	auto spv_path = std::format("{}.spv", glsl_path);
 | |
| 	log_trc(
 | |
| 	    "Compiling {} shader {} -> {}",
 | |
| 	    type == vertex ? "vertex" : "fragment",
 | |
| 	    glsl_path,
 | |
| 	    spv_path
 | |
| 	);
 | |
| 
 | |
| 	// Don't bother linking to shaderc, just invoke the command with a system call.
 | |
| 	// NOLINTNEXTLINE(concurrency-mt-unsafe)
 | |
| 	system(
 | |
| 	    std::format(
 | |
| 	        "glslc --target-env=vulkan1.4 -std=450core -fshader-stage={} {} -o {}",
 | |
| 	        type == vertex ? "vert" : "frag",
 | |
| 	        glsl_path,
 | |
| 	        spv_path
 | |
| 	    )
 | |
| 	        .c_str()
 | |
| 	);
 | |
| 
 | |
| 	auto stream = std::ifstream(spv_path, std::ios::binary);
 | |
| 	lt::ensure(
 | |
| 	    stream.is_open(),
 | |
| 	    "Failed to open compiled {} shader at: {}",
 | |
| 	    type == vertex ? "vert" : "frag",
 | |
| 	    spv_path
 | |
| 	);
 | |
| 
 | |
| 	stream.seekg(0, std::ios::end);
 | |
| 	const auto size = stream.tellg();
 | |
| 
 | |
| 	auto bytes = std::vector<std::byte>(size);
 | |
| 	stream.seekg(0, std::ios::beg);
 | |
| 	stream.read((char *)bytes.data(), size); // NOLINT
 | |
| 	log_dbg("BYTES: {}", bytes.size());
 | |
| 	stream.close();
 | |
| 	std::filesystem::remove(spv_path);
 | |
| 
 | |
| 	ShaderAsset::pack(
 | |
| 	    out_path,
 | |
| 	    lt::assets::AssetMetadata {
 | |
| 	        .version = lt::assets::current_version,
 | |
| 	        .type = ShaderAsset::asset_type_identifier,
 | |
| 	    },
 | |
| 	    ShaderAsset::Metadata {
 | |
| 	        .type = type,
 | |
| 	    },
 | |
| 	    std::move(bytes)
 | |
| 	);
 | |
| }
 |