ir_to_mesa.cpp revision ae252d3613d10a051657c4ca6db27409f7cf40ae
184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt/*
284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Copyright © 2010 Intel Corporation
384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt *
484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * copy of this software and associated documentation files (the "Software"),
684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * to deal in the Software without restriction, including without limitation
784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * and/or sell copies of the Software, and to permit persons to whom the
984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Software is furnished to do so, subject to the following conditions:
1084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt *
1184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * The above copyright notice and this permission notice (including the next
1284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * paragraph) shall be included in all copies or substantial portions of the
1384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Software.
1484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt *
1584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * DEALINGS IN THE SOFTWARE.
2284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */
2384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
2484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "ir.h"
25aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholtextern "C" {
2684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt#include "shader/prog_instruction.h"
27aaee40e107cf07a12c8e373d8bb910254f4ba30bEric Anholt};
2884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
2984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt/**
3084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * \file ir_to_mesa.h
3184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt *
3284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * Translates the IR to Mesa IR if possible.
3384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */
3484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
3584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt/**
3684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * This struct is a corresponding struct to Mesa prog_src_register, with
3784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt * wider fields.
3884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt */
3984771df82ed2ed8718013795089edd38cf5bd84dEric Anholttypedef struct ir_to_mesa_src_reg {
4084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int file; /**< PROGRAM_* from Mesa */
4184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
4284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */
4384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} ir_to_mesa_src_reg;
4484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
4584771df82ed2ed8718013795089edd38cf5bd84dEric Anholttypedef struct ir_to_mesa_dst_reg {
4684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int file; /**< PROGRAM_* from Mesa */
4784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
4884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt} ir_to_mesa_dst_reg;
4984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
5084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtextern ir_to_mesa_src_reg ir_to_mesa_undef;
5184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
5284771df82ed2ed8718013795089edd38cf5bd84dEric Anholtclass ir_to_mesa_instruction : public exec_node {
5384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtpublic:
5484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   enum prog_opcode op;
5584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   ir_to_mesa_dst_reg dst_reg;
5684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   ir_to_mesa_src_reg src_reg[3];
57b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt   /** Pointer to the ir source this tree came from for debugging */
58b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt   ir_instruction *ir;
5984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt};
6084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
6184771df82ed2ed8718013795089edd38cf5bd84dEric Anholtstruct mbtree {
6284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   struct mbtree *left;
6384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   struct mbtree *right;
6484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   void *state;
6584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   uint16_t op;
6684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   class ir_to_mesa_visitor *v;
6784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
68b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt   /** Pointer to the ir source this tree came from for debugging */
69b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt   ir_instruction *ir;
70b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt
7184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /**
7284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * This is the representation of this tree node's results as a
7384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * source register for its consumer.
7484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    */
7584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   ir_to_mesa_src_reg src_reg;
7684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt};
7784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
7884771df82ed2ed8718013795089edd38cf5bd84dEric Anholtvoid do_ir_to_mesa(exec_list *instructions);
7984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
8084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtclass temp_entry : public exec_node {
8184771df82ed2ed8718013795089edd38cf5bd84dEric Anholtpublic:
8284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   temp_entry(ir_variable *var, int file, int index)
8384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt      : file(file), index(index), var(var)
8484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   {
8584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt      /* empty */
8684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   }
8784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
8884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int file;
8984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int index;
9084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   ir_variable *var; /* variable that maps to this, if any */
9184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt};
9284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
9384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtclass ir_to_mesa_visitor : public ir_visitor {
9484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtpublic:
95ae252d3613d10a051657c4ca6db27409f7cf40aeEric Anholt   ir_to_mesa_visitor();
9684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
9784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int next_temp;
9884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   int next_constant;
9984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
10084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   void get_temp(struct mbtree *tree);
10184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
10284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   void get_temp_for_var(ir_variable *var, struct mbtree *tree);
10384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
10484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   struct mbtree *create_tree(int op,
105b7abce770fe9bb09a6f435d35c1a4afd134fa855Eric Anholt			      ir_instruction *ir,
10684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt			      struct mbtree *left,
10784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt			      struct mbtree *right);
10884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
10984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /**
11084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * \name Visit methods
11184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    *
11284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * As typical for the visitor pattern, there must be one \c visit method for
11384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * each concrete subclass of \c ir_instruction.  Virtual base classes within
11484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    * the hierarchy should not have \c visit methods.
11584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt    */
11684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /*@{*/
11784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_variable *);
11884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_loop *);
11984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_loop_jump *);
12084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_function_signature *);
12184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_function *);
12284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_expression *);
12384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_swizzle *);
12484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_dereference_variable *);
12584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_dereference_array *);
12684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_dereference_record *);
12784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_assignment *);
12884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_constant *);
12984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_call *);
13084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_return *);
13184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_texture *);
13284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   virtual void visit(ir_if *);
13384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /*@}*/
13484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
13584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   struct mbtree *result;
13684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
13784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /** List of temp_entry */
13884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   exec_list variable_storage;
13984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
14084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   /** List of ir_to_mesa_instruction */
14184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   exec_list instructions;
14284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt};
14384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
14484771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction *
14584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_emit_op1(struct mbtree *tree, enum prog_opcode op,
14684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_dst_reg dst,
14784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src0);
14884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
14984771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction *
15084771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_emit_op2(struct mbtree *tree, enum prog_opcode op,
15184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_dst_reg dst,
15284771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src0,
15384771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src1);
15484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
15584771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_instruction *
15684771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_emit_op3(struct mbtree *tree, enum prog_opcode op,
15784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_dst_reg dst,
15884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src0,
15984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src1,
16084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt		    ir_to_mesa_src_reg src2);
16184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
16284771df82ed2ed8718013795089edd38cf5bd84dEric Anholtinline ir_to_mesa_dst_reg
16384771df82ed2ed8718013795089edd38cf5bd84dEric Anholtir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg reg)
16484771df82ed2ed8718013795089edd38cf5bd84dEric Anholt{
16584771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   ir_to_mesa_dst_reg dst_reg;
16684771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
16784771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   dst_reg.file = reg.file;
16884771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   dst_reg.index = reg.index;
16984771df82ed2ed8718013795089edd38cf5bd84dEric Anholt
17084771df82ed2ed8718013795089edd38cf5bd84dEric Anholt   return dst_reg;
17184771df82ed2ed8718013795089edd38cf5bd84dEric Anholt}
172