Migrate shaders to the registry (#964)
Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user