Files
sophia/engine/src/shader.hpp
T
2026-09-06 23:40:27 -07:00

57 lines
1.2 KiB
C++

#pragma once
#include <memory>
#include <sophia/types.hpp>
#include <span>
#include <string>
#include <vector>
namespace sophia {
enum class ShaderStage { VERTEX, FRAGMENT, COMPUTE };
class Shader {
public:
class Builder;
Shader(const Shader&) = delete;
Shader& operator=(const Shader&) = delete;
~Shader() = default;
const std::vector<u32>& getSpirv() const { return this->spirv; }
ShaderStage getStage() const { return this->stage; }
private:
Shader() = default;
void compile(const std::string& path, ShaderStage shaderStage);
void load(const std::string& path, ShaderStage shaderStage);
ShaderStage stage;
std::vector<u32> spirv;
};
class Shader::Builder {
public:
Builder() = default;
Builder& fromGLSL(const std::string& path);
Builder& fromSPIRV(const std::string& path);
Builder& fromSPIRV(std::vector<u32> spirv);
Builder& fromSPIRV(std::span<const u32> spirv);
Builder& setStage(ShaderStage shaderStage);
std::unique_ptr<Shader> build();
private:
std::string path;
std::vector<u32> embeddedSpirv;
ShaderStage stage;
bool stageSet = false;
bool precompiled = false;
bool embedded = false;
};
} // namespace sophia