diff options
author | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-02-26 21:25:06 -0800 |
---|---|---|
committer | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-02-27 10:19:22 -0800 |
commit | 65021162a494cfffd6b0d50d3e93fb1082e90332 (patch) | |
tree | 60573ba246de4d7398b3c5e53dd46ed2ed6d61cc /src/gallium/drivers/r300/r300_state_derived.c | |
parent | 17c7852bf93c4d4edf0c2cf0bdc553d399e2f51a (diff) |
r300-gallium: A handful of tiny vfmt fixups.
Using a tab of inputs should work, but I keep getting bad results.
If only Rawhide's GDB wasn't broken...
Diffstat (limited to 'src/gallium/drivers/r300/r300_state_derived.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_state_derived.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c index a51904096f..4284a955ab 100644 --- a/src/gallium/drivers/r300/r300_state_derived.c +++ b/src/gallium/drivers/r300/r300_state_derived.c @@ -57,34 +57,39 @@ static uint32_t translate_vertex_data_type(int type) { /* XXX this function should be able to handle vert shaders as well as draw */ static void r300_update_vertex_layout(struct r300_context* r300) { + struct r300_vertex_format vformat; struct vertex_info vinfo; boolean pos = false, psize = false, fog = false; int i, texs = 0, cols = 0; + int tab[16]; struct tgsi_shader_info* info = &r300->fs->info; + memset(&vinfo, 0, sizeof(vinfo)); + for (i = 0; i < 16; i++) { + tab[i] = -1; + } assert(info->num_inputs <= 16); - /* This is rather lame. Since draw_find_vs_output doesn't return an error - * when it can't find an output, we have to pre-iterate and count each - * output ourselves. */ for (i = 0; i < info->num_inputs; i++) { switch (info->input_semantic_name[i]) { case TGSI_SEMANTIC_POSITION: pos = true; + tab[i] = 0; break; case TGSI_SEMANTIC_COLOR: - cols++; + tab[i] = 2 + cols++; break; case TGSI_SEMANTIC_FOG: fog = true; break; case TGSI_SEMANTIC_PSIZE: psize = true; + tab[i] = 1; break; case TGSI_SEMANTIC_GENERIC: - texs++; + tab[i] = 6 + texs++; break; default: debug_printf("r300: Unknown vertex input %d\n", @@ -105,6 +110,7 @@ static void r300_update_vertex_layout(struct r300_context* r300) if (!pos) { debug_printf("r300: Forcing vertex position attribute emit...\n"); + tab[0] = 0; } draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_POS, @@ -152,18 +158,19 @@ static void r300_update_vertex_layout(struct r300_context* r300) (0xf << R300_WRITE_ENA_SHIFT)) for (i = 0; i < vinfo.num_attribs; i++) { + /* Make sure we have a proper destination for our attribute */ + //assert(tab[i] != -1); + temp = translate_vertex_data_type(vinfo.attrib[i].emit) | - R300_SIGNED; + (tab[i] << R300_DST_VEC_LOC_SHIFT) | R300_SIGNED; if (i & 1) { r300->vertex_info.vap_prog_stream_cntl[i >> 1] &= 0xffff0000; r300->vertex_info.vap_prog_stream_cntl[i >> 1] |= - (translate_vertex_data_type(vinfo.attrib[i].emit) | - R300_SIGNED) << 16; + temp << 16; } else { r300->vertex_info.vap_prog_stream_cntl[i >> 1] &= 0xffff; r300->vertex_info.vap_prog_stream_cntl[i >> 1] |= - translate_vertex_data_type(vinfo.attrib[i].emit) | - R300_SIGNED; + temp; } r300->vertex_info.vap_prog_stream_cntl_ext[i >> 1] |= @@ -180,7 +187,7 @@ static void r300_update_vertex_layout(struct r300_context* r300) /* Set up the RS block. This is the part of the chipset that actually does * the rasterization of vertices into fragments. This is also the part of the * chipset that locks up if any part of it is even slightly wrong. */ -void r300_update_rs_block(struct r300_context* r300) +static void r300_update_rs_block(struct r300_context* r300) { } |