summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/swr
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/swr')
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/builder.cpp44
-rw-r--r--src/gallium/drivers/swr/rasterizer/jitter/builder.h1
2 files changed, 45 insertions, 0 deletions
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
index 32487353f86..e1c5d80c806 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 82c5f8cde2a..6ca128d38f1 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"