Added parsing for dynamic_enable in lazy shader compilation.
This commit is contained in:
@@ -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 = []
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user