[Mesa-dev] [PATCH 07/11] mesa/st: create add_buffer_to_load_and_stores() helper
Marek Olšák
maraeo at gmail.com
Mon Aug 21 21:52:20 UTC 2017
For patches 1-3, 6, 7:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Thu, Aug 17, 2017 at 1:03 PM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> Will be used to add LOAD support to UBOs.
> ---
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 46 ++++++++++++++++++------------
> 1 file changed, 27 insertions(+), 19 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 9688400ed4..f77c85a944 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -1240,20 +1240,46 @@ attrib_type_size(const struct glsl_type *type, bool is_vs_input)
> {
> return type->count_attribute_slots(is_vs_input);
> }
>
> static int
> type_size(const struct glsl_type *type)
> {
> return type->count_attribute_slots(false);
> }
>
> +static void
> +add_buffer_to_load_and_stores(glsl_to_tgsi_instruction *inst, st_src_reg *buf,
> + exec_list *instructions, ir_constant *access)
> +{
> + /**
> + * emit_asm() might have actually split the op into pieces, e.g. for
> + * double stores. We have to go back and fix up all the generated ops.
> + */
> + unsigned op = inst->op;
> + do {
> + inst->resource = *buf;
> + if (access)
> + inst->buffer_access = access->value.u[0];
> +
> + if (inst == instructions->get_head_raw())
> + break;
> + inst = (glsl_to_tgsi_instruction *)inst->get_prev();
> +
> + if (inst->op == TGSI_OPCODE_UADD) {
> + if (inst == instructions->get_head_raw())
> + break;
> + inst = (glsl_to_tgsi_instruction *)inst->get_prev();
> + }
> + } while (inst->op == op && inst->resource.file == PROGRAM_UNDEFINED);
> +}
> +
> /**
> * If the given GLSL type is an array or matrix or a structure containing
> * an array/matrix member, return true. Else return false.
> *
> * This is used to determine which kind of temp storage (PROGRAM_TEMPORARY
> * or PROGRAM_ARRAY) should be used for variables of this type. Anytime
> * we have an array that might be indexed with a variable, we need to use
> * the later storage type.
> */
> static bool
> @@ -3635,39 +3661,21 @@ glsl_to_tgsi_visitor::visit_ssbo_intrinsic(ir_call *ir)
> inst = emit_asm(ir, opcode, dst, off, data, data2);
> }
>
> param = param->get_next();
> ir_constant *access = NULL;
> if (!param->is_tail_sentinel()) {
> access = ((ir_instruction *)param)->as_constant();
> assert(access);
> }
>
> - /* The emit_asm() might have actually split the op into pieces, e.g. for
> - * double stores. We have to go back and fix up all the generated ops.
> - */
> - unsigned op = inst->op;
> - do {
> - inst->resource = buffer;
> - if (access)
> - inst->buffer_access = access->value.u[0];
> -
> - if (inst == this->instructions.get_head_raw())
> - break;
> - inst = (glsl_to_tgsi_instruction *)inst->get_prev();
> -
> - if (inst->op == TGSI_OPCODE_UADD) {
> - if (inst == this->instructions.get_head_raw())
> - break;
> - inst = (glsl_to_tgsi_instruction *)inst->get_prev();
> - }
> - } while (inst->op == op && inst->resource.file == PROGRAM_UNDEFINED);
> + add_buffer_to_load_and_stores(inst, &buffer, &this->instructions, access);
> }
>
> void
> glsl_to_tgsi_visitor::visit_membar_intrinsic(ir_call *ir)
> {
> switch (ir->callee->intrinsic_id) {
> case ir_intrinsic_memory_barrier:
> emit_asm(ir, TGSI_OPCODE_MEMBAR, undef_dst,
> st_src_reg_for_int(TGSI_MEMBAR_SHADER_BUFFER |
> TGSI_MEMBAR_ATOMIC_BUFFER |
> --
> 2.13.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list