summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-10-26 12:20:17 -0600
committerBrian <brian.paul@tungstengraphics.com>2007-10-26 13:10:37 -0600
commit6b30f3888e46c3981f1e4fc34c155c7539275420 (patch)
treeeefd579e38e123270b3b24d91a9d61453ec9cf0a
parent67e4b8299620db2e2f33795621b23e9827604bb1 (diff)
Initial support for immediate values in TGSI programs.
These can be evaluated at compile time. Code disabled pending clarifications of TGSI immediate data structures.
-rw-r--r--src/mesa/pipe/tgsi/exec/tgsi_dump.c6
-rw-r--r--src/mesa/pipe/tgsi/exec/tgsi_exec.c11
-rw-r--r--src/mesa/pipe/tgsi/exec/tgsi_exec.h4
-rw-r--r--src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c60
4 files changed, 74 insertions, 7 deletions
diff --git a/src/mesa/pipe/tgsi/exec/tgsi_dump.c b/src/mesa/pipe/tgsi/exec/tgsi_dump.c
index 9d21da0965..e7eb811d18 100644
--- a/src/mesa/pipe/tgsi/exec/tgsi_dump.c
+++ b/src/mesa/pipe/tgsi/exec/tgsi_dump.c
@@ -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 );
diff --git a/src/mesa/pipe/tgsi/exec/tgsi_exec.c b/src/mesa/pipe/tgsi/exec/tgsi_exec.c
index 3f464372ca..42aed9bd6b 100644
--- a/src/mesa/pipe/tgsi/exec/tgsi_exec.c
+++ b/src/mesa/pipe/tgsi/exec/tgsi_exec.c
@@ -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:
diff --git a/src/mesa/pipe/tgsi/exec/tgsi_exec.h b/src/mesa/pipe/tgsi/exec/tgsi_exec.h
index 6c1d368342..1805e72487 100644
--- a/src/mesa/pipe/tgsi/exec/tgsi_exec.h
+++ b/src/mesa/pipe/tgsi/exec/tgsi_exec.h
@@ -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;
diff --git a/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c b/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c
index 8975b4fd57..4fac61777c 100644
--- a/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c
+++ b/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c
@@ -1,9 +1,12 @@
#include "tgsi_platform.h"
#include "tgsi_mesa.h"
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
+#include "shader/prog_parameter.h"
#define TGSI_DEBUG 0
+#define EMIT_IMMEDIATES 0
+
/*
* Map mesa register file to TGSI register file.
@@ -21,9 +24,14 @@ map_register_file(
//case PROGRAM_ENV_PARAM:
case PROGRAM_STATE_VAR:
case PROGRAM_NAMED_PARAM:
- case PROGRAM_CONSTANT:
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:
@@ -49,7 +57,8 @@ map_register_file_index(
GLuint file,
GLuint index,
const GLuint inputMapping[],
- const GLuint outputMapping[])
+ const GLuint outputMapping[],
+ const GLuint immediateMapping[])
{
switch( file ) {
case TGSI_FILE_INPUT:
@@ -59,6 +68,11 @@ 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;
}
@@ -119,12 +133,26 @@ convert_writemask(
return writemask;
}
+#if EMIT_IMMEDIATES
+static struct tgsi_full_immediate
+make_immediate(const float *value, uint size)
+{
+ struct tgsi_full_immediate imm;
+ imm.Immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
+ imm.Immediate.Size = size;
+ imm.Immediate.DataType = TGSI_IMM_FLOAT32;
+ imm.u.ImmediateFloat32 = (struct tgsi_immediate_float32 *) value;
+ return imm;
+}
+#endif
+
static void
compile_instruction(
const struct prog_instruction *inst,
struct tgsi_full_instruction *fullinst,
const GLuint inputMapping[],
const GLuint outputMapping[],
+ const GLuint immediateMapping[],
GLuint preamble_size,
GLuint processor )
{
@@ -144,7 +172,8 @@ compile_instruction(
fulldst->DstRegister.File,
inst->DstReg.Index,
inputMapping,
- outputMapping
+ outputMapping,
+ NULL
);
fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask );
@@ -157,7 +186,8 @@ compile_instruction(
fullsrc->SrcRegister.File,
inst->SrcReg[i].Index,
inputMapping,
- outputMapping );
+ outputMapping,
+ immediateMapping);
for( j = 0; j < 4; j++ ) {
GLuint swz;
@@ -595,6 +625,10 @@ tgsi_translate_mesa_program(
struct tgsi_processor *processor;
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);
@@ -723,12 +757,30 @@ 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
+ = make_immediate(program->Parameters->ParameterValues[i],
+ program->Parameters->Parameters[i].Size);
+ ti += tgsi_build_full_immediate(&fullimm,
+ &tokens[ti],
+ header,
+ maxTokens - ti);
+ immediates[i] = numImmediates;
+ numImmediates++;
+ }
+ }
+#endif
+
for( i = 0; i < program->NumInstructions; i++ ) {
compile_instruction(
&program->Instructions[i],
&fullinst,
inputMapping,
outputMapping,
+ immediates,
preamble_size,
procType );