\r
return decl;\r
}\r
-\r
-\r
-static struct tgsi_full_declaration\r
-make_temp_decl(GLuint index)\r
-{\r
- struct tgsi_full_declaration decl;\r
- decl = tgsi_default_full_declaration();\r
- decl.Declaration.File = TGSI_FILE_TEMPORARY;\r
- decl.Declaration.Declare = TGSI_DECLARE_RANGE;\r
- decl.u.DeclarationRange.First = index;\r
- decl.u.DeclarationRange.Last = index;\r
- return decl;\r
-}\r
-\r
+
+
+static struct tgsi_full_declaration
+make_temp_decl(
+ GLuint start_index,
+ GLuint end_index )
+{
+ struct tgsi_full_declaration decl;
+ decl = tgsi_default_full_declaration();
+ decl.Declaration.File = TGSI_FILE_TEMPORARY;
+ decl.Declaration.Declare = TGSI_DECLARE_RANGE;
+ decl.u.DeclarationRange.First = start_index;
+ decl.u.DeclarationRange.Last = end_index;
+ return decl;
+}
+
\r
/**\r
* Find the temporaries which are used in the given program.\r
- * Put the indices of the temporaries in 'tempsUsed'.\r
- * \return number of temporaries used\r
- */\r
-static GLuint\r
-find_temporaries(const struct gl_program *program,\r
- GLuint tempsUsed[MAX_PROGRAM_TEMPS])\r
-{\r
- GLuint i, j, count;\r
-\r
- for (i = 0; i < MAX_PROGRAM_TEMPS; i++)\r
- tempsUsed[i] = GL_FALSE;\r
+ * Put the indices of the temporaries in 'tempsUsed'.
+ * \return number of temporaries used
+ */
+static void
+find_temporaries(const struct gl_program *program,
+ GLboolean tempsUsed[MAX_PROGRAM_TEMPS])
+{
+ GLuint i, j;
+
+ for (i = 0; i < MAX_PROGRAM_TEMPS; i++)
+ tempsUsed[i] = GL_FALSE;
\r
for (i = 0; i < program->NumInstructions; i++) {\r
const struct prog_instruction *inst = program->Instructions + i;\r
if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)\r
tempsUsed[inst->SrcReg[j].Index] = GL_TRUE;\r
if (inst->DstReg.File == PROGRAM_TEMPORARY)\r
- tempsUsed[inst->DstReg.Index] = GL_TRUE;\r
- }\r
- }\r
-\r
- /* convert flags to list of indices */\r
- count = 0;\r
- for (i = 0; i < MAX_PROGRAM_TEMPS; i++) {\r
- if (tempsUsed[i])\r
- tempsUsed[count++] = i;\r
- }\r
- return count;\r
-}\r
-\r
-\r
+ tempsUsed[inst->DstReg.Index] = GL_TRUE;
+ }
+ }
+}
+
+
\r
\r
/**\r
maxTokens - ti );\r
}\r
}\r
-\r
- /* temporary decls */\r
- {\r
- GLuint tempsUsed[MAX_PROGRAM_TEMPS];\r
- uint numTemps = find_temporaries(program, tempsUsed);\r
- for (i = 0; i < numTemps; i++) {\r
- struct tgsi_full_declaration fulldecl;\r
- fulldecl = make_temp_decl(tempsUsed[i]);\r
- ti += tgsi_build_full_declaration(\r
- &fulldecl,\r
- &tokens[ti],\r
- header,\r
- maxTokens - ti );\r
- }\r
- }\r
-\r
+
+ /* temporary decls */
+ {
+ GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1];
+ GLboolean inside_range = GL_FALSE;
+ GLuint start_range;
+
+ find_temporaries(program, tempsUsed);
+ tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE;
+ for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) {
+ if (tempsUsed[i] && !inside_range) {
+ inside_range = GL_TRUE;
+ start_range = i;
+ }
+ else if (!tempsUsed[i] && inside_range) {
+ struct tgsi_full_declaration fulldecl;
+
+ inside_range = GL_FALSE;
+ fulldecl = make_temp_decl( start_range, i - 1 );
+ ti += tgsi_build_full_declaration(
+ &fulldecl,
+ &tokens[ti],
+ header,
+ maxTokens - ti );
+ }
+ }
+ }
+
/* immediates/literals */\r
#if EMIT_IMMEDIATES\r
for (i = 0; i < program->Parameters->NumParameters; i++) {\r