tgsi/ureg: add shared variables support for compute shaders

This introduces TGSI_FILE_MEMORY for shared, global and local memory.
Only shared memory is currently supported.

Changes from v2:
 - introduce TGSI_FILE_MEMORY

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Samuel Pitoiset
2016-01-16 23:08:55 +01:00
parent 5e09ac78e5
commit a8328e3a50
7 changed files with 48 additions and 1 deletions

View File

@@ -111,6 +111,7 @@ tgsi_default_declaration( void )
declaration.Local = 0; declaration.Local = 0;
declaration.Array = 0; declaration.Array = 0;
declaration.Atomic = 0; declaration.Atomic = 0;
declaration.Shared = 0;
declaration.Padding = 0; declaration.Padding = 0;
return declaration; return declaration;

View File

@@ -364,6 +364,11 @@ iter_declaration(
TXT(", ATOMIC"); TXT(", ATOMIC");
} }
if (decl->Declaration.File == TGSI_FILE_MEMORY) {
if (decl->Declaration.Shared)
TXT(", SHARED");
}
if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
TXT(", "); TXT(", ");
ENM(decl->SamplerView.Resource, tgsi_texture_names); ENM(decl->SamplerView.Resource, tgsi_texture_names);

View File

@@ -57,6 +57,7 @@ static const char *tgsi_file_names[] =
"IMAGE", "IMAGE",
"SVIEW", "SVIEW",
"BUFFER", "BUFFER",
"MEMORY",
}; };
const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] = const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =

View File

@@ -1381,6 +1381,9 @@ static boolean parse_declaration( struct translate_ctx *ctx )
if (str_match_nocase_whole(&cur, "ATOMIC")) { if (str_match_nocase_whole(&cur, "ATOMIC")) {
decl.Declaration.Atomic = 1; decl.Declaration.Atomic = 1;
ctx->cur = cur; ctx->cur = cur;
} else if (str_match_nocase_whole(&cur, "SHARED")) {
decl.Declaration.Shared = 1;
ctx->cur = cur;
} }
} else { } else {
if (str_match_nocase_whole(&cur, "LOCAL")) { if (str_match_nocase_whole(&cur, "LOCAL")) {

View File

@@ -189,6 +189,8 @@ struct ureg_program
unsigned nr_instructions; unsigned nr_instructions;
struct ureg_tokens domain[2]; struct ureg_tokens domain[2];
bool use_shared_memory;
}; };
static union tgsi_any_token error_tokens[32]; static union tgsi_any_token error_tokens[32];
@@ -727,6 +729,16 @@ struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr,
return reg; return reg;
} }
/* Allocate a shared memory area.
*/
struct ureg_src ureg_DECL_shared_memory(struct ureg_program *ureg)
{
struct ureg_src reg = ureg_src_register(TGSI_FILE_MEMORY, 0);
ureg->use_shared_memory = true;
return reg;
}
static int static int
match_or_expand_immediate64( const unsigned *v, match_or_expand_immediate64( const unsigned *v,
int type, int type,
@@ -1653,6 +1665,23 @@ emit_decl_buffer(struct ureg_program *ureg,
out[1].decl_range.Last = index; out[1].decl_range.Last = index;
} }
static void
emit_decl_shared_memory(struct ureg_program *ureg)
{
union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 2);
out[0].value = 0;
out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
out[0].decl.NrTokens = 2;
out[0].decl.File = TGSI_FILE_MEMORY;
out[0].decl.UsageMask = TGSI_WRITEMASK_XYZW;
out[0].decl.Shared = true;
out[1].value = 0;
out[1].decl_range.First = 0;
out[1].decl_range.Last = 0;
}
static void static void
emit_immediate( struct ureg_program *ureg, emit_immediate( struct ureg_program *ureg,
const unsigned *v, const unsigned *v,
@@ -1825,6 +1854,9 @@ static void emit_decls( struct ureg_program *ureg )
emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic); emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic);
} }
if (ureg->use_shared_memory)
emit_decl_shared_memory(ureg);
if (ureg->const_decls.nr_constant_ranges) { if (ureg->const_decls.nr_constant_ranges) {
for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) { for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) {
emit_decl_range(ureg, emit_decl_range(ureg,

View File

@@ -337,6 +337,9 @@ ureg_DECL_image(struct ureg_program *ureg,
struct ureg_src struct ureg_src
ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic); ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic);
struct ureg_src
ureg_DECL_shared_memory(struct ureg_program *ureg);
static inline struct ureg_src static inline struct ureg_src
ureg_imm4f( struct ureg_program *ureg, ureg_imm4f( struct ureg_program *ureg,
float a, float b, float a, float b,

View File

@@ -79,6 +79,7 @@ enum tgsi_file_type {
TGSI_FILE_IMAGE =10, TGSI_FILE_IMAGE =10,
TGSI_FILE_SAMPLER_VIEW =11, TGSI_FILE_SAMPLER_VIEW =11,
TGSI_FILE_BUFFER =12, TGSI_FILE_BUFFER =12,
TGSI_FILE_MEMORY =13,
TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */ TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */
}; };
@@ -129,7 +130,8 @@ struct tgsi_declaration
unsigned Local : 1; /**< optimize as subroutine local variable? */ unsigned Local : 1; /**< optimize as subroutine local variable? */
unsigned Array : 1; /**< extra array info? */ unsigned Array : 1; /**< extra array info? */
unsigned Atomic : 1; /**< atomic only? for TGSI_FILE_BUFFER */ unsigned Atomic : 1; /**< atomic only? for TGSI_FILE_BUFFER */
unsigned Padding : 5; unsigned Shared : 1; /**< shared storage for TGSI_FILE_MEMORY */
unsigned Padding : 4;
}; };
struct tgsi_declaration_range struct tgsi_declaration_range