Browse Source

gallium/tgsi: Move interpolation info from tgsi_declaration to a separate token.

Move Interpolate, Centroid and CylindricalWrap from tgsi_declaration
to a separate token -- they only make sense for FS inputs and we need
room for other flags in the top-level declaration token.
tags/i965-primitive-restart-v2
Francisco Jerez 13 years ago
parent
commit
1279923d72

+ 2
- 1
src/gallium/auxiliary/draw/draw_pipe_aaline.c View File

@@ -237,12 +237,13 @@ aa_transform_inst(struct tgsi_transform_context *ctx,
decl = tgsi_default_full_declaration();
decl.Declaration.File = TGSI_FILE_INPUT;
/* XXX this could be linear... */
decl.Declaration.Interpolate = TGSI_INTERPOLATE_PERSPECTIVE;
decl.Declaration.Interpolate = 1;
decl.Declaration.Semantic = 1;
decl.Semantic.Name = TGSI_SEMANTIC_GENERIC;
decl.Semantic.Index = aactx->maxGeneric + 1;
decl.Range.First =
decl.Range.Last = aactx->maxInput + 1;
decl.Interp.Interpolate = TGSI_INTERPOLATE_PERSPECTIVE;
ctx->emit_declaration(ctx, &decl);

/* declare new sampler */

+ 2
- 1
src/gallium/auxiliary/draw/draw_pipe_aapoint.c View File

@@ -201,12 +201,13 @@ aa_transform_inst(struct tgsi_transform_context *ctx,
decl = tgsi_default_full_declaration();
decl.Declaration.File = TGSI_FILE_INPUT;
/* XXX this could be linear... */
decl.Declaration.Interpolate = TGSI_INTERPOLATE_PERSPECTIVE;
decl.Declaration.Interpolate = 1;
decl.Declaration.Semantic = 1;
decl.Semantic.Name = TGSI_SEMANTIC_GENERIC;
decl.Semantic.Index = aactx->maxGeneric + 1;
decl.Range.First =
decl.Range.Last = texInput;
decl.Interp.Interpolate = TGSI_INTERPOLATE_PERSPECTIVE;
ctx->emit_declaration(ctx, &decl);

/* declare new temp regs */

+ 2
- 1
src/gallium/auxiliary/draw/draw_pipe_pstipple.c View File

@@ -234,12 +234,13 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,
/* declare new position input reg */
decl = tgsi_default_full_declaration();
decl.Declaration.File = TGSI_FILE_INPUT;
decl.Declaration.Interpolate = TGSI_INTERPOLATE_LINEAR; /* XXX? */
decl.Declaration.Interpolate = 1;
decl.Declaration.Semantic = 1;
decl.Semantic.Name = TGSI_SEMANTIC_POSITION;
decl.Semantic.Index = 0;
decl.Range.First =
decl.Range.Last = wincoordInput;
decl.Interp.Interpolate = TGSI_INTERPOLATE_LINEAR; /* XXX? */
ctx->emit_declaration(ctx, &decl);
}


+ 48
- 9
src/gallium/auxiliary/tgsi/tgsi_build.c View File

@@ -104,12 +104,10 @@ tgsi_default_declaration( void )
declaration.NrTokens = 1;
declaration.File = TGSI_FILE_NULL;
declaration.UsageMask = TGSI_WRITEMASK_XYZW;
declaration.Interpolate = TGSI_INTERPOLATE_CONSTANT;
declaration.Interpolate = 0;
declaration.Dimension = 0;
declaration.Semantic = 0;
declaration.Centroid = 0;
declaration.Invariant = 0;
declaration.CylindricalWrap = 0;

return declaration;
}
@@ -121,9 +119,7 @@ tgsi_build_declaration(
unsigned interpolate,
unsigned dimension,
unsigned semantic,
unsigned centroid,
unsigned invariant,
unsigned cylindrical_wrap,
struct tgsi_header *header )
{
struct tgsi_declaration declaration;
@@ -137,9 +133,7 @@ tgsi_build_declaration(
declaration.Interpolate = interpolate;
declaration.Dimension = dimension;
declaration.Semantic = semantic;
declaration.Centroid = centroid;
declaration.Invariant = invariant;
declaration.CylindricalWrap = cylindrical_wrap;

header_bodysize_grow( header );

@@ -194,6 +188,36 @@ tgsi_build_declaration_dimension(unsigned index_2d,
return dd;
}

static struct tgsi_declaration_interp
tgsi_default_declaration_interp( void )
{
struct tgsi_declaration_interp di;

di.Interpolate = TGSI_INTERPOLATE_CONSTANT;
di.Centroid = 0;
di.CylindricalWrap = 0;

return di;
}

static struct tgsi_declaration_interp
tgsi_build_declaration_interp(unsigned interpolate,
unsigned centroid,
unsigned cylindrical_wrap,
struct tgsi_declaration *declaration,
struct tgsi_header *header)
{
struct tgsi_declaration_interp di;

di.Interpolate = interpolate;
di.Centroid = centroid;
di.CylindricalWrap = cylindrical_wrap;

declaration_grow(declaration, header);

return di;
}

static struct tgsi_declaration_semantic
tgsi_default_declaration_semantic( void )
{
@@ -298,6 +322,7 @@ tgsi_default_full_declaration( void )
full_declaration.Declaration = tgsi_default_declaration();
full_declaration.Range = tgsi_default_declaration_range();
full_declaration.Semantic = tgsi_default_declaration_semantic();
full_declaration.Interp = tgsi_default_declaration_interp();
full_declaration.ImmediateData.u = NULL;
full_declaration.Resource = tgsi_default_declaration_resource();
full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
@@ -327,9 +352,7 @@ tgsi_build_full_declaration(
full_decl->Declaration.Interpolate,
full_decl->Declaration.Dimension,
full_decl->Declaration.Semantic,
full_decl->Declaration.Centroid,
full_decl->Declaration.Invariant,
full_decl->Declaration.CylindricalWrap,
header );

if (maxsize <= size)
@@ -357,6 +380,22 @@ tgsi_build_full_declaration(
header);
}

if (full_decl->Declaration.Interpolate) {
struct tgsi_declaration_interp *di;

if (maxsize <= size) {
return 0;
}
di = (struct tgsi_declaration_interp *)&tokens[size];
size++;

*di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate,
full_decl->Interp.Centroid,
full_decl->Interp.CylindricalWrap,
declaration,
header);
}

if( full_decl->Declaration.Semantic ) {
struct tgsi_declaration_semantic *ds;


+ 26
- 23
src/gallium/auxiliary/tgsi/tgsi_dump.c View File

@@ -306,36 +306,39 @@ iter_declaration(
}
}

if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT &&
decl->Declaration.File == TGSI_FILE_INPUT)
{
TXT( ", " );
ENM( decl->Declaration.Interpolate, tgsi_interpolate_names );
}
if (decl->Declaration.Interpolate) {
if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT &&
decl->Declaration.File == TGSI_FILE_INPUT)
{
TXT( ", " );
ENM( decl->Interp.Interpolate, tgsi_interpolate_names );
}

