Mesa (master): ARB prog parser: new set_src_reg(), set_dst_reg() helpers

Brian Paul brianp at kemper.freedesktop.org
Sat Oct 31 01:11:19 UTC 2009


Module: Mesa
Branch: master
Commit: df5615de1f1bfc68417eb2a6381fe3d8ab9ac035
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=df5615de1f1bfc68417eb2a6381fe3d8ab9ac035

Author: Brian Paul <brianp at vmware.com>
Date:   Fri Oct 30 19:05:50 2009 -0600

ARB prog parser: new set_src_reg(), set_dst_reg() helpers

These functions do sanity checks on the register file and index.

---

 src/mesa/shader/program_parse.y |   83 ++++++++++++++++++++++++++-------------
 1 files changed, 55 insertions(+), 28 deletions(-)

diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y
index 20bde83..32b0584 100644
--- a/src/mesa/shader/program_parse.y
+++ b/src/mesa/shader/program_parse.y
@@ -66,8 +66,14 @@ static int validate_inputs(struct YYLTYPE *locp,
 
 static void init_dst_reg(struct prog_dst_register *r);
 
+static void set_dst_reg(struct prog_dst_register *r,
+                        gl_register_file file, GLint index);
+
 static void init_src_reg(struct asm_src_register *r);
 
+static void set_src_reg(struct asm_src_register *r,
+                        gl_register_file file, GLint index);
+
 static void asm_instruction_set_operands(struct asm_instruction *inst,
     const struct prog_dst_register *dst, const struct asm_src_register *src0,
     const struct asm_src_register *src1, const struct asm_src_register *src2);
@@ -580,9 +586,7 @@ scalarUse:  srcReg scalarSuffix
 	   temp_sym.param_binding_begin = ~0;
 	   initialize_symbol_from_const(state->prog, & temp_sym, & $1);
 
-	   init_src_reg(& $$);
-	   $$.Base.File = PROGRAM_CONSTANT;
-	   $$.Base.Index = temp_sym.param_binding_begin;
+	   set_src_reg(& $$, PROGRAM_CONSTANT, temp_sym.param_binding_begin);
 	}
 	;
 
@@ -644,9 +648,7 @@ maskedDstReg: dstReg optionalMask optionalCcMask
 
 maskedAddrReg: addrReg addrWriteMask
 	{
-	   init_dst_reg(& $$);
-	   $$.File = PROGRAM_ADDRESS;
-	   $$.Index = 0;
+	   set_dst_reg(& $$, PROGRAM_ADDRESS, 0);
 	   $$.WriteMask = $2.mask;
 	}
 	;
@@ -776,16 +778,13 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
 	   init_src_reg(& $$);
 	   switch (s->type) {
 	   case at_temp:
-	      $$.Base.File = PROGRAM_TEMPORARY;
-	      $$.Base.Index = s->temp_binding;
+	      set_src_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
 	      break;
 	   case at_param:
-	      $$.Base.File = s->param_binding_type;
-	      $$.Base.Index = s->param_binding_begin;
+	      set_src_reg(& $$, s->param_binding_type, s->param_binding_begin);
 	      break;
 	   case at_attrib:
-	      $$.Base.File = PROGRAM_INPUT;
-	      $$.Base.Index = s->attrib_binding;
+	      set_src_reg(& $$, PROGRAM_INPUT, s->attrib_binding);
 	      state->prog->InputsRead |= (1U << $$.Base.Index);
 
 	      if (!validate_inputs(& @1, state)) {
@@ -800,9 +799,7 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
 	}
 	| attribBinding
 	{
-	   init_src_reg(& $$);
-	   $$.Base.File = PROGRAM_INPUT;
-	   $$.Base.Index = $1;
+	   set_src_reg(& $$, PROGRAM_INPUT, $1);
 	   state->prog->InputsRead |= (1U << $$.Base.Index);
 
 	   if (!validate_inputs(& @1, state)) {
@@ -832,19 +829,16 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
 	}
 	| paramSingleItemUse
 	{
-	   init_src_reg(& $$);
-	   $$.Base.File = ($1.name != NULL) 
+           gl_register_file file = ($1.name != NULL) 
 	      ? $1.param_binding_type
 	      : PROGRAM_CONSTANT;
-	   $$.Base.Index = $1.param_binding_begin;
+	   set_src_reg(& $$, file, $1.param_binding_begin);
 	}
 	;
 
 dstReg: resultBinding
 	{
-	   init_dst_reg(& $$);
-	   $$.File = PROGRAM_OUTPUT;
-	   $$.Index = $1;
+	   set_dst_reg(& $$, PROGRAM_OUTPUT, $1);
 	}
 	| USED_IDENTIFIER /* temporaryReg | vertexResultReg */
 	{
@@ -859,19 +853,15 @@ dstReg: resultBinding
 	      YYERROR;
 	   }
 
-	   init_dst_reg(& $$);
 	   switch (s->type) {
 	   case at_temp:
-	      $$.File = PROGRAM_TEMPORARY;
-	      $$.Index = s->temp_binding;
+	      set_dst_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
 	      break;
 	   case at_output:
-	      $$.File = PROGRAM_OUTPUT;
-	      $$.Index = s->output_binding;
+	      set_dst_reg(& $$, PROGRAM_OUTPUT, s->output_binding);
 	      break;
 	   default:
-	      $$.File = s->param_binding_type;
-	      $$.Index = s->param_binding_begin;
+	      set_dst_reg(& $$, s->param_binding_type, s->param_binding_begin);
 	      break;
 	   }
 	}
@@ -2263,6 +2253,26 @@ init_dst_reg(struct prog_dst_register *r)
 }
 
 
+/** Like init_dst_reg() but set the File and Index fields. */
+void
+set_dst_reg(struct prog_dst_register *r, gl_register_file file, GLint index)
+{
+   const GLint maxIndex = 1 << INST_INDEX_BITS;
+   const GLint minIndex = 0;
+   ASSERT(index >= minIndex);
+   ASSERT(index <= maxIndex);
+   ASSERT(file == PROGRAM_TEMPORARY ||
+	  file == PROGRAM_ADDRESS ||
+	  file == PROGRAM_OUTPUT);
+   memset(r, 0, sizeof(*r));
+   r->File = file;
+   r->Index = index;
+   r->WriteMask = WRITEMASK_XYZW;
+   r->CondMask = COND_TR;
+   r->CondSwizzle = SWIZZLE_NOOP;
+}
+
+
 void
 init_src_reg(struct asm_src_register *r)
 {
@@ -2273,6 +2283,23 @@ init_src_reg(struct asm_src_register *r)
 }
 
 
+/** Like init_src_reg() but set the File and Index fields. */
+void
+set_src_reg(struct asm_src_register *r, gl_register_file file, GLint index)
+{
+   const GLint maxIndex = (1 << INST_INDEX_BITS) - 1;
+   const GLint minIndex = -(1 << INST_INDEX_BITS);
+   ASSERT(index >= minIndex);
+   ASSERT(index <= maxIndex);
+   ASSERT(file < PROGRAM_FILE_MAX);
+   memset(r, 0, sizeof(*r));
+   r->Base.File = file;
+   r->Base.Index = index;
+   r->Base.Swizzle = SWIZZLE_NOOP;
+   r->Symbol = NULL;
+}
+
+
 /**
  * Validate the set of inputs used by a program
  *




More information about the mesa-commit mailing list