I'd be fine with a new TGSI_FILE_MEMORY which provided options for shared, global, and local(/private?) memory. I believe the old TGSI_FILE_RESOURCE had support for these in a hacky way, this would be the clean way of doing it.
On Tue, Jan 26, 2016 at 5:52 AM, Marek Olšák <mar...@gmail.com> wrote: > I think it would be better to add a new TGSI file for shared variables. > > Marek > > On Sun, Jan 24, 2016 at 10:09 PM, Samuel Pitoiset > <samuel.pitoi...@gmail.com> wrote: >> This adds a new SHARED attribute to TGSI_FILE_BUFFER. Only >> one shared buffer can be declared and its size is defined by >> MAX_COMPUTE_SHARED_SIZE. Note that an atomic buffer can also >> be shared. >> >> Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> >> --- >> src/gallium/auxiliary/tgsi/tgsi_build.c | 1 + >> src/gallium/auxiliary/tgsi/tgsi_dump.c | 2 ++ >> src/gallium/auxiliary/tgsi/tgsi_text.c | 3 +++ >> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 11 ++++++++--- >> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 3 ++- >> src/gallium/include/pipe/p_shader_tokens.h | 3 ++- >> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 15 ++++++++------- >> 7 files changed, 26 insertions(+), 12 deletions(-) >> >> 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..5305d90 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c >> @@ -362,6 +362,8 @@ iter_declaration( >> if (decl->Declaration.File == TGSI_FILE_BUFFER) { >> if (decl->Declaration.Atomic) >> TXT(", ATOMIC"); >> + if (decl->Declaration.Shared) >> + TXT(", SHARED"); >> } >> >> if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { >> 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 d681150..52e3c66 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c >> @@ -168,6 +168,7 @@ struct ureg_program >> struct { >> unsigned index; >> bool atomic; >> + bool shared; >> } buffer[PIPE_MAX_SHADER_BUFFERS]; >> unsigned nr_buffers; >> >> @@ -707,7 +708,7 @@ ureg_DECL_image(struct ureg_program *ureg, >> /* Allocate a new buffer. >> */ >> struct ureg_src ureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, >> - bool atomic) >> + bool atomic, bool shared) >> { >> struct ureg_src reg = ureg_src_register(TGSI_FILE_BUFFER, nr); >> unsigned i; >> @@ -719,6 +720,7 @@ struct ureg_src ureg_DECL_buffer(struct ureg_program >> *ureg, unsigned nr, >> if (i < PIPE_MAX_SHADER_BUFFERS) { >> ureg->buffer[i].index = nr; >> ureg->buffer[i].atomic = atomic; >> + ureg->buffer[i].shared = shared; >> ureg->nr_buffers++; >> return reg; >> } >> @@ -1637,7 +1639,8 @@ emit_decl_image(struct ureg_program *ureg, >> static void >> emit_decl_buffer(struct ureg_program *ureg, >> unsigned index, >> - bool atomic) >> + bool atomic, >> + bool shared) >> { >> union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 2); >> >> @@ -1647,6 +1650,7 @@ emit_decl_buffer(struct ureg_program *ureg, >> out[0].decl.File = TGSI_FILE_BUFFER; >> out[0].decl.UsageMask = 0xf; >> out[0].decl.Atomic = atomic; >> + out[0].decl.Shared = shared; >> >> out[1].value = 0; >> out[1].decl_range.First = index; >> @@ -1822,7 +1826,8 @@ static void emit_decls( struct ureg_program *ureg ) >> } >> >> for (i = 0; i < ureg->nr_buffers; i++) { >> - emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic); >> + emit_decl_buffer(ureg, ureg->buffer[i].index, ureg->buffer[i].atomic, >> + ureg->buffer[i].shared); >> } >> >> if (ureg->const_decls.nr_constant_ranges) { >> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> b/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> index 86e58a9..c4f184f 100644 >> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h >> @@ -335,7 +335,8 @@ ureg_DECL_image(struct ureg_program *ureg, >> boolean raw); >> >> 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, >> + bool shared); >> >> static inline struct ureg_src >> ureg_imm4f( struct ureg_program *ureg, >> diff --git a/src/gallium/include/pipe/p_shader_tokens.h >> b/src/gallium/include/pipe/p_shader_tokens.h >> index 6539017..cb1995e 100644 >> --- a/src/gallium/include/pipe/p_shader_tokens.h >> +++ b/src/gallium/include/pipe/p_shader_tokens.h >> @@ -129,7 +129,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_BUFFER */ >> + unsigned Padding : 4; >> }; >> >> struct tgsi_declaration_range >> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> index 870991d..ed8778f 100644 >> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> @@ -395,7 +395,7 @@ public: >> int samplers_used; >> glsl_base_type sampler_types[PIPE_MAX_SAMPLERS]; >> int sampler_targets[PIPE_MAX_SAMPLERS]; /**< One of TGSI_TEXTURE_* */ >> - int buffers_used; >> + uint64_t buffers_used; >> bool indirect_addr_consts; >> int wpos_transform_const; >> >> @@ -3937,7 +3937,7 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program >> *prog) >> is_resource_instruction(inst->op) || >> inst->op == TGSI_OPCODE_STORE)) { >> if (inst->buffer.file == PROGRAM_BUFFER) >> - v->buffers_used |= 1 << inst->buffer.index; >> + v->buffers_used |= 1ULL << inst->buffer.index; >> } >> } >> prog->SamplersUsed = v->samplers_used; >> @@ -5855,19 +5855,20 @@ st_translate_program( >> } >> >> for (i = 0; i < frag_const->MaxAtomicBuffers; i++) { >> - if (program->buffers_used & (1 << i)) { >> - t->buffers[i] = ureg_DECL_buffer(ureg, i, true); >> + if (program->buffers_used & (1ULL << i)) { >> + t->buffers[i] = ureg_DECL_buffer(ureg, i, true, false); >> } >> } >> >> for (; i < frag_const->MaxAtomicBuffers + >> frag_const->MaxShaderStorageBlocks; >> i++) { >> - if (program->buffers_used & (1 << i)) { >> - t->buffers[i] = ureg_DECL_buffer(ureg, i, false); >> + if (program->buffers_used & (1ULL << i)) { >> + t->buffers[i] = ureg_DECL_buffer(ureg, i, false, false); >> } >> } >> >> - >> + if (program->buffers_used & (1ULL << i)) >> + t->buffers[i] = ureg_DECL_buffer(ureg, i, false, true); >> >> /* Emit each instruction in turn: >> */ >> -- >> 2.6.4 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev