Shader/AstOptimizer: Reduce template complexition
This commit is contained in:
parent
60a7cec099
commit
d878036bfc
|
|
@ -308,19 +308,13 @@ namespace Nz::ShaderAst
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
struct CastConstant;
|
struct CastConstant;
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
|
||||||
struct CastConstantPropagation
|
|
||||||
{
|
|
||||||
using Op = CastConstant<T, Args...>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
||||||
template<typename T, std::size_t TargetComponentCount, std::size_t FromComponentCount>
|
template<typename T, std::size_t TargetComponentCount, std::size_t FromComponentCount>
|
||||||
struct SwizzleBase;
|
struct SwizzlePropagationBase;
|
||||||
|
|
||||||
template<typename T, std::size_t TargetComponentCount>
|
template<typename T, std::size_t TargetComponentCount>
|
||||||
struct SwizzleBase<T, TargetComponentCount, 1>
|
struct SwizzlePropagationBase<T, TargetComponentCount, 1>
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& /*components*/, T value)
|
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& /*components*/, T value)
|
||||||
{
|
{
|
||||||
|
|
@ -338,7 +332,7 @@ namespace Nz::ShaderAst
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, std::size_t TargetComponentCount>
|
template<typename T, std::size_t TargetComponentCount>
|
||||||
struct SwizzleBase<T, TargetComponentCount, 2>
|
struct SwizzlePropagationBase<T, TargetComponentCount, 2>
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector2<T>& value)
|
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector2<T>& value)
|
||||||
{
|
{
|
||||||
|
|
@ -356,7 +350,7 @@ namespace Nz::ShaderAst
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, std::size_t TargetComponentCount>
|
template<typename T, std::size_t TargetComponentCount>
|
||||||
struct SwizzleBase<T, TargetComponentCount, 3>
|
struct SwizzlePropagationBase<T, TargetComponentCount, 3>
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector3<T>& value)
|
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector3<T>& value)
|
||||||
{
|
{
|
||||||
|
|
@ -374,7 +368,7 @@ namespace Nz::ShaderAst
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, std::size_t TargetComponentCount>
|
template<typename T, std::size_t TargetComponentCount>
|
||||||
struct SwizzleBase<T, TargetComponentCount, 4>
|
struct SwizzlePropagationBase<T, TargetComponentCount, 4>
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector4<T>& value)
|
std::unique_ptr<ConstantValueExpression> operator()(const std::array<UInt32, 4>& components, const Vector4<T>& value)
|
||||||
{
|
{
|
||||||
|
|
@ -392,13 +386,7 @@ namespace Nz::ShaderAst
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, std::size_t... Args>
|
template<typename T, std::size_t... Args>
|
||||||
struct Swizzle;
|
struct SwizzlePropagation;
|
||||||
|
|
||||||
template<typename T, std::size_t... Args>
|
|
||||||
struct SwizzlePropagation
|
|
||||||
{
|
|
||||||
using Op = Swizzle<T, Args...>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
|
||||||
|
|
@ -656,65 +644,65 @@ namespace Nz::ShaderAst
|
||||||
//EnableOptimisation(CastConstant, Vector4ui32, UInt32, UInt32, UInt32, UInt32);
|
//EnableOptimisation(CastConstant, Vector4ui32, UInt32, UInt32, UInt32, UInt32);
|
||||||
|
|
||||||
// Swizzle
|
// Swizzle
|
||||||
EnableOptimisation(Swizzle, double, 1, 1);
|
EnableOptimisation(SwizzlePropagation, double, 1, 1);
|
||||||
EnableOptimisation(Swizzle, double, 1, 2);
|
EnableOptimisation(SwizzlePropagation, double, 1, 2);
|
||||||
EnableOptimisation(Swizzle, double, 1, 3);
|
EnableOptimisation(SwizzlePropagation, double, 1, 3);
|
||||||
EnableOptimisation(Swizzle, double, 1, 4);
|
EnableOptimisation(SwizzlePropagation, double, 1, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, double, 2, 1);
|
EnableOptimisation(SwizzlePropagation, double, 2, 1);
|
||||||
EnableOptimisation(Swizzle, double, 2, 2);
|
EnableOptimisation(SwizzlePropagation, double, 2, 2);
|
||||||
EnableOptimisation(Swizzle, double, 2, 3);
|
EnableOptimisation(SwizzlePropagation, double, 2, 3);
|
||||||
EnableOptimisation(Swizzle, double, 2, 4);
|
EnableOptimisation(SwizzlePropagation, double, 2, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, double, 3, 1);
|
EnableOptimisation(SwizzlePropagation, double, 3, 1);
|
||||||
EnableOptimisation(Swizzle, double, 3, 2);
|
EnableOptimisation(SwizzlePropagation, double, 3, 2);
|
||||||
EnableOptimisation(Swizzle, double, 3, 3);
|
EnableOptimisation(SwizzlePropagation, double, 3, 3);
|
||||||
EnableOptimisation(Swizzle, double, 3, 4);
|
EnableOptimisation(SwizzlePropagation, double, 3, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, double, 4, 1);
|
EnableOptimisation(SwizzlePropagation, double, 4, 1);
|
||||||
EnableOptimisation(Swizzle, double, 4, 2);
|
EnableOptimisation(SwizzlePropagation, double, 4, 2);
|
||||||
EnableOptimisation(Swizzle, double, 4, 3);
|
EnableOptimisation(SwizzlePropagation, double, 4, 3);
|
||||||
EnableOptimisation(Swizzle, double, 4, 4);
|
EnableOptimisation(SwizzlePropagation, double, 4, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, float, 1, 1);
|
EnableOptimisation(SwizzlePropagation, float, 1, 1);
|
||||||
EnableOptimisation(Swizzle, float, 1, 2);
|
EnableOptimisation(SwizzlePropagation, float, 1, 2);
|
||||||
EnableOptimisation(Swizzle, float, 1, 3);
|
EnableOptimisation(SwizzlePropagation, float, 1, 3);
|
||||||
EnableOptimisation(Swizzle, float, 1, 4);
|
EnableOptimisation(SwizzlePropagation, float, 1, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, float, 2, 1);
|
EnableOptimisation(SwizzlePropagation, float, 2, 1);
|
||||||
EnableOptimisation(Swizzle, float, 2, 2);
|
EnableOptimisation(SwizzlePropagation, float, 2, 2);
|
||||||
EnableOptimisation(Swizzle, float, 2, 3);
|
EnableOptimisation(SwizzlePropagation, float, 2, 3);
|
||||||
EnableOptimisation(Swizzle, float, 2, 4);
|
EnableOptimisation(SwizzlePropagation, float, 2, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, float, 3, 1);
|
EnableOptimisation(SwizzlePropagation, float, 3, 1);
|
||||||
EnableOptimisation(Swizzle, float, 3, 2);
|
EnableOptimisation(SwizzlePropagation, float, 3, 2);
|
||||||
EnableOptimisation(Swizzle, float, 3, 3);
|
EnableOptimisation(SwizzlePropagation, float, 3, 3);
|
||||||
EnableOptimisation(Swizzle, float, 3, 4);
|
EnableOptimisation(SwizzlePropagation, float, 3, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, float, 4, 1);
|
EnableOptimisation(SwizzlePropagation, float, 4, 1);
|
||||||
EnableOptimisation(Swizzle, float, 4, 2);
|
EnableOptimisation(SwizzlePropagation, float, 4, 2);
|
||||||
EnableOptimisation(Swizzle, float, 4, 3);
|
EnableOptimisation(SwizzlePropagation, float, 4, 3);
|
||||||
EnableOptimisation(Swizzle, float, 4, 4);
|
EnableOptimisation(SwizzlePropagation, float, 4, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, Int32, 1, 1);
|
EnableOptimisation(SwizzlePropagation, Int32, 1, 1);
|
||||||
EnableOptimisation(Swizzle, Int32, 1, 2);
|
EnableOptimisation(SwizzlePropagation, Int32, 1, 2);
|
||||||
EnableOptimisation(Swizzle, Int32, 1, 3);
|
EnableOptimisation(SwizzlePropagation, Int32, 1, 3);
|
||||||
EnableOptimisation(Swizzle, Int32, 1, 4);
|
EnableOptimisation(SwizzlePropagation, Int32, 1, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, Int32, 2, 1);
|
EnableOptimisation(SwizzlePropagation, Int32, 2, 1);
|
||||||
EnableOptimisation(Swizzle, Int32, 2, 2);
|
EnableOptimisation(SwizzlePropagation, Int32, 2, 2);
|
||||||
EnableOptimisation(Swizzle, Int32, 2, 3);
|
EnableOptimisation(SwizzlePropagation, Int32, 2, 3);
|
||||||
EnableOptimisation(Swizzle, Int32, 2, 4);
|
EnableOptimisation(SwizzlePropagation, Int32, 2, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, Int32, 3, 1);
|
EnableOptimisation(SwizzlePropagation, Int32, 3, 1);
|
||||||
EnableOptimisation(Swizzle, Int32, 3, 2);
|
EnableOptimisation(SwizzlePropagation, Int32, 3, 2);
|
||||||
EnableOptimisation(Swizzle, Int32, 3, 3);
|
EnableOptimisation(SwizzlePropagation, Int32, 3, 3);
|
||||||
EnableOptimisation(Swizzle, Int32, 3, 4);
|
EnableOptimisation(SwizzlePropagation, Int32, 3, 4);
|
||||||
|
|
||||||
EnableOptimisation(Swizzle, Int32, 4, 1);
|
EnableOptimisation(SwizzlePropagation, Int32, 4, 1);
|
||||||
EnableOptimisation(Swizzle, Int32, 4, 2);
|
EnableOptimisation(SwizzlePropagation, Int32, 4, 2);
|
||||||
EnableOptimisation(Swizzle, Int32, 4, 3);
|
EnableOptimisation(SwizzlePropagation, Int32, 4, 3);
|
||||||
EnableOptimisation(Swizzle, Int32, 4, 4);
|
EnableOptimisation(SwizzlePropagation, Int32, 4, 4);
|
||||||
|
|
||||||
// Unary
|
// Unary
|
||||||
|
|
||||||
|
|
@ -1165,14 +1153,10 @@ namespace Nz::ShaderAst
|
||||||
std::visit([&](auto&& arg)
|
std::visit([&](auto&& arg)
|
||||||
{
|
{
|
||||||
using T = std::decay_t<decltype(arg)>;
|
using T = std::decay_t<decltype(arg)>;
|
||||||
using CCType = CastConstantPropagation<TargetType, T>;
|
using CCType = CastConstant<TargetType, T>;
|
||||||
|
|
||||||
if constexpr (is_complete_v<CCType>)
|
if constexpr (is_complete_v<CCType>)
|
||||||
{
|
optimized = CCType{}(arg);
|
||||||
using Op = typename CCType::Op;
|
|
||||||
if constexpr (is_complete_v<Op>)
|
|
||||||
optimized = Op{}(arg);
|
|
||||||
}
|
|
||||||
}, operand.value);
|
}, operand.value);
|
||||||
|
|
||||||
return optimized;
|
return optimized;
|
||||||
|
|
@ -1192,11 +1176,7 @@ namespace Nz::ShaderAst
|
||||||
using SPType = SwizzlePropagation<BaseType, TargetComponentCount, FromComponentCount>;
|
using SPType = SwizzlePropagation<BaseType, TargetComponentCount, FromComponentCount>;
|
||||||
|
|
||||||
if constexpr (is_complete_v<SPType>)
|
if constexpr (is_complete_v<SPType>)
|
||||||
{
|
optimized = SPType{}(components, arg);
|
||||||
using Op = typename SPType::Op;
|
|
||||||
if constexpr (is_complete_v<Op>)
|
|
||||||
optimized = Op{}(components, arg);
|
|
||||||
}
|
|
||||||
}, operand.value);
|
}, operand.value);
|
||||||
|
|
||||||
return optimized;
|
return optimized;
|
||||||
|
|
@ -1230,14 +1210,10 @@ namespace Nz::ShaderAst
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> optimized;
|
std::unique_ptr<ConstantValueExpression> optimized;
|
||||||
|
|
||||||
using CCType = CastConstantPropagation<Vector2<TargetType>, TargetType, TargetType>;
|
using CCType = CastConstant<Vector2<TargetType>, TargetType, TargetType>;
|
||||||
|
|
||||||
if constexpr (is_complete_v<CCType>)
|
if constexpr (is_complete_v<CCType>)
|
||||||
{
|
optimized = CCType{}(v1, v2);
|
||||||
using Op = typename CCType::Op;
|
|
||||||
if constexpr (is_complete_v<Op>)
|
|
||||||
optimized = Op{}(v1, v2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return optimized;
|
return optimized;
|
||||||
}
|
}
|
||||||
|
|
@ -1247,14 +1223,10 @@ namespace Nz::ShaderAst
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> optimized;
|
std::unique_ptr<ConstantValueExpression> optimized;
|
||||||
|
|
||||||
using CCType = CastConstantPropagation<Vector3<TargetType>, TargetType, TargetType, TargetType>;
|
using CCType = CastConstant<Vector3<TargetType>, TargetType, TargetType, TargetType>;
|
||||||
|
|
||||||
if constexpr (is_complete_v<CCType>)
|
if constexpr (is_complete_v<CCType>)
|
||||||
{
|
optimized = CCType{}(v1, v2, v3);
|
||||||
using Op = typename CCType::Op;
|
|
||||||
if constexpr (is_complete_v<Op>)
|
|
||||||
optimized = Op{}(v1, v2, v3);
|
|
||||||
}
|
|
||||||
|
|
||||||
return optimized;
|
return optimized;
|
||||||
}
|
}
|
||||||
|
|
@ -1264,14 +1236,10 @@ namespace Nz::ShaderAst
|
||||||
{
|
{
|
||||||
std::unique_ptr<ConstantValueExpression> optimized;
|
std::unique_ptr<ConstantValueExpression> optimized;
|
||||||
|
|
||||||
using CCType = CastConstantPropagation<Vector4<TargetType>, TargetType, TargetType, TargetType, TargetType>;
|
using CCType = CastConstant<Vector4<TargetType>, TargetType, TargetType, TargetType, TargetType>;
|
||||||
|
|
||||||
if constexpr (is_complete_v<CCType>)
|
if constexpr (is_complete_v<CCType>)
|
||||||
{
|
optimized = CCType{}(v1, v2, v3, v4);
|
||||||
using Op = typename CCType::Op;
|
|
||||||
if constexpr (is_complete_v<Op>)
|
|
||||||
optimized = Op{}(v1, v2, v3, v4);
|
|
||||||
}
|
|
||||||
|
|
||||||
return optimized;
|
return optimized;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue