diff options
Diffstat (limited to 'src/mesa/pipe')
| -rw-r--r-- | src/mesa/pipe/llvm/storagesoa.cpp | 20 | ||||
| -rw-r--r-- | src/mesa/pipe/llvm/storagesoa.h | 2 | 
2 files changed, 22 insertions, 0 deletions
| diff --git a/src/mesa/pipe/llvm/storagesoa.cpp b/src/mesa/pipe/llvm/storagesoa.cpp index e09e9e8fe7..7292333a80 100644 --- a/src/mesa/pipe/llvm/storagesoa.cpp +++ b/src/mesa/pipe/llvm/storagesoa.cpp @@ -81,6 +81,15 @@ std::vector<llvm::Value*> StorageSoa::constElement(int idx, int swizzle,                                                     llvm::Value *indIdx)  {     std::vector<llvm::Value*> res(4); +   llvm::Value *xChannel = elementPointer(m_consts, idx, 0); +   llvm::Value *yChannel = elementPointer(m_consts, idx, 1); +   llvm::Value *zChannel = elementPointer(m_consts, idx, 2); +   llvm::Value *wChannel = elementPointer(m_consts, idx, 3); + +   res[0] = alignedArrayLoad(xChannel); +   res[1] = alignedArrayLoad(yChannel); +   res[2] = alignedArrayLoad(zChannel); +   res[3] = alignedArrayLoad(wChannel);     return res;  } @@ -206,3 +215,14 @@ llvm::ConstantInt * StorageSoa::constantInt(int idx) const     m_constInts[idx] = constInt;     return constInt;  } + +llvm::Value *StorageSoa::alignedArrayLoad(llvm::Value *val) +{ +   VectorType  *vectorType = VectorType::get(Type::FloatTy, 4); +   PointerType *vectorPtr  = PointerType::get(vectorType, 0); + +   CastInst *cast = new BitCastInst(val, vectorPtr, name("toVector"), m_block); +   LoadInst *load = new LoadInst(cast, name("alignLoad"), false, m_block); +   load->setAlignment(8); +   return load; +} diff --git a/src/mesa/pipe/llvm/storagesoa.h b/src/mesa/pipe/llvm/storagesoa.h index 84db7726a7..43b23951de 100644 --- a/src/mesa/pipe/llvm/storagesoa.h +++ b/src/mesa/pipe/llvm/storagesoa.h @@ -74,6 +74,8 @@ private:                          int channel) const;     const char *name(const char *prefix) const;     llvm::ConstantInt *constantInt(int) const; +   llvm::Value *alignedArrayLoad(llvm::Value *val); +  private:     llvm::BasicBlock *m_block; | 
