tgsi: add Stream{X,Y,Z,W} fields to tgsi_declaration_semantic
This is for geometry shader outputs. Without it, drivers have no way of knowing which stream each output is intended for, and have to conservatively write all outputs to all streams. Separate stream numbers for each component are required due to output packing. Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -239,7 +239,10 @@ tgsi_default_declaration_semantic( void )
|
||||
|
||||
ds.Name = TGSI_SEMANTIC_POSITION;
|
||||
ds.Index = 0;
|
||||
ds.Padding = 0;
|
||||
ds.StreamX = 0;
|
||||
ds.StreamY = 0;
|
||||
ds.StreamZ = 0;
|
||||
ds.StreamW = 0;
|
||||
|
||||
return ds;
|
||||
}
|
||||
@@ -248,6 +251,10 @@ static struct tgsi_declaration_semantic
|
||||
tgsi_build_declaration_semantic(
|
||||
unsigned semantic_name,
|
||||
unsigned semantic_index,
|
||||
unsigned streamx,
|
||||
unsigned streamy,
|
||||
unsigned streamz,
|
||||
unsigned streamw,
|
||||
struct tgsi_declaration *declaration,
|
||||
struct tgsi_header *header )
|
||||
{
|
||||
@@ -258,7 +265,10 @@ tgsi_build_declaration_semantic(
|
||||
|
||||
ds.Name = semantic_name;
|
||||
ds.Index = semantic_index;
|
||||
ds.Padding = 0;
|
||||
ds.StreamX = streamx;
|
||||
ds.StreamY = streamy;
|
||||
ds.StreamZ = streamz;
|
||||
ds.StreamW = streamw;
|
||||
|
||||
declaration_grow( declaration, header );
|
||||
|
||||
@@ -461,6 +471,10 @@ tgsi_build_full_declaration(
|
||||
*ds = tgsi_build_declaration_semantic(
|
||||
full_decl->Semantic.Name,
|
||||
full_decl->Semantic.Index,
|
||||
full_decl->Semantic.StreamX,
|
||||
full_decl->Semantic.StreamY,
|
||||
full_decl->Semantic.StreamZ,
|
||||
full_decl->Semantic.StreamW,
|
||||
declaration,
|
||||
header );
|
||||
}
|
||||
|
||||
@@ -360,6 +360,19 @@ iter_declaration(
|
||||
UID( decl->Semantic.Index );
|
||||
CHR( ']' );
|
||||
}
|
||||
|
||||
if (decl->Semantic.StreamX != 0 || decl->Semantic.StreamY != 0 ||
|
||||
decl->Semantic.StreamZ != 0 || decl->Semantic.StreamW != 0) {
|
||||
TXT(", STREAM(");
|
||||
UID(decl->Semantic.StreamX);
|
||||
TXT(", ");
|
||||
UID(decl->Semantic.StreamY);
|
||||
TXT(", ");
|
||||
UID(decl->Semantic.StreamZ);
|
||||
TXT(", ");
|
||||
UID(decl->Semantic.StreamW);
|
||||
CHR(')');
|
||||
}
|
||||
}
|
||||
|
||||
if (decl->Declaration.File == TGSI_FILE_IMAGE) {
|
||||
|
||||
@@ -1544,6 +1544,54 @@ static boolean parse_declaration( struct translate_ctx *ctx )
|
||||
}
|
||||
}
|
||||
|
||||
cur = ctx->cur;
|
||||
eat_opt_white( &cur );
|
||||
if (*cur == ',' &&
|
||||
file == TGSI_FILE_OUTPUT && ctx->processor == PIPE_SHADER_GEOMETRY) {
|
||||
cur++;
|
||||
eat_opt_white(&cur);
|
||||
if (str_match_nocase_whole(&cur, "STREAM")) {
|
||||
uint stream[4];
|
||||
|
||||
eat_opt_white(&cur);
|
||||
if (*cur != '(') {
|
||||
report_error(ctx, "Expected '('");
|
||||
return FALSE;
|
||||
}
|
||||
cur++;
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
eat_opt_white(&cur);
|
||||
if (!parse_uint(&cur, &stream[i])) {
|
||||
report_error(ctx, "Expected literal integer");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
eat_opt_white(&cur);
|
||||
if (i < 3) {
|
||||
if (*cur != ',') {
|
||||
report_error(ctx, "Expected ','");
|
||||
return FALSE;
|
||||
}
|
||||
cur++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*cur != ')') {
|
||||
report_error(ctx, "Expected ')'");
|
||||
return FALSE;
|
||||
}
|
||||
cur++;
|
||||
|
||||
decl.Semantic.StreamX = stream[0];
|
||||
decl.Semantic.StreamY = stream[1];
|
||||
decl.Semantic.StreamZ = stream[2];
|
||||
decl.Semantic.StreamW = stream[3];
|
||||
|
||||
ctx->cur = cur;
|
||||
}
|
||||
}
|
||||
|
||||
cur = ctx->cur;
|
||||
eat_opt_white( &cur );
|
||||
if (*cur == ',' && !is_vs_input) {
|
||||
|
||||
@@ -207,7 +207,10 @@ struct tgsi_declaration_semantic
|
||||
{
|
||||
unsigned Name : 8; /**< one of TGSI_SEMANTIC_x */
|
||||
unsigned Index : 16; /**< UINT */
|
||||
unsigned Padding : 8;
|
||||
unsigned StreamX : 2; /**< vertex stream (for GS output) */
|
||||
unsigned StreamY : 2;
|
||||
unsigned StreamZ : 2;
|
||||
unsigned StreamW : 2;
|
||||
};
|
||||
|
||||
struct tgsi_declaration_image {
|
||||
|
||||
Reference in New Issue
Block a user