From 8238c791dcd244c5d242b0e61cbc744ed64e5e23 Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Tue, 1 May 2018 16:33:19 -0500 Subject: [PATCH] swr/rast: Add Builder::GetVectorType() Reviewed-by: Bruce Cherniak --- .../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 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 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()); + } + + // should packetize to <8 x > + 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" -- 2.30.2