Enable immediates in TGSI and work with them in LLVM code.
authorZack Rusin <zack@tungstengraphics.com>
Mon, 29 Oct 2007 14:59:24 +0000 (10:59 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Tue, 30 Oct 2007 09:15:05 +0000 (05:15 -0400)
Enables immediates by default in the TGSI translation code
and adds code handling it in llvm tgsi translation.

src/mesa/pipe/llvm/llvmtgsi.cpp
src/mesa/pipe/llvm/storage.cpp
src/mesa/pipe/llvm/storage.h
src/mesa/state_tracker/st_mesa_to_tgsi.c

index 4611ac17664ab426dfc59dcdb26c2d012c457125..ec38c695b933a18733bf6c9ebf1770ce9e9f9468 100644 (file)
@@ -164,9 +164,23 @@ translate_declaration(llvm::Module *module,
 
 
 static void
-translate_immediate(llvm::Module *module,
+translate_immediate(Storage *storage,
                     struct tgsi_full_immediate *imm)
 {
+   float vec[4];
+   int i;
+   for (i = 0; i < imm->Immediate.Size - 1; ++i) {
+      switch( imm->Immediate.DataType ) {
+      case TGSI_IMM_FLOAT32:
+         vec[i] = imm->u.ImmediateFloat32[i].Float;
+         break;
+      default:
+         assert( 0 );
+      }
+   }
+   printf("-------------- VEC = %f %f %f %f\n",
+          vec[0], vec[1], vec[2], vec[3]);
+   storage->addImmediate(vec);
 }
 
 static void
@@ -200,6 +214,8 @@ translate_instruction(llvm::Module *module,
          val = storage->tempElement(src->SrcRegister.Index);
       } else if (src->SrcRegister.File == TGSI_FILE_OUTPUT) {
          val = storage->outputElement(src->SrcRegister.Index, indIdx);
+      } else if (src->SrcRegister.File == TGSI_FILE_IMMEDIATE) {
+         val = storage->immediateElement(src->SrcRegister.Index);
       } else {
          fprintf(stderr, "ERROR: not supported llvm source %d\n", src->SrcRegister.File);
          return;
@@ -679,7 +695,7 @@ tgsi_to_llvm(struct gallivm_prog *prog, const struct tgsi_token *tokens)
          break;
 
       case TGSI_TOKEN_TYPE_IMMEDIATE:
-         translate_immediate(mod,
+         translate_immediate(&storage,
                              &parse.FullToken.FullImmediate);
          break;
 
index ff62fcf3e49cbd1359b864676c929079eac23162..1aaabbe88286eeeadd64f298bfe2ef4cb081b78e 100644 (file)
@@ -393,3 +393,18 @@ void Storage::popTemps()
    m_tempStack.pop();
 }
 #endif //MESA_LLVM
+
+llvm::Value * Storage::immediateElement(int idx)
+{
+   return m_immediates[idx];
+}
+
+void Storage::addImmediate(float *val)
+{
+   std::vector<Constant*> vec(4);
+   vec[0] = ConstantFP::get(Type::FloatTy, APFloat(val[0]));
+   vec[1] = ConstantFP::get(Type::FloatTy, APFloat(val[1]));
+   vec[2] = ConstantFP::get(Type::FloatTy, APFloat(val[2]));
+   vec[3] = ConstantFP::get(Type::FloatTy, APFloat(val[3]));
+   m_immediates.push_back(ConstantVector::get(m_floatVecType, vec));
+}
index ac3e4d5af9700b1042713a6cc87c1886353151b4..f9a82ef857d308f62160d5c77fae64701afaa2cc 100644 (file)
@@ -65,6 +65,7 @@ public:
    llvm::Value *inputElement(int idx, llvm::Value *indIdx =0);
    llvm::Value *constElement(int idx, llvm::Value *indIdx =0);
    llvm::Value *outputElement(int idx, llvm::Value *indIdx =0);
+   llvm::Value *immediateElement(int idx);
 
    llvm::Value *tempElement(int idx);
    void setTempElement(int idx, llvm::Value *val, int mask);
@@ -87,6 +88,8 @@ public:
    void pushTemps();
    void popTemps();
 
+   void addImmediate(float *val);
+
 private:
    llvm::Value *maskWrite(llvm::Value *src, int mask, llvm::Value *templ);
    const char *name(const char *prefix);
@@ -102,6 +105,7 @@ private:
    std::vector<llvm::Value*>         m_temps;
    std::vector<llvm::Value*>         m_addrs;
    std::vector<llvm::Value*>         m_dstCache;
+   std::vector<llvm::Constant*>      m_immediates;
 
    llvm::VectorType *m_floatVecType;
    llvm::VectorType *m_intVecType;
index 75195968e5cf577dd11e08ae195a31e03ec16cc7..36b41ea7e89e3dfeb6f1bf3ae67771d3ec6a5522 100644 (file)
@@ -38,8 +38,6 @@
 
 #define TGSI_DEBUG 0
 
-#define EMIT_IMMEDIATES 0
-
 
 /*
  * Map mesa register file to TGSI register file.
@@ -60,11 +58,7 @@ map_register_file(
    case PROGRAM_UNIFORM:
       return TGSI_FILE_CONSTANT;
    case PROGRAM_CONSTANT:
-#if EMIT_IMMEDIATES
       return TGSI_FILE_IMMEDIATE;
-#else
-      return TGSI_FILE_CONSTANT;
-#endif
    case PROGRAM_INPUT:
       return TGSI_FILE_INPUT;
    case PROGRAM_OUTPUT:
@@ -101,10 +95,8 @@ map_register_file_index(
    case TGSI_FILE_OUTPUT:
       return outputMapping[index];
 
-#if EMIT_IMMEDIATES
    case TGSI_FILE_IMMEDIATE:
       return immediateMapping[index];
-#endif
 
    default:
       return index;
@@ -166,7 +158,6 @@ convert_writemask(
    return writemask;
 }
 
-#if EMIT_IMMEDIATES
 static struct tgsi_full_immediate
 make_immediate(const float *value, uint size)
 {
@@ -177,7 +168,6 @@ make_immediate(const float *value, uint size)
    imm.u.ImmediateFloat32 = (struct tgsi_immediate_float32 *) value;
    return imm;
 }
-#endif
 
 static void
 compile_instruction(
@@ -661,9 +651,7 @@ tgsi_translate_mesa_program(
    struct tgsi_full_instruction fullinst;
    GLuint preamble_size = 0;
    GLuint immediates[1000];
-#if EMIT_IMMEDIATES
    GLuint numImmediates = 0;
-#endif
 
    assert(procType == TGSI_PROCESSOR_FRAGMENT ||
           procType == TGSI_PROCESSOR_VERTEX);
@@ -804,7 +792,6 @@ tgsi_translate_mesa_program(
    }
 
    /* immediates/literals */
-#if EMIT_IMMEDIATES
    for (i = 0; i < program->Parameters->NumParameters; i++) {
       if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {
          struct tgsi_full_immediate fullimm
@@ -818,7 +805,6 @@ tgsi_translate_mesa_program(
          numImmediates++;
       }
    }
-#endif
 
    for( i = 0; i < program->NumInstructions; i++ ) {
       compile_instruction(