On 04/26/2016 03:13 AM, Ilia Mirkin wrote:
On Mon, Apr 25, 2016 at 4:14 PM, Samuel Pitoiset
<samuel.pitoi...@gmail.com> wrote:
This is loosely based on the previous lowering pass wrote by calim
four years ago. I did clean the code and fixed some issues.

v2: drop .raw code which is unused for now

Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  | 97 +++++++++++++++++++++-
 1 file changed, 94 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
index dc08ad3..1194f60 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
@@ -1449,7 +1449,7 @@ private:
    void handleUserClipPlanes();

    // Symbol *getResourceBase(int r);
-   // void getResourceCoords(std::vector<Value *>&, int r, int s);
+   void getImageCoords(std::vector<Value *>&, int r, int s);

    void handleLOAD(Value *dst0[4]);
    void handleSTORE();
@@ -2255,7 +2255,7 @@ Converter::getResourceCoords(std::vector<Value *> 
&coords, int r, int s)
       coords[0] = mkOp1v(OP_MOV, TYPE_U32, getScratch(4, FILE_ADDRESS),
                          coords[0]);
 }
-
+*/
 static inline int
 partitionLoadStore(uint8_t comp[2], uint8_t size[2], uint8_t mask)
 {
@@ -2280,7 +2280,30 @@ partitionLoadStore(uint8_t comp[2], uint8_t size[2], 
uint8_t mask)
    }
    return n + 1;
 }
-*/
+
+static inline nv50_ir::TexTarget
+getImageTarget(const tgsi::Source *code, int r)
+{
+   return tgsi::translateTexture(code->images.at(r).target);
+}
+
+static inline const nv50_ir::TexInstruction::ImgFormatDesc *
+getImageFormat(const tgsi::Source *code, int r)
+{
+   return &nv50_ir::TexInstruction::formatTable[
+      tgsi::translateImgFormat(code->images.at(r).format)];
+}
+
+void
+Converter::getImageCoords(std::vector<Value *> &coords, int r, int s)
+{
+   TexInstruction::Target t =
+      TexInstruction::Target(getImageTarget(code, r));
+   const int arg = t.getDim() + (t.isArray() || t.isCube());
+
+   for (int c = 0; c < arg; ++c)
+      coords.push_back(fetchSrc(s, c));
+}

 // For raw loads, granularity is 4 byte.
 // Usage of the texture read mask on OP_SULDP is not allowed.
@@ -2314,6 +2337,33 @@ Converter::handleLOAD(Value *dst0[4])
             ld->setIndirect(0, 1, fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 
0));
       }
       break;
+   case TGSI_FILE_IMAGE: {
+      assert(!code->images[r].raw);
+
+      getImageCoords(off, r, 1);
+      def.resize(4);
+
+      for (c = 0; c < 4; ++c) {
+         if (!dst0[c] || tgsi.getSrc(0).getSwizzle(c) != (TGSI_SWIZZLE_X + c))
+            def[c] = getScratch();
+         else
+            def[c] = dst0[c];
+      }
+
+      TexInstruction *ld =
+         mkTex(OP_SULDP, getImageTarget(code, r), code->images[r].slot, 0,
+               def, off);
+      ld->tex.mask = tgsi.getDst(0).getMask();
+      ld->tex.format = getImageFormat(code, r);
+      ld->cache = tgsi.getCacheMode();
+      if (tgsi.getSrc(0).isIndirect(0))
+         ld->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
+
+      FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
+         if (dst0[c] != def[c])
+            mkMov(dst0[c], def[tgsi.getSrc(0).getSwizzle(c)]);
+      }
+      break;
    default:
       assert(!"Unsupported srcFile for LOAD");
    }
@@ -2420,6 +2470,24 @@ Converter::handleSTORE()
             st->setIndirect(0, 1, fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 
0));
       }
       break;
+   case TGSI_FILE_IMAGE: {
+      assert(!code->images[r].raw);
+
+      getImageCoords(off, r, 0);
+      src = off;
+
+      FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
+         src.push_back(fetchSrc(1, c));
+
+      TexInstruction *st =
+         mkTex(OP_SUSTP, getImageTarget(code, r), code->images[r].slot,
+               0, dummy, src);
+      st->tex.mask = tgsi.getDst(0).getMask();
+      st->cache = tgsi.getCacheMode();
+      if (tgsi.getSrc(0).isIndirect(0))
+         st->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));

Erm.... are you sure? I think these should be talking about
getDst(0).isIndirect(0). For stores, the image is in the dst, no?

This is a copy-paste error.


+      }
+      break;
    default:
       assert(!"Unsupported dstFile for STORE");
    }
@@ -2518,6 +2586,29 @@ Converter::handleATOM(Value *dst0[4], DataType ty, 
uint16_t subOp)
          if (dst0[c])
             dst0[c] = dst; // not equal to rDst so handleInstruction will do 
mkMov
       break;
+   case TGSI_FILE_IMAGE: {
+      assert(!code->images[r].raw);
+
+      getImageCoords(srcv, r, 1);
+      defv.push_back(dst);
+      srcv.push_back(fetchSrc(2, 0));
+
+      if (subOp == NV50_IR_SUBOP_ATOM_CAS)
+         srcv.push_back(fetchSrc(3, 0));
+
+      TexInstruction *tex = mkTex(OP_SUREDP, getImageTarget(code, r),
+                                  code->images[r].slot, 0, defv, srcv);
+      tex->subOp = subOp;
+      tex->tex.mask = 1;
+      tex->setType(ty);
+      if (tgsi.getSrc(0).isIndirect(0))
+         tex->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
+
+      for (int c = 0; c < 4; ++c)
+         if (dst0[c])
+            dst0[c] = dst; // not equal to rDst so handleInstruction will do 
mkMov
+      }
+      break;
    default:
       assert(!"Unsupported srcFile for ATOM");
    }
--
2.8.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

--
-Samuel
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to