From: Gert Wollny Date: Wed, 21 Jun 2017 08:05:23 +0000 (+0200) Subject: mesa/st: glsl_to_tgsi move some helper classes to extra files X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=732246701f58a6be4bd377fbd2ecf1f10737824e;p=mesa.git mesa/st: glsl_to_tgsi move some helper classes to extra files 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); Reviewed-by: Nicolai Hähnle --- diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index e65b091fe8c..40d1a2e5383 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -511,6 +511,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 5348c6f9f3e..7ccb6e25d68 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_format.h" #include "st_nir.h" #include "st_shader_cache.h" +#include "st_glsl_to_tgsi_private.h" #include "util/hash_table.h" #include @@ -65,28 +66,6 @@ #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; -} - static unsigned is_precise(const ir_variable *ir) { if (!ir) @@ -94,231 +73,6 @@ static unsigned is_precise(const ir_variable *ir) return ir->data.precise || ir->data.invariant; } -/** - * 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 precise:1; - 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; -}; - class variable_storage { DECLARE_RZALLOC_CXX_OPERATORS(variable_storage) @@ -398,11 +152,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(); @@ -606,7 +355,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] = { @@ -620,40 +369,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 00000000000..0075ae86766 --- /dev/null +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_private.cpp @@ -0,0 +1,196 @@ +/* + * 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 +#include + +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(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_src_reg st_src_reg::get_abs() +{ + st_src_reg reg = *this; + reg.negate = 0; + reg.abs = 1; + return reg; +} + +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; +} \ No newline at end of file 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 00000000000..c92d96cf6c3 --- /dev/null +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_private.h @@ -0,0 +1,168 @@ +/* + * 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. + */ + +#ifndef ST_GLSL_TO_TGSI_PRIVATE_H +#define ST_GLSL_TO_TGSI_PRIVATE_H + +#include +#include +#include +#include + +int swizzle_for_size(int size); + +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 fe02549fdrom for debugging */ + ir_instruction *ir; + + unsigned op:8; /**< TGSI opcode */ + unsigned precise:1; + 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 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; + } +} + +inline static unsigned +num_inst_dst_regs(const glsl_to_tgsi_instruction *op) +{ + return op->info->num_dst; +} + +inline 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; +} +#endif