tgsi: handle parsing vertex streams

These are needed for ARB_gpu_shader5

Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
macos/master
Dave Airlie 7 years ago
parent 2c21683dfb
commit 027a0df49e
  1. 18
      src/gallium/auxiliary/tgsi/tgsi_build.c
  2. 48
      src/gallium/auxiliary/tgsi/tgsi_text.c
  3. 5
      src/gallium/include/pipe/p_shader_tokens.h

@ -233,7 +233,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;
}
@ -242,6 +245,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 )
{
@ -252,7 +259,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 );
@ -450,6 +460,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 );
}

@ -1377,6 +1377,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) {

@ -192,7 +192,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_resource {

Loading…
Cancel
Save