Archived
1
Fork 0

Add query for shader language accepted by the current GFX api

This commit is contained in:
redstrate 2020-08-15 20:32:02 -04:00
parent 80fd8a375b
commit 6db47e272f
7 changed files with 16 additions and 10 deletions

View file

@ -2,7 +2,7 @@ set(CMAKE_FOLDER "GFX Backends")
add_library(GFX INTERFACE) add_library(GFX INTERFACE)
target_include_directories(GFX INTERFACE public) target_include_directories(GFX INTERFACE public)
target_link_libraries(GFX INTERFACE Utility) target_link_libraries(GFX INTERFACE Utility ShaderCompiler)
add_custom_target(GFXInterface SOURCES add_custom_target(GFXInterface SOURCES
public/gfx.hpp public/gfx.hpp

View file

@ -9,6 +9,7 @@ class GFXMetal : public GFX {
public: public:
bool is_supported() override; bool is_supported() override;
GFXContext required_context() override { return GFXContext::Metal; } GFXContext required_context() override { return GFXContext::Metal; }
ShaderLanguage accepted_shader_language() override { return ShaderLanguage::MSL; }
const char* get_name() override; const char* get_name() override;
bool supports_feature(const GFXFeature feature) override; bool supports_feature(const GFXFeature feature) override;

View file

@ -431,7 +431,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
{ {
std::string vertex_src; std::string vertex_src;
if(info.shaders.vertex_path.empty()) { if(info.shaders.vertex_path.empty()) {
vertex_src = std::get<std::string>(info.shaders.vertex_src); vertex_src = info.shaders.vertex_src.as_string();
} else { } else {
const auto vertex_path = utility::format("{}.msl", info.shaders.vertex_path); const auto vertex_path = utility::format("{}.msl", info.shaders.vertex_path);
@ -453,7 +453,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
{ {
std::string fragment_src; std::string fragment_src;
if(info.shaders.fragment_path.empty()) { if(info.shaders.fragment_path.empty()) {
fragment_src = std::get<std::string>(info.shaders.fragment_src); fragment_src = info.shaders.fragment_src.as_string();
} else { } else {
const auto fragment_path = utility::format("{}.msl", info.shaders.fragment_path); const auto fragment_path = utility::format("{}.msl", info.shaders.fragment_path);

View file

@ -4,6 +4,8 @@
#include <vector> #include <vector>
#include <variant> #include <variant>
#include "shadercompiler.hpp"
class GFXBuffer; class GFXBuffer;
class GFXPipeline; class GFXPipeline;
class GFXCommandBuffer; class GFXCommandBuffer;
@ -145,7 +147,7 @@ struct GFXGraphicsPipelineCreateInfo {
struct Shaders { struct Shaders {
std::string_view vertex_path, fragment_path; std::string_view vertex_path, fragment_path;
std::variant<std::string, std::vector<uint32_t>> vertex_src, fragment_src; ShaderSource vertex_src, fragment_src;
GFXShaderConstants vertex_constants, fragment_constants; GFXShaderConstants vertex_constants, fragment_constants;
} shaders; } shaders;
@ -269,6 +271,7 @@ public:
// check for runtime support // check for runtime support
virtual bool is_supported() { return false; } virtual bool is_supported() { return false; }
virtual GFXContext required_context() { return GFXContext::None; } virtual GFXContext required_context() { return GFXContext::None; }
virtual ShaderLanguage accepted_shader_language() {}
virtual const char* get_name() { return nullptr; } virtual const char* get_name() { return nullptr; }
virtual bool supports_feature([[maybe_unused]] const GFXFeature feature) { return true; } virtual bool supports_feature([[maybe_unused]] const GFXFeature feature) { return true; }

View file

@ -21,7 +21,7 @@ public:
// generates static and skinned versions of the pipeline provided // generates static and skinned versions of the pipeline provided
std::tuple<GFXPipeline*, GFXPipeline*> create_pipeline_permutations(GFXGraphicsPipelineCreateInfo& createInfo, bool positions_only = false); std::tuple<GFXPipeline*, GFXPipeline*> create_pipeline_permutations(GFXGraphicsPipelineCreateInfo& createInfo, bool positions_only = false);
std::variant<std::string, std::vector<uint32_t>> compile_material_fragment(Material& material, bool use_ibl = true); ShaderSource compile_material_fragment(Material& material, bool use_ibl = true);
}; };
static MaterialCompiler material_compiler; static MaterialCompiler material_compiler;

View file

@ -6,11 +6,11 @@
#include "string_utils.hpp" #include "string_utils.hpp"
#include "shadercompiler.hpp" #include "shadercompiler.hpp"
std::variant<std::string, std::vector<uint32_t>> get_shader(std::string filename, bool skinned, bool cubemap) { ShaderSource get_shader(std::string filename, bool skinned, bool cubemap) {
auto shader_file = file::open(file::internal_domain / filename); auto shader_file = file::open(file::internal_domain / filename);
if(!shader_file.has_value()) { if(!shader_file.has_value()) {
console::error(System::Renderer, "Failed to open shader file {}!", filename); console::error(System::Renderer, "Failed to open shader file {}!", filename);
return ""; return {};
} }
ShaderStage stage; ShaderStage stage;
@ -27,7 +27,7 @@ std::variant<std::string, std::vector<uint32_t>> get_shader(std::string filename
if(cubemap) if(cubemap)
options.add_definition("CUBEMAP"); options.add_definition("CUBEMAP");
return shader_compiler.compile(ShaderLanguage::GLSL, stage, shader_file->read_as_string(), ShaderLanguage::MSL, options)->source; return *shader_compiler.compile(ShaderLanguage::GLSL, stage, shader_file->read_as_string(), engine->get_gfx()->accepted_shader_language(), options);
} }
GFXPipeline* MaterialCompiler::create_static_pipeline(GFXGraphicsPipelineCreateInfo createInfo, bool positions_only, bool cubemap) { GFXPipeline* MaterialCompiler::create_static_pipeline(GFXGraphicsPipelineCreateInfo createInfo, bool positions_only, bool cubemap) {
@ -184,7 +184,7 @@ layout(push_constant, binding = 0) uniform PushConstant {\n \
int materialOffset;\n \ int materialOffset;\n \
};\n"; };\n";
std::variant<std::string, std::vector<uint32_t>> MaterialCompiler::compile_material_fragment(Material& material, bool use_ibl) { ShaderSource MaterialCompiler::compile_material_fragment(Material& material, bool use_ibl) {
walked_nodes.clear(); walked_nodes.clear();
if(!render_options.enable_ibl) if(!render_options.enable_ibl)
@ -387,5 +387,5 @@ std::variant<std::string, std::vector<uint32_t>> MaterialCompiler::compile_mater
src += "}\n"; src += "}\n";
return shader_compiler.compile(ShaderLanguage::GLSL, ShaderStage::Fragment, src, ShaderLanguage::MSL)->source; return *shader_compiler.compile(ShaderLanguage::GLSL, ShaderStage::Fragment, src, engine->get_gfx()->accepted_shader_language());
} }

View file

@ -30,6 +30,8 @@ public:
class ShaderSource { class ShaderSource {
public: public:
ShaderSource() {}
ShaderSource(const ShaderSource& rhs) : source (rhs.source) {}
ShaderSource(const std::string source_string) : source(source_string) {} ShaderSource(const std::string source_string) : source(source_string) {}
ShaderSource(const std::vector<uint32_t> source_bytecode) : source(source_bytecode) {} ShaderSource(const std::vector<uint32_t> source_bytecode) : source(source_bytecode) {}