mesa: add basic support for 2D register arrays to mesa
authorZack Rusin <zackr@vmware.com>
Sat, 10 Jul 2010 01:19:28 +0000 (21:19 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 10 Jul 2010 01:19:28 +0000 (21:19 -0400)
just like in Gallium it's a basic functionality needed by a lot
of modern graphcis extensions

src/mesa/program/prog_instruction.h
src/mesa/program/prog_print.c
src/mesa/state_tracker/st_mesa_to_tgsi.c

index bc980c6a7f6e807565abc59cdeb29bf849a33ab9..cb5beb9b00d99452fbf9277b5e3dafd9eebaedd7 100644 (file)
@@ -271,6 +271,12 @@ struct prog_src_register
     * instruction which allows per-component negation.
     */
    GLuint Negate:4;
+
+   GLuint HasIndex2D:1;
+   GLuint RelAddr2D:1;
+   GLint Index2D:(INST_INDEX_BITS+1); /**< Extra bit here for sign bit.
+                                       * May be negative for relative
+                                       * addressing. */
 };
 
 
index 80c9203e31f2a2eea86242a7e5d93f870d17236e..876b2d46186dc3b0ee9ad3c55c0483d3ee9cabbe 100644 (file)
@@ -265,7 +265,8 @@ arb_output_attrib_string(GLint index, GLenum progType)
  */
 static const char *
 reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode,
-           GLboolean relAddr, const struct gl_program *prog)
+           GLboolean relAddr, const struct gl_program *prog,
+           GLboolean hasIndex2D, GLboolean relAddr2D, GLint index2D)
 {
    static char str[100];
    const char *addr = relAddr ? "ADDR+" : "";
@@ -275,6 +276,11 @@ reg_string(gl_register_file f, GLint index, gl_prog_print_mode mode,
    switch (mode) {
    case PROG_PRINT_DEBUG:
       sprintf(str, "%s[%s%d]", file_string(f, mode), addr, index);
+      if (hasIndex2D) {
+         int offset = strlen(str);
+         const char *addr2D = relAddr2D ? "ADDR+" : "";
+         sprintf(str+offset, "[%s%d]", addr2D, index2D);
+      }
       break;
 
    case PROG_PRINT_ARB:
@@ -478,7 +484,8 @@ fprint_dst_reg(FILE * f,
 {
    fprintf(f, "%s%s",
           reg_string((gl_register_file) dstReg->File,
-                     dstReg->Index, mode, dstReg->RelAddr, prog),
+                     dstReg->Index, mode, dstReg->RelAddr, prog,
+                      GL_FALSE, GL_FALSE, 0),
           _mesa_writemask_string(dstReg->WriteMask));
    
    if (dstReg->CondMask != COND_TR) {
@@ -508,7 +515,8 @@ fprint_src_reg(FILE *f,
    fprintf(f, "%s%s%s%s",
           abs,
           reg_string((gl_register_file) srcReg->File,
-                     srcReg->Index, mode, srcReg->RelAddr, prog),
+                     srcReg->Index, mode, srcReg->RelAddr, prog,
+                      srcReg->HasIndex2D, srcReg->RelAddr2D, srcReg->Index2D),
           _mesa_swizzle_string(srcReg->Swizzle,
                                srcReg->Negate, GL_FALSE),
           abs);
index fdf023d6ae39b674bf9207c2bfb29fcaa63dbb45..050b5d164d7c4787ffe0afa33b2f785d6b32720c 100644 (file)
@@ -330,6 +330,14 @@ translate_src( struct st_translate *t,
       }
    }
 
+   if (SrcReg->HasIndex2D) {
+      if (SrcReg->RelAddr2D)
+         src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]),
+                                            SrcReg->Index2D);
+      else
+         src = ureg_src_dimension( src, SrcReg->Index2D);
+   }
+
    return src;
 }