aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_build.c4
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_dump.c3
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_text.c65
-rw-r--r--src/gallium/docs/source/tgsi.rst6
-rw-r--r--src/gallium/include/pipe/p_shader_tokens.h3
5 files changed, 54 insertions, 27 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c
index 8378075b3e9..ed725c53966 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_build.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
@@ -108,6 +108,7 @@ tgsi_default_declaration( void )
declaration.Dimension = 0;
declaration.Semantic = 0;
declaration.Invariant = 0;
+ declaration.Local = 0;
return declaration;
}
@@ -120,6 +121,7 @@ tgsi_build_declaration(
unsigned dimension,
unsigned semantic,
unsigned invariant,
+ unsigned local,
struct tgsi_header *header )
{
struct tgsi_declaration declaration;
@@ -134,6 +136,7 @@ tgsi_build_declaration(
declaration.Dimension = dimension;
declaration.Semantic = semantic;
declaration.Invariant = invariant;
+ declaration.Local = local;
header_bodysize_grow( header );
@@ -359,6 +362,7 @@ tgsi_build_full_declaration(
full_decl->Declaration.Dimension,
full_decl->Declaration.Semantic,
full_decl->Declaration.Invariant,
+ full_decl->Declaration.Local,
header );
if (maxsize <= size)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c
index 36859466877..383c54590af 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
@@ -271,6 +271,9 @@ iter_declaration(
ctx,
decl->Declaration.UsageMask );
+ if (decl->Declaration.Local)
+ TXT( ", LOCAL" );
+
if (decl->Declaration.Semantic) {
TXT( ", " );
ENM( decl->Semantic.Name, tgsi_semantic_names );
diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
index 52e30b40169..c87313a3c16 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_text.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
@@ -1161,38 +1161,51 @@ static boolean parse_declaration( struct translate_ctx *ctx )
}
ctx->cur = cur;
} else {
- for (i = 0; i < TGSI_SEMANTIC_COUNT; i++) {
- if (str_match_no_case( &cur, tgsi_semantic_names[i] )) {
- const char *cur2 = cur;
- uint index;
+ if (str_match_no_case(&cur, "LOCAL") &&
+ !is_digit_alpha_underscore(cur)) {
+ decl.Declaration.Local = 1;
+ ctx->cur = cur;
+ }
- if (is_digit_alpha_underscore( cur ))
- continue;
- eat_opt_white( &cur2 );
- if (*cur2 == '[') {
- cur2++;
- eat_opt_white( &cur2 );
- if (!parse_uint( &cur2, &index )) {
- report_error( ctx, "Expected literal integer" );
- return FALSE;
- }
+ cur = ctx->cur;
+ eat_opt_white( &cur );
+ if (*cur == ',') {
+ cur++;
+ eat_opt_white( &cur );
+
+ for (i = 0; i < TGSI_SEMANTIC_COUNT; i++) {
+ if (str_match_no_case( &cur, tgsi_semantic_names[i] )) {
+ uint index;
+
+ if (is_digit_alpha_underscore( cur ))
+ continue;
+ cur2 = cur;
eat_opt_white( &cur2 );
- if (*cur2 != ']') {
- report_error( ctx, "Expected `]'" );
- return FALSE;
- }
- cur2++;
+ if (*cur2 == '[') {
+ cur2++;
+ eat_opt_white( &cur2 );
+ if (!parse_uint( &cur2, &index )) {
+ report_error( ctx, "Expected literal integer" );
+ return FALSE;
+ }
+ eat_opt_white( &cur2 );
+ if (*cur2 != ']') {
+ report_error( ctx, "Expected `]'" );
+ return FALSE;
+ }
+ cur2++;
- decl.Semantic.Index = index;
+ decl.Semantic.Index = index;
- cur = cur2;
- }
+ cur = cur2;
+ }
- decl.Declaration.Semantic = 1;
- decl.Semantic.Name = i;
+ decl.Declaration.Semantic = 1;
+ decl.Semantic.Name = i;
- ctx->cur = cur;
- break;
+ ctx->cur = cur;
+ break;
+ }
}
}
}
diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst
index 1155ff391c1..548a9a39855 100644
--- a/src/gallium/docs/source/tgsi.rst
+++ b/src/gallium/docs/source/tgsi.rst
@@ -1795,6 +1795,12 @@ of TGSI_FILE.
UsageMask field specifies which of the register components can be accessed
and is one of TGSI_WRITEMASK.
+The Local flag specifies that a given value isn't intended for
+subroutine parameter passing and, as a result, the implementation
+isn't required to give any guarantees of it being preserved across
+subroutine boundaries. As it's merely a compiler hint, the
+implementation is free to ignore it.
+
If Dimension flag is set to 1, a Declaration Dimension token follows.
If Semantic flag is set to 1, a Declaration Semantic token follows.
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 2579112a25b..5325e43896c 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -120,7 +120,8 @@ struct tgsi_declaration
unsigned Semantic : 1; /**< BOOL, any semantic info? */
unsigned Interpolate : 1; /**< any interpolation info? */
unsigned Invariant : 1; /**< invariant optimization? */
- unsigned Padding : 8;
+ unsigned Local : 1; /**< optimize as subroutine local variable? */
+ unsigned Padding : 7;
};
struct tgsi_declaration_range