In the middle of multithreading parsers.
This commit is contained in:
@@ -13,9 +13,9 @@ struct prioritized_metadata_comparator
|
||||
|
||||
bool operator()(const type& a, const type& b) const noexcept
|
||||
{
|
||||
if (a.geometry != b.geometry)
|
||||
if (a.geometry_type != b.geometry_type)
|
||||
{
|
||||
return a.geometry > b.geometry;
|
||||
return a.geometry_type > b.geometry_type;
|
||||
}
|
||||
|
||||
if (a.stage != b.stage)
|
||||
@@ -48,24 +48,24 @@ std::optional<std::pair<zgl::shader_metadata, zgl::shader_handle>> zgl::shader_m
|
||||
) {
|
||||
auto shader_it = std::ranges::lower_bound(
|
||||
m_shader_lookup,
|
||||
std::pair{ requirements.geometry, requirements.stage },
|
||||
std::pair{ requirements.geometry_type, requirements.stage },
|
||||
std::greater{},
|
||||
[](const shader_lookup_entry_type& entry)
|
||||
[](const entry_type& entry)
|
||||
{
|
||||
const auto& meta = entry.first;
|
||||
return std::pair{ meta.geometry, meta.stage };
|
||||
return std::pair{ meta.geometry_type, meta.stage };
|
||||
}
|
||||
);
|
||||
|
||||
while (
|
||||
shader_it != m_shader_lookup.end() and
|
||||
shader_it->first.geometry == requirements.geometry and
|
||||
shader_it->first.geometry_type == requirements.geometry_type and
|
||||
shader_it->first.stage == requirements.stage
|
||||
) {
|
||||
const auto& [ meta, data ] = *shader_it;
|
||||
|
||||
const auto unwanted_static_features = meta.static_enabled & ~requirements.features;
|
||||
const auto required_dynamic_features = requirements.features & ~meta.static_enabled;
|
||||
const auto unwanted_static_features = meta.static_enabled & ~requirements.components;
|
||||
const auto required_dynamic_features = requirements.components & ~meta.static_enabled;
|
||||
const auto missing_dynamic_features = required_dynamic_features & ~meta.dynamic_enable;
|
||||
|
||||
if (unwanted_static_features == 0 and missing_dynamic_features == 0)
|
||||
@@ -84,9 +84,9 @@ void zgl::shader_manager::process(const store_type& shader_sources)
|
||||
m_preprocessor.process(shader_sources);
|
||||
}
|
||||
|
||||
void zgl::shader_manager::get_handles(
|
||||
void zgl::shader_manager::fetch(
|
||||
const assets::shader_source_store& shader_sources,
|
||||
std::span<const shading::shader_set_requirements> requirements,
|
||||
std::span<const shading::shader_program_requirements> requirements,
|
||||
std::span<shader_set_metadata> metadata,
|
||||
std::span<shader_handle_set> shader_sets
|
||||
) {
|
||||
@@ -99,14 +99,14 @@ void zgl::shader_manager::get_handles(
|
||||
shader_set_meta = {};
|
||||
|
||||
auto shader_req = shading::shader_requirements{
|
||||
.geometry = req.geometry,
|
||||
.geometry_type = req.geometry_type,
|
||||
.stage = {},
|
||||
.features = req.features
|
||||
.components = req.components
|
||||
};
|
||||
|
||||
for (auto [ stage_index, handle ] : std::ranges::views::enumerate(shader_set.stages))
|
||||
{
|
||||
shader_req.stage = static_cast<shading::stage::types>(stage_index);
|
||||
shader_req.stage = static_cast<assets::shader_components::stage>(stage_index);
|
||||
|
||||
if (auto shader_match = find_shader(shader_req))
|
||||
{
|
||||
@@ -127,7 +127,7 @@ void zgl::shader_manager::get_handles(
|
||||
m_preprocessed_shader_source_metadata_buffer.resize(m_source_requirement_buffer.size());
|
||||
m_source_strings_buffer.clear();
|
||||
|
||||
m_preprocessor.get_shader_sources(
|
||||
m_preprocessor.fetch(
|
||||
shader_sources,
|
||||
m_source_requirement_buffer,
|
||||
m_preprocessed_shader_source_metadata_buffer,
|
||||
@@ -161,7 +161,7 @@ void zgl::shader_manager::get_handles(
|
||||
)) {
|
||||
handle = shader.handle;
|
||||
auto shader_meta = shader_metadata{
|
||||
.geometry = source_req_it->geometry,
|
||||
.geometry_type = source_req_it->geometry_type,
|
||||
.stage = source_req_it->stage,
|
||||
.static_enabled = source_meta_it->static_enabled,
|
||||
.dynamic_enable = source_meta_it->dynamic_enable
|
||||
@@ -194,14 +194,14 @@ void zgl::shader_manager::get_handles(
|
||||
std::ranges::sort(
|
||||
new_shaders,
|
||||
prioritized_metadata_comparator{},
|
||||
&shader_lookup_entry_type::first
|
||||
&entry_type::first
|
||||
);
|
||||
|
||||
std::ranges::inplace_merge(
|
||||
m_shader_lookup,
|
||||
m_shader_lookup.begin() + prev_shader_count,
|
||||
prioritized_metadata_comparator{},
|
||||
&shader_lookup_entry_type::first
|
||||
&entry_type::first
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user