On Sat, Feb 6, 2016 at 5:04 PM, Samuel Pitoiset <[email protected]> wrote: > 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 <[email protected]> > --- > src/gallium/auxiliary/tgsi/tgsi_build.c | 1 + > src/gallium/auxiliary/tgsi/tgsi_dump.c | 5 +++++ > src/gallium/auxiliary/tgsi/tgsi_strings.c | 1 + > src/gallium/auxiliary/tgsi/tgsi_text.c | 3 +++ > src/gallium/auxiliary/tgsi/tgsi_ureg.c | 32 > ++++++++++++++++++++++++++++++ > src/gallium/auxiliary/tgsi/tgsi_ureg.h | 3 +++ > src/gallium/include/pipe/p_shader_tokens.h | 4 +++- > 7 files changed, 48 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c > b/src/gallium/auxiliary/tgsi/tgsi_build.c > index 83f5062..cfe9b92 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_build.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c > @@ -111,6 +111,7 @@ tgsi_default_declaration( void ) > declaration.Local = 0; > declaration.Array = 0; > declaration.Atomic = 0; > + declaration.Shared = 0; > declaration.Padding = 0; > > return declaration; > diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c > b/src/gallium/auxiliary/tgsi/tgsi_dump.c > index 2ad29b9..36f0cc5 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c > @@ -364,6 +364,11 @@ iter_declaration( > TXT(", ATOMIC"); > } > > + if (decl->Declaration.File == TGSI_FILE_MEMORY) { > + if (decl->Declaration.Shared) > + TXT(", SHARED"); > + } > + > if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { > TXT(", "); > ENM(decl->SamplerView.Resource, tgsi_texture_names); > diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c > b/src/gallium/auxiliary/tgsi/tgsi_strings.c > index f2d70d4..b15ae69 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c > @@ -57,6 +57,7 @@ static const char *tgsi_file_names[] = > "IMAGE", > "SVIEW", > "BUFFER", > + "MEMORY", > }; > > const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] = > diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c > b/src/gallium/auxiliary/tgsi/tgsi_text.c > index 97b1869..ef43ebc 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_text.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c > @@ -1381,6 +1381,9 @@ static boolean parse_declaration( struct translate_ctx > *ctx ) > if (str_match_nocase_whole(&cur, "ATOMIC")) { > decl.Declaration.Atomic = 1; > ctx->cur = cur; > + } else if (str_match_nocase_whole(&cur, "SHARED")) { > + decl.Declaration.Shared = 1; > + ctx->cur = cur; > } > } else { > if (str_match_nocase_whole(&cur, "LOCAL")) { > diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c > b/src/gallium/auxiliary/tgsi/tgsi_ureg.c > index 9654ac5..e1a7278 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c > @@ -189,6 +189,8 @@ struct ureg_program > unsigned nr_instructions; > > struct ureg_tokens domain[2]; > + > + bool use_shared_memory; > }; > > 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; > } > > +/* 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 > match_or_expand_immediate64( const unsigned *v, > int type, > @@ -1654,6 +1666,23 @@ emit_decl_buffer(struct ureg_program *ureg, > } > > 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 > emit_immediate( struct ureg_program *ureg, > const unsigned *v, > unsigned type ) > @@ -1825,6 +1854,9 @@ static void emit_decls( struct ureg_program *ureg ) > 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) { > for (i = 0; i < ureg->const_decls.nr_constant_ranges; i++) { > emit_decl_range(ureg, > diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h > b/src/gallium/auxiliary/tgsi/tgsi_ureg.h > index 86e58a9..6a3b5dd 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h > @@ -337,6 +337,9 @@ ureg_DECL_image(struct ureg_program *ureg, > struct ureg_src > 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 > ureg_imm4f( struct ureg_program *ureg, > float a, float b, > diff --git a/src/gallium/include/pipe/p_shader_tokens.h > b/src/gallium/include/pipe/p_shader_tokens.h > index 6539017..9d4a96a 100644 > --- a/src/gallium/include/pipe/p_shader_tokens.h > +++ b/src/gallium/include/pipe/p_shader_tokens.h > @@ -79,6 +79,7 @@ enum tgsi_file_type { > TGSI_FILE_IMAGE =10, > TGSI_FILE_SAMPLER_VIEW =11, > TGSI_FILE_BUFFER =12, > + TGSI_FILE_MEMORY =13, > TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */ > }; > > @@ -129,7 +130,8 @@ struct tgsi_declaration > unsigned Local : 1; /**< optimize as subroutine local variable? */ > unsigned Array : 1; /**< extra array info? */ > unsigned Atomic : 1; /**< atomic only? for TGSI_FILE_BUFFER */ > - unsigned Padding : 5; > + unsigned Shared : 1; /**< shared storage for TGSI_FILE_MEMORY */
Might as well go all out and steal 2 bits for shared/private/global? > + unsigned Padding : 4; > }; > > struct tgsi_declaration_range > -- > 2.6.4 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
