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:
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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] =
|
||||||
|
@@ -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")) {
|
||||||
|
@@ -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,
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user