[Mesa-dev] [PATCH v5 1/6] mesa/st: glsl_to_tgsi move some helper classes to extra files

Nicolai Hähnle nhaehnle at gmail.com
Mon Jun 26 12:13:34 UTC 2017


On 25.06.2017 09:22, Gert Wollny wrote:
> To prepare the implementation of a temp register lifetime tracker
> some of the classes are moved into seperate header/implementation
> files to make them accessible from other files.
> 
> Specifically these are:
> 
>      class st_src_reg;
>      class st_dst_reg;
>      class glsl_to_tgsi_instruction;
>      struct rename_reg_pair;
> 
>      int swizzle_for_type(const glsl_type *type, int component);
> 
>    as inline:
> 
>      bool is_resource_instruction(unsigned opcode);
>      unsigned num_inst_dst_regs(const glsl_to_tgsi_instruction *op);
>      unsigned num_inst_src_regs(const glsl_to_tgsi_instruction *op);
> ---
>   src/mesa/Makefile.sources                          |   2 +
>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp         | 288 +--------------------
>   src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp | 205 +++++++++++++++
>   src/mesa/state_tracker/st_glsl_to_tgsi_private.h   | 164 ++++++++++++
>   4 files changed, 374 insertions(+), 285 deletions(-)
>   create mode 100644 src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp
>   create mode 100644 src/mesa/state_tracker/st_glsl_to_tgsi_private.h
> 
> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
> index b80882fb8d..21f9167bda 100644
> --- a/src/mesa/Makefile.sources
> +++ b/src/mesa/Makefile.sources
> @@ -507,6 +507,8 @@ STATETRACKER_FILES = \
>   	state_tracker/st_glsl_to_nir.cpp \
>   	state_tracker/st_glsl_to_tgsi.cpp \
>   	state_tracker/st_glsl_to_tgsi.h \
> +	state_tracker/st_glsl_to_tgsi_private.cpp \
> +	state_tracker/st_glsl_to_tgsi_private.h \
>   	state_tracker/st_glsl_types.cpp \
>   	state_tracker/st_glsl_types.h \
>   	state_tracker/st_manager.c \
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 7852941acd..528fc4cc64 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -55,6 +55,7 @@
>   #include "st_glsl_types.h"
>   #include "st_nir.h"
>   #include "st_shader_cache.h"
> +#include "st_glsl_to_tgsi_private.h"
>   
>   #include "util/hash_table.h"
>   #include <algorithm>
> @@ -65,251 +66,7 @@
>   
>   #define MAX_GLSL_TEXTURE_OFFSET 4
>   
> -class st_src_reg;
> -class st_dst_reg;
> -
> -static int swizzle_for_size(int size);
> -
> -static int swizzle_for_type(const glsl_type *type, int component = 0)
> -{
> -   unsigned num_elements = 4;
> -
> -   if (type) {
> -      type = type->without_array();
> -      if (type->is_scalar() || type->is_vector() || type->is_matrix())
> -         num_elements = type->vector_elements;
> -   }
> -
> -   int swizzle = swizzle_for_size(num_elements);
> -   assert(num_elements + component <= 4);
> -
> -   swizzle += component * MAKE_SWIZZLE4(1, 1, 1, 1);
> -   return swizzle;
> -}
> -
> -/**
> - * This struct is a corresponding struct to TGSI ureg_src.
> - */
> -class st_src_reg {
> -public:
> -   st_src_reg(gl_register_file file, int index, const glsl_type *type,
> -              int component = 0, unsigned array_id = 0)
> -   {
> -      assert(file != PROGRAM_ARRAY || array_id != 0);
> -      this->file = file;
> -      this->index = index;
> -      this->swizzle = swizzle_for_type(type, component);
> -      this->negate = 0;
> -      this->abs = 0;
> -      this->index2D = 0;
> -      this->type = type ? type->base_type : GLSL_TYPE_ERROR;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->double_reg2 = false;
> -      this->array_id = array_id;
> -      this->is_double_vertex_input = false;
> -   }
> -
> -   st_src_reg(gl_register_file file, int index, enum glsl_base_type type)
> -   {
> -      assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> -      this->type = type;
> -      this->file = file;
> -      this->index = index;
> -      this->index2D = 0;
> -      this->swizzle = SWIZZLE_XYZW;
> -      this->negate = 0;
> -      this->abs = 0;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->double_reg2 = false;
> -      this->array_id = 0;
> -      this->is_double_vertex_input = false;
> -   }
> -
> -   st_src_reg(gl_register_file file, int index, enum glsl_base_type type, int index2D)
> -   {
> -      assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> -      this->type = type;
> -      this->file = file;
> -      this->index = index;
> -      this->index2D = index2D;
> -      this->swizzle = SWIZZLE_XYZW;
> -      this->negate = 0;
> -      this->abs = 0;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->double_reg2 = false;
> -      this->array_id = 0;
> -      this->is_double_vertex_input = false;
> -   }
> -
> -   st_src_reg()
> -   {
> -      this->type = GLSL_TYPE_ERROR;
> -      this->file = PROGRAM_UNDEFINED;
> -      this->index = 0;
> -      this->index2D = 0;
> -      this->swizzle = 0;
> -      this->negate = 0;
> -      this->abs = 0;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->double_reg2 = false;
> -      this->array_id = 0;
> -      this->is_double_vertex_input = false;
> -   }
> -
> -   explicit st_src_reg(st_dst_reg reg);
> -
> -   int32_t index; /**< temporary index, VERT_ATTRIB_*, VARYING_SLOT_*, etc. */
> -   int16_t index2D;
> -   uint16_t swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */
> -   int negate:4; /**< NEGATE_XYZW mask from mesa */
> -   unsigned abs:1;
> -   enum glsl_base_type type:5; /** GLSL_TYPE_* from GLSL IR (enum glsl_base_type) */
> -   unsigned has_index2:1;
> -   gl_register_file file:5; /**< PROGRAM_* from Mesa */
> -   /*
> -    * Is this the second half of a double register pair?
> -    * currently used for input mapping only.
> -    */
> -   unsigned double_reg2:1;
> -   unsigned is_double_vertex_input:1;
> -   unsigned array_id:10;
> -
> -   /** Register index should be offset by the integer in this reg. */
> -   st_src_reg *reladdr;
> -   st_src_reg *reladdr2;
> -
> -   st_src_reg get_abs()
> -   {
> -      st_src_reg reg = *this;
> -      reg.negate = 0;
> -      reg.abs = 1;
> -      return reg;
> -   }
> -};
> -
> -class st_dst_reg {
> -public:
> -   st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type, int index)
> -   {
> -      assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> -      this->file = file;
> -      this->index = index;
> -      this->index2D = 0;
> -      this->writemask = writemask;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->type = type;
> -      this->array_id = 0;
> -   }
> -
> -   st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type)
> -   {
> -      assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> -      this->file = file;
> -      this->index = 0;
> -      this->index2D = 0;
> -      this->writemask = writemask;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->type = type;
> -      this->array_id = 0;
> -   }
> -
> -   st_dst_reg()
> -   {
> -      this->type = GLSL_TYPE_ERROR;
> -      this->file = PROGRAM_UNDEFINED;
> -      this->index = 0;
> -      this->index2D = 0;
> -      this->writemask = 0;
> -      this->reladdr = NULL;
> -      this->reladdr2 = NULL;
> -      this->has_index2 = false;
> -      this->array_id = 0;
> -   }
> -
> -   explicit st_dst_reg(st_src_reg reg);
> -
> -   int32_t index; /**< temporary index, VERT_ATTRIB_*, VARYING_SLOT_*, etc. */
> -   int16_t index2D;
> -   gl_register_file file:5; /**< PROGRAM_* from Mesa */
> -   unsigned writemask:4; /**< Bitfield of WRITEMASK_[XYZW] */
> -   enum glsl_base_type type:5; /** GLSL_TYPE_* from GLSL IR (enum glsl_base_type) */
> -   unsigned has_index2:1;
> -   unsigned array_id:10;
> -
> -   /** Register index should be offset by the integer in this reg. */
> -   st_src_reg *reladdr;
> -   st_src_reg *reladdr2;
> -};
> -
> -st_src_reg::st_src_reg(st_dst_reg reg)
> -{
> -   this->type = reg.type;
> -   this->file = reg.file;
> -   this->index = reg.index;
> -   this->swizzle = SWIZZLE_XYZW;
> -   this->negate = 0;
> -   this->abs = 0;
> -   this->reladdr = reg.reladdr;
> -   this->index2D = reg.index2D;
> -   this->reladdr2 = reg.reladdr2;
> -   this->has_index2 = reg.has_index2;
> -   this->double_reg2 = false;
> -   this->array_id = reg.array_id;
> -   this->is_double_vertex_input = false;
> -}
> -
> -st_dst_reg::st_dst_reg(st_src_reg reg)
> -{
> -   this->type = reg.type;
> -   this->file = reg.file;
> -   this->index = reg.index;
> -   this->writemask = WRITEMASK_XYZW;
> -   this->reladdr = reg.reladdr;
> -   this->index2D = reg.index2D;
> -   this->reladdr2 = reg.reladdr2;
> -   this->has_index2 = reg.has_index2;
> -   this->array_id = reg.array_id;
> -}
> -
> -class glsl_to_tgsi_instruction : public exec_node {
> -public:
> -   DECLARE_RALLOC_CXX_OPERATORS(glsl_to_tgsi_instruction)
> -
> -   st_dst_reg dst[2];
> -   st_src_reg src[4];
> -   st_src_reg resource; /**< sampler, image or buffer register */
> -   st_src_reg *tex_offsets;
> -
> -   /** Pointer to the ir source this tree came from for debugging */
> -   ir_instruction *ir;
> -
> -   unsigned op:8; /**< TGSI opcode */
> -   unsigned saturate:1;
> -   unsigned is_64bit_expanded:1;
> -   unsigned sampler_base:5;
> -   unsigned sampler_array_size:6; /**< 1-based size of sampler array, 1 if not array */
> -   unsigned tex_target:4; /**< One of TEXTURE_*_INDEX */
> -   glsl_base_type tex_type:5;
> -   unsigned tex_shadow:1;
> -   unsigned image_format:9;
> -   unsigned tex_offset_num_offset:3;
> -   unsigned dead_mask:4; /**< Used in dead code elimination */
> -   unsigned buffer_access:3; /**< buffer access type */
> -
> -   const struct tgsi_opcode_info *info;
> -};
> +extern int swizzle_for_size(int size);

