mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-01 14:00:16 +01:00
Clean-up the TGSI_SEMANTIC tokens, introduce semantic indexes.
Still need to produce decl instructions for vertex shaders...
This commit is contained in:
parent
478d1e2c9c
commit
f69b5c56fe
13 changed files with 191 additions and 122 deletions
|
|
@ -94,7 +94,8 @@ run_vertex_program(struct draw_context *draw,
|
|||
const float *trans = draw->viewport.translate;
|
||||
|
||||
assert(count <= 4);
|
||||
assert(draw->vertex_shader.output_semantics[0] == TGSI_SEMANTIC_POSITION);
|
||||
assert(draw->vertex_shader.output_semantic_name[0]
|
||||
== TGSI_SEMANTIC_POSITION);
|
||||
|
||||
#ifdef DEBUG
|
||||
memset( &machine, 0, sizeof( machine ) );
|
||||
|
|
|
|||
|
|
@ -51,7 +51,8 @@ struct i915_fp_compile {
|
|||
uint declarations[I915_PROGRAM_SIZE];
|
||||
uint program[I915_PROGRAM_SIZE];
|
||||
|
||||
uint input_semantic[PIPE_MAX_SHADER_INPUTS];
|
||||
uint input_semantic_name[PIPE_MAX_SHADER_INPUTS];
|
||||
uint input_semantic_index[PIPE_MAX_SHADER_INPUTS];
|
||||
|
||||
/** points into the i915->current.constants array: */
|
||||
float (*constants)[4];
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ src_vector(struct i915_fp_compile *p,
|
|||
const struct tgsi_full_src_register *source)
|
||||
{
|
||||
uint index = source->SrcRegister.Index;
|
||||
uint src, sem;
|
||||
uint src, sem_name, sem_ind;
|
||||
|
||||
switch (source->SrcRegister.File) {
|
||||
case TGSI_FILE_TEMPORARY:
|
||||
|
|
@ -152,10 +152,11 @@ src_vector(struct i915_fp_compile *p,
|
|||
/* use vertex format info to map a slot number to a VF attrib */
|
||||
assert(index < p->vertex_info->num_attribs);
|
||||
|
||||
sem = p->input_semantic[index];
|
||||
sem_name = p->input_semantic_name[index];
|
||||
sem_ind = p->input_semantic_index[index];
|
||||
|
||||
#if 1
|
||||
switch (sem) {
|
||||
switch (sem_name) {
|
||||
case TGSI_SEMANTIC_POSITION:
|
||||
printf("SKIP SEM POS\n");
|
||||
/*
|
||||
|
|
@ -163,28 +164,23 @@ src_vector(struct i915_fp_compile *p,
|
|||
src = i915_emit_decl(p, REG_TYPE_T, p->wpos_tex, D0_CHANNEL_ALL);
|
||||
*/
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR0:
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL);
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR1:
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ);
|
||||
src = swizzle(src, X, Y, Z, ONE);
|
||||
case TGSI_SEMANTIC_COLOR:
|
||||
if (sem_ind == 0) {
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_DIFFUSE, D0_CHANNEL_ALL);
|
||||
}
|
||||
else {
|
||||
/* secondary color */
|
||||
assert(sem_ind == 1);
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_SPECULAR, D0_CHANNEL_XYZ);
|
||||
src = swizzle(src, X, Y, Z, ONE);
|
||||
}
|
||||
break;
|
||||
case TGSI_SEMANTIC_FOG:
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_FOG_W, D0_CHANNEL_W);
|
||||
src = swizzle(src, W, W, W, W);
|
||||
break;
|
||||
case TGSI_SEMANTIC_TEX0:
|
||||
case TGSI_SEMANTIC_TEX1:
|
||||
case TGSI_SEMANTIC_TEX2:
|
||||
case TGSI_SEMANTIC_TEX3:
|
||||
case TGSI_SEMANTIC_TEX4:
|
||||
case TGSI_SEMANTIC_TEX5:
|
||||
case TGSI_SEMANTIC_TEX6:
|
||||
case TGSI_SEMANTIC_TEX7:
|
||||
src = i915_emit_decl(p, REG_TYPE_T,
|
||||
T_TEX0 + (sem - TGSI_SEMANTIC_TEX0),
|
||||
D0_CHANNEL_ALL);
|
||||
case TGSI_SEMANTIC_TEXCOORD:
|
||||
src = i915_emit_decl(p, REG_TYPE_T, T_TEX0 + sem_ind, D0_CHANNEL_ALL);
|
||||
break;
|
||||
default:
|
||||
i915_program_error(p, "Bad source->Index");
|
||||
|
|
@ -895,11 +891,13 @@ i915_translate_instructions(struct i915_fp_compile *p,
|
|||
if (parse.FullToken.FullDeclaration.Declaration.File
|
||||
== TGSI_FILE_INPUT) {
|
||||
/* save input register info for use in src_vector() */
|
||||
uint ind, sem;
|
||||
uint ind, sem, semi;
|
||||
ind = parse.FullToken.FullDeclaration.u.DeclarationRange.First;
|
||||
sem = parse.FullToken.FullDeclaration.Semantic.SemanticName;
|
||||
semi = parse.FullToken.FullDeclaration.Semantic.SemanticIndex;
|
||||
/*printf("FS Input DECL [%u] sem %u\n", ind, sem);*/
|
||||
p->input_semantic[ind] = sem;
|
||||
p->input_semantic_name[ind] = sem;
|
||||
p->input_semantic_index[ind] = semi;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1059,7 +1057,7 @@ i915_find_wpos_space(struct i915_fp_compile *p)
|
|||
i915_program_error(p, "No free texcoord for wpos value");
|
||||
}
|
||||
#else
|
||||
if (p->shader->input_semantics[0] == TGSI_SEMANTIC_POSITION) {
|
||||
if (p->shader->input_semantic_name[0] == TGSI_SEMANTIC_POSITION) {
|
||||
/* frag shader using the fragment position input */
|
||||
#if 0
|
||||
assert(0);
|
||||
|
|
@ -1079,8 +1077,8 @@ i915_find_wpos_space(struct i915_fp_compile *p)
|
|||
static void
|
||||
i915_fixup_depth_write(struct i915_fp_compile *p)
|
||||
{
|
||||
/* XXX assuming depth is always in output[0] */
|
||||
if (p->shader->output_semantics[0] == TGSI_SEMANTIC_DEPTH) {
|
||||
/* XXX assuming pos/depth is always in output[0] */
|
||||
if (p->shader->output_semantic_name[0] == TGSI_SEMANTIC_POSITION) {
|
||||
const uint depth = UREG(REG_TYPE_OD, 0);
|
||||
|
||||
i915_emit_arith(p,
|
||||
|
|
|
|||
|
|
@ -59,28 +59,24 @@ static void calculate_vertex_layout( struct i915_context *i915 )
|
|||
/* Note: we'll set the S4_VFMT_XYZ[W] bits below */
|
||||
|
||||
for (i = 0; i < fs->num_inputs; i++) {
|
||||
switch (fs->input_semantics[i]) {
|
||||
switch (fs->input_semantic_name[i]) {
|
||||
case TGSI_SEMANTIC_POSITION:
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR0:
|
||||
front0 = draw_emit_vertex_attr(vinfo, FORMAT_4UB, colorInterp);
|
||||
vinfo->hwfmt[0] |= S4_VFMT_COLOR;
|
||||
case TGSI_SEMANTIC_COLOR:
|
||||
if (fs->input_semantic_index[i] == 0) {
|
||||
front0 = draw_emit_vertex_attr(vinfo, FORMAT_4UB, colorInterp);
|
||||
vinfo->hwfmt[0] |= S4_VFMT_COLOR;
|
||||
}
|
||||
else {
|
||||
assert(fs->input_semantic_index[i] == 1);
|
||||
assert(0); /* untested */
|
||||
front1 = draw_emit_vertex_attr(vinfo, FORMAT_4UB, colorInterp);
|
||||
vinfo->hwfmt[0] |= S4_VFMT_SPEC_FOG;
|
||||
}
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR1:
|
||||
assert(0); /* untested */
|
||||
front1 = draw_emit_vertex_attr(vinfo, FORMAT_4UB, colorInterp);
|
||||
vinfo->hwfmt[0] |= S4_VFMT_SPEC_FOG;
|
||||
break;
|
||||
case TGSI_SEMANTIC_TEX0:
|
||||
case TGSI_SEMANTIC_TEX1:
|
||||
case TGSI_SEMANTIC_TEX2:
|
||||
case TGSI_SEMANTIC_TEX3:
|
||||
case TGSI_SEMANTIC_TEX4:
|
||||
case TGSI_SEMANTIC_TEX5:
|
||||
case TGSI_SEMANTIC_TEX6:
|
||||
case TGSI_SEMANTIC_TEX7:
|
||||
case TGSI_SEMANTIC_TEXCOORD:
|
||||
{
|
||||
const uint unit = fs->input_semantics[i] - TGSI_SEMANTIC_TEX0;
|
||||
const uint unit = fs->input_semantic_index[i];
|
||||
uint hwtc;
|
||||
texCoords[unit] = TRUE;
|
||||
draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE);
|
||||
|
|
|
|||
|
|
@ -148,8 +148,12 @@ struct pipe_shader_state {
|
|||
/** These fields somewhat constitute the shader "signature" */
|
||||
ubyte num_inputs;
|
||||
ubyte num_outputs;
|
||||
ubyte input_semantics[PIPE_MAX_SHADER_INPUTS];
|
||||
ubyte output_semantics[PIPE_MAX_SHADER_OUTPUTS];
|
||||
|
||||
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
|
||||
ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
|
||||
|
||||
ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
|
||||
ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
|
||||
};
|
||||
|
||||
struct pipe_depth_stencil_state
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
|||
draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_LINEAR);
|
||||
|
||||
for (i = 0; i < fs->num_inputs; i++) {
|
||||
switch (fs->input_semantics[i]) {
|
||||
switch (fs->input_semantic_name[i]) {
|
||||
case TGSI_SEMANTIC_POSITION:
|
||||
/* Need Z if depth test is enabled or the fragment program uses the
|
||||
* fragment position (XYZW).
|
||||
|
|
@ -73,13 +73,16 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
|||
softpipe->need_z = TRUE;
|
||||
softpipe->need_w = TRUE;
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR0:
|
||||
front0 = draw_emit_vertex_attr(vinfo,
|
||||
FORMAT_4F, colorInterp);
|
||||
break;
|
||||
case TGSI_SEMANTIC_COLOR1:
|
||||
front1 = draw_emit_vertex_attr(vinfo,
|
||||
FORMAT_4F, colorInterp);
|
||||
case TGSI_SEMANTIC_COLOR:
|
||||
if (fs->input_semantic_index[i] == 0) {
|
||||
front0 = draw_emit_vertex_attr(vinfo,
|
||||
FORMAT_4F, colorInterp);
|
||||
}
|
||||
else {
|
||||
assert(fs->input_semantic_index[i] == 1);
|
||||
front1 = draw_emit_vertex_attr(vinfo,
|
||||
FORMAT_4F, colorInterp);
|
||||
}
|
||||
break;
|
||||
case TGSI_SEMANTIC_FOG:
|
||||
draw_emit_vertex_attr(vinfo,
|
||||
|
|
@ -96,12 +99,13 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
|||
#endif
|
||||
softpipe->psize_slot = i;
|
||||
/*case TGSI_SEMANTIC_TEXCOORD:*/
|
||||
case TGSI_SEMANTIC_TEX0:
|
||||
case TGSI_SEMANTIC_TEXCOORD:
|
||||
/* unit = fs->input_semantic_index[i] */
|
||||
draw_emit_vertex_attr(vinfo,
|
||||
FORMAT_4F, INTERP_PERSPECTIVE);
|
||||
softpipe->need_w = TRUE;
|
||||
break;
|
||||
case TGSI_SEMANTIC_OTHER:
|
||||
case TGSI_SEMANTIC_GENERIC:
|
||||
draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE);
|
||||
softpipe->need_w = TRUE;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ tgsi_default_declaration_semantic( void )
|
|||
{
|
||||
struct tgsi_declaration_semantic ds;
|
||||
|
||||
ds.SemanticName = TGSI_SEMANTIC_DEPTH;
|
||||
ds.SemanticName = TGSI_SEMANTIC_POSITION;
|
||||
ds.SemanticIndex = 0;
|
||||
ds.Padding = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -201,28 +201,22 @@ static const char *TGSI_INTERPOLATES_SHORT[] =
|
|||
|
||||
static const char *TGSI_SEMANTICS[] =
|
||||
{
|
||||
"SEMANTIC_DEPTH",
|
||||
"SEMANTIC_COLOR0",
|
||||
"SEMANTIC_COLOR1",
|
||||
"SEMANTIC_COLOR0B",
|
||||
"SEMANTIC_COLOR1B",
|
||||
"SEMANTIC_POSITION",
|
||||
"SEMANTIC_COLOR",
|
||||
"SEMANTIC_BCOLOR",
|
||||
"SEMANTIC_FOG",
|
||||
"SEMANTIC_OTHER,"
|
||||
"SEMANTIC_TEX0",
|
||||
"SEMANTIC_TEXCOORD",
|
||||
"SEMANTIC_GENERIC,"
|
||||
};
|
||||
|
||||
static const char *TGSI_SEMANTICS_SHORT[] =
|
||||
{
|
||||
"DEPTH",
|
||||
"COLOR0",
|
||||
"COLOR1",
|
||||
"COLOR0B",
|
||||
"COLOR1B",
|
||||
"POSITION",
|
||||
"COLOR",
|
||||
"BCOLOR",
|
||||
"FOG",
|
||||
"OTHER",
|
||||
"TEX0"
|
||||
"TEXCOORD",
|
||||
"GENERIC",
|
||||
};
|
||||
|
||||
static const char *TGSI_IMMS[] =
|
||||
|
|
|
|||
|
|
@ -103,23 +103,13 @@ struct tgsi_declaration_interpolation
|
|||
unsigned Padding : 28;
|
||||
};
|
||||
|
||||
#define TGSI_SEMANTIC_DEPTH 0
|
||||
#define TGSI_SEMANTIC_COLOR0 1
|
||||
#define TGSI_SEMANTIC_COLOR1 2
|
||||
#define TGSI_SEMANTIC_COLOR0B 3 /**< back-face primary color */
|
||||
#define TGSI_SEMANTIC_COLOR1B 4 /**< back-face secondary color */
|
||||
#define TGSI_SEMANTIC_POSITION 5
|
||||
#define TGSI_SEMANTIC_FOG 6
|
||||
#define TGSI_SEMANTIC_OTHER 7 /* XXX temp */
|
||||
#define TGSI_SEMANTIC_TEX0 8
|
||||
#define TGSI_SEMANTIC_TEX1 9
|
||||
#define TGSI_SEMANTIC_TEX2 10
|
||||
#define TGSI_SEMANTIC_TEX3 11
|
||||
#define TGSI_SEMANTIC_TEX4 12
|
||||
#define TGSI_SEMANTIC_TEX5 13
|
||||
#define TGSI_SEMANTIC_TEX6 14
|
||||
#define TGSI_SEMANTIC_TEX7 15
|
||||
#define TGSI_SEMANTIC_COUNT 16 /**< number of semantic values */
|
||||
#define TGSI_SEMANTIC_POSITION 0
|
||||
#define TGSI_SEMANTIC_COLOR 1
|
||||
#define TGSI_SEMANTIC_BCOLOR 2 /**< back-face color */
|
||||
#define TGSI_SEMANTIC_FOG 3
|
||||
#define TGSI_SEMANTIC_TEXCOORD 4
|
||||
#define TGSI_SEMANTIC_GENERIC 5
|
||||
#define TGSI_SEMANTIC_COUNT 6 /**< number of semantic values */
|
||||
|
||||
struct tgsi_declaration_semantic
|
||||
{
|
||||
|
|
|
|||
|
|
@ -473,7 +473,8 @@ make_frag_input_decl(
|
|||
GLuint index,
|
||||
GLuint interpolate,
|
||||
GLuint usage_mask,
|
||||
GLuint semantic_name )
|
||||
GLuint semantic_name,
|
||||
GLuint semantic_index )
|
||||
{
|
||||
struct tgsi_full_declaration decl;
|
||||
|
||||
|
|
@ -486,6 +487,7 @@ make_frag_input_decl(
|
|||
decl.u.DeclarationRange.First = index;
|
||||
decl.u.DeclarationRange.Last = index;
|
||||
decl.Semantic.SemanticName = semantic_name;
|
||||
decl.Semantic.SemanticIndex = semantic_index;
|
||||
decl.Interpolation.Interpolate = interpolate;
|
||||
|
||||
return decl;
|
||||
|
|
@ -495,6 +497,7 @@ static struct tgsi_full_declaration
|
|||
make_frag_output_decl(
|
||||
GLuint index,
|
||||
GLuint semantic_name,
|
||||
GLuint semantic_index,
|
||||
GLuint usage_mask )
|
||||
{
|
||||
struct tgsi_full_declaration decl;
|
||||
|
|
@ -507,7 +510,7 @@ make_frag_output_decl(
|
|||
decl.u.DeclarationRange.First = index;
|
||||
decl.u.DeclarationRange.Last = index;
|
||||
decl.Semantic.SemanticName = semantic_name;
|
||||
decl.Semantic.SemanticIndex = 0;
|
||||
decl.Semantic.SemanticIndex = semantic_index;
|
||||
|
||||
return decl;
|
||||
}
|
||||
|
|
@ -528,7 +531,8 @@ tgsi_mesa_compile_fp_program(
|
|||
const struct gl_fragment_program *program,
|
||||
GLuint numInputs,
|
||||
const GLuint inputMapping[],
|
||||
const ubyte inputSemantic[],
|
||||
const ubyte inputSemanticName[],
|
||||
const ubyte inputSemanticIndex[],
|
||||
const GLuint interpMode[],
|
||||
const GLuint outputMapping[],
|
||||
struct tgsi_token *tokens,
|
||||
|
|
@ -553,13 +557,13 @@ tgsi_mesa_compile_fp_program(
|
|||
ti = 3;
|
||||
|
||||
for (i = 0; i < numInputs; i++) {
|
||||
switch (inputSemantic[i]) {
|
||||
switch (inputSemanticName[i]) {
|
||||
case TGSI_SEMANTIC_POSITION:
|
||||
/* Fragment XY pos */
|
||||
fulldecl = make_frag_input_decl(i,
|
||||
TGSI_INTERPOLATE_CONSTANT,
|
||||
TGSI_WRITEMASK_XY,
|
||||
TGSI_SEMANTIC_POSITION );
|
||||
TGSI_SEMANTIC_POSITION, 0 );
|
||||
ti += tgsi_build_full_declaration(
|
||||
&fulldecl,
|
||||
&tokens[ti],
|
||||
|
|
@ -569,7 +573,7 @@ tgsi_mesa_compile_fp_program(
|
|||
fulldecl = make_frag_input_decl(i,
|
||||
TGSI_INTERPOLATE_LINEAR,
|
||||
TGSI_WRITEMASK_ZW,
|
||||
TGSI_SEMANTIC_POSITION );
|
||||
TGSI_SEMANTIC_POSITION, 0 );
|
||||
ti += tgsi_build_full_declaration(
|
||||
&fulldecl,
|
||||
&tokens[ti],
|
||||
|
|
@ -580,7 +584,8 @@ tgsi_mesa_compile_fp_program(
|
|||
fulldecl = make_frag_input_decl(i,
|
||||
interpMode[i],
|
||||
TGSI_WRITEMASK_XYZW,
|
||||
inputSemantic[i] );
|
||||
inputSemanticName[i],
|
||||
inputSemanticIndex[i]);
|
||||
ti += tgsi_build_full_declaration(&fulldecl,
|
||||
&tokens[ti],
|
||||
header,
|
||||
|
|
@ -599,7 +604,7 @@ tgsi_mesa_compile_fp_program(
|
|||
|
||||
fulldecl = make_frag_output_decl(
|
||||
0,
|
||||
TGSI_SEMANTIC_DEPTH,
|
||||
TGSI_SEMANTIC_POSITION, 0, /* Z / Depth */
|
||||
TGSI_WRITEMASK_Z );
|
||||
ti += tgsi_build_full_declaration(
|
||||
&fulldecl,
|
||||
|
|
@ -610,7 +615,7 @@ tgsi_mesa_compile_fp_program(
|
|||
if( program->Base.OutputsWritten & (1 << FRAG_RESULT_COLR) ) {
|
||||
fulldecl = make_frag_output_decl(
|
||||
1,
|
||||
TGSI_SEMANTIC_COLOR0,
|
||||
TGSI_SEMANTIC_COLOR, 0,
|
||||
TGSI_WRITEMASK_XYZW );
|
||||
ti += tgsi_build_full_declaration(
|
||||
&fulldecl,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ tgsi_mesa_compile_fp_program(
|
|||
const struct gl_fragment_program *program,
|
||||
GLuint numInputs,
|
||||
const GLuint inputMapping[],
|
||||
const ubyte inputSemantic[],
|
||||
const ubyte inputSemanticName[],
|
||||
const ubyte inputSemanticIndex[],
|
||||
const GLuint interpMode[],
|
||||
const GLuint outputMapping[],
|
||||
struct tgsi_token *tokens,
|
||||
|
|
|
|||
|
|
@ -77,23 +77,41 @@ st_translate_fragment_shader(struct st_context *st,
|
|||
|
||||
switch (i) {
|
||||
case FRAG_ATTRIB_WPOS:
|
||||
fs.input_semantics[fs.num_inputs] = TGSI_SEMANTIC_POSITION;
|
||||
fs.input_semantic_name[fs.num_inputs] = TGSI_SEMANTIC_POSITION;
|
||||
fs.input_semantic_index[fs.num_inputs] = 0;
|
||||
interpMode[fs.num_inputs] = TGSI_INTERPOLATE_CONSTANT;
|
||||
break;
|
||||
case FRAG_ATTRIB_COL0:
|
||||
fs.input_semantics[fs.num_inputs] = TGSI_SEMANTIC_COLOR0;
|
||||
fs.input_semantic_name[fs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
fs.input_semantic_index[fs.num_inputs] = 0;
|
||||
interpMode[fs.num_inputs] = TGSI_INTERPOLATE_LINEAR;
|
||||
break;
|
||||
case FRAG_ATTRIB_COL1:
|
||||
fs.input_semantics[fs.num_inputs] = TGSI_SEMANTIC_COLOR1;
|
||||
fs.input_semantic_name[fs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
fs.input_semantic_index[fs.num_inputs] = 1;
|
||||
interpMode[fs.num_inputs] = TGSI_INTERPOLATE_LINEAR;
|
||||
break;
|
||||
case FRAG_ATTRIB_FOGC:
|
||||
assert(0);
|
||||
break;
|
||||
case FRAG_ATTRIB_TEX0:
|
||||
fs.input_semantics[fs.num_inputs] = TGSI_SEMANTIC_TEX0;
|
||||
case FRAG_ATTRIB_TEX1:
|
||||
case FRAG_ATTRIB_TEX2:
|
||||
case FRAG_ATTRIB_TEX3:
|
||||
case FRAG_ATTRIB_TEX4:
|
||||
case FRAG_ATTRIB_TEX5:
|
||||
case FRAG_ATTRIB_TEX6:
|
||||
case FRAG_ATTRIB_TEX7:
|
||||
fs.input_semantic_name[fs.num_inputs] = TGSI_SEMANTIC_TEXCOORD;
|
||||
fs.input_semantic_index[fs.num_inputs] = i - FRAG_ATTRIB_TEX0;
|
||||
interpMode[fs.num_inputs] = TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
break;
|
||||
case FRAG_ATTRIB_VAR0:
|
||||
/* fall-through */
|
||||
default:
|
||||
assert(0);
|
||||
fs.input_semantic_name[fs.num_inputs] = TGSI_SEMANTIC_GENERIC;
|
||||
fs.input_semantic_index[fs.num_inputs] = i - FRAG_ATTRIB_VAR0;
|
||||
interpMode[fs.num_inputs] = TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
}
|
||||
|
||||
fs.num_inputs++;
|
||||
|
|
@ -107,11 +125,11 @@ st_translate_fragment_shader(struct st_context *st,
|
|||
if (stfp->Base.Base.OutputsWritten & (1 << i)) {
|
||||
switch (i) {
|
||||
case FRAG_RESULT_DEPR:
|
||||
fs.output_semantics[fs.num_outputs] = TGSI_SEMANTIC_DEPTH;
|
||||
fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
|
||||
outputMapping[i] = fs.num_outputs;
|
||||
break;
|
||||
case FRAG_RESULT_COLR:
|
||||
fs.output_semantics[fs.num_outputs] = TGSI_SEMANTIC_COLOR0;
|
||||
fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
|
||||
outputMapping[i] = fs.num_outputs;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -126,7 +144,8 @@ st_translate_fragment_shader(struct st_context *st,
|
|||
tgsi_mesa_compile_fp_program( &stfp->Base,
|
||||
fs.num_inputs,
|
||||
inputMapping,
|
||||
fs.input_semantics,
|
||||
fs.input_semantic_name,
|
||||
fs.input_semantic_index,
|
||||
interpMode,
|
||||
outputMapping,
|
||||
stfp->tokens, ST_FP_MAX_TOKENS );
|
||||
|
|
|
|||
|
|
@ -64,9 +64,8 @@ st_translate_vertex_shader(struct st_context *st,
|
|||
memset(&vs, 0, sizeof(vs));
|
||||
|
||||
/*
|
||||
* Determine how many inputs there are.
|
||||
* Also, compute two look-up tables that map between Mesa VERT_ATTRIB_x
|
||||
* values and TGSI generic input indexes.
|
||||
* Determine number of inputs, the mappings between VERT_ATTRIB_x
|
||||
* and TGSI generic input indexes, plus input attrib semantic info.
|
||||
*/
|
||||
for (i = 0; i < MAX_VERTEX_PROGRAM_ATTRIBS; i++) {
|
||||
if (stvp->Base.Base.InputsRead & (1 << i)) {
|
||||
|
|
@ -74,26 +73,57 @@ st_translate_vertex_shader(struct st_context *st,
|
|||
stvp->index_to_input[vs.num_inputs] = i;
|
||||
switch (i) {
|
||||
case VERT_ATTRIB_POS:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_POSITION;
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_POSITION;
|
||||
vs.input_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_WEIGHT:
|
||||
/* fall-through */
|
||||
case VERT_ATTRIB_NORMAL:
|
||||
/* just label as a generic */
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.input_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_COLOR0:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR0;
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
vs.input_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_ATTRIB_COLOR1:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR1;
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
vs.input_semantic_index[vs.num_inputs] = 1;
|
||||
break;
|
||||
case VERT_ATTRIB_TEX0:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_TEX0;
|
||||
case VERT_ATTRIB_TEX1:
|
||||
case VERT_ATTRIB_TEX2:
|
||||
case VERT_ATTRIB_TEX3:
|
||||
case VERT_ATTRIB_TEX4:
|
||||
case VERT_ATTRIB_TEX5:
|
||||
case VERT_ATTRIB_TEX6:
|
||||
case VERT_ATTRIB_TEX7:
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_TEXCOORD;
|
||||
vs.input_semantic_index[vs.num_inputs] = 1 - VERT_ATTRIB_TEX0;
|
||||
break;
|
||||
case VERT_ATTRIB_GENERIC0:
|
||||
case VERT_ATTRIB_GENERIC1:
|
||||
case VERT_ATTRIB_GENERIC2:
|
||||
case VERT_ATTRIB_GENERIC3:
|
||||
case VERT_ATTRIB_GENERIC4:
|
||||
case VERT_ATTRIB_GENERIC5:
|
||||
case VERT_ATTRIB_GENERIC6:
|
||||
case VERT_ATTRIB_GENERIC7:
|
||||
assert(i < VERT_ATTRIB_MAX);
|
||||
vs.input_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.input_semantic_index[vs.num_inputs] = 1 - VERT_ATTRIB_GENERIC0;
|
||||
break;
|
||||
default:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_OTHER;
|
||||
assert(0);
|
||||
}
|
||||
vs.num_inputs++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine number of outputs and the register mapping.
|
||||
* Determine number of outputs, the register mapping and
|
||||
* the semantic information for each vertex output/result.
|
||||
*/
|
||||
for (i = 0; i < VERT_RESULT_MAX; i++) {
|
||||
if (stvp->Base.Base.OutputsWritten & (1 << i)) {
|
||||
|
|
@ -102,23 +132,49 @@ st_translate_vertex_shader(struct st_context *st,
|
|||
|
||||
switch (i) {
|
||||
case VERT_RESULT_HPOS:
|
||||
vs.output_semantics[vs.num_outputs] = TGSI_SEMANTIC_POSITION;
|
||||
vs.output_semantic_name[vs.num_outputs] = TGSI_SEMANTIC_POSITION;
|
||||
vs.output_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_RESULT_COL0:
|
||||
vs.output_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR0;
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
vs.output_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_RESULT_COL1:
|
||||
vs.output_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR1;
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_COLOR;
|
||||
vs.output_semantic_index[vs.num_inputs] = 1;
|
||||
break;
|
||||
case VERT_RESULT_BFC0:
|
||||
vs.output_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR0B;
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_BCOLOR;
|
||||
vs.output_semantic_index[vs.num_inputs] = 0;
|
||||
break;
|
||||
case VERT_RESULT_BFC1:
|
||||
vs.output_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR1B;
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_BCOLOR;
|
||||
vs.output_semantic_index[vs.num_inputs] = 1;
|
||||
break;
|
||||
case VERT_RESULT_FOGC:
|
||||
case VERT_RESULT_PSIZ:
|
||||
case VERT_RESULT_EDGE:
|
||||
assert(0);
|
||||
break;
|
||||
case VERT_RESULT_TEX0:
|
||||
case VERT_RESULT_TEX1:
|
||||
case VERT_RESULT_TEX2:
|
||||
case VERT_RESULT_TEX3:
|
||||
case VERT_RESULT_TEX4:
|
||||
case VERT_RESULT_TEX5:
|
||||
case VERT_RESULT_TEX6:
|
||||
case VERT_RESULT_TEX7:
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_TEXCOORD;
|
||||
vs.output_semantic_index[vs.num_inputs] = i - VERT_RESULT_TEX0;
|
||||
break;
|
||||
case VERT_RESULT_VAR0:
|
||||
/* fall-through */
|
||||
default:
|
||||
vs.output_semantics[vs.num_outputs] = TGSI_SEMANTIC_OTHER;
|
||||
assert(i - VERT_RESULT_VAR0 < MAX_VARYING);
|
||||
vs.output_semantic_name[vs.num_inputs] = TGSI_SEMANTIC_GENERIC;
|
||||
vs.output_semantic_index[vs.num_inputs] = i - VERT_RESULT_VAR0;
|
||||
}
|
||||
|
||||
vs.num_outputs++;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue