do the lit (some artifacts present)
authorZack Rusin <zack@tungstengraphics.com>
Fri, 16 May 2008 20:06:59 +0000 (16:06 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Sat, 17 May 2008 17:58:44 +0000 (13:58 -0400)
src/gallium/auxiliary/gallivm/instructionssoa.cpp
src/gallium/auxiliary/gallivm/instructionssoa.h
src/gallium/auxiliary/gallivm/soabuiltins.c
src/gallium/auxiliary/gallivm/tgsitollvm.cpp

index 55fdda279162df261e36e95fc007cc9d3fb0f0ef..074dd0ecd6bc43fe949f57e4cf7b416030afa866 100644 (file)
@@ -179,6 +179,7 @@ void InstructionsSoa::createFunctionMap()
    m_functionsMap[TGSI_OPCODE_MIN]   = "min";
    m_functionsMap[TGSI_OPCODE_MAX]   = "max";
    m_functionsMap[TGSI_OPCODE_POWER] = "pow";
+   m_functionsMap[TGSI_OPCODE_LIT]   = "lit";
 }
 
 void InstructionsSoa::createDependencies()
@@ -204,6 +205,14 @@ void InstructionsSoa::createDependencies()
       minDeps[0] = "minvec";
       m_builtinDependencies["min"] = minDeps;
    }
+   {
+      std::vector<std::string> litDeps(4);
+      litDeps[0] = "minvec";
+      litDeps[1] = "maxvec";
+      litDeps[2] = "powf";
+      litDeps[3] = "powvec";
+      m_builtinDependencies["lit"] = litDeps;
+   }
 }
 
 llvm::Function * InstructionsSoa::function(int op)
@@ -475,3 +484,9 @@ std::vector<llvm::Value*> InstructionsSoa::sub(const std::vector<llvm::Value*> i
    return res;
 }
 
+std::vector<llvm::Value*> InstructionsSoa::lit(const std::vector<llvm::Value*> in)
+{
+   llvm::Function *func = function(TGSI_OPCODE_LIT);
+   return callBuiltin(func, in);
+}
+
index 5a7f8fdf727a13365b6f092f00981b135892539c..477ef4a1579e4e3c75cc0a0bc91a848c691b96a7 100644 (file)
@@ -56,6 +56,7 @@ public:
                                  const std::vector<llvm::Value*> in2);
    std::vector<llvm::Value*> dp4(const std::vector<llvm::Value*> in1,
                                  const std::vector<llvm::Value*> in2);
+   std::vector<llvm::Value*> lit(const std::vector<llvm::Value*> in);
    std::vector<llvm::Value*> madd(const std::vector<llvm::Value*> in1,
                                   const std::vector<llvm::Value*> in2,
                                   const std::vector<llvm::Value*> in3);
index 935283f962b0c0c11dbe48e0b6d4b94960e18e69..b3bfebfe509ce6ce41540830882465f6f619c70a 100644 (file)
@@ -109,20 +109,6 @@ void pow(float4 *res,
    res[3] = res[0];
 }
 
-void lit(float4 *res,
-         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w,
-         float4 tmp1x, float4 tmp1y, float4 tmp1z, float4 tmp1w)
-{
-   const float4 zerovec = (float4) {0, 0, 0, 0};
-   float4 tmpx = tmp0x;
-   float4 tmpy = tmp0y;
-
-   res[0] = (float4){1.0, 1.0, 1.0, 1.0};
-   res[1] = tmpx;
-   res[2] = tmpy;
-   res[3] = (float4){1.0, 1.0, 1.0, 1.0};
-}
-
 float4 minvec(float4 a, float4 b)
 {
    return (float4){(a.x < b.x) ? a.x : b.x,
@@ -159,3 +145,26 @@ void max(float4 *res,
    res[2] = maxvec(tmp0z, tmp1z);
    res[3] = maxvec(tmp0w, tmp1w);
 }
+
+
+void lit(float4 *res,
+         float4 tmp0x, float4 tmp0y, float4 tmp0z, float4 tmp0w)
+{
+   const float4 zerovec = (float4) {0, 0, 0, 0};
+   const float4 min128 = (float4) {-128.f, -128.f, -128.f, -128.f};
+   const float4 plus128 = (float4) {128.f,  128.f,  128.f,  128.f};
+
+   res[0] = (float4){1.0, 1.0, 1.0, 1.0};
+   if (tmp0x.x > 0) {
+      float4 tmpx = maxvec(tmpx, zerovec);
+      float4 tmpy = maxvec(tmp0y, zerovec);
+      float4 tmpw = minvec(tmp0w, plus128);
+      tmpw = maxvec(tmpw, min128);
+      res[1] = tmpx;
+      res[2] = powvec(tmpy, tmpw);
+   } else {
+      res[1] = zerovec;
+      res[2] = zerovec;
+   }
+   res[3] = (float4){1.0, 1.0, 1.0, 1.0};
+}
index 007b5c169af7dede4ca3f8275d5101e14d3a3675..abcb240f46517c0c0550fa5947d8154837d497af 100644 (file)
@@ -692,6 +692,7 @@ translate_instructionir(llvm::Module *module,
    }
       break;
    case TGSI_OPCODE_LIT: {
+      out = instr->lit(inputs[0]);
    }
       break;
    case TGSI_OPCODE_RCP: {