diff --git a/include/opengl/data_uploaders/shader_compiler.hpp b/include/opengl/data_uploaders/shader_compiler.hpp index d770224..2e1db7b 100644 --- a/include/opengl/data_uploaders/shader_compiler.hpp +++ b/include/opengl/data_uploaders/shader_compiler.hpp @@ -23,14 +23,6 @@ class shader_program_compiler public: - - - // compile shader programs for given requirements - // cache shader programs with their capabilities - // store sstream for creating defines - - // register shader source code - // store define types for these shaders as bitmap void register_shader_sources( const dynamic_shader_source_store& shader_sources ); @@ -71,7 +63,12 @@ protected: shader_program::metadata_type& metadata ); - [[nodiscard]] static bool parse_feature_toggles_declaration( + [[nodiscard]] static bool parse_static_enable_declaration( + std::span tokens, + shader_program::metadata_type& metadata + ); + + [[nodiscard]] static bool parse_dynamic_enable_declaration( std::span tokens, shader_program::metadata_type& metadata ); @@ -100,7 +97,8 @@ private: stage = 0, geometry = 1, features = 2, - feature_toggles = 3, + static_enable = 3, + dynamic_enable = 4, invalid = std::numeric_limits::max() }; @@ -108,18 +106,19 @@ private: { "STAGE", metadata_declaration_type::stage }, { "GEOMETRY", metadata_declaration_type::geometry }, { "FEATURES", metadata_declaration_type::features }, - { "FEATURE_TOGGLES", metadata_declaration_type::feature_toggles } + { "STATIC_ENABLE", metadata_declaration_type::static_enable } + { "DYNAMIC_ENABLE", metadata_declaration_type::dynamic_enable } }; - inline static auto stage_lookup = ztu::string_lookup{ - { "VERTEX", shader_program::stages::vertex }, - { "GEOMETRY", shader_program::stages::geometry }, - { "FRAGMENT", shader_program::stages::fragment }, + inline static auto stage_lookup = ztu::string_lookup{ + { "VERTEX", shader_program::stage::types::vertex }, + { "GEOMETRY", shader_program::stage::types::geometry }, + { "FRAGMENT", shader_program::stage::types::fragment }, }; - inline static auto geometry_lookup = ztu::string_lookup{ - { "MESH", shader_program::geometries::mesh }, - { "POINT_CLOUD", shader_program::geometries::point_cloud } + inline static auto geometry_lookup = ztu::string_lookup{ + { "MESH", shader_program::geometry::types::mesh }, + { "POINT_CLOUD", shader_program::geometry::types::point_cloud } }; inline static auto mesh_feature_lookup = [] diff --git a/include/opengl/data_uploaders/shader_program_compiler.hpp b/include/opengl/data_uploaders/shader_program_compiler.hpp index 825de19..c491091 100644 --- a/include/opengl/data_uploaders/shader_program_compiler.hpp +++ b/include/opengl/data_uploaders/shader_program_compiler.hpp @@ -22,12 +22,12 @@ class shader_program_compiler const dynamic_shader_source_store& shader_sources ); - void find_or_compile_shader_programs( - std::span required_capabilities, - zgl::shader_program_lookup& shader_program_lookup + void compile_shaders( + const dynamic_shader_source_store& shader_sources, + std::span required_capabilities, + std::vector& shader_handles ); - // create metadata for all sources // get diff --git a/include/shader_program/metadata_type.hpp b/include/shader_program/metadata_type.hpp index 09169ad..ac44e10 100644 --- a/include/shader_program/metadata_type.hpp +++ b/include/shader_program/metadata_type.hpp @@ -8,6 +8,7 @@ #include "features/mesh_features.hpp" #include "features/point_cloud_features.hpp" +// TODO move implementation to .ipp file namespace shader_program { diff --git a/source/opengl/data_uploaders/shader_compiler.cpp b/source/opengl/data_uploaders/shader_compiler.cpp index acc7a53..7e99390 100644 --- a/source/opengl/data_uploaders/shader_compiler.cpp +++ b/source/opengl/data_uploaders/shader_compiler.cpp @@ -154,10 +154,10 @@ bool zgl::shader_program_compiler::parse_features_declaration( switch (metadata.geometry) { case shader_program::geometry::types::mesh: - parse_feature_tokens(tokens, mesh_feature_lookup, metadata.features.mesh); + parse_feature_tokens(tokens, mesh_feature_lookup, metadata.feature_set.mesh.features); break; case shader_program::geometry::types::point_cloud: - parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.features.point_cloud); + parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.feature_set.point_cloud.features); break; default: ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast(metadata.geometry)); @@ -166,17 +166,36 @@ bool zgl::shader_program_compiler::parse_features_declaration( return true; } -bool zgl::shader_program_compiler::parse_feature_toggles_declaration( +bool zgl::shader_program_compiler::parse_static_enable_declaration( std::span tokens, shader_program::metadata_type& metadata ) { switch (metadata.geometry) { case shader_program::geometry::types::mesh: - parse_feature_tokens(tokens, mesh_feature_lookup, metadata.static_enable.mesh); + parse_feature_tokens(tokens, mesh_feature_lookup, metadata.feature_set.mesh.static_enable); break; case shader_program::geometry::types::point_cloud: - parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.static_enable.point_cloud); + parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.feature_set.point_cloud.static_enable); + break; + default: + ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast(metadata.geometry)); + return false; + } + return true; +} + +bool zgl::shader_program_compiler::parse_dynamic_enable_declaration( + std::span tokens, + shader_program::metadata_type& metadata +) { + switch (metadata.geometry) + { + case shader_program::geometry::types::mesh: + parse_feature_tokens(tokens, mesh_feature_lookup, metadata.feature_set.mesh.dynamic_enable); + break; + case shader_program::geometry::types::point_cloud: + parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.feature_set.point_cloud.dynamic_enable); break; default: ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast(metadata.geometry)); @@ -199,7 +218,8 @@ std::optional zgl::shader_program_compiler::parse std::make_tuple(stage, "stage"sv, &parse_stage_declaration), std::make_tuple(geometry, "geometry"sv, &parse_geometry_declaration), std::make_tuple(features, "features"sv, &parse_features_declaration), - std::make_tuple(feature_toggles, "feature_toggles"sv, &parse_feature_toggles_declaration) + std::make_tuple(static_enable, "static_enable"sv, &parse_static_enable_declaration), + std::make_tuple(dynamic_enable, "dynamic_enable"sv, &parse_dynamic_enable_declaration) }) { const auto index = declaration_type_indices[static_cast(type)]; @@ -318,7 +338,7 @@ void zgl::shader_program_compiler::compile_shaders( const auto& shader_source = *shader_source_it; - if (shader_source.source.empty() and requirements.stage == shader_program::stages::geometry) + if (shader_source.source.empty() and requirements.stage == shader_program::stage::types::geometry) { continue; }