Initial support for immediate values in TGSI programs.
authorBrian <brian.paul@tungstengraphics.com>
Fri, 26 Oct 2007 18:20:17 +0000 (12:20 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 26 Oct 2007 19:10:37 +0000 (13:10 -0600)
These can be evaluated at compile time.
Code disabled pending clarifications of TGSI immediate data structures.

src/mesa/pipe/tgsi/exec/tgsi_dump.c
src/mesa/pipe/tgsi/exec/tgsi_exec.c
src/mesa/pipe/tgsi/exec/tgsi_exec.h
src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c

index 9d21da0..e7eb811 100644 (file)
@@ -89,7 +89,7 @@ text_dump_flt(
 {
    char str[48];
 
-   sprintf( str, "%40.6f", f );
+   sprintf( str, "%10.4f", f );
    text_dump_str( dump, str );
 }
 
@@ -780,7 +780,11 @@ dump_immediate_short(
    ENM( imm->Immediate.DataType, TGSI_IMMS_SHORT );
 
    TXT( " { " );
+#if 0
    for( i = 0; i < imm->Immediate.Size - 1; i++ ) {
+#else
+   for( i = 0; i < imm->Immediate.Size; i++ ) {
+#endif
       switch( imm->Immediate.DataType ) {
       case TGSI_IMM_FLOAT32:
          FLT( imm->u.ImmediateFloat32[i].Float );
index 3f46437..42aed9b 100644 (file)
@@ -170,6 +170,7 @@ tgsi_exec_prepare( struct tgsi_exec_machine *mach )
          break;
 
       case TGSI_TOKEN_TYPE_IMMEDIATE:
+#if 0
          assert( (parse.FullToken.FullImmediate.Immediate.Size - 1) % 4 == 0 );
          assert( mach->ImmLimit + (parse.FullToken.FullImmediate.Immediate.Size - 1) / 4 <= 256 );
 
@@ -177,6 +178,16 @@ tgsi_exec_prepare( struct tgsi_exec_machine *mach )
             mach->Imms[mach->ImmLimit + i / 4][i % 4] = parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float;
          }
          mach->ImmLimit += (parse.FullToken.FullImmediate.Immediate.Size - 1) / 4;
+#else
+         /* Add this immediate value (vector of 1,2,3,4 floats) to immediates array */
+         assert( parse.FullToken.FullImmediate.Immediate.Size <= 4 );
+         assert( mach->ImmLimit < TGSI_EXEC_NUM_IMMEDIATES );
+
+         for( i = 0; i < parse.FullToken.FullImmediate.Immediate.Size; i++ ) {
+            mach->Imms[mach->ImmLimit][i] = parse.FullToken.FullImmediate.u.ImmediateFloat32[i].Float;
+         }
+         mach->ImmLimit++;
+#endif
          break;
 
       case TGSI_TOKEN_TYPE_INSTRUCTION:
index 6c1d368..1805e72 100644 (file)
@@ -93,12 +93,12 @@ struct tgsi_exec_labels
 
 #define TGSI_EXEC_NUM_TEMPS   (32 + 4)
 #define TGSI_EXEC_NUM_ADDRS   1
+#define TGSI_EXEC_NUM_IMMEDIATES  256
 
 #define TGSI_EXEC_MAX_COND_NESTING  10
 #define TGSI_EXEC_MAX_LOOP_NESTING  10
 #define TGSI_EXEC_MAX_CALL_NESTING  10
 
-
 /**
  * Run-time virtual machine state for executing TGSI shader.
  */
@@ -120,7 +120,7 @@ struct tgsi_exec_machine
 
    struct tgsi_sampler           *Samplers;
 
-   float                         Imms[256][4];
+   float                         Imms[TGSI_EXEC_NUM_IMMEDIATES][4];
    unsigned                      ImmLimit;
    float                         (*Consts)[4];
    struct tgsi_exec_vector       *Inputs;
index 8975b4f..4fac617 100644 (file)
@@ -1,9 +1,12 @@
 #include "tgsi_platform.h"\r
 #include "tgsi_mesa.h"\r
 #include "pipe/tgsi/mesa/mesa_to_tgsi.h"\r
+#include "shader/prog_parameter.h"\r
 \r
 #define TGSI_DEBUG 0\r
 \r
+#define EMIT_IMMEDIATES 0\r
+\r
 \r
 /*\r
  * Map mesa register file to TGSI register file.\r
@@ -21,9 +24,14 @@ map_register_file(
    //case PROGRAM_ENV_PARAM:\r
    case PROGRAM_STATE_VAR:\r
    case PROGRAM_NAMED_PARAM:\r
-   case PROGRAM_CONSTANT:\r
    case PROGRAM_UNIFORM:\r
       return TGSI_FILE_CONSTANT;\r
+   case PROGRAM_CONSTANT:\r
+#if EMIT_IMMEDIATES\r
+      return TGSI_FILE_IMMEDIATE;\r
+#else\r
+      return TGSI_FILE_CONSTANT;\r
+#endif\r
    case PROGRAM_INPUT:\r
       return TGSI_FILE_INPUT;\r
    case PROGRAM_OUTPUT:\r
@@ -49,7 +57,8 @@ map_register_file_index(
    GLuint file,\r
    GLuint index,\r
    const GLuint inputMapping[],\r
-   const GLuint outputMapping[])\r
+   const GLuint outputMapping[],\r
+   const GLuint immediateMapping[])\r
 {\r
    switch( file ) {\r
    case TGSI_FILE_INPUT:\r
@@ -59,6 +68,11 @@ map_register_file_index(
    case TGSI_FILE_OUTPUT:\r
       return outputMapping[index];\r
 \r
+#if EMIT_IMMEDIATES\r
+   case TGSI_FILE_IMMEDIATE:\r
+      return immediateMapping[index];\r
+#endif\r
+\r
    default:\r
       return index;\r
    }\r
@@ -119,12 +133,26 @@ convert_writemask(
    return writemask;\r
 }\r
 \r
+#if EMIT_IMMEDIATES\r
+static struct tgsi_full_immediate\r
+make_immediate(const float *value, uint size)\r
+{\r
+   struct tgsi_full_immediate imm;\r
+   imm.Immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;\r
+   imm.Immediate.Size = size;\r
+   imm.Immediate.DataType = TGSI_IMM_FLOAT32;\r
+   imm.u.ImmediateFloat32 = (struct tgsi_immediate_float32 *) value;\r
+   return imm;\r
+}\r
+#endif\r
+\r
 static void\r
 compile_instruction(\r
    const struct prog_instruction *inst,\r
    struct tgsi_full_instruction *fullinst,\r
    const GLuint inputMapping[],\r
    const GLuint outputMapping[],\r
+   const GLuint immediateMapping[],\r
    GLuint preamble_size,\r
    GLuint processor )\r
 {\r
@@ -144,7 +172,8 @@ compile_instruction(
       fulldst->DstRegister.File,\r
       inst->DstReg.Index,\r
       inputMapping,\r
-      outputMapping\r
+      outputMapping,\r
+      NULL\r
       );\r
    fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask );\r
 \r
@@ -157,7 +186,8 @@ compile_instruction(
          fullsrc->SrcRegister.File,\r
          inst->SrcReg[i].Index,\r
          inputMapping,\r
-         outputMapping );\r
+         outputMapping,\r
+         immediateMapping);\r
 \r
       for( j = 0; j < 4; j++ ) {\r
          GLuint swz;\r
@@ -595,6 +625,10 @@ tgsi_translate_mesa_program(
    struct tgsi_processor *processor;\r
    struct tgsi_full_instruction fullinst;\r
    GLuint preamble_size = 0;\r
+   GLuint immediates[1000];\r
+#if EMIT_IMMEDIATES\r
+   GLuint numImmediates = 0;\r
+#endif\r
 \r
    assert(procType == TGSI_PROCESSOR_FRAGMENT ||\r
           procType == TGSI_PROCESSOR_VERTEX);\r
@@ -723,12 +757,30 @@ tgsi_translate_mesa_program(
       }\r
    }\r
 \r
+   /* immediates/literals */\r
+#if EMIT_IMMEDIATES\r
+   for (i = 0; i < program->Parameters->NumParameters; i++) {\r
+      if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {\r
+         struct tgsi_full_immediate fullimm\r
+            = make_immediate(program->Parameters->ParameterValues[i],\r
+                             program->Parameters->Parameters[i].Size);\r
+         ti += tgsi_build_full_immediate(&fullimm,\r
+                                         &tokens[ti],\r
+                                         header,\r
+                                         maxTokens - ti);\r
+         immediates[i] = numImmediates;\r
+         numImmediates++;\r
+      }\r
+   }\r
+#endif\r
+\r
    for( i = 0; i < program->NumInstructions; i++ ) {\r
       compile_instruction(\r
             &program->Instructions[i],\r
             &fullinst,\r
             inputMapping,\r
             outputMapping,\r
+            immediates,\r
             preamble_size,\r
             procType );\r
 \r