[Mesa-dev] [PATCH 6/7] swr/rast: Add Builder::GetVectorType()

George Kyriazis george.kyriazis at intel.com
Fri May 4 18:40:58 UTC 2018


---
 .../drivers/swr/rasterizer/jitter/builder.cpp      | 44 ++++++++++++++++++++++
 .../drivers/swr/rasterizer/jitter/builder.h        |  1 +
 2 files changed, 45 insertions(+)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
index 3248735..e1c5d80 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
@@ -170,4 +170,48 @@ namespace SwrJit
         return (pGenIntrin->getMetadata("is_evaluate") != nullptr);
     }
 
+    //////////////////////////////////////////////////////////////////////////
+    /// @brief Packetizes the type. Assumes SOA conversion.
+    Type* Builder::GetVectorType(Type* pType)
+    {
+        if (pType->isVectorTy())
+        {
+            return pType;
+        }
+
+        // [N x float] should packetize to [N x <8 x float>]
+        if (pType->isArrayTy())
+        {
+            uint32_t arraySize = pType->getArrayNumElements();
+            Type* pArrayType = pType->getArrayElementType();
+            Type* pVecArrayType = GetVectorType(pArrayType);
+            Type* pVecType = ArrayType::get(pVecArrayType, arraySize);
+            return pVecType;
+        }
+
+        // {float,int} should packetize to {<8 x float>, <8 x int>}
+        if (pType->isAggregateType())
+        {
+            uint32_t numElems = pType->getStructNumElements();
+            SmallVector<Type*, 8> vecTypes;
+            for (uint32_t i = 0; i < numElems; ++i)
+            {
+                Type* pElemType = pType->getStructElementType(i);
+                Type* pVecElemType = GetVectorType(pElemType);
+                vecTypes.push_back(pVecElemType);
+            }
+            Type* pVecType = StructType::get(JM()->mContext, vecTypes);
+            return pVecType;
+        }
+
+        // [N x float]* should packetize to [N x <8 x float>]*
+        if (pType->isPointerTy() && pType->getPointerElementType()->isArrayTy())
+        {
+            return PointerType::get(GetVectorType(pType->getPointerElementType()), pType->getPointerAddressSpace());
+        }
+
+        // <ty> should packetize to <8 x <ty>>
+        Type* vecType = VectorType::get(pType, JM()->mVWidth);
+        return vecType;
+    }
 }
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.h b/src/gallium/drivers/swr/rasterizer/jitter/builder.h
index 82c5f8c..6ca128d 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.h
@@ -123,6 +123,7 @@ namespace SwrJit
         bool IsTempAlloca(Value* inst);
         bool SetTexelMaskEvaluate(Instruction* inst);
         bool IsTexelMaskEvaluate(Instruction* inst);
+        Type* GetVectorType(Type* pType);
 
 #include "gen_builder.hpp"
 #include "gen_builder_meta.hpp"
-- 
2.7.4



More information about the mesa-dev mailing list