extern is unnecessary, and this should be in a header file.


>   
>   class variable_storage {
>      DECLARE_RZALLOC_CXX_OPERATORS(variable_storage)
> @@ -390,11 +147,6 @@ find_array_type(struct inout_decl *decls, unsigned count, unsigned array_id)
>      return GLSL_TYPE_ERROR;
>   }
>   
> -struct rename_reg_pair {
> -   bool valid;
> -   int new_reg;
> -};
> -
>   struct glsl_to_tgsi_visitor : public ir_visitor {
>   public:
>      glsl_to_tgsi_visitor();
> @@ -597,7 +349,7 @@ fail_link(struct gl_shader_program *prog, const char *fmt, ...)
>      prog->data->LinkStatus = linking_failure;
>   }
>   
> -static int
> +int
>   swizzle_for_size(int size)
>   {
>      static const int size_swizzles[4] = {
> @@ -611,40 +363,6 @@ swizzle_for_size(int size)
>      return size_swizzles[size - 1];
>   }
>   
> -static bool
> -is_resource_instruction(unsigned opcode)
> -{
> -   switch (opcode) {
> -   case TGSI_OPCODE_RESQ:
> -   case TGSI_OPCODE_LOAD:
> -   case TGSI_OPCODE_ATOMUADD:
> -   case TGSI_OPCODE_ATOMXCHG:
> -   case TGSI_OPCODE_ATOMCAS:
> -   case TGSI_OPCODE_ATOMAND:
> -   case TGSI_OPCODE_ATOMOR:
> -   case TGSI_OPCODE_ATOMXOR:
> -   case TGSI_OPCODE_ATOMUMIN:
> -   case TGSI_OPCODE_ATOMUMAX:
> -   case TGSI_OPCODE_ATOMIMIN:
> -   case TGSI_OPCODE_ATOMIMAX:
> -      return true;
> -   default:
> -      return false;
> -   }
> -}
> -
> -static unsigned
> -num_inst_dst_regs(const glsl_to_tgsi_instruction *op)
> -{
> -   return op->info->num_dst;
> -}
> -
> -static unsigned
> -num_inst_src_regs(const glsl_to_tgsi_instruction *op)
> -{
> -   return op->info->is_tex || is_resource_instruction(op->op) ?
> -      op->info->num_src - 1 : op->info->num_src;
> -}
>   
>   glsl_to_tgsi_instruction *
>   glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op,
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp
> new file mode 100644
> index 0000000000..705160552a
> --- /dev/null
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp
> @@ -0,0 +1,205 @@
> +/*
> + * Copyright © 2010 Intel Corporation
> + * Copyright © 2011 Bryan Cain
> + * Copyright © 2017 Gert Wollny
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "st_glsl_to_tgsi_private.h"
> +#include <tgsi/tgsi_info.h>
> +#include <mesa/program/prog_instruction.h>
> +
> +using std::vector;
> +
> +extern int swizzle_for_size(int size);

Again, this needs to be in a header file.


> +
> +static int swizzle_for_type(const glsl_type *type, int component = 0)
> +{
> +   unsigned num_elements = 4;
> +
> +   if (type) {
> +      type = type->without_array();
> +      if (type->is_scalar() || type->is_vector() || type->is_matrix())
> +         num_elements = type->vector_elements;
> +   }
> +
> +   int swizzle = swizzle_for_size(num_elements);
> +   assert(num_elements + component <= 4);
> +
> +   swizzle += component * MAKE_SWIZZLE4(1, 1, 1, 1);
> +   return swizzle;
> +}
> +
> +
> +
> +st_src_reg::st_src_reg(gl_register_file file, int index, const glsl_type *type,
> +                       int component, unsigned array_id)
> +{
> +   assert(file != PROGRAM_ARRAY || array_id != 0);
> +   this->file = file;
> +   this->index = index;
> +   this->swizzle = swizzle_for_type(type, component);
> +   this->negate = 0;
> +   this->abs = 0;
> +   this->index2D = 0;
> +   this->type = type ? type->base_type : GLSL_TYPE_ERROR;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->double_reg2 = false;
> +   this->array_id = array_id;
> +   this->is_double_vertex_input = false;
> +}
> +
> +st_src_reg::st_src_reg(gl_register_file file, int index, enum glsl_base_type type)
> +{
> +   assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> +   this->type = type;
> +   this->file = file;
> +   this->index = index;
> +   this->index2D = 0;
> +   this->swizzle = SWIZZLE_XYZW;
> +   this->negate = 0;
> +   this->abs = 0;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->double_reg2 = false;
> +   this->array_id = 0;
> +   this->is_double_vertex_input = false;
> +}
> +
> +st_src_reg::st_src_reg(gl_register_file file, int index, enum glsl_base_type type, int index2D)
> +{
> +   assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> +   this->type = type;
> +   this->file = file;
> +   this->index = index;
> +   this->index2D = index2D;
> +   this->swizzle = SWIZZLE_XYZW;
> +   this->negate = 0;
> +   this->abs = 0;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->double_reg2 = false;
> +   this->array_id = 0;
> +   this->is_double_vertex_input = false;
> +}
> +
> +st_src_reg::st_src_reg()
> +{
> +   this->type = GLSL_TYPE_ERROR;
> +   this->file = PROGRAM_UNDEFINED;
> +   this->index = 0;
> +   this->index2D = 0;
> +   this->swizzle = 0;
> +   this->negate = 0;
> +   this->abs = 0;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->double_reg2 = false;
> +   this->array_id = 0;
> +   this->is_double_vertex_input = false;
> +}
> +
> +
> +st_src_reg st_src_reg::get_abs()
> +{
> +   st_src_reg reg = *this;
> +   reg.negate = 0;
> +   reg.abs = 1;
> +   return reg;
> +}

Please move get_abs below the other constructor.


> +st_src_reg::st_src_reg(st_dst_reg reg)
> +{
> +   this->type = reg.type;
> +   this->file = reg.file;
> +   this->index = reg.index;
> +   this->swizzle = SWIZZLE_XYZW;
> +   this->negate = 0;
> +   this->abs = 0;
> +   this->reladdr = reg.reladdr;
> +   this->index2D = reg.index2D;
> +   this->reladdr2 = reg.reladdr2;
> +   this->has_index2 = reg.has_index2;
> +   this->double_reg2 = false;
> +   this->array_id = reg.array_id;
> +   this->is_double_vertex_input = false;
> +}
> +
> +st_dst_reg::st_dst_reg(st_src_reg reg)
> +{
> +   this->type = reg.type;
> +   this->file = reg.file;
> +   this->index = reg.index;
> +   this->writemask = WRITEMASK_XYZW;
> +   this->reladdr = reg.reladdr;
> +   this->index2D = reg.index2D;
> +   this->reladdr2 = reg.reladdr2;
> +   this->has_index2 = reg.has_index2;
> +   this->array_id = reg.array_id;
> +}
> +
> +
> +st_dst_reg::st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type, int index)
> +{
> +   assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> +   this->file = file;
> +   this->index = index;
> +   this->index2D = 0;
> +   this->writemask = writemask;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->type = type;
> +   this->array_id = 0;
> +}
> +
> +
> +st_dst_reg::st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type)
> +{
> +   assert(file != PROGRAM_ARRAY); /* need array_id > 0 */
> +   this->file = file;
> +   this->index = 0;
> +   this->index2D = 0;
> +   this->writemask = writemask;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->type = type;
> +   this->array_id = 0;
> +}
> +
> +st_dst_reg::st_dst_reg()
> +{
> +   this->type = GLSL_TYPE_ERROR;
> +   this->file = PROGRAM_UNDEFINED;
> +   this->index = 0;
> +   this->index2D = 0;
> +   this->writemask = 0;
> +   this->reladdr = NULL;
> +   this->reladdr2 = NULL;
> +   this->has_index2 = false;
> +   this->array_id = 0;
> +}
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_private.h b/src/mesa/state_tracker/st_glsl_to_tgsi_private.h
> new file mode 100644
> index 0000000000..d729bc008d
> --- /dev/null
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_private.h
> @@ -0,0 +1,164 @@
> +/*
> + * Copyright © 2010 Intel Corporation
> + * Copyright © 2011 Bryan Cain
> + * Copyright © 2017 Gert Wollny
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */

