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