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