| @@ -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); | |||
| } | |||
| @@ -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); | |||
| @@ -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}; | |||
| } | |||
| @@ -692,6 +692,7 @@ translate_instructionir(llvm::Module *module, | |||
| } | |||
| break; | |||
| case TGSI_OPCODE_LIT: { | |||
| out = instr->lit(inputs[0]); | |||
| } | |||
| break; | |||
| case TGSI_OPCODE_RCP: { | |||