For patches 1-3, 6, 7:
Reviewed-by: Marek Olšák
Marek
On Thu, Aug 17, 2017 at 1:03 PM, Timothy Arceri 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, , >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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev