Fix nested swizzles. Actually fetch the destination contents
authorZack Rusin <zack@tungstengraphics.com>
Thu, 25 Oct 2007 13:03:53 +0000 (09:03 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Thu, 25 Oct 2007 13:04:41 +0000 (09:04 -0400)
instead of input.

src/mesa/pipe/llvm/storage.cpp
src/mesa/pipe/llvm/storage.h

index 1072917198974f225989ddd017e26e1d17e99dc9..cba719a8becb6ef98f307e82908bd3ff1a9f0628 100644 (file)
@@ -212,7 +212,9 @@ void Storage::setTempElement(int idx, llvm::Value *val, int mask)
 void Storage::store(int dstIdx, llvm::Value *val, int mask)
 {
    if (mask != TGSI_WRITEMASK_XYZW) {
-      llvm::Value *templ = m_dstCache[dstIdx];
+      llvm::Value *templ = 0;
+      if (m_destWriteMap[dstIdx])
+         templ = outputElement(dstIdx);
       val = maskWrite(val, mask, templ);
    }
 
@@ -222,7 +224,7 @@ void Storage::store(int dstIdx, llvm::Value *val, int mask)
                                                       m_block);
    StoreInst *st = new StoreInst(val, getElem, false, m_block);
    st->setAlignment(8);
-   //m_dstCache[dstIdx] = st;
+   m_destWriteMap[dstIdx] = true;
 }
 
 llvm::Value *Storage::maskWrite(llvm::Value *src, int mask, llvm::Value *templ)
@@ -308,7 +310,7 @@ llvm::Value * Storage::outputElement(int idx, llvm::Value *indIdx )
     GetElementPtrInst *getElem = 0;
 
    if (indIdx) {
-      getElem = new GetElementPtrInst(m_IN,
+      getElem = new GetElementPtrInst(m_OUT,
                                       BinaryOperator::create(Instruction::Add,
                                                              indIdx,
                                                              constantInt(idx),
@@ -317,7 +319,7 @@ llvm::Value * Storage::outputElement(int idx, llvm::Value *indIdx )
                                       name("output_ptr"),
                                       m_block);
    } else {
-      getElem = new GetElementPtrInst(m_IN,
+      getElem = new GetElementPtrInst(m_OUT,
                                       constantInt(idx),
                                       name("output_ptr"),
                                       m_block);
index a844d1c30f65312465253d4ef7bc1db2bb8ef4e0..ebdfcdefd601973af10805577d9259e2175d8fa2 100644 (file)
@@ -34,6 +34,7 @@
 #define STORAGE_H
 
 #include <map>
+#include <set>
 #include <vector>
 
 namespace llvm {
@@ -103,6 +104,8 @@ private:
    int         m_idx;
 
    int         m_numConsts;
+
+   std::map<int, bool > m_destWriteMap;
 };
 
 #endif