Added parsing for dynamic_enable in lazy shader compilation.

This commit is contained in:
zy4n
2025-03-03 21:19:08 +01:00
parent fde6a2fd7b
commit e01b8c2e09
4 changed files with 49 additions and 29 deletions

View File

@@ -23,14 +23,6 @@ class shader_program_compiler
public: 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( void register_shader_sources(
const dynamic_shader_source_store& shader_sources const dynamic_shader_source_store& shader_sources
); );
@@ -71,7 +63,12 @@ protected:
shader_program::metadata_type& metadata shader_program::metadata_type& metadata
); );
[[nodiscard]] static bool parse_feature_toggles_declaration( [[nodiscard]] static bool parse_static_enable_declaration(
std::span<const std::string_view> tokens,
shader_program::metadata_type& metadata
);
[[nodiscard]] static bool parse_dynamic_enable_declaration(
std::span<const std::string_view> tokens, std::span<const std::string_view> tokens,
shader_program::metadata_type& metadata shader_program::metadata_type& metadata
); );
@@ -100,7 +97,8 @@ private:
stage = 0, stage = 0,
geometry = 1, geometry = 1,
features = 2, features = 2,
feature_toggles = 3, static_enable = 3,
dynamic_enable = 4,
invalid = std::numeric_limits<std::size_t>::max() invalid = std::numeric_limits<std::size_t>::max()
}; };
@@ -108,18 +106,19 @@ private:
{ "STAGE", metadata_declaration_type::stage }, { "STAGE", metadata_declaration_type::stage },
{ "GEOMETRY", metadata_declaration_type::geometry }, { "GEOMETRY", metadata_declaration_type::geometry },
{ "FEATURES", metadata_declaration_type::features }, { "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<shader_program::stages>{ inline static auto stage_lookup = ztu::string_lookup<shader_program::stage::types>{
{ "VERTEX", shader_program::stages::vertex }, { "VERTEX", shader_program::stage::types::vertex },
{ "GEOMETRY", shader_program::stages::geometry }, { "GEOMETRY", shader_program::stage::types::geometry },
{ "FRAGMENT", shader_program::stages::fragment }, { "FRAGMENT", shader_program::stage::types::fragment },
}; };
inline static auto geometry_lookup = ztu::string_lookup<shader_program::geometries>{ inline static auto geometry_lookup = ztu::string_lookup<shader_program::geometry::types>{
{ "MESH", shader_program::geometries::mesh }, { "MESH", shader_program::geometry::types::mesh },
{ "POINT_CLOUD", shader_program::geometries::point_cloud } { "POINT_CLOUD", shader_program::geometry::types::point_cloud }
}; };
inline static auto mesh_feature_lookup = [] inline static auto mesh_feature_lookup = []

View File

@@ -22,12 +22,12 @@ class shader_program_compiler
const dynamic_shader_source_store& shader_sources const dynamic_shader_source_store& shader_sources
); );
void find_or_compile_shader_programs( void compile_shaders(
std::span<const Capabilities> required_capabilities, const dynamic_shader_source_store& shader_sources,
zgl::shader_program_lookup& shader_program_lookup std::span<const shader_program::metadata_type> required_capabilities,
std::vector<shader_handle>& shader_handles
); );
// create metadata for all sources // create metadata for all sources
// get // get

View File

@@ -8,6 +8,7 @@
#include "features/mesh_features.hpp" #include "features/mesh_features.hpp"
#include "features/point_cloud_features.hpp" #include "features/point_cloud_features.hpp"
// TODO move implementation to .ipp file
namespace shader_program namespace shader_program
{ {

View File

@@ -154,10 +154,10 @@ bool zgl::shader_program_compiler::parse_features_declaration(
switch (metadata.geometry) switch (metadata.geometry)
{ {
case shader_program::geometry::types::mesh: 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; break;
case shader_program::geometry::types::point_cloud: 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; break;
default: default:
ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast<int>(metadata.geometry)); ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast<int>(metadata.geometry));
@@ -166,17 +166,36 @@ bool zgl::shader_program_compiler::parse_features_declaration(
return true; return true;
} }
bool zgl::shader_program_compiler::parse_feature_toggles_declaration( bool zgl::shader_program_compiler::parse_static_enable_declaration(
std::span<const std::string_view> tokens, std::span<const std::string_view> tokens,
shader_program::metadata_type& metadata shader_program::metadata_type& metadata
) { ) {
switch (metadata.geometry) switch (metadata.geometry)
{ {
case shader_program::geometry::types::mesh: 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; break;
case shader_program::geometry::types::point_cloud: 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<int>(metadata.geometry));
return false;
}
return true;
}
bool zgl::shader_program_compiler::parse_dynamic_enable_declaration(
std::span<const std::string_view> 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; break;
default: default:
ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast<int>(metadata.geometry)); ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast<int>(metadata.geometry));
@@ -199,7 +218,8 @@ std::optional<shader_program::metadata_type> zgl::shader_program_compiler::parse
std::make_tuple(stage, "stage"sv, &parse_stage_declaration), std::make_tuple(stage, "stage"sv, &parse_stage_declaration),
std::make_tuple(geometry, "geometry"sv, &parse_geometry_declaration), std::make_tuple(geometry, "geometry"sv, &parse_geometry_declaration),
std::make_tuple(features, "features"sv, &parse_features_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<std::size_t>(type)]; const auto index = declaration_type_indices[static_cast<std::size_t>(type)];
@@ -318,7 +338,7 @@ void zgl::shader_program_compiler::compile_shaders(
const auto& shader_source = *shader_source_it; 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; continue;
} }