Missing include guards.


> +
> +#include <mesa/main/mtypes.h>
> +#include <compiler/glsl_types.h>
> +#include <compiler/glsl/ir.h>
> +#include <tgsi/tgsi_info.h>
> +#include <stack>
> +#include <vector>
> +
> +class st_dst_reg;
> +
> +/**
> + * This struct is a corresponding struct to TGSI ureg_src.
> + */
> +class st_src_reg {
> +public:
> +	st_src_reg(gl_register_file file, int index, const glsl_type *type,
> +	           int component = 0, unsigned array_id = 0);
> +
> +	st_src_reg(gl_register_file file, int index, enum glsl_base_type type);
> +
> +	st_src_reg(gl_register_file file, int index, enum glsl_base_type type, int index2D);
> +
> +	st_src_reg();
> +
> +	explicit st_src_reg(st_dst_reg reg);
> +
> +   st_src_reg get_abs();
> +
> +   int32_t index; /**< temporary index, VERT_ATTRIB_*, VARYING_SLOT_*, etc. */
> +   int16_t index2D;
> +
> +   uint16_t swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */
> +   int negate:4; /**< NEGATE_XYZW mask from mesa */
> +   unsigned abs:1;
> +   enum glsl_base_type type:5; /** GLSL_TYPE_* from GLSL IR (enum glsl_base_type) */
> +   unsigned has_index2:1;
> +   gl_register_file file:5; /**< PROGRAM_* from Mesa */
> +   /*
> +    * Is this the second half of a double register pair?
> +    * currently used for input mapping only.
> +    */
> +   unsigned double_reg2:1;
> +   unsigned is_double_vertex_input:1;
> +   unsigned array_id:10;
> +   /** Register index should be offset by the integer in this reg. */
> +   st_src_reg *reladdr;
> +   st_src_reg *reladdr2;
> +
> +};
> +
> +class st_dst_reg {
> +public:
> +   st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type, int index);
> +
> +   st_dst_reg(gl_register_file file, int writemask, enum glsl_base_type type);
> +
> +   st_dst_reg();
> +
> +   explicit st_dst_reg(st_src_reg reg);
> +
> +   int32_t index; /**< temporary index, VERT_ATTRIB_*, VARYING_SLOT_*, etc. */
> +   int16_t index2D;
> +   gl_register_file file:5; /**< PROGRAM_* from Mesa */
> +   unsigned writemask:4; /**< Bitfield of WRITEMASK_[XYZW] */
> +   enum glsl_base_type type:5; /** GLSL_TYPE_* from GLSL IR (enum glsl_base_type) */
> +   unsigned has_index2:1;
> +   unsigned array_id:10;
> +
> +   /** Register index should be offset by the integer in this reg. */
> +   st_src_reg *reladdr;
> +   st_src_reg *reladdr2;
> +};
> +
> +class glsl_to_tgsi_instruction : public exec_node {
> +public:
> +   DECLARE_RALLOC_CXX_OPERATORS(glsl_to_tgsi_instruction)
> +
> +   st_dst_reg dst[2];
> +   st_src_reg src[4];
> +   st_src_reg resource; /**< sampler or buffer register */
> +   st_src_reg *tex_offsets;
> +
> +   /** Pointer to the ir source this tree came from for debugging */
> +   ir_instruction *ir;
> +
> +   unsigned op:8; /**< TGSI opcode */
> +   unsigned saturate:1;
> +   unsigned is_64bit_expanded:1;
> +   unsigned sampler_base:5;
> +   unsigned sampler_array_size:6; /**< 1-based size of sampler array, 1 if not array */
> +   unsigned tex_target:4; /**< One of TEXTURE_*_INDEX */
> +   glsl_base_type tex_type:5;
> +   unsigned tex_shadow:1;
> +   unsigned image_format:9;
> +   unsigned tex_offset_num_offset:3;
> +   unsigned dead_mask:4; /**< Used in dead code elimination */
> +   unsigned buffer_access:3; /**< buffer access type */
> +
> +   const struct tgsi_opcode_info *info;
> +};
> +
> +struct rename_reg_pair {
> +   bool valid;
> +   int new_reg;
> +};
> +
> +inline bool
> +is_resource_instruction(unsigned opcode)
> +{
> +   switch (opcode) {
> +   case TGSI_OPCODE_RESQ:
> +   case TGSI_OPCODE_LOAD:
> +   case TGSI_OPCODE_ATOMUADD:
> +   case TGSI_OPCODE_ATOMXCHG:
> +   case TGSI_OPCODE_ATOMCAS:
> +   case TGSI_OPCODE_ATOMAND:
> +   case TGSI_OPCODE_ATOMOR:
> +   case TGSI_OPCODE_ATOMXOR:
> +   case TGSI_OPCODE_ATOMUMIN:
> +   case TGSI_OPCODE_ATOMUMAX:
> +   case TGSI_OPCODE_ATOMIMIN:
> +   case TGSI_OPCODE_ATOMIMAX:
> +      return true;
> +   default:
> +      return false;
> +   }
> +}
> +
> +inline unsigned
> +num_inst_dst_regs(const glsl_to_tgsi_instruction *op)
> +{
> +   return op->info->num_dst;
> +}
> +
> +inline unsigned
> +num_inst_src_regs(const glsl_to_tgsi_instruction *op)
> +{
> +   return op->info->is_tex || is_resource_instruction(op->op) ?
> +      op->info->num_src - 1 : op->info->num_src;
> +}

These three functions need a "static".

Cheers,
Nicolai
-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list