mesa: add basic support for 2D register arrays to mesa

just like in Gallium it's a basic functionality needed by a lot
of modern graphcis extensions
This commit is contained in:
Zack Rusin
2010-07-09 21:19:28 -04:00
parent 308f52d573
commit b4855288e4
3 changed files with 25 additions and 3 deletions
+6
View 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. */
};
+11 -3
View 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);
+8
View 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;
}