swr/rast: Type-check TemplateArgUnroller
[mesa.git] / src / gallium / drivers / swr / rasterizer / core / utils.h
index a8c58d9d4efa011cee0e8bb2ba6a9996ab34f786..d6cbf2436d3e528bcedce4b00227ad4f512c6ce4 100644 (file)
@@ -53,6 +53,14 @@ struct simd16BBox
 };
 #endif
 
+template<typename SIMD_T>
+struct SIMDBBOX_T
+{
+    typename SIMD_T::Integer            ymin;
+    typename SIMD_T::Integer            ymax;
+    typename SIMD_T::Integer            xmin;
+    typename SIMD_T::Integer            xmax;
+};
 
 // helper function to unroll loops
 template<int Begin, int End, int Step = 1>
@@ -122,6 +130,16 @@ uint32_t ComputeCRC(uint32_t crc, const void *pData, uint32_t size)
     return crc;
 }
 
+//////////////////////////////////////////////////////////////////////////
+/// Check specified bit within a data word
+//////////////////////////////////////////////////////////////////////////
+template <typename T>
+INLINE
+static bool CheckBit(T word, uint32_t bit)
+{
+    return 0 != (word & (T(1) << bit));
+}
+
 //////////////////////////////////////////////////////////////////////////
 /// Add byte offset to any-type pointer
 //////////////////////////////////////////////////////////////////////////
@@ -250,12 +268,15 @@ public:
 };
 
 // Ranged integer argument for TemplateArgUnroller
-template <uint32_t TMin, uint32_t TMax>
-struct IntArg
+template <typename T, T TMin, T TMax>
+struct RangedArg
 {
-    uint32_t val;
+    T val;
 };
 
+template <uint32_t TMin, uint32_t TMax>
+using IntArg = RangedArg<uint32_t, TMin, TMax>;
+
 // Recursive template used to auto-nest conditionals.  Converts dynamic boolean function
 // arguments to static template arguments.
 template <typename TermT, typename... ArgsB>
@@ -289,49 +310,49 @@ struct TemplateArgUnroller
     }
 
     //-----------------------------------------
-    // Integer value (within specified range)
+    // Ranged value (within specified range)
     //-----------------------------------------
 
     // Last Arg Terminator
-    template <uint32_t TMin, uint32_t TMax>
-    static typename TermT::FuncType GetFunc(IntArg<TMin, TMax> iArg)
+    template <typename T, T TMin, T TMax>
+    static typename TermT::FuncType GetFunc(RangedArg<T, TMin, TMax> iArg)
     {
         if (iArg.val == TMax)
         {
-            return TermT::template GetFunc<ArgsB..., std::integral_constant<uint32_t, TMax>>();
+            return TermT::template GetFunc<ArgsB..., std::integral_constant<T, TMax>>();
         }
         if (TMax > TMin)
         {
-            return TemplateArgUnroller<TermT, ArgsB...>::GetFunc(IntArg<TMin, TMax-1>{iArg.val});
+            return TemplateArgUnroller<TermT, ArgsB...>::GetFunc(RangedArg<T, TMin, (T)(int(TMax)-1)>{iArg.val});
         }
         SWR_ASSUME(false); return nullptr;
     }
-    template <uint32_t TVal>
-    static typename TermT::FuncType GetFunc(IntArg<TVal, TVal> iArg)
+    template <typename T, T TVal>
+    static typename TermT::FuncType GetFunc(RangedArg<T, TVal, TVal> iArg)
     {
         SWR_ASSERT(iArg.val == TVal);
-        return TermT::template GetFunc<ArgsB..., std::integral_constant<uint32_t, TVal>>();
+        return TermT::template GetFunc<ArgsB..., std::integral_constant<T, TVal>>();
     }
 
     // Recursively parse args
-    template <uint32_t TMin, uint32_t TMax, typename... TArgsT>
-    static typename TermT::FuncType GetFunc(IntArg<TMin, TMax> iArg, TArgsT... remainingArgs)
+    template <typename T, T TMin, T TMax, typename... TArgsT>
+    static typename TermT::FuncType GetFunc(RangedArg<T, TMin, TMax> iArg, TArgsT... remainingArgs)
     {
         if (iArg.val == TMax)
         {
-            return TemplateArgUnroller<TermT, ArgsB..., std::integral_constant<uint32_t, TMax>>::GetFunc(remainingArgs...);
+            return TemplateArgUnroller<TermT, ArgsB..., std::integral_constant<T, TMax>>::GetFunc(remainingArgs...);
         }
         if (TMax > TMin)
         {
-            return TemplateArgUnroller<TermT, ArgsB...>::GetFunc(IntArg<TMin, TMax - 1>{iArg.val}, remainingArgs...);
+            return TemplateArgUnroller<TermT, ArgsB...>::GetFunc(RangedArg<T, TMin, (T)(int(TMax) - 1)>{iArg.val}, remainingArgs...);
         }
         SWR_ASSUME(false); return nullptr;
     }
-    template <uint32_t TVal, typename... TArgsT>
-    static typename TermT::FuncType GetFunc(IntArg<TVal, TVal> iArg, TArgsT... remainingArgs)
+    template <typename T, T TVal, typename... TArgsT>
+    static typename TermT::FuncType GetFunc(RangedArg<T, TVal, TVal> iArg, TArgsT... remainingArgs)
     {
         SWR_ASSERT(iArg.val == TVal);
-        return TemplateArgUnroller<TermT, ArgsB..., std::integral_constant<uint32_t, TVal>>::GetFunc(remainingArgs...);
+        return TemplateArgUnroller<TermT, ArgsB..., std::integral_constant<T, TVal>>::GetFunc(remainingArgs...);
     }
 };
 
@@ -347,7 +368,8 @@ static INLINE std::string GetEnv(const std::string& variableName)
     output.resize(valueSize - 1); // valueSize includes null, output.resize() does not
     GetEnvironmentVariableA(variableName.c_str(), &output[0], valueSize);
 #else
-    output = getenv(variableName.c_str());
+    char *env = getenv(variableName.c_str());
+    output = env ? env : "";
 #endif
 
     return output;