Migrate shaders to the registry (#964)

Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
This commit is contained in:
mwilsnd
2023-04-04 14:00:12 -05:00
committed by GitHub
parent daeae05181
commit f207aee091
97 changed files with 1924 additions and 3577 deletions

View File

@@ -10,79 +10,71 @@
#include <mbgl/programs/raster_program.hpp>
#include <mbgl/programs/symbol_program.hpp>
#include <mbgl/util/logging.hpp>
#include <exception>
namespace mbgl {
Programs::Programs(gfx::Context& context_, const ProgramParameters& programParameters_)
: debug(context_, programParameters_),
clippingMask(context_, programParameters_),
context(context_),
programParameters(programParameters_) {}
Programs::Programs(const ProgramParameters& programParameters_)
: programParameters(programParameters_) {}
Programs::~Programs() = default;
void Programs::registerWith([[maybe_unused]] gfx::ShaderRegistry& registry) noexcept {}
/// @brief Register a list of types with a shader registry instance
/// @tparam ...T Type list parameter pack
/// @param registry A shader registry instance
/// programParameters_ ProgramParameters used to initialize each instance
template<typename ... T>
void registerTypes(gfx::ShaderRegistry& registry,
const ProgramParameters& programParameters_)
{
/// The following fold expression will create a shared_ptr for every type
/// in the parameter pack and register it with the shader registry.
BackgroundLayerPrograms& Programs::getBackgroundLayerPrograms() noexcept {
if (!backgroundPrograms) {
backgroundPrograms = std::make_unique<BackgroundLayerPrograms>(context, programParameters);
}
return static_cast<BackgroundLayerPrograms&>(*backgroundPrograms);
/// Registration calls are wrapped in a lambda that throws on registration
/// failure, we shouldn't expect registration to faill unless the shader
/// registry instance provided already has conflicting programs present.
( [](bool expr) {
if (!expr) {
throw std::runtime_error(
"Failed to register " +
std::string(T::Name) +
" with shader registry!");
}
}( registry.registerShader(
std::make_shared<T>(programParameters_))), ... );
}
RasterLayerPrograms& Programs::getRasterLayerPrograms() noexcept {
if (!rasterPrograms) {
rasterPrograms = std::make_unique<RasterLayerPrograms>(context, programParameters);
}
return static_cast<RasterLayerPrograms&>(*rasterPrograms);
}
HeatmapLayerPrograms& Programs::getHeatmapLayerPrograms() noexcept {
if (!heatmapPrograms) {
heatmapPrograms = std::make_unique<HeatmapLayerPrograms>(context, programParameters);
}
return static_cast<HeatmapLayerPrograms&>(*heatmapPrograms);
}
HillshadeLayerPrograms& Programs::getHillshadeLayerPrograms() noexcept {
if (!hillshadePrograms) {
hillshadePrograms = std::make_unique<HillshadeLayerPrograms>(context, programParameters);
}
return static_cast<HillshadeLayerPrograms&>(*hillshadePrograms);
}
FillLayerPrograms& Programs::getFillLayerPrograms() noexcept {
if (!fillPrograms) {
fillPrograms = std::make_unique<FillLayerPrograms>(context, programParameters);
}
return static_cast<FillLayerPrograms&>(*fillPrograms);
}
FillExtrusionLayerPrograms& Programs::getFillExtrusionLayerPrograms() noexcept {
if (!fillExtrusionPrograms) {
fillExtrusionPrograms = std::make_unique<FillExtrusionLayerPrograms>(context, programParameters);
}
return static_cast<FillExtrusionLayerPrograms&>(*fillExtrusionPrograms);
}
CircleLayerPrograms& Programs::getCircleLayerPrograms() noexcept {
if (!circlePrograms) {
circlePrograms = std::make_unique<CircleLayerPrograms>(context, programParameters);
}
return static_cast<CircleLayerPrograms&>(*circlePrograms);
}
LineLayerPrograms& Programs::getLineLayerPrograms() noexcept {
if (!linePrograms) {
linePrograms = std::make_unique<LineLayerPrograms>(context, programParameters);
}
return static_cast<LineLayerPrograms&>(*linePrograms);
}
SymbolLayerPrograms& Programs::getSymbolLayerPrograms() noexcept {
if (!symbolPrograms) {
symbolPrograms = std::make_unique<SymbolLayerPrograms>(context, programParameters);
}
return static_cast<SymbolLayerPrograms&>(*symbolPrograms);
void Programs::registerWith(gfx::ShaderRegistry& registry) {
/// The following types will be registered
registerTypes<
BackgroundProgram,
BackgroundPatternProgram,
RasterProgram,
HeatmapProgram,
HeatmapTextureProgram,
HillshadeProgram,
HillshadePrepareProgram,
FillProgram,
FillPatternProgram,
FillOutlineProgram,
FillOutlinePatternProgram,
FillExtrusionProgram,
FillExtrusionPatternProgram,
CircleProgram,
LineProgram,
LineGradientProgram,
LineSDFProgram,
LinePatternProgram,
SymbolIconProgram,
SymbolSDFIconProgram,
SymbolSDFTextProgram,
SymbolTextAndIconProgram,
CollisionBoxProgram,
CollisionCircleProgram,
DebugProgram,
ClippingMaskProgram
>(registry, programParameters);
}
} // namespace mbgl