sm4_to_tgsi.cpp revision 0e40b41ceec15d97507fe85343daad54aa1c4824
192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/************************************************************************** 292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Copyright 2010 Luca Barbieri 492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining 692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * a copy of this software and associated documentation files (the 792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * "Software"), to deal in the Software without restriction, including 892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish, 992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to 1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to 1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * the following conditions: 1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The above copyright notice and this permission notice (including the 1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * next paragraph) shall be included in all copies or substantial 1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * portions of the Software. 1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri **************************************************************************/ 2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 274babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri#include "d3d1xstutil.h" 28e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#include "sm4.h" 2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "tgsi/tgsi_ureg.h" 3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <vector> 3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if 1 3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) assert(x) 3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) assert(0 && (x)) 3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else 3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) do {if(!(x)) throw(#x);} while(0) 3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) throw(x) 3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif 3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 40e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristatic unsigned sm4_to_pipe_interpolation[] = 4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_PERSPECTIVE, /* UNDEFINED */ 4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_CONSTANT, 4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR */ 4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR_CENTROID */ 4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE */ 4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE_CENTROID */ 4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Added in D3D10.1 5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_PERSPECTIVE, /* LINEAR_SAMPLE */ 5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_INTERPOLATE_LINEAR, /* LINEAR_NOPERSPECTIVE_SAMPLE */ 5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 54e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristatic int sm4_to_pipe_sv[] = 5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, 5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_POSITION, 5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_CLIP_DISTANCE */ 5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_CULL_DISTANCE */ 6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_RENDER_TARGET_ARRAY_INDEX */ 6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_VIEWPORT_ARRAY_INDEX */ 6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_VERTEXID,*/ 6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_PRIMID, 6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_INSTANCEID, 6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_FACE, 6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_SAMPLE_INDEX*/ 6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 69e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristruct sm4_to_tgsi_converter 7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_program* ureg; 7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> temps; 7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> outputs; 7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_src> inputs; 7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_src> samplers; 7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<std::pair<unsigned, unsigned> > targets; // first is normal, second shadow/comparison 7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<unsigned> sampler_modes; // 0 = normal, 1 = shadow/comparison 7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<std::pair<unsigned, unsigned> > loops; 79e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_insn* insn; 80e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri struct sm4_program& program; 81e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri std::vector<unsigned> sm4_to_tgsi_insn_num; 82e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri std::vector<std::pair<unsigned, unsigned> > label_to_sm4_insn_num; 8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool in_sub; 8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool avoid_txf; 8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool avoid_int; 8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 87e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_converter(struct sm4_program& program) 8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : program(program) 8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri avoid_txf = true; 9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri avoid_int = false; 9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 94e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri struct ureg_dst _reg(sm4_op& op) 9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(op.file) 9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 98e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_NULL: 9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d; 10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri memset(&d, 0, sizeof(d)); 10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri d.File = TGSI_FILE_NULL; 10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 105e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_TEMP: 10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.indices[0].disp < temps.size()); 10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return temps[op.indices[0].disp]; 109e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_OUTPUT: 11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.indices[0].disp < outputs.size()); 11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return outputs[op.indices[0].disp]; 11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ureg_dst_undef(); 11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _dst(unsigned i = 0) 12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 122e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 123e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(op.mode == SM4_OPERAND_MODE_MASK || op.mode == SM4_OPERAND_MODE_SCALAR); 12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = ureg_writemask(_reg(op), op.mask); 12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.sat) 12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri d = ureg_saturate(d); 12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src _src(unsigned i) 13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 133e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src s; 13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(op.file) 13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 137e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_IMMEDIATE32: 13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_imm4f(ureg, op.imm_values[0].f32, op.imm_values[1].f32, op.imm_values[2].f32, op.imm_values[3].f32); 13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 140e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_INPUT: 1414babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.is_index_simple(0)); 1424babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.num_indices == 1 || op.num_indices == 2); 1434babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri // TODO: is this correct, or are incorrectly swapping the two indices in the GS case? 1444babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.indices[op.num_indices - 1].disp < inputs.size()); 1454babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s = inputs[op.indices[op.num_indices - 1].disp]; 1464babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri if(op.num_indices == 2) 1474babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri { 1484babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s.Dimension = 1; 1494babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s.DimensionIndex = op.indices[0].disp; 1504babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri } 15192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 152e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_CONSTANT_BUFFER: 15392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: indirect addressing 15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.num_indices == 2); 15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.is_index_simple(0)); 15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.is_index_simple(1)); 15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_src_register(TGSI_FILE_CONSTANT, (unsigned)op.indices[1].disp); 15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s.Dimension = 1; 15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s.DimensionIndex = op.indices[0].disp; 16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_src(_reg(op)); 16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 165e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(op.mode == SM4_OPERAND_MODE_SWIZZLE || op.mode == SM4_OPERAND_MODE_SCALAR) 16692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_swizzle(s, op.swizzle[0], op.swizzle[1], op.swizzle[2], op.swizzle[3]); 16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* immediates are masked to show needed values */ 170e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(op.file == SM4_FILE_IMMEDIATE32 || op.file == SM4_FILE_IMMEDIATE64); 17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(op.abs) 17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_abs(s); 17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(op.neg) 17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_negate(s); 17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return s; 17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri }; 17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 179e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri int _idx(sm4_file file, unsigned i = 0) 18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 182e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.file == file); 18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return (int)op.indices[0].disp; 18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int _texslot(bool have_sampler = true) 18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::map<std::pair<int, int>, int>::iterator i; 191e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri i = program.resource_sampler_to_slot.find(std::make_pair(_idx(SM4_FILE_RESOURCE, 2), have_sampler ? _idx(SM4_FILE_SAMPLER, 3) : -1)); 19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i != program.resource_sampler_to_slot.end()); 19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return i->second; 19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned tex_target(unsigned texslot) 19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned mode = sampler_modes[program.slot_to_sampler[texslot]]; 19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned target; 20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(mode) 20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri target = targets[program.slot_to_resource[texslot]].second; 20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri target = targets[program.slot_to_resource[texslot]].first; 20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(target); 20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return target; 20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> insn_tmps; 20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _tmp() 21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = ureg_DECL_temporary(ureg); 21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_tmps.push_back(t); 21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return t; 21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _tmp(struct ureg_dst d) 21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(d.File == TGSI_FILE_TEMPORARY) 22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ureg_writemask(_tmp(), d.WriteMask); 22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 225e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP1_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1)); break 226e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP2_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2)); break 227e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP3_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2), _src(3)); break 22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP1(n) OP1_(n, n) 22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP2(n) OP2_(n, n) 23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP3(n) OP3_(n, n) 2316c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri#define OP_CF(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, &label); label_to_sm4_insn_num.push_back(std::make_pair(label, program.cf_insn_linked[insn_num])); break; 23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void translate_insns(unsigned begin, unsigned end) 23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned insn_num = begin; insn_num < end; ++insn_num) 23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 237e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num[insn_num] = ureg_get_instruction_number(ureg); 23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned label; 23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn = program.insns[insn_num]; 24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool ok; 24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 24292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // trivial instructions 245e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_NOP: 24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(MOV); 24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // float 25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(ADD); 25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MUL); 25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3(MAD); 25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DIV); 25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(FRC); 25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(RCP); 25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MIN); 25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MAX); 25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(LT, SLT); 25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(GE, SGE); 26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(EQ, SEQ); 26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(NE, SNE); 26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // bitwise 26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(NOT); 26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(AND); 26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(OR); 26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(XOR); 26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 26992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // special mathematical 27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP2); 27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP3); 27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP4); 27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(RSQ); 27492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(LOG, LG2); 27592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(EXP, EX2); 27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // rounding 27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_NE, ROUND); 27992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_Z, TRUNC); 28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_PI, CEIL); 28192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_NI, FLR); 28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 28392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // cross-thread 28492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX, DDX); 28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX_COARSE, DDX); 28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX_FINE, DDX); 28792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY, DDY); 28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY_COARSE, DDY); 28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY_FINE, DDY); 290e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_EMIT: 29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EMIT(ureg); 29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 293e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CUT: 29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDPRIM(ureg); 29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 296e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_EMITTHENCUT: 29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EMIT(ureg); 29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDPRIM(ureg); 29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 30092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 30192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // non-trivial instructions 302e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_MOVC: 30392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* CMP checks for < 0, but MOVC checks for != 0 30492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * but fortunately, x != 0 is equivalent to -abs(x) < 0 30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * XXX: can test_nz apply to this?! 30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri */ 30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CMP(ureg, _dst(), ureg_negate(ureg_abs(_src(1))), _src(2), _src(3)); 30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 309e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SQRT: 31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RSQ(ureg, t, _src(1)); 31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RCP(ureg, d, ureg_src(t)); 31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 317e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SINCOS: 31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst s = _dst(0); 32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst c = _dst(1); 32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src v = _src(2); 32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(s.File != TGSI_FILE_NULL) 32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_SIN(ureg, s, v); 32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(c.File != TGSI_FILE_NULL) 32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_COS(ureg, c, v); 32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // control flow 330e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DISCARD: 33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_KIL(ureg, _src(0)); 33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(LOOP, BGNLOOP); 33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(ENDLOOP, ENDLOOP); 335e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_BREAK: 33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BRK(ureg); 33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 338e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_BREAKC: 33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // XXX: can test_nz apply to this?! 34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BREAKC(ureg, _src(0)); 34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 342e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CONTINUE: 34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CONT(ureg); 34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 345e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CONTINUEC: 34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // XXX: can test_nz apply to this?! 34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CONT(ureg); 34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 352e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SWITCH: 35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_SWITCH(ureg, _src(0)); 35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 355e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CASE: 35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CASE(ureg, _src(0)); 35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 358e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DEFAULT: 35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DEFAULT(ureg); 36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 361e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ENDSWITCH: 36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSWITCH(ureg); 36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 364e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CALL: 36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CAL(ureg, &label); 366e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, program.label_to_insn_num[_idx(SM4_FILE_LABEL)])); 36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 368e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_LABEL: 36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub) 37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSUB(ureg); 37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_END(ureg); 37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BGNSUB(ureg); 37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri in_sub = true; 37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 376e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RET: 37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub || insn_num != (program.insns.size() - 1)) 37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 380e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RETC: 38192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 38292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.test_nz) 38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 38492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 38592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!insn->insn.test_nz) 38692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 38792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(ELSE, ELSE); 394e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ENDIF: 39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 397e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_IF: 39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.test_nz) 39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 401e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, program.cf_insn_linked[insn_num])); 40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned linked = program.cf_insn_linked[insn_num]; 406e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(program.insns[linked]->opcode == SM4_OPCODE_ENDIF) 40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 40892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 40992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 41092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 411e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, linked)); 41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 41392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* we have to swap the branches in this case (fun!) 41692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * TODO: maybe just emit a SEQ 0? 41792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * */ 41892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned endif = program.cf_insn_linked[linked]; 41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 421e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, linked)); 42292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(linked + 1, endif); 42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 425e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num[linked] = ureg_get_instruction_number(ureg); 42692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 427e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, endif)); 42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(insn_num + 1, linked); 43092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_num = endif - 1; 43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri goto next; 43392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 43492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 43592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 436e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RESINFO: 43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 43892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::map<int, int>::iterator i; 439e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri i = program.resource_to_slot.find(_idx(SM4_FILE_RESOURCE, 2)); 44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i != program.resource_to_slot.end()); 44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = i->second; 44292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 44392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // no driver actually provides this, unfortunately 44492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXQ(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot]); 44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri }; 44792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: sample offset, sample index 448e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_LD: // dst, coord_int, res; mipmap level in last coord_int arg (ouch) 449e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_LD_MS: 45092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 45192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(false); 452d83b7a69a0aeece9d7ba68c1b161656988009bfaLuca Barbieri unsigned dim = 0; 45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(targets[texslot].first) 45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 45592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case TGSI_TEXTURE_1D: 45692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri dim = 1; 45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case TGSI_TEXTURE_2D: 45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case TGSI_TEXTURE_RECT: 46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri dim = 2; 46192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case TGSI_TEXTURE_3D: 46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri dim = 3; 46492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 46792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 46892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(avoid_txf) 47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src texcoord; 47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!avoid_int) 47392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_I2F(ureg, tmp, _src(1)); 47592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri texcoord = ureg_src(tmp); 47692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 47792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 47892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri texcoord = _src(1); 47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_swizzle(texcoord, 0, 1, 2, dim), samplers[texslot]); 48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXF(ureg, _dst(), tex_target(texslot), ureg_swizzle(_src(1), 0, 1, 2, dim), samplers[texslot]); 48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 486e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE: // dst, coord, res, samp 48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TEX(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot]); 49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 49192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 492e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_B: // dst, coord, res, samp, bias.x 49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1)); 49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0)); 49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXB(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]); 49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 501e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_C: // dst, coord, res, samp, comp.x 50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 50392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 50592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XY), _src(1)); 50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), ureg_swizzle(_src(4), 0, 0, 0, 0)); 50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TEX(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]); 50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 50992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 510e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_C_LZ: // dst, coord, res, samp, comp.x 51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XY), _src(1)); 51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), ureg_swizzle(_src(4), 0, 0, 0, 0)); 51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_imm1f(ureg, 0.0)); 51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]); 51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 520e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_D: // dst, coord, res, samp, ddx, ddy 52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXD(ureg, _dst(), tex_target(texslot), _src(1), samplers[texslot], _src(4), _src(5)); 52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 526e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_L: // dst, coord, res, samp, bias.x 52792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned texslot = _texslot(); 52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1)); 53192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0)); 53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_TXL(ureg, _dst(), tex_target(texslot), ureg_src(tmp), samplers[texslot]); 53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 53792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!ok && !avoid_int) 54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // integer 54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ITOF, I2F); 54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOI, F2I); 54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IADD, UADD); 54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(INEG); 55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IMUL, UMUL); 55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(IMAD, UMAD); 55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ISHL, SHL); 55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ISHR, ISHR); 55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(IMIN); 55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(IMAX); 55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ILT, ISLT); 55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IGE, ISGE); 55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IEQ, USEQ); 55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(INE, USNE); 56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // unsigned 56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(UTOF, U2F); 56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOU, F2U); 56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMUL); 56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3(UMAD); 56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMIN); 56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMAX); 56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ULT, USLT); 56992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UGE, USGE); 57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(USHR); 57192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 572e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UDIV: 57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst q = _dst(0); 57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst r = _dst(1); 57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src a = _src(2); 57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src b = _src(3); 57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(q.File != TGSI_FILE_NULL) 57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_UDIV(ureg, q, a, b); 58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(r.File != TGSI_FILE_NULL) 58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_UMOD(ureg, r, a, b); 58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 58592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!ok && avoid_int) 59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 594e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ITOF: 595e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UTOF: 59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 59792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOI, TRUNC); 59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOU, FLR); 59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // integer 60092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IADD, ADD); 60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IMUL, MUL); 60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(IMAD, MAD); 60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(MIN, MIN); 60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(MAX, MAX); 60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ILT, SLT); 60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IGE, SGE); 60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IEQ, SEQ); 60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(INE, SNE); 60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // unsigned 61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMUL, MUL); 61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(UMAD, MAD); 61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMIN, MIN); 61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMAX, MAX); 61592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ULT, SLT); 61692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UGE, SGE); 61792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 618e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_INEG: 61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, _dst(), ureg_negate(_src(1))); 62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 621e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ISHL: 62292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 62492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 62592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EX2(ureg, t, _src(2)); 62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, d, ureg_src(t), _src(1)); 62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 62892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 629e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ISHR: 630e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_USHR: 63192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EX2(ureg, t, ureg_negate(_src(2))); 63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, t, ureg_src(t), _src(1)); 63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FLR(ureg, d, ureg_src(t)); 63792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 639e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UDIV: 64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst q = _dst(0); 64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst r = _dst(1); 64392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src a = _src(2); 64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src b = _src(3); 64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst f = _tmp(); 64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DIV(ureg, f, a, b); 64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(q.File != TGSI_FILE_NULL) 64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FLR(ureg, q, ureg_src(f)); 64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(r.File != TGSI_FILE_NULL) 65092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FRC(ureg, f, ureg_src(f)); 65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, r, ureg_src(f), b); 65392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 65892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 65992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(ok); 66292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!insn_tmps.empty()) 66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned i = 0; i < insn_tmps.size(); ++i) 66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_release_temporary(ureg, insn_tmps[i]); 66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_tmps.clear(); 66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 66992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinext:; 67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 67192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 67292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 67392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void* do_translate() 67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned processor; 67692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(program.version.type) 67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 67892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 0: 67992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_FRAGMENT; 68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 1: 68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_VERTEX; 68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 2: 68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_GEOMETRY; 68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 68792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Tessellation and compute shaders not yet supported"); 68992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return 0; 69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 692e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(!sm4_link_cf_insns(program)) 69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Malformed control flow"); 694e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(!sm4_find_labels(program)) 69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Failed to locate labels"); 696e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(!sm4_allocate_resource_sampler_pairs(program)) 69792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Unsupported (indirect?) accesses to resources and/or samplers"); 69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg = ureg_create(processor); 70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 70192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri in_sub = false; 70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned i = 0; i < program.slot_to_resource.size(); ++i) 70492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri samplers.push_back(ureg_DECL_sampler(ureg, i)); 70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 706e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num.resize(program.insns.size()); 70792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned insn_num = 0; insn_num < program.dcls.size(); ++insn_num) 70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 709e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_dcl& dcl = *program.dcls[insn_num]; 71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int idx = -1; 7114babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri if(dcl.op.get() && dcl.op->is_index_simple(0)) 71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri idx = dcl.op->indices[0].disp; 71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(dcl.opcode) 71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 715e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_GLOBAL_FLAGS: 71692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 717e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_TEMPS: 71892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned i = 0; i < dcl.num; ++i) 71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri temps.push_back(ureg_DECL_temporary(ureg)); 72092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 721e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT: 72292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 72392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(processor == TGSI_PROCESSOR_VERTEX) 7240e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri { 7250e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri if(inputs.size() <= (unsigned)idx) 7260e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri inputs.resize(idx + 1); 72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs[idx] = ureg_DECL_vs_input(ureg, idx); 7280e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri } 7294babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri else if(processor == TGSI_PROCESSOR_GEOMETRY) 7304babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri { 7314babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri // TODO: is this correct? 7324babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri unsigned gsidx = dcl.op->indices[1].disp; 7330e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri if(inputs.size() <= (unsigned)gsidx) 7340e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri inputs.resize(gsidx + 1); 7354babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri inputs[gsidx] = ureg_DECL_gs_input(ureg, gsidx, TGSI_SEMANTIC_GENERIC, gsidx); 7364babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri } 73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 73892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 740e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS: 74192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 74292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(inputs.size() <= (unsigned)idx) 74392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs.resize(idx + 1); 744e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri inputs[idx] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, idx, sm4_to_pipe_interpolation[dcl.dcl_input_ps.interpolation]); 74592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 746e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT: 74792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 74892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(outputs.size() <= (unsigned)idx) 74992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs.resize(idx + 1); 75092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(processor == TGSI_PROCESSOR_FRAGMENT) 75192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, idx); 75292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 75392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, idx); 75492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 755e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_SIV: 756e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_SGV: 757e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS_SIV: 758e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS_SGV: 75992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 76092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(inputs.size() <= (unsigned)idx) 76192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs.resize(idx + 1); 76292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: is this correct? 763e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri inputs[idx] = ureg_DECL_system_value(ureg, idx, sm4_to_pipe_sv[dcl.sv], 0); 76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 765e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT_SIV: 766e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT_SGV: 76792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 76892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(outputs.size() <= (unsigned)idx) 76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs.resize(idx + 1); 770e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(sm4_to_pipe_sv[dcl.sv] >= 0); 771e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri outputs[idx] = ureg_DECL_output(ureg, sm4_to_pipe_sv[dcl.sv], 0); 77292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 773e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_RESOURCE: 77492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 77592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(targets.size() <= (unsigned)idx) 77692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets.resize(idx + 1); 77792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(dcl.dcl_resource.target) 77892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 779e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE1D: 78092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_1D; 78192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW1D; 78292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 783e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE2D: 78492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_2D; 78592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW2D; 78692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 787e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE3D: 78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_3D; 78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = 0; 79092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 791e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURECUBE: 79292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_CUBE; 79392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = 0; 79492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 7960e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri // HACK to make SimpleSample10 work 7970e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri //check(0); 7980e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri targets[idx].first = TGSI_TEXTURE_2D; 7990e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW2D; 8000e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri break; 80192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 80292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 803e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_SAMPLER: 80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 80592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(sampler_modes.size() <= (unsigned)idx) 80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri sampler_modes.resize(idx + 1); 80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(!dcl.dcl_sampler.mono); 80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri sampler_modes[idx] = dcl.dcl_sampler.shadow; 80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 810e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_CONSTANT_BUFFER: 81192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->num_indices == 2); 81292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->is_index_simple(0)); 81392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->is_index_simple(1)); 81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri idx = dcl.op->indices[0].disp; 81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DECL_constant2D(ureg, 0, (unsigned)dcl.op->indices[1].disp - 1, idx); 81692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 8174babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE: 8184babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_input_prim(ureg, d3d_to_pipe_prim_type[dcl.dcl_gs_input_primitive.primitive]); 8194babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 8204babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY: 8214babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_output_prim(ureg, d3d_to_pipe_prim[dcl.dcl_gs_output_primitive_topology.primitive_topology]); 8224babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 8234babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT: 8244babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_max_vertices(ureg, dcl.num); 8254babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 82692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 82792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 82892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 82992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 83092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 83192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(0, program.insns.size()); 832e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num.push_back(ureg_get_instruction_number(ureg)); 83392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub) 83492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSUB(ureg); 83592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 83692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_END(ureg); 83792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 838e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri for(unsigned i = 0; i < label_to_sm4_insn_num.size(); ++i) 839e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri ureg_fixup_label(ureg, label_to_sm4_insn_num[i].first, sm4_to_tgsi_insn_num[label_to_sm4_insn_num[i].second]); 84092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 84192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const struct tgsi_token * tokens = ureg_get_tokens(ureg, 0); 84292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_destroy(ureg); 84392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return (void*)tokens; 84492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 84592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 84692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void* translate() 84792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 84892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri try 84992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 85092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return do_translate(); 85192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 85292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri catch(const char*) 85392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 85492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return 0; 85592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 85692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 85792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 85892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 859e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid* sm4_to_tgsi(struct sm4_program& program) 86092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 861e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_converter conv(program); 86292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return conv.translate(); 86392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 864