Fixed bugs in lazy shader compilation.
This commit is contained in:
@@ -153,10 +153,10 @@ bool zgl::shader_program_compiler::parse_features_declaration(
|
||||
) {
|
||||
switch (metadata.geometry)
|
||||
{
|
||||
case shader_program::geometries::mesh:
|
||||
case shader_program::geometry::types::mesh:
|
||||
parse_feature_tokens(tokens, mesh_feature_lookup, metadata.features.mesh);
|
||||
break;
|
||||
case shader_program::geometries::point_cloud:
|
||||
case shader_program::geometry::types::point_cloud:
|
||||
parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.features.point_cloud);
|
||||
break;
|
||||
default:
|
||||
@@ -172,11 +172,11 @@ bool zgl::shader_program_compiler::parse_feature_toggles_declaration(
|
||||
) {
|
||||
switch (metadata.geometry)
|
||||
{
|
||||
case shader_program::geometries::mesh:
|
||||
parse_feature_tokens(tokens, mesh_feature_lookup, metadata.feature_toggles.mesh);
|
||||
case shader_program::geometry::types::mesh:
|
||||
parse_feature_tokens(tokens, mesh_feature_lookup, metadata.static_enable.mesh);
|
||||
break;
|
||||
case shader_program::geometries::point_cloud:
|
||||
parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.feature_toggles.point_cloud);
|
||||
case shader_program::geometry::types::point_cloud:
|
||||
parse_feature_tokens(tokens, point_cloud_feature_lookup, metadata.static_enable.point_cloud);
|
||||
break;
|
||||
default:
|
||||
ztu::logger::warn("Internal error: Unknown geometry index %.", static_cast<int>(metadata.geometry));
|
||||
@@ -236,27 +236,28 @@ auto zgl::shader_program_compiler::find_compatible_shader_source(
|
||||
&std::pair<shader_program::metadata_type, dynamic_shader_source_store::id_type>::first
|
||||
);
|
||||
|
||||
if (lower_it == shader_lookup.end()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
const auto required_features = requirements.features.generic(requirements.geometry);
|
||||
auto generic_requirement_feature_set = requirements.generic_feature_set();
|
||||
const auto& required_features = generic_requirement_feature_set.features;
|
||||
|
||||
while (
|
||||
lower_it != shader_lookup.end() and
|
||||
lower_it->first.geometry == requirements.geometry and
|
||||
lower_it->first.stage == requirements.stage
|
||||
) {
|
||||
const auto& data = lower_it->first;
|
||||
const auto& [ features, feature_toggles ] = data.generic();
|
||||
const auto& [ features, static_enable, dynamic_enable ] = data.generic_feature_set();
|
||||
|
||||
const auto missing_features = required_features & ~features;
|
||||
const auto extra_features = ~required_features & features;
|
||||
const auto untoggleable_extra_features = extra_features & ~feature_toggles;
|
||||
const auto unwanted_features = ~required_features & features;
|
||||
const auto fixed_unwanted_features = unwanted_features & ~static_enable & ~dynamic_enable;
|
||||
|
||||
if (missing_features == 0 and untoggleable_extra_features == 0)
|
||||
if (missing_features == 0 and fixed_unwanted_features == 0)
|
||||
{
|
||||
const auto to_be_toggled = required_features & feature_toggles;
|
||||
requirements.feature_toggles.from_generic(requirements.geometry, to_be_toggled);
|
||||
// Tell caller which features need to be toggled before compilation
|
||||
// and which features can still be dynamically enabled after compilation.
|
||||
generic_requirement_feature_set.static_enable = required_features & static_enable;
|
||||
generic_requirement_feature_set.dynamic_enable = dynamic_enable;
|
||||
requirements.from_generic_feature_set(generic_requirement_feature_set);
|
||||
|
||||
return lower_it->second;
|
||||
}
|
||||
@@ -325,11 +326,11 @@ void zgl::shader_program_compiler::compile_shaders(
|
||||
shader_strings.clear();
|
||||
|
||||
switch (requirements.geometry) {
|
||||
case shader_program::geometries::mesh:
|
||||
add_required_feature_defines(requirements.feature_toggles.mesh, mesh_feature_defines, shader_strings);
|
||||
case shader_program::geometry::types::mesh:
|
||||
add_required_feature_defines(requirements.feature_set.mesh.static_enable, mesh_feature_defines, shader_strings);
|
||||
break;
|
||||
case shader_program::geometries::point_cloud:
|
||||
add_required_feature_defines(requirements.feature_toggles.point_cloud, point_cloud_feature_defines, shader_strings);
|
||||
case shader_program::geometry::types::point_cloud:
|
||||
add_required_feature_defines(requirements.feature_set.point_cloud.static_enable, point_cloud_feature_defines, shader_strings);
|
||||
break;
|
||||
default:
|
||||
std::unreachable();
|
||||
@@ -339,7 +340,7 @@ void zgl::shader_program_compiler::compile_shaders(
|
||||
|
||||
shader_id = glCreateShader(static_cast<GLenum>(requirements.stage));
|
||||
|
||||
glShaderSource(shader_id, shader_strings.size(), shader_strings.data(), nullptr);
|
||||
glShaderSource(shader_id, static_cast<GLsizei>(shader_strings.size()), shader_strings.data(), nullptr);
|
||||
glCompileShader(shader_id);
|
||||
|
||||
GLint success;
|
||||
@@ -399,7 +400,7 @@ void zgl::shader_program_compiler::register_shader_sources(
|
||||
const auto it = std::ranges::upper_bound(
|
||||
shader_lookup,
|
||||
*metadata,
|
||||
shader_program::metadata_type::feature_count_less{},
|
||||
std::less{},
|
||||
&std::pair<shader_program::metadata_type, dynamic_shader_source_store::id_type>::first
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user