RES is split into two -- BUFFER and IMAGE.
On Mon, Jan 4, 2016 at 3:22 PM, Samuel Pitoiset <[email protected]> wrote: > I assume this is going to replace the old RES stuff? > > > On 01/03/2016 05:37 AM, Ilia Mirkin wrote: >> >> Signed-off-by: Ilia Mirkin <[email protected]> >> --- >> src/gallium/auxiliary/tgsi/tgsi_dump.c | 5 +++ >> src/gallium/auxiliary/tgsi/tgsi_strings.c | 1 + >> src/gallium/auxiliary/tgsi/tgsi_text.c | 5 +++ >> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 52 >> ++++++++++++++++++++++++++++++ >> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 3 ++ >> src/gallium/include/pipe/p_shader_tokens.h | 4 ++- >> 6 files changed, 69 insertions(+), 1 deletion(-) >> >> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c >> b/src/gallium/auxiliary/tgsi/tgsi_dump.c >> index dad3839..de3aae5 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c >> @@ -359,6 +359,11 @@ iter_declaration( >> TXT(", RAW"); >> } >> >> + if (decl->Declaration.File == TGSI_FILE_BUFFER) { >> + if (decl->Declaration.Atomic) >> + TXT(", ATOMIC"); >> + } >> + >> 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 ae30399..c0dd044 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c >> @@ -56,6 +56,7 @@ static const char *tgsi_file_names[] = >> "SV", >> "IMAGE", >> "SVIEW", >> + "BUFFER", >> }; >> >> 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 a45ab90..d72d843 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c >> @@ -1350,6 +1350,11 @@ static boolean parse_declaration( struct >> translate_ctx *ctx ) >> decl.SamplerView.ReturnTypeX; >> } >> ctx->cur = cur; >> + } else if (file == TGSI_FILE_BUFFER) { >> + if (str_match_nocase_whole(&cur, "ATOMIC")) { >> + decl.Declaration.Atomic = 1; >> + ctx->cur = cur; >> + } >> } else { >> if (str_match_nocase_whole(&cur, "LOCAL")) { >> decl.Declaration.Local = 1; >> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> index ee23df9..6d5092b 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> @@ -165,6 +165,12 @@ struct ureg_program >> } image[PIPE_MAX_SHADER_IMAGES]; >> unsigned nr_images; >> >> + struct { >> + unsigned index; >> + bool atomic; >> + } buffer[PIPE_MAX_SHADER_BUFFERS]; >> + unsigned nr_buffers; >> + >> struct util_bitmask *free_temps; >> struct util_bitmask *local_temps; >> struct util_bitmask *decl_temps; >> @@ -689,6 +695,29 @@ ureg_DECL_image(struct ureg_program *ureg, >> return reg; >> } >> >> +/* Allocate a new buffer. >> + */ >> +struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, >> + bool atomic) >> +{ >> + struct ureg_src reg = ureg_src_register(TGSI_FILE_BUFFER, nr); >> + unsigned i; >> + >> + for (i = 0; i < ureg->nr_buffers; i++) >> + if (ureg->buffer[i].index == nr) >> + return reg; >> + >> + if (i < PIPE_MAX_SHADER_BUFFERS) { >> + ureg->buffer[i].index = nr; >> + ureg->buffer[i].atomic = atomic; >> + ureg->nr_buffers++; >> + return reg; >> + } >> + >> + assert(0); >> + return reg; >> +} >> + >> static int >> match_or_expand_immediate64( const unsigned *v, >> int type, >> @@ -1546,6 +1575,25 @@ emit_decl_image(struct ureg_program *ureg, >> } >> >> static void >> +emit_decl_buffer(struct ureg_program *ureg, >> + unsigned index, >> + bool atomic) >> +{ >> + 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_BUFFER; >> + out[0].decl.UsageMask = 0xf; >> + out[0].decl.Atomic = atomic; >> + >> + out[1].value = 0; >> + out[1].decl_range.First = index; >> + out[1].decl_range.Last = index; >> +} >> + >> +static void >> emit_immediate( struct ureg_program *ureg, >> const unsigned *v, >> unsigned type ) >> @@ -1713,6 +1761,10 @@ static void emit_decls( struct ureg_program *ureg ) >> ureg->image[i].raw); >> } >> >> + for (i = 0; i < ureg->nr_buffers; i++) { >> + emit_decl_buffer(ureg, ureg->buffer[i].index, >> ureg->buffer[i].atomic); >> + } >> + >> 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 bba2afb..e25c961 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> @@ -335,6 +335,9 @@ ureg_DECL_image(struct ureg_program *ureg, >> boolean wr, >> boolean raw); >> >> +struct ureg_src >> +ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic); >> + >> 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 d182962..815aff1 100644 >> --- a/src/gallium/include/pipe/p_shader_tokens.h >> +++ b/src/gallium/include/pipe/p_shader_tokens.h >> @@ -78,6 +78,7 @@ enum tgsi_file_type { >> TGSI_FILE_SYSTEM_VALUE =9, >> TGSI_FILE_IMAGE =10, >> TGSI_FILE_SAMPLER_VIEW =11, >> + TGSI_FILE_BUFFER =12, >> TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */ >> }; >> >> @@ -127,7 +128,8 @@ struct tgsi_declaration >> unsigned Invariant : 1; /**< invariant optimization? */ >> unsigned Local : 1; /**< optimize as subroutine local >> variable? */ >> unsigned Array : 1; /**< extra array info? */ >> - unsigned Padding : 6; >> + unsigned Atomic : 1; /**< atomic only? for TGSI_FILE_BUFFER */ >> + unsigned Padding : 5; >> }; >> >> struct tgsi_declaration_range >> > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
