[Mesa-dev] [PATCH 3/9] glsl/lower_64bit: extract non-64bit sources from vectors.

Gustaw Smolarczyk wielkiegie at gmail.com
Sat Feb 3 12:50:10 UTC 2018


2018-02-03 11:26 GMT+01:00 Erik Faye-Lund <kusmabite at gmail.com>:

>
>
> On Feb 1, 2018 04:35, "Dave Airlie" <airlied at gmail.com> wrote:
>
> From: Dave Airlie <airlied at redhat.com>
>
> In order to deal with conversions properly we need to extract
> non-64bit sources from vectors instead of expanding them as
> the 64-bit code does.
>
> We need non-64bit sources for the 32->64 conversion functions.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/compiler/glsl/lower_64bit.cpp | 38 ++++++++++++++++++++++++++++++
> ++++----
>  1 file changed, 34 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/glsl/lower_64bit.cpp
> b/src/compiler/glsl/lower_64bit.cpp
> index ac62d1db1e..c7c6d1cb31 100644
> --- a/src/compiler/glsl/lower_64bit.cpp
> +++ b/src/compiler/glsl/lower_64bit.cpp
> @@ -52,6 +52,7 @@ using namespace ir_builder;
>
>  namespace lower_64bit {
>  void expand_source(ir_factory &, ir_rvalue *val, ir_variable
> **expanded_src);
> +void extract_source(ir_factory &, ir_rvalue *val, ir_variable
> **extracted_src);
>
>  ir_dereference_variable *compact_destination(ir_factory &,
>                                               const glsl_type *type,
> @@ -226,6 +227,25 @@ lower_64bit::expand_source(ir_factory &body,
>        expanded_src[i] = expanded_src[0];
>  }
>
> +void
> +lower_64bit::extract_source(ir_factory &body,
> +                            ir_rvalue *val,
> +                            ir_variable **extracted_src)
> +{
> +   ir_variable *const temp = body.make_temp(val->type, "tmp");
> +
> +   body.emit(assign(temp, val));
> +   unsigned i;
> +   for (i = 0; i < val->type->vector_elements; i++) {
> +      extracted_src[i] = body.make_temp(val->type->get_scalar_type(),
> "extracted_source");
> +
> +      body.emit(assign(extracted_src[i], swizzle(temp, i, 1)));
> +   }
> +
> +   for (/* empty */; i < 4; i++)
> +      extracted_src[i] = extracted_src[0];
> +}
> +
>  /**
>   * Convert a series of uvec2 results into a single 64-bit integer vector
>   */
> @@ -262,14 +282,24 @@ lower_64bit::lower_op_to_function_call(ir_instruction
> *base_ir,
>     void *const mem_ctx = ralloc_parent(ir);
>     exec_list instructions;
>     unsigned source_components = 0;
> -   const glsl_type *const result_type =
> -      ir->type->base_type == GLSL_TYPE_UINT64
> -      ? glsl_type::uvec2_type : glsl_type::ivec2_type;
> +   const glsl_type *result_type;
> +
> +   if (ir->type->is_64bit()) {
> +      if (ir->type->base_type == GLSL_TYPE_UINT64 ||
> +          ir->type->base_type == GLSL_TYPE_DOUBLE)
> +         result_type = glsl_type::uvec2_type;
> +      else
> +         result_type = glsl_type::ivec2_type;
> +   } else
> +      result_type = ir->type->get_scalar_type();
>
>     ir_factory body(&instructions, mem_ctx);
>
>     for (unsigned i = 0; i < num_operands; i++) {
> -      expand_source(body, ir->operands[i], src[i]);
> +      if (ir->operands[i]->type->is_64bit())
> +         expand_source(body, ir->operands[i], src[i]);
> +      else
> +         extract_source(body, ir->operands[i], src[i]);
>
>
> This change looks like a nop to me. Was the different sides of the else
> supposed to do different things?
>

Hi, just passing by.

Though they look very similarly, one is ex-pand-_source and the other is
ex-tract-_source.

Regards,
Gustaw Smolarczyk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180203/58a04aad/attachment.html>


More information about the mesa-dev mailing list