[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