if (decl->Declaration.Centroid) {
TXT( ", CENTROID" );
if (decl->Interp.Centroid) {
TXT( ", CENTROID" );
}

if (decl->Interp.CylindricalWrap) {
TXT(", CYLWRAP_");
if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) {
CHR('X');
}
if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) {
CHR('Y');
}
if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) {
CHR('Z');
}
if (decl->Interp.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) {
CHR('W');
}
}
}

if (decl->Declaration.Invariant) {
TXT( ", INVARIANT" );
}

if (decl->Declaration.CylindricalWrap) {
TXT(", CYLWRAP_");
if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_X) {
CHR('X');
}
if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Y) {
CHR('Y');
}
if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_Z) {
CHR('Z');
}
if (decl->Declaration.CylindricalWrap & TGSI_CYLINDRICAL_WRAP_W) {
CHR('W');
}
}

if (decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) {
unsigned i;

+ 1
- 1
src/gallium/auxiliary/tgsi/tgsi_exec.c View File

@@ -2371,7 +2371,7 @@ exec_declaration(struct tgsi_exec_machine *mach,
eval_coef_func eval;
uint i, j;

switch (decl->Declaration.Interpolate) {
switch (decl->Interp.Interpolate) {
case TGSI_INTERPOLATE_CONSTANT:
eval = eval_constant_coef;
break;

+ 4
- 0
src/gallium/auxiliary/tgsi/tgsi_parse.c View File

@@ -113,6 +113,10 @@ tgsi_parse_token(
next_token(ctx, &decl->Dim);
}

if( decl->Declaration.Interpolate ) {
next_token( ctx, &decl->Interp );
}

if( decl->Declaration.Semantic ) {
next_token( ctx, &decl->Semantic );
}

+ 1
- 0
src/gallium/auxiliary/tgsi/tgsi_parse.h View File

@@ -67,6 +67,7 @@ struct tgsi_full_declaration
struct tgsi_declaration Declaration;
struct tgsi_declaration_range Range;
struct tgsi_declaration_dimension Dim;
struct tgsi_declaration_interp Interp;
struct tgsi_declaration_semantic Semantic;
struct tgsi_immediate_array_data ImmediateData;
struct tgsi_declaration_resource Resource;

+ 1
- 1
src/gallium/auxiliary/tgsi/tgsi_ppc.c View File

@@ -1170,7 +1170,7 @@ emit_declaration(
for( i = first; i <= last; i++ ) {
for( j = 0; j < NUM_CHANNELS; j++ ) {
if( mask & (1 << j) ) {
switch( decl->Declaration.Interpolate ) {
switch( decl->Interp.Interpolate ) {
case TGSI_INTERPOLATE_CONSTANT:
emit_coef_a0( func, 0, i, j );
emit_inputs( func, 0, i, j );

+ 3
- 3
src/gallium/auxiliary/tgsi/tgsi_scan.c View File

@@ -157,9 +157,9 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
if (file == TGSI_FILE_INPUT) {
info->input_semantic_name[reg] = (ubyte)fulldecl->Semantic.Name;
info->input_semantic_index[reg] = (ubyte)fulldecl->Semantic.Index;
info->input_interpolate[reg] = (ubyte)fulldecl->Declaration.Interpolate;
info->input_centroid[reg] = (ubyte)fulldecl->Declaration.Centroid;
info->input_cylindrical_wrap[reg] = (ubyte)fulldecl->Declaration.CylindricalWrap;
info->input_interpolate[reg] = (ubyte)fulldecl->Interp.Interpolate;
info->input_centroid[reg] = (ubyte)fulldecl->Interp.Centroid;
info->input_cylindrical_wrap[reg] = (ubyte)fulldecl->Interp.CylindricalWrap;
info->num_inputs++;

if (procType == TGSI_PROCESSOR_FRAGMENT &&

+ 2
- 1
src/gallium/auxiliary/tgsi/tgsi_text.c View File

@@ -1225,7 +1225,8 @@ static boolean parse_declaration( struct translate_ctx *ctx )
if (str_match_no_case( &cur, tgsi_interpolate_names[i] )) {
if (is_digit_alpha_underscore( cur ))
continue;
decl.Declaration.Interpolate = i;
decl.Declaration.Interpolate = 1;
decl.Interp.Interpolate = i;

ctx->cur = cur;
break;

+ 11
- 10
src/gallium/auxiliary/tgsi/tgsi_ureg.c View File

@@ -46,6 +46,7 @@ union tgsi_any_token {
struct tgsi_declaration decl;
struct tgsi_declaration_range decl_range;
struct tgsi_declaration_dimension decl_dim;
struct tgsi_declaration_interp decl_interp;
struct tgsi_declaration_semantic decl_semantic;
struct tgsi_declaration_sampler_view decl_sampler_view;
struct tgsi_immediate imm;
@@ -1229,25 +1230,28 @@ emit_decl_fs(struct ureg_program *ureg,
unsigned cylindrical_wrap,
unsigned centroid)
{
union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 3);
union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 4);

out[0].value = 0;
out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
out[0].decl.NrTokens = 3;
out[0].decl.NrTokens = 4;
out[0].decl.File = file;
out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW; /* FIXME! */
out[0].decl.Interpolate = interpolate;
out[0].decl.Interpolate = 1;
out[0].decl.Semantic = 1;
out[0].decl.CylindricalWrap = cylindrical_wrap;
out[0].decl.Centroid = centroid;

out[1].value = 0;
out[1].decl_range.First = index;
out[1].decl_range.Last = index;

out[2].value = 0;
out[2].decl_semantic.Name = semantic_name;
out[2].decl_semantic.Index = semantic_index;
out[2].decl_interp.Interpolate = interpolate;
out[2].decl_interp.CylindricalWrap = cylindrical_wrap;
out[2].decl_interp.Centroid = centroid;

out[3].value = 0;
out[3].decl_semantic.Name = semantic_name;
out[3].decl_semantic.Index = semantic_index;
}


@@ -1263,7 +1267,6 @@ static void emit_decl_range( struct ureg_program *ureg,
out[0].decl.NrTokens = 2;
out[0].decl.File = file;
out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW;
out[0].decl.Interpolate = TGSI_INTERPOLATE_CONSTANT;
out[0].decl.Semantic = 0;

out[1].value = 0;
@@ -1285,7 +1288,6 @@ emit_decl_range2D(struct ureg_program *ureg,
out[0].decl.NrTokens = 3;
out[0].decl.File = file;
out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW;
out[0].decl.Interpolate = TGSI_INTERPOLATE_CONSTANT;
out[0].decl.Dimension = 1;

out[1].value = 0;
@@ -1312,7 +1314,6 @@ emit_decl_sampler_view(struct ureg_program *ureg,
out[0].decl.NrTokens = 3;
out[0].decl.File = TGSI_FILE_SAMPLER_VIEW;
out[0].decl.UsageMask = 0xf;
out[0].decl.Interpolate = TGSI_INTERPOLATE_CONSTANT;

out[1].value = 0;
out[1].decl_range.First = index;

+ 2
- 1
src/gallium/auxiliary/util/u_pstipple.c View File

@@ -298,12 +298,13 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,
/* declare new position input reg */
decl = tgsi_default_full_declaration();
decl.Declaration.File = TGSI_FILE_INPUT;
decl.Declaration.Interpolate = TGSI_INTERPOLATE_LINEAR;
decl.Declaration.Interpolate = 1;
decl.Declaration.Semantic = 1;
decl.Semantic.Name = TGSI_SEMANTIC_POSITION;
decl.Semantic.Index = 0;
decl.Range.First =
decl.Range.Last = wincoordInput;
decl.Interp.Interpolate = TGSI_INTERPOLATE_LINEAR;
ctx->emit_declaration(ctx, &decl);
}


+ 15
- 9
src/gallium/docs/source/tgsi.rst View File

@@ -1559,19 +1559,11 @@ of TGSI_FILE.
UsageMask field specifies which of the register components can be accessed
and is one of TGSI_WRITEMASK.

Interpolate field is only valid for fragment shader INPUT register files.
It specifes the way input is being interpolated by the rasteriser and is one
of TGSI_INTERPOLATE.

If Dimension flag is set to 1, a Declaration Dimension token follows.

If Semantic flag is set to 1, a Declaration Semantic token follows.

CylindricalWrap bitfield is only valid for fragment shader INPUT register
files. It specifies which register components should be subject to cylindrical
wrapping when interpolating by the rasteriser. If TGSI_CYLINDRICAL_WRAP_X
is set to 1, the X component should be interpolated according to cylindrical
wrapping rules.
If Interpolate flag is set to 1, a Declaration Interpolate token follows.

If file is TGSI_FILE_RESOURCE, a Declaration Resource token follows.

@@ -1718,6 +1710,20 @@ is a writable stencil reference value. Only the Y component is writable.
This allows the fragment shader to change the fragments stencilref value.


Declaration Interpolate
^^^^^^^^^^^^^^^^^^^^^^^

This token is only valid for fragment shader INPUT declarations.

The Interpolate field specifes the way input is being interpolated by
the rasteriser and is one of TGSI_INTERPOLATE_*.

The CylindricalWrap bitfield specifies which register components
should be subject to cylindrical wrapping when interpolating by the
rasteriser. If TGSI_CYLINDRICAL_WRAP_X is set to 1, the X component
should be interpolated according to cylindrical wrapping rules.


Declaration Sampler View
^^^^^^^^^^^^^^^^^^^^^^^^


+ 2
- 2
src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp View File

@@ -805,7 +805,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
info->in[i].si = si;
if (info->type == PIPE_SHADER_FRAGMENT) {
// translate interpolation mode
switch (decl->Declaration.Interpolate) {
switch (decl->Interp.Interpolate) {
case TGSI_INTERPOLATE_CONSTANT:
info->in[i].flat = 1;
break;
@@ -818,7 +818,7 @@ bool Source::scanDeclaration(const struct tgsi_full_declaration *decl)
default:
break;
}
if (decl->Declaration.Centroid)
if (decl->Interp.Centroid)
info->in[i].centroid = 1;
}
}

+ 2
- 1
src/gallium/drivers/r300/r300_vs_draw.c View File

@@ -94,11 +94,12 @@ static void emit_output(struct tgsi_transform_context *ctx,

decl = tgsi_default_full_declaration();
decl.Declaration.File = TGSI_FILE_OUTPUT;
decl.Declaration.Interpolate = interp;
decl.Declaration.Interpolate = 1;
decl.Declaration.Semantic = TRUE;
decl.Semantic.Name = name;
decl.Semantic.Index = index;
decl.Range.First = decl.Range.Last = reg;
decl.Interp.Interpolate = interp;
ctx->emit_declaration(ctx, &decl);
++vsctx->num_outputs;
}

+ 3
- 3
src/gallium/drivers/r600/r600_shader.c View File

@@ -722,8 +722,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
ctx->shader->input[i].name = d->Semantic.Name;
ctx->shader->input[i].sid = d->Semantic.Index;
ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]);
ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
ctx->shader->input[i].centroid = d->Declaration.Centroid;
ctx->shader->input[i].interpolate = d->Interp.Interpolate;
ctx->shader->input[i].centroid = d->Interp.Centroid;
ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First;
if (ctx->type == TGSI_PROCESSOR_FRAGMENT) {
switch (ctx->shader->input[i].name) {
@@ -749,7 +749,7 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
ctx->shader->output[i].sid = d->Semantic.Index;
ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]);
ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First;
ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
ctx->shader->output[i].interpolate = d->Interp.Interpolate;
ctx->shader->output[i].write_mask = d->Declaration.UsageMask;
if (ctx->type == TGSI_PROCESSOR_VERTEX) {
switch (d->Semantic.Name) {

+ 4
- 4
src/gallium/drivers/radeonsi/radeonsi_shader.c View File

@@ -199,7 +199,7 @@ static void declare_input_fs(
LLVMValueRef attr_number = lp_build_const_int32(gallivm, input_index);

/* XXX: Handle all possible interpolation modes */
switch (decl->Declaration.Interpolate) {
switch (decl->Interp.Interpolate) {
case TGSI_INTERPOLATE_COLOR:
if (si_shader_ctx->rctx->rasterizer->flatshade)
intr_name = "llvm.SI.fs.interp.constant";
@@ -331,14 +331,14 @@ static void si_llvm_emit_epilogue(struct lp_build_tgsi_context * bld_base)
i = shader->ninput++;
shader->input[i].name = d->Semantic.Name;
shader->input[i].sid = d->Semantic.Index;
shader->input[i].interpolate = d->Declaration.Interpolate;
shader->input[i].centroid = d->Declaration.Centroid;
shader->input[i].interpolate = d->Interp.Interpolate;
shader->input[i].centroid = d->Interp.Centroid;
break;
case TGSI_FILE_OUTPUT:
i = shader->noutput++;
shader->output[i].name = d->Semantic.Name;
shader->output[i].sid = d->Semantic.Index;
shader->output[i].interpolate = d->Declaration.Interpolate;
shader->output[i].interpolate = d->Interp.Interpolate;
break;
}


+ 10
- 3
src/gallium/include/pipe/p_shader_tokens.h View File

@@ -115,12 +115,11 @@ struct tgsi_declaration
unsigned NrTokens : 8; /**< UINT */
unsigned File : 4; /**< one of TGSI_FILE_x */
unsigned UsageMask : 4; /**< bitmask of TGSI_WRITEMASK_x flags */
unsigned Interpolate : 4; /**< one of TGSI_INTERPOLATE_x */
unsigned Dimension : 1; /**< any extra dimension info? */
unsigned Semantic : 1; /**< BOOL, any semantic info? */
unsigned Centroid : 1; /**< centroid sampling? */
unsigned Interpolate : 1; /**< any interpolation info? */
unsigned Invariant : 1; /**< invariant optimization? */
unsigned CylindricalWrap:4; /**< TGSI_CYLINDRICAL_WRAP_x flags */
unsigned Padding : 8;
};

struct tgsi_declaration_range
@@ -135,6 +134,14 @@ struct tgsi_declaration_dimension
unsigned Padding:16;
};

struct tgsi_declaration_interp
{
unsigned Interpolate : 4; /**< one of TGSI_INTERPOLATE_x */
unsigned Centroid : 1; /**< centroid sampling? */
unsigned CylindricalWrap:4; /**< TGSI_CYLINDRICAL_WRAP_x flags */
unsigned Padding : 23;
};

#define TGSI_SEMANTIC_POSITION 0
#define TGSI_SEMANTIC_COLOR 1
#define TGSI_SEMANTIC_BCOLOR 2 /**< back-face color */

Loading…
Cancel
Save