r300-gallium: vs: Use a tab to properly set up OVM.

This commit is contained in:
Corbin Simpson
2009-04-05 01:32:55 -07:00
parent 50ee103cf0
commit 84d76607ec
2 changed files with 17 additions and 44 deletions

View File

@@ -27,12 +27,18 @@ static void r300_vs_declare(struct r300_vs_asm* assembler,
{
switch (decl->Declaration.File) {
case TGSI_FILE_INPUT:
break;
case TGSI_FILE_OUTPUT:
switch (decl->Semantic.SemanticName) {
case TGSI_SEMANTIC_POSITION:
assembler->tab[decl->DeclarationRange.First] = 0;
break;
case TGSI_SEMANTIC_COLOR:
assembler->color_count++;
assembler->tab[decl->DeclarationRange.First] = 2;
break;
case TGSI_SEMANTIC_GENERIC:
assembler->tex_count++;
/* XXX multiple? */
assembler->tab[decl->DeclarationRange.First] = 6;
break;
default:
debug_printf("r300: vs: Bad semantic declaration %d\n",
@@ -40,7 +46,6 @@ static void r300_vs_declare(struct r300_vs_asm* assembler,
break;
}
break;
case TGSI_FILE_OUTPUT:
case TGSI_FILE_CONSTANT:
break;
case TGSI_FILE_TEMPORARY:
@@ -50,8 +55,6 @@ static void r300_vs_declare(struct r300_vs_asm* assembler,
debug_printf("r300: vs: Bad file %d\n", decl->Declaration.File);
break;
}
assembler->temp_offset = assembler->color_count + assembler->tex_count;
}
static INLINE unsigned r300_vs_src_type(struct r300_vs_asm* assembler,
@@ -88,46 +91,15 @@ static INLINE unsigned r300_vs_dst_type(struct r300_vs_asm* assembler,
return 0;
}
static INLINE unsigned r300_vs_src(struct r300_vs_asm* assembler,
struct tgsi_src_register* src)
{
switch (src->File) {
case TGSI_FILE_NULL:
return 0;
case TGSI_FILE_INPUT:
/* XXX may be wrong */
return src->Index;
break;
case TGSI_FILE_TEMPORARY:
return src->Index + assembler->temp_offset;
break;
case TGSI_FILE_IMMEDIATE:
return (src->Index + assembler->imm_offset) | (1 << 8);
break;
case TGSI_FILE_CONSTANT:
/* XXX magic */
return src->Index | (1 << 8);
break;
default:
debug_printf("r300: vs: Unimplemented src %d\n", src->File);
break;
}
return 0;
}
static INLINE unsigned r300_vs_dst(struct r300_vs_asm* assembler,
struct tgsi_dst_register* dst)
{
switch (dst->File) {
case TGSI_FILE_NULL:
/* This happens during KIL instructions. */
return 0;
case TGSI_FILE_TEMPORARY:
return dst->Index;
break;
case TGSI_FILE_OUTPUT:
return 0;
break;
case TGSI_FILE_TEMPORARY:
return dst->Index + assembler->temp_offset;
return assembler->tab[dst->Index];
break;
default:
debug_printf("r300: vs: Unimplemented dst %d\n", dst->File);
@@ -161,7 +133,7 @@ static void r300_vs_emit_inst(struct r300_vertex_shader* vs,
int i = vs->instruction_count;
vs->instructions[i].inst0 = R300_PVS_DST_OPCODE(R300_VE_ADD) |
R300_PVS_DST_REG_TYPE(r300_vs_dst_type(assembler, &dst->DstRegister)) |
R300_PVS_DST_OFFSET(dst->DstRegister.Index);
R300_PVS_DST_OFFSET(r300_vs_dst(assembler, &dst->DstRegister));
switch (count) {
case 3:
vs->instructions[i].inst3 =
@@ -265,6 +237,9 @@ void r300_translate_vertex_shader(struct r300_context* r300,
"%d from user and %d from immediates\n", consts->count,
consts->user_count, assembler->imm_count);
debug_printf("r300: vs: tab: %d %d %d %d\n", assembler->tab[0],
assembler->tab[1], assembler->tab[2], assembler->tab[3]);
tgsi_dump(vs->state.tokens);
/* XXX finish r300 vertex shader dumper */
r300_vs_dump(vs);

View File

@@ -87,10 +87,6 @@ struct r300_vs_asm {
unsigned color_count;
/* Number of texcoords. */
unsigned tex_count;
/* Offset for temporary registers. Inputs and temporaries have no
* distinguishing markings, so inputs start at 0 and the first usable
* temporary register is after all inputs. */
unsigned temp_offset;
/* Number of requested temporary registers. */
unsigned temp_count;
/* Offset for immediate constants. Neither R300 nor R500 can do four
@@ -99,6 +95,8 @@ struct r300_vs_asm {
unsigned imm_offset;
/* Number of immediate constants. */
unsigned imm_count;
/* Offsets into vertex output memory. */
unsigned tab[16];
};
static struct r300_vertex_shader r300_passthrough_vertex_shader = {