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 2714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller#include <d3d11shader.h> 284babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri#include "d3d1xstutil.h" 29e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#include "sm4.h" 3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "tgsi/tgsi_ureg.h" 3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <vector> 3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if 1 3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) assert(x) 3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) assert(0 && (x)) 3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else 3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define check(x) do {if(!(x)) throw(#x);} while(0) 3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define fail(x) throw(x) 3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif 4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 41db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieristruct tgsi_interpolation 4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 43db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri unsigned interpolation; 44db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri bool centroid; 45db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri}; 46db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri 47db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieristatic tgsi_interpolation sm4_to_pipe_interpolation[] = 48db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri{ 49db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_PERSPECTIVE, false}, /* UNDEFINED */ 50db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_CONSTANT, false}, 51db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_PERSPECTIVE, false}, /* LINEAR */ 52db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_PERSPECTIVE, true}, /* LINEAR_CENTROID */ 53db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_LINEAR, false}, /* LINEAR_NOPERSPECTIVE */ 54db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_LINEAR, true}, /* LINEAR_NOPERSPECTIVE_CENTROID */ 5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // Added in D3D10.1 57db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_PERSPECTIVE, true}, /* LINEAR_SAMPLE */ 58db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri {TGSI_INTERPOLATE_LINEAR, true}, /* LINEAR_NOPERSPECTIVE_SAMPLE */ 5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 61e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristatic int sm4_to_pipe_sv[] = 6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, 6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_POSITION, 6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_CLIP_DISTANCE */ 6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_CULL_DISTANCE */ 6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_RENDER_TARGET_ARRAY_INDEX */ 6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_VIEWPORT_ARRAY_INDEX */ 6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_VERTEXID,*/ 7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_PRIMID, 7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_INSTANCEID, 7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri TGSI_SEMANTIC_FACE, 7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri -1, /*TGSI_SEMANTIC_SAMPLE_INDEX*/ 7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 76e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieristruct sm4_to_tgsi_converter 7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_program* ureg; 7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> temps; 8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> outputs; 8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_src> inputs; 8265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller std::vector<struct ureg_src> resources; 8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_src> samplers; 8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<std::pair<unsigned, unsigned> > targets; // first is normal, second shadow/comparison 8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<unsigned> sampler_modes; // 0 = normal, 1 = shadow/comparison 8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<std::pair<unsigned, unsigned> > loops; 87e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_insn* insn; 88e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri struct sm4_program& program; 89e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri std::vector<unsigned> sm4_to_tgsi_insn_num; 90e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri std::vector<std::pair<unsigned, unsigned> > label_to_sm4_insn_num; 9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool in_sub; 9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool avoid_txf; 9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool avoid_int; 9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 95e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_converter(struct sm4_program& program) 9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri : program(program) 9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri avoid_txf = true; 9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri avoid_int = false; 10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 102e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri struct ureg_dst _reg(sm4_op& op) 10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(op.file) 10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 106e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_NULL: 10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d; 10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri memset(&d, 0, sizeof(d)); 11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri d.File = TGSI_FILE_NULL; 11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 113e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_TEMP: 11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.indices[0].disp < temps.size()); 11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return temps[op.indices[0].disp]; 117e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_OUTPUT: 11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.indices[0].disp < outputs.size()); 12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return outputs[op.indices[0].disp]; 12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ureg_dst_undef(); 12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _dst(unsigned i = 0) 12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 130e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 131e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(op.mode == SM4_OPERAND_MODE_MASK || op.mode == SM4_OPERAND_MODE_SCALAR); 13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = ureg_writemask(_reg(op), op.mask); 13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.sat) 13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri d = ureg_saturate(d); 13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src _src(unsigned i) 13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 141e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src s; 14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(op.file) 14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 145e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_IMMEDIATE32: 14692617aeac109481258f0c3863d09c1b8903d438bLuca 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); 14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 148e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_INPUT: 1494babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.is_index_simple(0)); 1504babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.num_indices == 1 || op.num_indices == 2); 1514babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri // TODO: is this correct, or are incorrectly swapping the two indices in the GS case? 1524babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri check(op.indices[op.num_indices - 1].disp < inputs.size()); 1534babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s = inputs[op.indices[op.num_indices - 1].disp]; 1544babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri if(op.num_indices == 2) 1554babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri { 1564babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s.Dimension = 1; 1574babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri s.DimensionIndex = op.indices[0].disp; 1584babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri } 15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 160e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_FILE_CONSTANT_BUFFER: 16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: indirect addressing 16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.num_indices == 2); 16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.is_index_simple(0)); 16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.is_index_simple(1)); 16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_src_register(TGSI_FILE_CONSTANT, (unsigned)op.indices[1].disp); 16692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s.Dimension = 1; 16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s.DimensionIndex = op.indices[0].disp; 16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_src(_reg(op)); 17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 173e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(op.mode == SM4_OPERAND_MODE_SWIZZLE || op.mode == SM4_OPERAND_MODE_SCALAR) 17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_swizzle(s, op.swizzle[0], op.swizzle[1], op.swizzle[2], op.swizzle[3]); 17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* immediates are masked to show needed values */ 178e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(op.file == SM4_FILE_IMMEDIATE32 || op.file == SM4_FILE_IMMEDIATE64); 17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(op.abs) 18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_abs(s); 18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(op.neg) 18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri s = ureg_negate(s); 18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return s; 18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri }; 18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 187e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri int _idx(sm4_file file, unsigned i = 0) 18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(i < insn->num_ops); 190e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_op& op = *insn->ops[i]; 19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.file == file); 19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(op.has_simple_index()); 19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return (int)op.indices[0].disp; 19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 19665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller unsigned tex_target(unsigned resource, unsigned sampler) 19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 19865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller unsigned shadow = sampler_modes[sampler]; 19965303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller unsigned target = shadow ? targets[resource].second : targets[resource].first; 20065303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller check(target); 20165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller return target; 20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 20465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller enum pipe_type res_return_type(unsigned type) 20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 20665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller switch(type) 20765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller { 20865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case D3D_RETURN_TYPE_UNORM: return PIPE_TYPE_UNORM; 20965303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case D3D_RETURN_TYPE_SNORM: return PIPE_TYPE_SNORM; 21065303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case D3D_RETURN_TYPE_SINT: return PIPE_TYPE_SINT; 21165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case D3D_RETURN_TYPE_UINT: return PIPE_TYPE_UINT; 21265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case D3D_RETURN_TYPE_FLOAT: return PIPE_TYPE_FLOAT; 21365303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller default: 21465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller fail("invalid resource return type"); 21565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller return PIPE_TYPE_FLOAT; 21665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller } 21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri std::vector<struct ureg_dst> insn_tmps; 22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _tmp() 22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = ureg_DECL_temporary(ureg); 22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_tmps.push_back(t); 22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return t; 22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst _tmp(struct ureg_dst d) 22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(d.File == TGSI_FILE_TEMPORARY) 23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return d; 23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return ureg_writemask(_tmp(), d.WriteMask); 23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 236e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP1_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1)); break 237e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP2_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2)); break 238e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri#define OP3_(d, g) case SM4_OPCODE_##d: ureg_##g(ureg, _dst(), _src(1), _src(2), _src(3)); break 23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP1(n) OP1_(n, n) 24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP2(n) OP2_(n, n) 24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define OP3(n) OP3_(n, n) 2426c598c78bd17642d731cf57b8369cc794f64ba2fLuca 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; 24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void translate_insns(unsigned begin, unsigned end) 24592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned insn_num = begin; insn_num < end; ++insn_num) 24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 248e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num[insn_num] = ureg_get_instruction_number(ureg); 24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned label; 25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn = program.insns[insn_num]; 25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri bool ok; 25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // trivial instructions 256e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_NOP: 25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(MOV); 25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // float 26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(ADD); 26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MUL); 26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3(MAD); 26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DIV); 26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(FRC); 26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(RCP); 26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MIN); 26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(MAX); 26992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(LT, SLT); 27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(GE, SGE); 27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(EQ, SEQ); 27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(NE, SNE); 27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 27492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // bitwise 27592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(NOT); 27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(AND); 27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(OR); 27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(XOR); 27992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // special mathematical 28192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP2); 28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP3); 28392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(DP4); 28492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(RSQ); 28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(LOG, LG2); 28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(EXP, EX2); 28792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // rounding 28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_NE, ROUND); 29092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_Z, TRUNC); 29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_PI, CEIL); 29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ROUND_NI, FLR); 29392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // cross-thread 29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX, DDX); 29692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX_COARSE, DDX); 29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTX_FINE, DDX); 29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY, DDY); 29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY_COARSE, DDY); 30092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(DERIV_RTY_FINE, DDY); 301e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_EMIT: 30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EMIT(ureg); 30392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 304e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CUT: 30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDPRIM(ureg); 30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 307e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_EMITTHENCUT: 30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EMIT(ureg); 30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDPRIM(ureg); 31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // non-trivial instructions 313e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_MOVC: 31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* CMP checks for < 0, but MOVC checks for != 0 31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * but fortunately, x != 0 is equivalent to -abs(x) < 0 31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * XXX: can test_nz apply to this?! 31792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri */ 31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CMP(ureg, _dst(), ureg_negate(ureg_abs(_src(1))), _src(2), _src(3)); 31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 320e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SQRT: 32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RSQ(ureg, t, _src(1)); 32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RCP(ureg, d, ureg_src(t)); 32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 328e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SINCOS: 32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst s = _dst(0); 33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst c = _dst(1); 33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src v = _src(2); 33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(s.File != TGSI_FILE_NULL) 33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_SIN(ureg, s, v); 33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(c.File != TGSI_FILE_NULL) 33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_COS(ureg, c, v); 33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // control flow 341e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DISCARD: 34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_KIL(ureg, _src(0)); 34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(LOOP, BGNLOOP); 34592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(ENDLOOP, ENDLOOP); 346e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_BREAK: 34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BRK(ureg); 34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 349e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_BREAKC: 35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // XXX: can test_nz apply to this?! 35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BREAKC(ureg, _src(0)); 35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 353e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CONTINUE: 35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CONT(ureg); 35592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 356e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CONTINUEC: 35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // XXX: can test_nz apply to this?! 35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CONT(ureg); 36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 363e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SWITCH: 36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_SWITCH(ureg, _src(0)); 36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 366e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CASE: 36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CASE(ureg, _src(0)); 36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 369e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DEFAULT: 37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DEFAULT(ureg); 37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 372e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ENDSWITCH: 37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSWITCH(ureg); 37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 375e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_CALL: 37692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_CAL(ureg, &label); 377e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, program.label_to_insn_num[_idx(SM4_FILE_LABEL)])); 37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 379e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_LABEL: 38092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub) 38192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSUB(ureg); 38292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_END(ureg); 38492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_BGNSUB(ureg); 38592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri in_sub = true; 38692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 387e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RET: 38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub || insn_num != (program.insns.size() - 1)) 38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 391e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RETC: 39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.test_nz) 39492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!insn->insn.test_nz) 39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_RET(ureg); 40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 40192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP_CF(ELSE, ELSE); 405e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ENDIF: 40692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDIF(ureg); 40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 408e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_IF: 40992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(insn->insn.test_nz) 41092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 41192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 412e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, program.cf_insn_linked[insn_num])); 41392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 41692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned linked = program.cf_insn_linked[insn_num]; 417e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(program.insns[linked]->opcode == SM4_OPCODE_ENDIF) 41892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_fixup_label(ureg, label, ureg_get_instruction_number(ureg)); 42192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 422e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, linked)); 42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 42592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 42692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri /* we have to swap the branches in this case (fun!) 42792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * TODO: maybe just emit a SEQ 0? 42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * */ 42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned endif = program.cf_insn_linked[linked]; 43092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_IF(ureg, _src(0), &label); 432e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, linked)); 43392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 43492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(linked + 1, endif); 43592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 436e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num[linked] = ureg_get_instruction_number(ureg); 43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ELSE(ureg, &label); 438e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri label_to_sm4_insn_num.push_back(std::make_pair(label, endif)); 43992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(insn_num + 1, linked); 44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 44292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_num = endif - 1; 44392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri goto next; 44492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 447e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_RESINFO: 44865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller // TODO: return type 449a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez ureg_SVIEWINFO(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)]); 45065303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller break; 45165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller // TODO: sample index, texture offset 45265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller case SM4_OPCODE_LD: // dst, coord_int, res; mipmap level in last coord_int arg 45365303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_LOAD(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)]); 45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 455e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_LD_MS: 45665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_LOAD_MS(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)]); 45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 458e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE: // dst, coord, res, samp 45965303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)]); 46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 461e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_B: // dst, coord, res, samp, bias.x 46265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE_B(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4)); 46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 464e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_C: // dst, coord, res, samp, comp.x 46565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE_C(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4)); 46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 467e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_C_LZ: // dst, coord, res, samp, comp.x 46865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE_C_LZ(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4)); 46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 470e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_D: // dst, coord, res, samp, ddx, ddy 47165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE_D(ureg, _dst(), _src(1), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)], _src(4), _src(5)); 47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 473e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_SAMPLE_L: // dst, coord, res, samp, bias.x 47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 47592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst tmp = _tmp(); 47692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_XYZ), _src(1)); 47792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), ureg_swizzle(_src(4), 0, 0, 0, 0)); 47865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller ureg_SAMPLE_L(ureg, _dst(), ureg_src(tmp), resources[_idx(SM4_FILE_RESOURCE, 2)], samplers[_idx(SM4_FILE_SAMPLER, 3)]); 47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 48692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!ok && !avoid_int) 48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 49192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // integer 49292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(ITOF, I2F); 49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOI, F2I); 49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IADD, UADD); 49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1(INEG); 49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IMUL, UMUL); 49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(IMAD, UMAD); 49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ISHL, SHL); 49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ISHR, ISHR); 50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(IMIN); 50192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(IMAX); 50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ILT, ISLT); 50392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IGE, ISGE); 50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IEQ, USEQ); 50592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(INE, USNE); 50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // unsigned 50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(UTOF, U2F); 50992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOU, F2U); 51092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMUL); 51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3(UMAD); 51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMIN); 51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(UMAX); 51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ULT, USLT); 51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UGE, USGE); 51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2(USHR); 51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 518e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UDIV: 51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 52092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst q = _dst(0); 52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst r = _dst(1); 52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src a = _src(2); 52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src b = _src(3); 52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(q.File != TGSI_FILE_NULL) 52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_UDIV(ureg, q, a, b); 52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(r.File != TGSI_FILE_NULL) 52792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_UMOD(ureg, r, a, b); 52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 53192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!ok && avoid_int) 53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 53792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = true; 53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(insn->opcode) 53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 540e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ITOF: 541e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UTOF: 54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOI, TRUNC); 54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP1_(FTOU, FLR); 54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // integer 54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IADD, ADD); 54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IMUL, MUL); 54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(IMAD, MAD); 54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(MIN, MIN); 55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(MAX, MAX); 55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ILT, SLT); 55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IGE, SGE); 55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(IEQ, SEQ); 55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(INE, SNE); 55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // unsigned 55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMUL, MUL); 55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP3_(UMAD, MAD); 55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMIN, MIN); 56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UMAX, MAX); 56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(ULT, SLT); 56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri OP2_(UGE, SGE); 56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 564e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_INEG: 56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MOV(ureg, _dst(), ureg_negate(_src(1))); 56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 567e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ISHL: 56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 56992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 57192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EX2(ureg, t, _src(2)); 57292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, d, ureg_src(t), _src(1)); 57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 575e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_ISHR: 576e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_USHR: 57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst d = _dst(); 57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst t = _tmp(d); 58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_EX2(ureg, t, ureg_negate(_src(2))); 58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, t, ureg_src(t), _src(1)); 58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FLR(ureg, d, ureg_src(t)); 58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 585e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_UDIV: 58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst q = _dst(0); 58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst r = _dst(1); 58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src a = _src(2); 59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_src b = _src(3); 59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct ureg_dst f = _tmp(); 59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DIV(ureg, f, a, b); 59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(q.File != TGSI_FILE_NULL) 59492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FLR(ureg, q, ureg_src(f)); 59592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(r.File != TGSI_FILE_NULL) 59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 59792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_FRC(ureg, f, ureg_src(f)); 59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_MUL(ureg, r, ureg_src(f), b); 59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 60092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ok = false; 60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(ok); 60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!insn_tmps.empty()) 61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned i = 0; i < insn_tmps.size(); ++i) 61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_release_temporary(ureg, insn_tmps[i]); 61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri insn_tmps.clear(); 61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 61592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinext:; 61692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 61792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 61892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void* do_translate() 62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned processor; 62292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(program.version.type) 62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 62492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 0: 62592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_FRAGMENT; 62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 1: 62892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_VERTEX; 62992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 63092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri case 2: 63192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri processor = TGSI_PROCESSOR_GEOMETRY; 63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Tessellation and compute shaders not yet supported"); 63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return 0; 63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 63792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 638e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(!sm4_link_cf_insns(program)) 63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Malformed control flow"); 640e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri if(!sm4_find_labels(program)) 64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri fail("Failed to locate labels"); 64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 64392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg = ureg_create(processor); 64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri in_sub = false; 64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 647e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num.resize(program.insns.size()); 64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned insn_num = 0; insn_num < program.dcls.size(); ++insn_num) 64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 650e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_dcl& dcl = *program.dcls[insn_num]; 65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri int idx = -1; 6524babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri if(dcl.op.get() && dcl.op->is_index_simple(0)) 65392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri idx = dcl.op->indices[0].disp; 65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(dcl.opcode) 65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 656e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_GLOBAL_FLAGS: 65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 658e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_TEMPS: 65992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri for(unsigned i = 0; i < dcl.num; ++i) 66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri temps.push_back(ureg_DECL_temporary(ureg)); 66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 662e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT: 66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(processor == TGSI_PROCESSOR_VERTEX) 6650e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri { 6660e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri if(inputs.size() <= (unsigned)idx) 6670e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri inputs.resize(idx + 1); 66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs[idx] = ureg_DECL_vs_input(ureg, idx); 6690e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri } 6704babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri else if(processor == TGSI_PROCESSOR_GEOMETRY) 6714babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri { 6724babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri // TODO: is this correct? 6734babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri unsigned gsidx = dcl.op->indices[1].disp; 6740e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri if(inputs.size() <= (unsigned)gsidx) 6750e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri inputs.resize(gsidx + 1); 6764babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri inputs[gsidx] = ureg_DECL_gs_input(ureg, gsidx, TGSI_SEMANTIC_GENERIC, gsidx); 6774babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri } 67892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 67992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 681e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS: 68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(inputs.size() <= (unsigned)idx) 68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs.resize(idx + 1); 685db6f1d0436b66435bac5e2b6db5d2f4e07e80473Luca Barbieri inputs[idx] = ureg_DECL_fs_input_cyl_centroid(ureg, TGSI_SEMANTIC_GENERIC, idx, sm4_to_pipe_interpolation[dcl.dcl_input_ps.interpolation].interpolation, 0, sm4_to_pipe_interpolation[dcl.dcl_input_ps.interpolation].centroid); 68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 687e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT: 68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 68992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(outputs.size() <= (unsigned)idx) 69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs.resize(idx + 1); 69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(processor == TGSI_PROCESSOR_FRAGMENT) 69292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, idx); 69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 69492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs[idx] = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, idx); 69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 696e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_SIV: 697e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_SGV: 698e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS_SIV: 699e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_INPUT_PS_SGV: 70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 70192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(inputs.size() <= (unsigned)idx) 70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri inputs.resize(idx + 1); 70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: is this correct? 704e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri inputs[idx] = ureg_DECL_system_value(ureg, idx, sm4_to_pipe_sv[dcl.sv], 0); 70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 706e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT_SIV: 707e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_OUTPUT_SGV: 70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 70992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(outputs.size() <= (unsigned)idx) 71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri outputs.resize(idx + 1); 711e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri check(sm4_to_pipe_sv[dcl.sv] >= 0); 712e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri outputs[idx] = ureg_DECL_output(ureg, sm4_to_pipe_sv[dcl.sv], 0); 71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 714e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_RESOURCE: 71592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 71692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(targets.size() <= (unsigned)idx) 71792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets.resize(idx + 1); 71892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri switch(dcl.dcl_resource.target) 71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 720e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE1D: 72192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_1D; 72292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW1D; 72392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 724c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller case SM4_TARGET_TEXTURE1DARRAY: 725c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller targets[idx].first = TGSI_TEXTURE_1D_ARRAY; 726c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller targets[idx].second = TGSI_TEXTURE_SHADOW1D_ARRAY; 727c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller break; 728e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE2D: 72992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_2D; 73092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW2D; 73192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 732c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller case SM4_TARGET_TEXTURE2DARRAY: 733c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller targets[idx].first = TGSI_TEXTURE_2D_ARRAY; 734c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller targets[idx].second = TGSI_TEXTURE_SHADOW2D_ARRAY; 735c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller break; 736e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURE3D: 73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_3D; 73892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = 0; 73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 740e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_TARGET_TEXTURECUBE: 74192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].first = TGSI_TEXTURE_CUBE; 74292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri targets[idx].second = 0; 74392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 74492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 7450e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri // HACK to make SimpleSample10 work 7460e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri //check(0); 7470e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri targets[idx].first = TGSI_TEXTURE_2D; 7480e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri targets[idx].second = TGSI_TEXTURE_SHADOW2D; 7490e40b41ceec15d97507fe85343daad54aa1c4824Luca Barbieri break; 75092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 75165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller if(resources.size() <= (unsigned)idx) 75265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller resources.resize(idx + 1); 753a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez resources[idx] = ureg_DECL_sampler_view( 754a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez ureg, idx, targets[idx].first, 755a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez res_return_type(dcl.rrt.x), 756a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez res_return_type(dcl.rrt.y), 757a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez res_return_type(dcl.rrt.z), 758a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez res_return_type(dcl.rrt.w)); 75992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 760e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_SAMPLER: 76192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(idx >= 0); 76292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(sampler_modes.size() <= (unsigned)idx) 76392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri sampler_modes.resize(idx + 1); 76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(!dcl.dcl_sampler.mono); 76592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri sampler_modes[idx] = dcl.dcl_sampler.shadow; 76665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller if(samplers.size() <= (unsigned)idx) 76765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller samplers.resize(idx + 1); 76865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller samplers[idx] = ureg_DECL_sampler(ureg, idx); 76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 770e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri case SM4_OPCODE_DCL_CONSTANT_BUFFER: 77192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->num_indices == 2); 77292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->is_index_simple(0)); 77392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(dcl.op->is_index_simple(1)); 77492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri idx = dcl.op->indices[0].disp; 77592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_DECL_constant2D(ureg, 0, (unsigned)dcl.op->indices[1].disp - 1, idx); 77692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri break; 7774babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE: 7784babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_input_prim(ureg, d3d_to_pipe_prim_type[dcl.dcl_gs_input_primitive.primitive]); 7794babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 7804babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY: 7814babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_output_prim(ureg, d3d_to_pipe_prim[dcl.dcl_gs_output_primitive_topology.primitive_topology]); 7824babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 7834babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT: 7844babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri ureg_property_gs_max_vertices(ureg, dcl.num); 7854babdc78448f92b8d027a66cd506351a16aef4ecLuca Barbieri break; 78692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri default: 78792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri check(0); 78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 79092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 79192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri translate_insns(0, program.insns.size()); 792e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_insn_num.push_back(ureg_get_instruction_number(ureg)); 79392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(in_sub) 79492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_ENDSUB(ureg); 79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 79692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_END(ureg); 79792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 798e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri for(unsigned i = 0; i < label_to_sm4_insn_num.size(); ++i) 799e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri ureg_fixup_label(ureg, label_to_sm4_insn_num[i].first, sm4_to_tgsi_insn_num[label_to_sm4_insn_num[i].second]); 80092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 80192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri const struct tgsi_token * tokens = ureg_get_tokens(ureg, 0); 80292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ureg_destroy(ureg); 80392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return (void*)tokens; 80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 80592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri void* translate() 80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri try 80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 81092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return do_translate(); 81192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 81292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri catch(const char*) 81392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return 0; 81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 81692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 81792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}; 81892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 819e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbierivoid* sm4_to_tgsi(struct sm4_program& program) 82092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 821e5ae4588d150a179974a812887f3b6445d8e2f34Luca Barbieri sm4_to_tgsi_converter conv(program); 82292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return conv.translate(); 82392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 82414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 82514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumillervoid* sm4_to_tgsi_linkage_only(struct sm4_program& prog) 82614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller{ 82714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller struct ureg_program* ureg = ureg_create(TGSI_PROCESSOR_GEOMETRY); 82814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 82914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller uint64_t already = 0; 83014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller for(unsigned n = 0, i = 0; i < prog.num_params_out; ++i) 83114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller { 83214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller unsigned sn, si; 83314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 83414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller if(already & (1ULL << prog.params_out[i].Register)) 83514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller continue; 83614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller already |= 1ULL << prog.params_out[i].Register; 83714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 83814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller switch(prog.params_out[i].SystemValueType) 83914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller { 84014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller case D3D_NAME_UNDEFINED: 84114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller sn = TGSI_SEMANTIC_GENERIC; 84214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller si = n++; 84314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller break; 84414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller case D3D_NAME_CULL_DISTANCE: 84514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller case D3D_NAME_CLIP_DISTANCE: 84614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller // FIXME 84714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller sn = 0; 84814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller si = prog.params_out[i].SemanticIndex; 84914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller assert(0); 85014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller break; 85114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller default: 85214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller continue; 85314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller } 85414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 85514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller ureg_DECL_output(ureg, sn, si); 85614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller } 85714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller 85814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller const struct tgsi_token* tokens = ureg_get_tokens(ureg, 0); 85914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller ureg_destroy(ureg); 86014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller return (void*)tokens; 86114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller} 862