/* Convert info about VS output semantics into r300_shader_semantics. */ static void r300_shader_read_vs_outputs( struct tgsi_shader_info* info, struct r300_shader_semantics* vs_outputs) { int i; unsigned index; r300_shader_semantics_reset(vs_outputs); for (i = 0; i < info->num_outputs; i++) { index = info->output_semantic_index[i]; switch (info->output_semantic_name[i]) { case TGSI_SEMANTIC_POSITION: assert(index == 0); vs_outputs->pos = i; break; case TGSI_SEMANTIC_PSIZE: assert(index == 0); vs_outputs->psize = i; break; case TGSI_SEMANTIC_COLOR: assert(index < ATTR_COLOR_COUNT); vs_outputs->color[index] = i; break; case TGSI_SEMANTIC_BCOLOR: assert(index < ATTR_COLOR_COUNT); vs_outputs->bcolor[index] = i; break; case TGSI_SEMANTIC_GENERIC: assert(index < ATTR_GENERIC_COUNT); vs_outputs->generic[index] = i; break; case TGSI_SEMANTIC_FOG: assert(index == 0); vs_outputs->fog = i; break; case TGSI_SEMANTIC_EDGEFLAG: assert(index == 0); fprintf(stderr, "r300 VP: cannot handle edgeflag output\n"); assert(0); break; default: assert(0); } } }
/* Convert info about FS input semantics to r300_shader_semantics. */ void r300_shader_read_fs_inputs(struct tgsi_shader_info* info, struct r300_shader_semantics* fs_inputs) { int i; unsigned index; r300_shader_semantics_reset(fs_inputs); for (i = 0; i < info->num_inputs; i++) { index = info->input_semantic_index[i]; switch (info->input_semantic_name[i]) { case TGSI_SEMANTIC_COLOR: assert(index < ATTR_COLOR_COUNT); fs_inputs->color[index] = i; break; case TGSI_SEMANTIC_GENERIC: assert(index < ATTR_GENERIC_COUNT); fs_inputs->generic[index] = i; break; case TGSI_SEMANTIC_FOG: assert(index == 0); fs_inputs->fog = i; break; case TGSI_SEMANTIC_POSITION: assert(index == 0); fs_inputs->wpos = i; break; case TGSI_SEMANTIC_FACE: assert(index == 0); fs_inputs->face = i; break; default: fprintf(stderr, "r300: FP: Unknown input semantic: %i\n", info->input_semantic_name[i]); } } }
/* Convert info about VS output semantics into r300_shader_semantics. */ static void r300_shader_read_vs_outputs( struct r300_context *r300, struct tgsi_shader_info* info, struct r300_shader_semantics* vs_outputs) { int i; unsigned index; r300_shader_semantics_reset(vs_outputs); for (i = 0; i < info->num_outputs; i++) { index = info->output_semantic_index[i]; switch (info->output_semantic_name[i]) { case TGSI_SEMANTIC_POSITION: assert(index == 0); vs_outputs->pos = i; break; case TGSI_SEMANTIC_PSIZE: assert(index == 0); vs_outputs->psize = i; break; case TGSI_SEMANTIC_COLOR: assert(index < ATTR_COLOR_COUNT); vs_outputs->color[index] = i; break; case TGSI_SEMANTIC_BCOLOR: assert(index < ATTR_COLOR_COUNT); vs_outputs->bcolor[index] = i; break; case TGSI_SEMANTIC_GENERIC: assert(index < ATTR_GENERIC_COUNT); vs_outputs->generic[index] = i; vs_outputs->num_generic++; break; case TGSI_SEMANTIC_FOG: assert(index == 0); vs_outputs->fog = i; break; case TGSI_SEMANTIC_EDGEFLAG: assert(index == 0); fprintf(stderr, "r300 VP: cannot handle edgeflag output.\n"); break; case TGSI_SEMANTIC_CLIPVERTEX: assert(index == 0); /* Draw does clip vertex for us. */ if (r300->screen->caps.has_tcl) { fprintf(stderr, "r300 VP: cannot handle clip vertex output.\n"); } break; default: fprintf(stderr, "r300 VP: unknown vertex output semantic: %i.\n", info->output_semantic_name[i]); } } /* WPOS is a straight copy of POSITION and it's always emitted. */ vs_outputs->wpos = i; }