summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary/gallivm
diff options
context:
space:
mode:
authorZack Rusin <zack@tungstengraphics.com>2008-05-16 16:06:59 -0400
committerZack Rusin <zack@tungstengraphics.com>2008-05-17 13:58:44 -0400
commit1d1cf8edf6a0409caf9aa7d44e186eb51f51fa1f (patch)
tree8a5aceaaedc73b62500fb0915e90bdb03ba55c4e /src/gallium/auxiliary/gallivm
parentea1a607292ef31df70cda8c6476755e0224c9f7d (diff)
do the lit (some artifacts present)
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r--src/gallium/auxiliary/gallivm/instructionssoa.cpp15
-rw-r--r--src/gallium/auxiliary/gallivm/instructionssoa.h1
-rw-r--r--src/gallium/auxiliary/gallivm/soabuiltins.c37
-rw-r--r--src/gallium/auxiliary/gallivm/tgsitollvm.cpp1
4 files changed, 40 insertions, 14 deletions
diff --git a/src/gallium/auxiliary/gallivm/instructionssoa.cpp b/src/gallium/auxiliary/gallivm/instructionssoa.cpp
index 55fdda2791..074dd0ecd6 100644
--- a/src/gallium/auxiliary/gallivm/instructionssoa.cpp
+++ b/src/gallium/auxiliary/gallivm/instructionssoa.cpp
@@ -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);
+}
+
diff --git a/src/gallium/auxiliary/gallivm/instructionssoa.h b/src/gallium/auxiliary/gallivm/instructionssoa.h
index 5a7f8fdf72..477ef4a157 100644
--- a/src/gallium/auxiliary/gallivm/instructionssoa.h
+++ b/src/gallium/auxiliary/gallivm/instructionssoa.h
@@ -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);
diff --git a/src/gallium/auxiliary/gallivm/soabuiltins.c b/src/gallium/auxiliary/gallivm/soabuiltins.c
index 935283f962..b3bfebfe50 100644
--- a/src/gallium/auxiliary/gallivm/soabuiltins.c
+++ b/src/gallium/auxiliary/gallivm/soabuiltins.c
@@ -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};
+}
diff --git a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
index 007b5c169a..abcb240f46 100644
--- a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
+++ b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
@@ -692,6 +692,7 @@ translate_instructionir(llvm::Module *module,
}
break;
case TGSI_OPCODE_LIT: {
+ out = instr->lit(inputs[0]);
}
break;
case TGSI_OPCODE_RCP: {