xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/d3d10umd/ShaderTGSI.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker  *
3*61046927SAndroid Build Coastguard Worker  * Copyright 2012-2021 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker  * the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18*61046927SAndroid Build Coastguard Worker  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19*61046927SAndroid Build Coastguard Worker  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20*61046927SAndroid Build Coastguard Worker  * USE OR OTHER DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker  *
22*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
23*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
24*61046927SAndroid Build Coastguard Worker  * of the Software.
25*61046927SAndroid Build Coastguard Worker  *
26*61046927SAndroid Build Coastguard Worker  **************************************************************************/
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker  * ShaderTGSI.c --
30*61046927SAndroid Build Coastguard Worker  *    Functions for translating shaders.
31*61046927SAndroid Build Coastguard Worker  */
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "Debug.h"
34*61046927SAndroid Build Coastguard Worker #include "ShaderParse.h"
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker #include "pipe/p_state.h"
37*61046927SAndroid Build Coastguard Worker #include "tgsi/tgsi_ureg.h"
38*61046927SAndroid Build Coastguard Worker #include "tgsi/tgsi_dump.h"
39*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker #include "ShaderDump.h"
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker enum dx10_opcode_format {
45*61046927SAndroid Build Coastguard Worker    OF_FLOAT,
46*61046927SAndroid Build Coastguard Worker    OF_INT,
47*61046927SAndroid Build Coastguard Worker    OF_UINT
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker struct dx10_opcode_xlate {
51*61046927SAndroid Build Coastguard Worker    D3D10_SB_OPCODE_TYPE type;
52*61046927SAndroid Build Coastguard Worker    enum dx10_opcode_format format;
53*61046927SAndroid Build Coastguard Worker    uint tgsi_opcode;
54*61046927SAndroid Build Coastguard Worker };
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker /* Opcodes that we have not even attempted to implement:
57*61046927SAndroid Build Coastguard Worker  */
58*61046927SAndroid Build Coastguard Worker #define TGSI_LOG_UNSUPPORTED TGSI_OPCODE_LAST
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker /* Opcodes which do not translate directly to a TGSI opcode, but which
61*61046927SAndroid Build Coastguard Worker  * have at least a partial implemention coded below:
62*61046927SAndroid Build Coastguard Worker  */
63*61046927SAndroid Build Coastguard Worker #define TGSI_EXPAND          (TGSI_OPCODE_LAST+1)
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker static struct dx10_opcode_xlate opcode_xlate[D3D10_SB_NUM_OPCODES] = {
66*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ADD,                              OF_FLOAT, TGSI_OPCODE_ADD},
67*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_AND,                              OF_UINT,  TGSI_OPCODE_AND},
68*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_BREAK,                            OF_FLOAT, TGSI_OPCODE_BRK},
69*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_BREAKC,                           OF_UINT,  TGSI_EXPAND},
70*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CALL,                             OF_UINT,  TGSI_EXPAND},
71*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CALLC,                            OF_UINT,  TGSI_EXPAND},
72*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CASE,                             OF_UINT,  TGSI_OPCODE_CASE},
73*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CONTINUE,                         OF_FLOAT, TGSI_OPCODE_CONT},
74*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CONTINUEC,                        OF_UINT,  TGSI_EXPAND},
75*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CUT,                              OF_FLOAT, TGSI_EXPAND},
76*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DEFAULT,                          OF_FLOAT, TGSI_OPCODE_DEFAULT},
77*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DERIV_RTX,                        OF_FLOAT, TGSI_OPCODE_DDX},
78*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DERIV_RTY,                        OF_FLOAT, TGSI_OPCODE_DDY},
79*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DISCARD,                          OF_UINT,  TGSI_EXPAND},
80*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DIV,                              OF_FLOAT, TGSI_OPCODE_DIV},
81*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DP2,                              OF_FLOAT, TGSI_OPCODE_DP2},
82*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DP3,                              OF_FLOAT, TGSI_OPCODE_DP3},
83*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DP4,                              OF_FLOAT, TGSI_OPCODE_DP4},
84*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ELSE,                             OF_FLOAT, TGSI_OPCODE_ELSE},
85*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_EMIT,                             OF_FLOAT, TGSI_EXPAND},
86*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_EMITTHENCUT,                      OF_FLOAT, TGSI_EXPAND},
87*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ENDIF,                            OF_FLOAT, TGSI_OPCODE_ENDIF},
88*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ENDLOOP,                          OF_FLOAT, TGSI_OPCODE_ENDLOOP},
89*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ENDSWITCH,                        OF_FLOAT, TGSI_OPCODE_ENDSWITCH},
90*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_EQ,                               OF_FLOAT, TGSI_OPCODE_FSEQ},
91*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_EXP,                              OF_FLOAT, TGSI_EXPAND},
92*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_FRC,                              OF_FLOAT, TGSI_OPCODE_FRC},
93*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_FTOI,                             OF_FLOAT, TGSI_EXPAND},
94*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_FTOU,                             OF_FLOAT, TGSI_EXPAND},
95*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_GE,                               OF_FLOAT, TGSI_OPCODE_FSGE},
96*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IADD,                             OF_INT,   TGSI_OPCODE_UADD},
97*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IF,                               OF_UINT,  TGSI_EXPAND},
98*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IEQ,                              OF_INT,   TGSI_OPCODE_USEQ},
99*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IGE,                              OF_INT,   TGSI_OPCODE_ISGE},
100*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ILT,                              OF_INT,   TGSI_OPCODE_ISLT},
101*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IMAD,                             OF_INT,   TGSI_OPCODE_UMAD},
102*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IMAX,                             OF_INT,   TGSI_OPCODE_IMAX},
103*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IMIN,                             OF_INT,   TGSI_OPCODE_IMIN},
104*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_IMUL,                             OF_INT,   TGSI_EXPAND},
105*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_INE,                              OF_INT,   TGSI_OPCODE_USNE},
106*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_INEG,                             OF_INT,   TGSI_OPCODE_INEG},
107*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ISHL,                             OF_INT,   TGSI_OPCODE_SHL},
108*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ISHR,                             OF_INT,   TGSI_OPCODE_ISHR},
109*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ITOF,                             OF_INT,   TGSI_OPCODE_I2F},
110*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LABEL,                            OF_INT,   TGSI_EXPAND},
111*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LD,                               OF_UINT,  TGSI_EXPAND},
112*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LD_MS,                            OF_UINT,  TGSI_EXPAND},
113*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LOG,                              OF_FLOAT, TGSI_EXPAND},
114*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LOOP,                             OF_FLOAT, TGSI_OPCODE_BGNLOOP},
115*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_LT,                               OF_FLOAT, TGSI_OPCODE_FSLT},
116*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MAD,                              OF_FLOAT, TGSI_OPCODE_MAD},
117*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MIN,                              OF_FLOAT, TGSI_OPCODE_MIN},
118*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MAX,                              OF_FLOAT, TGSI_OPCODE_MAX},
119*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_CUSTOMDATA,                       OF_FLOAT, TGSI_EXPAND},
120*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MOV,                              OF_UINT,  TGSI_OPCODE_MOV},
121*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MOVC,                             OF_UINT,  TGSI_OPCODE_UCMP},
122*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_MUL,                              OF_FLOAT, TGSI_OPCODE_MUL},
123*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_NE,                               OF_FLOAT, TGSI_OPCODE_FSNE},
124*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_NOP,                              OF_FLOAT, TGSI_OPCODE_NOP},
125*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_NOT,                              OF_UINT,  TGSI_OPCODE_NOT},
126*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_OR,                               OF_UINT,  TGSI_OPCODE_OR},
127*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_RESINFO,                          OF_UINT,  TGSI_EXPAND},
128*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_RET,                              OF_FLOAT, TGSI_OPCODE_RET},
129*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_RETC,                             OF_UINT,  TGSI_EXPAND},
130*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ROUND_NE,                         OF_FLOAT, TGSI_OPCODE_ROUND},
131*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ROUND_NI,                         OF_FLOAT, TGSI_OPCODE_FLR},
132*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ROUND_PI,                         OF_FLOAT, TGSI_OPCODE_CEIL},
133*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ROUND_Z,                          OF_FLOAT, TGSI_OPCODE_TRUNC},
134*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_RSQ,                              OF_FLOAT, TGSI_EXPAND},
135*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE,                           OF_FLOAT, TGSI_EXPAND},
136*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE_C,                         OF_FLOAT, TGSI_EXPAND},
137*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE_C_LZ,                      OF_FLOAT, TGSI_EXPAND},
138*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE_L,                         OF_FLOAT, TGSI_EXPAND},
139*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE_D,                         OF_FLOAT, TGSI_EXPAND},
140*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SAMPLE_B,                         OF_FLOAT, TGSI_EXPAND},
141*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SQRT,                             OF_FLOAT, TGSI_EXPAND},
142*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SWITCH,                           OF_UINT,  TGSI_OPCODE_SWITCH},
143*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_SINCOS,                           OF_FLOAT, TGSI_EXPAND},
144*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UDIV,                             OF_UINT,  TGSI_EXPAND},
145*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_ULT,                              OF_UINT,  TGSI_OPCODE_USLT},
146*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UGE,                              OF_UINT,  TGSI_OPCODE_USGE},
147*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UMUL,                             OF_UINT,  TGSI_EXPAND},
148*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UMAD,                             OF_UINT,  TGSI_OPCODE_UMAD},
149*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UMAX,                             OF_UINT,  TGSI_OPCODE_UMAX},
150*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UMIN,                             OF_UINT,  TGSI_OPCODE_UMIN},
151*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_USHR,                             OF_UINT,  TGSI_OPCODE_USHR},
152*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_UTOF,                             OF_UINT,  TGSI_OPCODE_U2F},
153*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_XOR,                              OF_UINT,  TGSI_OPCODE_XOR},
154*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_RESOURCE,                     OF_FLOAT, TGSI_EXPAND},
155*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_CONSTANT_BUFFER,              OF_FLOAT, TGSI_EXPAND},
156*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_SAMPLER,                      OF_FLOAT, TGSI_EXPAND},
157*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INDEX_RANGE,                  OF_FLOAT, TGSI_LOG_UNSUPPORTED},
158*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY, OF_FLOAT, TGSI_EXPAND},
159*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_GS_INPUT_PRIMITIVE,           OF_FLOAT, TGSI_EXPAND},
160*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT,      OF_FLOAT, TGSI_EXPAND},
161*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT,                        OF_FLOAT, TGSI_EXPAND},
162*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT_SGV,                    OF_FLOAT, TGSI_EXPAND},
163*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT_SIV,                    OF_FLOAT, TGSI_EXPAND},
164*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT_PS,                     OF_FLOAT, TGSI_EXPAND},
165*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT_PS_SGV,                 OF_FLOAT, TGSI_EXPAND},
166*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INPUT_PS_SIV,                 OF_FLOAT, TGSI_EXPAND},
167*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_OUTPUT,                       OF_FLOAT, TGSI_EXPAND},
168*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_OUTPUT_SGV,                   OF_FLOAT, TGSI_EXPAND},
169*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_OUTPUT_SIV,                   OF_FLOAT, TGSI_EXPAND},
170*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_TEMPS,                        OF_FLOAT, TGSI_EXPAND},
171*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_INDEXABLE_TEMP,               OF_FLOAT, TGSI_EXPAND},
172*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS,                 OF_FLOAT, TGSI_LOG_UNSUPPORTED},
173*61046927SAndroid Build Coastguard Worker    {D3D10_SB_OPCODE_RESERVED0,                        OF_FLOAT, TGSI_LOG_UNSUPPORTED},
174*61046927SAndroid Build Coastguard Worker    {D3D10_1_SB_OPCODE_LOD,                            OF_FLOAT, TGSI_LOG_UNSUPPORTED},
175*61046927SAndroid Build Coastguard Worker    {D3D10_1_SB_OPCODE_GATHER4,                        OF_FLOAT, TGSI_LOG_UNSUPPORTED},
176*61046927SAndroid Build Coastguard Worker    {D3D10_1_SB_OPCODE_SAMPLE_POS,                     OF_FLOAT, TGSI_LOG_UNSUPPORTED},
177*61046927SAndroid Build Coastguard Worker    {D3D10_1_SB_OPCODE_SAMPLE_INFO,                    OF_FLOAT, TGSI_LOG_UNSUPPORTED}
178*61046927SAndroid Build Coastguard Worker };
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_TEMPS 4096
181*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_INPUTS 32
182*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_OUTPUTS 32
183*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_CONSTS 4096
184*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_RESOURCES PIPE_MAX_SHADER_SAMPLER_VIEWS
185*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_SAMPLERS PIPE_MAX_SAMPLERS
186*61046927SAndroid Build Coastguard Worker #define SHADER_MAX_INDEXABLE_TEMPS 4096
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker struct Shader_call {
189*61046927SAndroid Build Coastguard Worker    unsigned d3d_label;
190*61046927SAndroid Build Coastguard Worker    unsigned tgsi_label_token;
191*61046927SAndroid Build Coastguard Worker };
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker struct Shader_label {
194*61046927SAndroid Build Coastguard Worker    unsigned d3d_label;
195*61046927SAndroid Build Coastguard Worker    unsigned tgsi_insn_no;
196*61046927SAndroid Build Coastguard Worker };
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker struct Shader_resource {
199*61046927SAndroid Build Coastguard Worker    uint target;   /* TGSI_TEXTURE_x */
200*61046927SAndroid Build Coastguard Worker };
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker struct Shader_xlate {
203*61046927SAndroid Build Coastguard Worker    struct ureg_program *ureg;
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    uint vertices_in;
206*61046927SAndroid Build Coastguard Worker    uint declared_temps;
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    struct ureg_dst temps[SHADER_MAX_TEMPS];
209*61046927SAndroid Build Coastguard Worker    struct ureg_dst output_depth;
210*61046927SAndroid Build Coastguard Worker    struct Shader_resource resources[SHADER_MAX_RESOURCES];
211*61046927SAndroid Build Coastguard Worker    struct ureg_src sv[SHADER_MAX_RESOURCES];
212*61046927SAndroid Build Coastguard Worker    struct ureg_src samplers[SHADER_MAX_SAMPLERS];
213*61046927SAndroid Build Coastguard Worker    struct ureg_src imms;
214*61046927SAndroid Build Coastguard Worker    struct ureg_src prim_id;
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker    uint temp_offset;
217*61046927SAndroid Build Coastguard Worker    uint indexable_temp_offsets[SHADER_MAX_INDEXABLE_TEMPS];
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker    struct {
220*61046927SAndroid Build Coastguard Worker       bool declared;
221*61046927SAndroid Build Coastguard Worker       uint writemask;
222*61046927SAndroid Build Coastguard Worker       uint siv_name;
223*61046927SAndroid Build Coastguard Worker       bool overloaded;
224*61046927SAndroid Build Coastguard Worker       struct ureg_src reg;
225*61046927SAndroid Build Coastguard Worker    } inputs[SHADER_MAX_INPUTS];
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker    struct {
228*61046927SAndroid Build Coastguard Worker       struct ureg_dst reg[4];
229*61046927SAndroid Build Coastguard Worker    } outputs[SHADER_MAX_OUTPUTS];
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker    struct {
232*61046927SAndroid Build Coastguard Worker       uint d3d;
233*61046927SAndroid Build Coastguard Worker       uint tgsi;
234*61046927SAndroid Build Coastguard Worker    } clip_distance_mapping[2], cull_distance_mapping[2];
235*61046927SAndroid Build Coastguard Worker    uint num_clip_distances_declared;
236*61046927SAndroid Build Coastguard Worker    uint num_cull_distances_declared;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker    struct Shader_call *calls;
239*61046927SAndroid Build Coastguard Worker    uint num_calls;
240*61046927SAndroid Build Coastguard Worker    uint max_calls;
241*61046927SAndroid Build Coastguard Worker    struct Shader_label *labels;
242*61046927SAndroid Build Coastguard Worker    uint num_labels;
243*61046927SAndroid Build Coastguard Worker    uint max_labels;
244*61046927SAndroid Build Coastguard Worker };
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker static uint
translate_interpolation(D3D10_SB_INTERPOLATION_MODE interpolation)247*61046927SAndroid Build Coastguard Worker translate_interpolation(D3D10_SB_INTERPOLATION_MODE interpolation)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker    switch (interpolation) {
250*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_UNDEFINED:
251*61046927SAndroid Build Coastguard Worker       assert(0);
252*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_LINEAR;
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_CONSTANT:
255*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_CONSTANT;
256*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR:
257*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_PERSPECTIVE;
258*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR_NOPERSPECTIVE:
259*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_LINEAR;
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR_CENTROID:
262*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR_SAMPLE: // DX10.1
263*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
264*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_PERSPECTIVE;
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR_NOPERSPECTIVE_CENTROID:
267*61046927SAndroid Build Coastguard Worker    case D3D10_SB_INTERPOLATION_LINEAR_NOPERSPECTIVE_SAMPLE: // DX10.1
268*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
269*61046927SAndroid Build Coastguard Worker       return TGSI_INTERPOLATE_LINEAR;
270*61046927SAndroid Build Coastguard Worker    }
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker    assert(0);
273*61046927SAndroid Build Coastguard Worker    return TGSI_INTERPOLATE_LINEAR;
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker static uint
translate_system_name(D3D10_SB_NAME name)277*61046927SAndroid Build Coastguard Worker translate_system_name(D3D10_SB_NAME name)
278*61046927SAndroid Build Coastguard Worker {
279*61046927SAndroid Build Coastguard Worker    switch (name) {
280*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_UNDEFINED:
281*61046927SAndroid Build Coastguard Worker       assert(0);                /* should not happen */
282*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_GENERIC;
283*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_POSITION:
284*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_POSITION;
285*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_CLIP_DISTANCE:
286*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_CULL_DISTANCE:
287*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_CLIPDIST;
288*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_PRIMITIVE_ID:
289*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_PRIMID;
290*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_INSTANCE_ID:
291*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_INSTANCEID;
292*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_VERTEX_ID:
293*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_VERTEXID_NOBASE;
294*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_VIEWPORT_ARRAY_INDEX:
295*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_VIEWPORT_INDEX;
296*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_RENDER_TARGET_ARRAY_INDEX:
297*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_LAYER;
298*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_IS_FRONT_FACE:
299*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_FACE;
300*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_SAMPLE_INDEX:
301*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
302*61046927SAndroid Build Coastguard Worker       return TGSI_SEMANTIC_GENERIC;
303*61046927SAndroid Build Coastguard Worker    }
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    assert(0);
306*61046927SAndroid Build Coastguard Worker    return TGSI_SEMANTIC_GENERIC;
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker static uint
translate_semantic_index(struct Shader_xlate * sx,D3D10_SB_NAME name,const struct Shader_dst_operand * operand)310*61046927SAndroid Build Coastguard Worker translate_semantic_index(struct Shader_xlate *sx,
311*61046927SAndroid Build Coastguard Worker                          D3D10_SB_NAME name,
312*61046927SAndroid Build Coastguard Worker                          const struct Shader_dst_operand *operand)
313*61046927SAndroid Build Coastguard Worker {
314*61046927SAndroid Build Coastguard Worker    unsigned idx;
315*61046927SAndroid Build Coastguard Worker    switch (name) {
316*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_CLIP_DISTANCE:
317*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_CULL_DISTANCE:
318*61046927SAndroid Build Coastguard Worker       if (sx->clip_distance_mapping[0].d3d == operand->base.index[0].imm) {
319*61046927SAndroid Build Coastguard Worker          idx = sx->clip_distance_mapping[0].tgsi;
320*61046927SAndroid Build Coastguard Worker       } else {
321*61046927SAndroid Build Coastguard Worker          assert(sx->clip_distance_mapping[1].d3d == operand->base.index[0].imm);
322*61046927SAndroid Build Coastguard Worker          idx = sx->clip_distance_mapping[1].tgsi;
323*61046927SAndroid Build Coastguard Worker       }
324*61046927SAndroid Build Coastguard Worker       break;
325*61046927SAndroid Build Coastguard Worker /*   case D3D10_SB_NAME_CULL_DISTANCE:
326*61046927SAndroid Build Coastguard Worker       if (sx->cull_distance_mapping[0].d3d == operand->base.index[0].imm) {
327*61046927SAndroid Build Coastguard Worker          idx = sx->cull_distance_mapping[0].tgsi;
328*61046927SAndroid Build Coastguard Worker       } else {
329*61046927SAndroid Build Coastguard Worker          assert(sx->cull_distance_mapping[1].d3d == operand->base.index[0].imm);
330*61046927SAndroid Build Coastguard Worker          idx = sx->cull_distance_mapping[1].tgsi;
331*61046927SAndroid Build Coastguard Worker       }
332*61046927SAndroid Build Coastguard Worker       break;*/
333*61046927SAndroid Build Coastguard Worker    default:
334*61046927SAndroid Build Coastguard Worker       idx = 0;
335*61046927SAndroid Build Coastguard Worker    }
336*61046927SAndroid Build Coastguard Worker    return idx;
337*61046927SAndroid Build Coastguard Worker }
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker static enum tgsi_return_type
trans_dcl_ret_type(D3D10_SB_RESOURCE_RETURN_TYPE d3drettype)340*61046927SAndroid Build Coastguard Worker trans_dcl_ret_type(D3D10_SB_RESOURCE_RETURN_TYPE d3drettype) {
341*61046927SAndroid Build Coastguard Worker    switch (d3drettype) {
342*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_UNORM:
343*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_UNORM;
344*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_SNORM:
345*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_SNORM;
346*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_SINT:
347*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_SINT;
348*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_UINT:
349*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_UINT;
350*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_FLOAT:
351*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_FLOAT;
352*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RETURN_TYPE_MIXED:
353*61046927SAndroid Build Coastguard Worker    default:
354*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
355*61046927SAndroid Build Coastguard Worker       return TGSI_RETURN_TYPE_FLOAT;
356*61046927SAndroid Build Coastguard Worker    }
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker static void
declare_vertices_in(struct Shader_xlate * sx,unsigned in)360*61046927SAndroid Build Coastguard Worker declare_vertices_in(struct Shader_xlate *sx,
361*61046927SAndroid Build Coastguard Worker                     unsigned in)
362*61046927SAndroid Build Coastguard Worker {
363*61046927SAndroid Build Coastguard Worker    /* Make sure vertices_in is consistent with input primitive
364*61046927SAndroid Build Coastguard Worker     * and other input declarations.
365*61046927SAndroid Build Coastguard Worker     */
366*61046927SAndroid Build Coastguard Worker    if (sx->vertices_in) {
367*61046927SAndroid Build Coastguard Worker       assert(sx->vertices_in == in);
368*61046927SAndroid Build Coastguard Worker    } else {
369*61046927SAndroid Build Coastguard Worker       sx->vertices_in = in;
370*61046927SAndroid Build Coastguard Worker    }
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker struct swizzle_mapping {
374*61046927SAndroid Build Coastguard Worker    unsigned x;
375*61046927SAndroid Build Coastguard Worker    unsigned y;
376*61046927SAndroid Build Coastguard Worker    unsigned z;
377*61046927SAndroid Build Coastguard Worker    unsigned w;
378*61046927SAndroid Build Coastguard Worker };
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker /* mapping of writmask to swizzles */
381*61046927SAndroid Build Coastguard Worker static const struct swizzle_mapping writemask_to_swizzle[] = {
382*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X }, //TGSI_WRITEMASK_NONE
383*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X }, //TGSI_WRITEMASK_X
384*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y }, //TGSI_WRITEMASK_Y
385*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y }, //TGSI_WRITEMASK_XY
386*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z }, //TGSI_WRITEMASK_Z
387*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_X, TGSI_SWIZZLE_Z }, //TGSI_WRITEMASK_XZ
388*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z }, //TGSI_WRITEMASK_YZ
389*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_X }, //TGSI_WRITEMASK_XYZ
390*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_W, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_W
391*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_W, TGSI_SWIZZLE_X, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_XW
392*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_YW
393*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_XYW
394*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_ZW
395*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_XZW
396*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_YZW
397*61046927SAndroid Build Coastguard Worker    { TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Z, TGSI_SWIZZLE_W }, //TGSI_WRITEMASK_XYZW
398*61046927SAndroid Build Coastguard Worker };
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker static struct ureg_src
swizzle_reg(struct ureg_src src,uint writemask,unsigned siv_name)401*61046927SAndroid Build Coastguard Worker swizzle_reg(struct ureg_src src, uint writemask,
402*61046927SAndroid Build Coastguard Worker             unsigned siv_name)
403*61046927SAndroid Build Coastguard Worker {
404*61046927SAndroid Build Coastguard Worker    switch (siv_name) {
405*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_PRIMITIVE_ID:
406*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_INSTANCE_ID:
407*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_VERTEX_ID:
408*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_VIEWPORT_ARRAY_INDEX:
409*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_RENDER_TARGET_ARRAY_INDEX:
410*61046927SAndroid Build Coastguard Worker    case D3D10_SB_NAME_IS_FRONT_FACE:
411*61046927SAndroid Build Coastguard Worker       return ureg_scalar(src, TGSI_SWIZZLE_X);
412*61046927SAndroid Build Coastguard Worker    default: {
413*61046927SAndroid Build Coastguard Worker       const struct swizzle_mapping *swizzle =
414*61046927SAndroid Build Coastguard Worker          &writemask_to_swizzle[writemask];
415*61046927SAndroid Build Coastguard Worker       return ureg_swizzle(src, swizzle->x, swizzle->y,
416*61046927SAndroid Build Coastguard Worker                           swizzle->z, swizzle->w);
417*61046927SAndroid Build Coastguard Worker    }
418*61046927SAndroid Build Coastguard Worker    }
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker static void
dcl_base_output(struct Shader_xlate * sx,struct ureg_program * ureg,struct ureg_dst reg,const struct Shader_dst_operand * operand)422*61046927SAndroid Build Coastguard Worker dcl_base_output(struct Shader_xlate *sx,
423*61046927SAndroid Build Coastguard Worker                 struct ureg_program *ureg,
424*61046927SAndroid Build Coastguard Worker                 struct ureg_dst reg,
425*61046927SAndroid Build Coastguard Worker                 const struct Shader_dst_operand *operand)
426*61046927SAndroid Build Coastguard Worker {
427*61046927SAndroid Build Coastguard Worker    unsigned writemask =
428*61046927SAndroid Build Coastguard Worker       operand->mask >> D3D10_SB_OPERAND_4_COMPONENT_MASK_SHIFT;
429*61046927SAndroid Build Coastguard Worker    unsigned idx = operand->base.index[0].imm;
430*61046927SAndroid Build Coastguard Worker    unsigned i;
431*61046927SAndroid Build Coastguard Worker 
432*61046927SAndroid Build Coastguard Worker    if (!writemask) {
433*61046927SAndroid Build Coastguard Worker       sx->outputs[idx].reg[0] = reg;
434*61046927SAndroid Build Coastguard Worker       sx->outputs[idx].reg[1] = reg;
435*61046927SAndroid Build Coastguard Worker       sx->outputs[idx].reg[2] = reg;
436*61046927SAndroid Build Coastguard Worker       sx->outputs[idx].reg[3] = reg;
437*61046927SAndroid Build Coastguard Worker       return;
438*61046927SAndroid Build Coastguard Worker    }
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker    for (i = 0; i < 4; ++i) {
441*61046927SAndroid Build Coastguard Worker       unsigned mask = 1 << i;
442*61046927SAndroid Build Coastguard Worker       if ((writemask & mask)) {
443*61046927SAndroid Build Coastguard Worker          sx->outputs[idx].reg[i] = reg;
444*61046927SAndroid Build Coastguard Worker       }
445*61046927SAndroid Build Coastguard Worker    }
446*61046927SAndroid Build Coastguard Worker }
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker static void
dcl_base_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * operand,struct ureg_src dcl_reg,uint index,uint siv_name)449*61046927SAndroid Build Coastguard Worker dcl_base_input(struct Shader_xlate *sx,
450*61046927SAndroid Build Coastguard Worker                struct ureg_program *ureg,
451*61046927SAndroid Build Coastguard Worker                const struct Shader_dst_operand *operand,
452*61046927SAndroid Build Coastguard Worker                struct ureg_src dcl_reg,
453*61046927SAndroid Build Coastguard Worker                uint index,
454*61046927SAndroid Build Coastguard Worker                uint siv_name)
455*61046927SAndroid Build Coastguard Worker {
456*61046927SAndroid Build Coastguard Worker    unsigned writemask =
457*61046927SAndroid Build Coastguard Worker       operand->mask >> D3D10_SB_OPERAND_4_COMPONENT_MASK_SHIFT;
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker    if (sx->inputs[index].declared && !sx->inputs[index].overloaded) {
460*61046927SAndroid Build Coastguard Worker       struct ureg_dst temp = ureg_DECL_temporary(sx->ureg);
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker       ureg_MOV(ureg,
463*61046927SAndroid Build Coastguard Worker                ureg_writemask(temp, sx->inputs[index].writemask),
464*61046927SAndroid Build Coastguard Worker                swizzle_reg(sx->inputs[index].reg, sx->inputs[index].writemask,
465*61046927SAndroid Build Coastguard Worker                            sx->inputs[index].siv_name));
466*61046927SAndroid Build Coastguard Worker       ureg_MOV(ureg, ureg_writemask(temp, writemask),
467*61046927SAndroid Build Coastguard Worker                swizzle_reg(dcl_reg, writemask, siv_name));
468*61046927SAndroid Build Coastguard Worker       sx->inputs[index].reg = ureg_src(temp);
469*61046927SAndroid Build Coastguard Worker       sx->inputs[index].overloaded = true;
470*61046927SAndroid Build Coastguard Worker       sx->inputs[index].writemask |= writemask;
471*61046927SAndroid Build Coastguard Worker    } else if (sx->inputs[index].overloaded) {
472*61046927SAndroid Build Coastguard Worker       struct ureg_dst temp = ureg_dst(sx->inputs[index].reg);
473*61046927SAndroid Build Coastguard Worker       ureg_MOV(ureg, ureg_writemask(temp, writemask),
474*61046927SAndroid Build Coastguard Worker                swizzle_reg(dcl_reg, writemask, siv_name));
475*61046927SAndroid Build Coastguard Worker       sx->inputs[index].writemask |= writemask;
476*61046927SAndroid Build Coastguard Worker    } else {
477*61046927SAndroid Build Coastguard Worker       assert(!sx->inputs[index].declared);
478*61046927SAndroid Build Coastguard Worker 
479*61046927SAndroid Build Coastguard Worker       sx->inputs[index].reg = dcl_reg;
480*61046927SAndroid Build Coastguard Worker       sx->inputs[index].declared = true;
481*61046927SAndroid Build Coastguard Worker       sx->inputs[index].writemask = writemask;
482*61046927SAndroid Build Coastguard Worker       sx->inputs[index].siv_name = siv_name;
483*61046927SAndroid Build Coastguard Worker    }
484*61046927SAndroid Build Coastguard Worker }
485*61046927SAndroid Build Coastguard Worker 
486*61046927SAndroid Build Coastguard Worker static void
dcl_vs_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst)487*61046927SAndroid Build Coastguard Worker dcl_vs_input(struct Shader_xlate *sx,
488*61046927SAndroid Build Coastguard Worker              struct ureg_program *ureg,
489*61046927SAndroid Build Coastguard Worker              const struct Shader_dst_operand *dst)
490*61046927SAndroid Build Coastguard Worker {
491*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
492*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 1);
493*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[0].imm < SHADER_MAX_INPUTS);
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_vs_input(ureg, dst->base.index[0].imm);
496*61046927SAndroid Build Coastguard Worker 
497*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[0].imm,
498*61046927SAndroid Build Coastguard Worker                   D3D10_SB_NAME_UNDEFINED);
499*61046927SAndroid Build Coastguard Worker }
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker static void
dcl_gs_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst)502*61046927SAndroid Build Coastguard Worker dcl_gs_input(struct Shader_xlate *sx,
503*61046927SAndroid Build Coastguard Worker              struct ureg_program *ureg,
504*61046927SAndroid Build Coastguard Worker              const struct Shader_dst_operand *dst)
505*61046927SAndroid Build Coastguard Worker {
506*61046927SAndroid Build Coastguard Worker    if (dst->base.index_dim == 2) {
507*61046927SAndroid Build Coastguard Worker       assert(dst->base.index[1].imm < SHADER_MAX_INPUTS);
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker       declare_vertices_in(sx, dst->base.index[0].imm);
510*61046927SAndroid Build Coastguard Worker 
511*61046927SAndroid Build Coastguard Worker       /* XXX: Implement declaration masks in gallium.
512*61046927SAndroid Build Coastguard Worker        */
513*61046927SAndroid Build Coastguard Worker       if (!sx->inputs[dst->base.index[1].imm].reg.File) {
514*61046927SAndroid Build Coastguard Worker          struct ureg_src reg =
515*61046927SAndroid Build Coastguard Worker             ureg_DECL_input(ureg,
516*61046927SAndroid Build Coastguard Worker                             TGSI_SEMANTIC_GENERIC,
517*61046927SAndroid Build Coastguard Worker                             dst->base.index[1].imm,
518*61046927SAndroid Build Coastguard Worker                             0, 1);
519*61046927SAndroid Build Coastguard Worker          dcl_base_input(sx, ureg, dst, reg, dst->base.index[1].imm,
520*61046927SAndroid Build Coastguard Worker                         D3D10_SB_NAME_UNDEFINED);
521*61046927SAndroid Build Coastguard Worker       }
522*61046927SAndroid Build Coastguard Worker    } else {
523*61046927SAndroid Build Coastguard Worker       assert(dst->base.type == D3D10_SB_OPERAND_TYPE_INPUT_PRIMITIVEID);
524*61046927SAndroid Build Coastguard Worker       assert(dst->base.index_dim == 0);
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker       sx->prim_id = ureg_DECL_system_value(ureg, TGSI_SEMANTIC_PRIMID, 0);
527*61046927SAndroid Build Coastguard Worker    }
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker static void
dcl_sgv_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst,uint dcl_siv_name)531*61046927SAndroid Build Coastguard Worker dcl_sgv_input(struct Shader_xlate *sx,
532*61046927SAndroid Build Coastguard Worker               struct ureg_program *ureg,
533*61046927SAndroid Build Coastguard Worker               const struct Shader_dst_operand *dst,
534*61046927SAndroid Build Coastguard Worker               uint dcl_siv_name)
535*61046927SAndroid Build Coastguard Worker {
536*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
537*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 1);
538*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[0].imm < SHADER_MAX_INPUTS);
539*61046927SAndroid Build Coastguard Worker 
540*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_system_value(ureg, translate_system_name(dcl_siv_name), 0);
541*61046927SAndroid Build Coastguard Worker 
542*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[0].imm,
543*61046927SAndroid Build Coastguard Worker                   dcl_siv_name);
544*61046927SAndroid Build Coastguard Worker }
545*61046927SAndroid Build Coastguard Worker 
546*61046927SAndroid Build Coastguard Worker static void
dcl_siv_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst,uint dcl_siv_name)547*61046927SAndroid Build Coastguard Worker dcl_siv_input(struct Shader_xlate *sx,
548*61046927SAndroid Build Coastguard Worker               struct ureg_program *ureg,
549*61046927SAndroid Build Coastguard Worker               const struct Shader_dst_operand *dst,
550*61046927SAndroid Build Coastguard Worker               uint dcl_siv_name)
551*61046927SAndroid Build Coastguard Worker {
552*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
553*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 2);
554*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[1].imm < SHADER_MAX_INPUTS);
555*61046927SAndroid Build Coastguard Worker 
556*61046927SAndroid Build Coastguard Worker    declare_vertices_in(sx, dst->base.index[0].imm);
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_input(ureg,
559*61046927SAndroid Build Coastguard Worker                          translate_system_name(dcl_siv_name), 0,
560*61046927SAndroid Build Coastguard Worker                          0, 1);
561*61046927SAndroid Build Coastguard Worker 
562*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[1].imm,
563*61046927SAndroid Build Coastguard Worker                   dcl_siv_name);
564*61046927SAndroid Build Coastguard Worker }
565*61046927SAndroid Build Coastguard Worker 
566*61046927SAndroid Build Coastguard Worker static void
dcl_ps_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst,uint dcl_in_ps_interp)567*61046927SAndroid Build Coastguard Worker dcl_ps_input(struct Shader_xlate *sx,
568*61046927SAndroid Build Coastguard Worker              struct ureg_program *ureg,
569*61046927SAndroid Build Coastguard Worker              const struct Shader_dst_operand *dst,
570*61046927SAndroid Build Coastguard Worker              uint dcl_in_ps_interp)
571*61046927SAndroid Build Coastguard Worker {
572*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
573*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 1);
574*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[0].imm < SHADER_MAX_INPUTS);
575*61046927SAndroid Build Coastguard Worker 
576*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_fs_input(ureg,
577*61046927SAndroid Build Coastguard Worker                             TGSI_SEMANTIC_GENERIC,
578*61046927SAndroid Build Coastguard Worker                             dst->base.index[0].imm,
579*61046927SAndroid Build Coastguard Worker                             translate_interpolation(dcl_in_ps_interp));
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[0].imm,
582*61046927SAndroid Build Coastguard Worker                   D3D10_SB_NAME_UNDEFINED);
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker static void
dcl_ps_sgv_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst,uint dcl_siv_name)586*61046927SAndroid Build Coastguard Worker dcl_ps_sgv_input(struct Shader_xlate *sx,
587*61046927SAndroid Build Coastguard Worker                  struct ureg_program *ureg,
588*61046927SAndroid Build Coastguard Worker                  const struct Shader_dst_operand *dst,
589*61046927SAndroid Build Coastguard Worker                  uint dcl_siv_name)
590*61046927SAndroid Build Coastguard Worker {
591*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
592*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 1);
593*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[0].imm < SHADER_MAX_INPUTS);
594*61046927SAndroid Build Coastguard Worker 
595*61046927SAndroid Build Coastguard Worker    if (dcl_siv_name == D3D10_SB_NAME_POSITION) {
596*61046927SAndroid Build Coastguard Worker       ureg_property(ureg,
597*61046927SAndroid Build Coastguard Worker                     TGSI_PROPERTY_FS_COORD_ORIGIN,
598*61046927SAndroid Build Coastguard Worker                     TGSI_FS_COORD_ORIGIN_UPPER_LEFT);
599*61046927SAndroid Build Coastguard Worker       ureg_property(ureg,
600*61046927SAndroid Build Coastguard Worker                     TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
601*61046927SAndroid Build Coastguard Worker                     TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER);
602*61046927SAndroid Build Coastguard Worker    }
603*61046927SAndroid Build Coastguard Worker 
604*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_fs_input(ureg,
605*61046927SAndroid Build Coastguard Worker                             translate_system_name(dcl_siv_name),
606*61046927SAndroid Build Coastguard Worker                             0,
607*61046927SAndroid Build Coastguard Worker                             TGSI_INTERPOLATE_CONSTANT);
608*61046927SAndroid Build Coastguard Worker 
609*61046927SAndroid Build Coastguard Worker    if (dcl_siv_name == D3D10_SB_NAME_IS_FRONT_FACE) {
610*61046927SAndroid Build Coastguard Worker       /* We need to map gallium's front_face to the one expected
611*61046927SAndroid Build Coastguard Worker        * by D3D10 */
612*61046927SAndroid Build Coastguard Worker       struct ureg_dst tmp = ureg_DECL_temporary(ureg);
613*61046927SAndroid Build Coastguard Worker 
614*61046927SAndroid Build Coastguard Worker       tmp = ureg_writemask(tmp, TGSI_WRITEMASK_X);
615*61046927SAndroid Build Coastguard Worker 
616*61046927SAndroid Build Coastguard Worker       ureg_CMP(ureg, tmp, reg,
617*61046927SAndroid Build Coastguard Worker                ureg_imm1i(ureg, 0), ureg_imm1i(ureg, -1));
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker       reg = ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X);
620*61046927SAndroid Build Coastguard Worker    }
621*61046927SAndroid Build Coastguard Worker 
622*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[0].imm,
623*61046927SAndroid Build Coastguard Worker                   dcl_siv_name);
624*61046927SAndroid Build Coastguard Worker }
625*61046927SAndroid Build Coastguard Worker 
626*61046927SAndroid Build Coastguard Worker static void
dcl_ps_siv_input(struct Shader_xlate * sx,struct ureg_program * ureg,const struct Shader_dst_operand * dst,uint dcl_siv_name,uint dcl_in_ps_interp)627*61046927SAndroid Build Coastguard Worker dcl_ps_siv_input(struct Shader_xlate *sx,
628*61046927SAndroid Build Coastguard Worker                  struct ureg_program *ureg,
629*61046927SAndroid Build Coastguard Worker                  const struct Shader_dst_operand *dst,
630*61046927SAndroid Build Coastguard Worker                  uint dcl_siv_name, uint dcl_in_ps_interp)
631*61046927SAndroid Build Coastguard Worker {
632*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
633*61046927SAndroid Build Coastguard Worker    assert(dst->base.index_dim == 1);
634*61046927SAndroid Build Coastguard Worker    assert(dst->base.index[0].imm < SHADER_MAX_INPUTS);
635*61046927SAndroid Build Coastguard Worker 
636*61046927SAndroid Build Coastguard Worker    reg = ureg_DECL_fs_input(ureg,
637*61046927SAndroid Build Coastguard Worker                             translate_system_name(dcl_siv_name),
638*61046927SAndroid Build Coastguard Worker                             0,
639*61046927SAndroid Build Coastguard Worker                             translate_interpolation(dcl_in_ps_interp));
640*61046927SAndroid Build Coastguard Worker 
641*61046927SAndroid Build Coastguard Worker    if (dcl_siv_name == D3D10_SB_NAME_POSITION) {
642*61046927SAndroid Build Coastguard Worker       /* D3D10 expects reciprocal of interpolated 1/w as 4th component,
643*61046927SAndroid Build Coastguard Worker        * gallium/GL just interpolated 1/w */
644*61046927SAndroid Build Coastguard Worker       struct ureg_dst tmp = ureg_DECL_temporary(ureg);
645*61046927SAndroid Build Coastguard Worker 
646*61046927SAndroid Build Coastguard Worker       ureg_MOV(ureg, tmp, reg);
647*61046927SAndroid Build Coastguard Worker       ureg_RCP(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W),
648*61046927SAndroid Build Coastguard Worker                ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_W));
649*61046927SAndroid Build Coastguard Worker       reg = ureg_src(tmp);
650*61046927SAndroid Build Coastguard Worker    }
651*61046927SAndroid Build Coastguard Worker 
652*61046927SAndroid Build Coastguard Worker    dcl_base_input(sx, ureg, dst, reg, dst->base.index[0].imm,
653*61046927SAndroid Build Coastguard Worker                   dcl_siv_name);
654*61046927SAndroid Build Coastguard Worker }
655*61046927SAndroid Build Coastguard Worker 
656*61046927SAndroid Build Coastguard Worker static struct ureg_src
translate_relative_operand(struct Shader_xlate * sx,const struct Shader_relative_operand * operand)657*61046927SAndroid Build Coastguard Worker translate_relative_operand(struct Shader_xlate *sx,
658*61046927SAndroid Build Coastguard Worker                            const struct Shader_relative_operand *operand)
659*61046927SAndroid Build Coastguard Worker {
660*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker    switch (operand->type) {
663*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_TEMP:
664*61046927SAndroid Build Coastguard Worker       assert(operand->index[0].imm < SHADER_MAX_TEMPS);
665*61046927SAndroid Build Coastguard Worker 
666*61046927SAndroid Build Coastguard Worker       reg = ureg_src(sx->temps[sx->temp_offset + operand->index[0].imm]);
667*61046927SAndroid Build Coastguard Worker       break;
668*61046927SAndroid Build Coastguard Worker 
669*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT_PRIMITIVEID:
670*61046927SAndroid Build Coastguard Worker       reg = sx->prim_id;
671*61046927SAndroid Build Coastguard Worker       break;
672*61046927SAndroid Build Coastguard Worker 
673*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP:
674*61046927SAndroid Build Coastguard Worker       assert(operand->index[1].imm < SHADER_MAX_TEMPS);
675*61046927SAndroid Build Coastguard Worker 
676*61046927SAndroid Build Coastguard Worker       reg = ureg_src(sx->temps[sx->indexable_temp_offsets[operand->index[0].imm] +
677*61046927SAndroid Build Coastguard Worker             operand->index[1].imm]);
678*61046927SAndroid Build Coastguard Worker       break;
679*61046927SAndroid Build Coastguard Worker 
680*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT:
681*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT:
682*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE32:
683*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE64:
684*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_SAMPLER:
685*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_RESOURCE:
686*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_CONSTANT_BUFFER:
687*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE_CONSTANT_BUFFER:
688*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_LABEL:
689*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH:
690*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_NULL:
691*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_RASTERIZER:
692*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT_COVERAGE_MASK:
693*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
694*61046927SAndroid Build Coastguard Worker       reg = ureg_src(ureg_DECL_temporary(sx->ureg));
695*61046927SAndroid Build Coastguard Worker       break;
696*61046927SAndroid Build Coastguard Worker 
697*61046927SAndroid Build Coastguard Worker    default:
698*61046927SAndroid Build Coastguard Worker       assert(0);                /* should never happen */
699*61046927SAndroid Build Coastguard Worker       reg = ureg_src(ureg_DECL_temporary(sx->ureg));
700*61046927SAndroid Build Coastguard Worker    }
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker    reg = ureg_scalar(reg, operand->comp);
703*61046927SAndroid Build Coastguard Worker    return reg;
704*61046927SAndroid Build Coastguard Worker }
705*61046927SAndroid Build Coastguard Worker 
706*61046927SAndroid Build Coastguard Worker static struct ureg_dst
translate_operand(struct Shader_xlate * sx,const struct Shader_operand * operand,unsigned writemask)707*61046927SAndroid Build Coastguard Worker translate_operand(struct Shader_xlate *sx,
708*61046927SAndroid Build Coastguard Worker                   const struct Shader_operand *operand,
709*61046927SAndroid Build Coastguard Worker                   unsigned writemask)
710*61046927SAndroid Build Coastguard Worker {
711*61046927SAndroid Build Coastguard Worker    struct ureg_dst reg;
712*61046927SAndroid Build Coastguard Worker 
713*61046927SAndroid Build Coastguard Worker    switch (operand->type) {
714*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_TEMP:
715*61046927SAndroid Build Coastguard Worker       assert(operand->index_dim == 1);
716*61046927SAndroid Build Coastguard Worker       assert(operand->index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
717*61046927SAndroid Build Coastguard Worker       assert(operand->index[0].imm < SHADER_MAX_TEMPS);
718*61046927SAndroid Build Coastguard Worker 
719*61046927SAndroid Build Coastguard Worker       reg = sx->temps[sx->temp_offset + operand->index[0].imm];
720*61046927SAndroid Build Coastguard Worker       break;
721*61046927SAndroid Build Coastguard Worker 
722*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT:
723*61046927SAndroid Build Coastguard Worker       assert(operand->index_dim == 1);
724*61046927SAndroid Build Coastguard Worker       assert(operand->index[0].imm < SHADER_MAX_OUTPUTS);
725*61046927SAndroid Build Coastguard Worker 
726*61046927SAndroid Build Coastguard Worker       if (operand->index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32) {
727*61046927SAndroid Build Coastguard Worker          if (!writemask) {
728*61046927SAndroid Build Coastguard Worker             reg = sx->outputs[operand->index[0].imm].reg[0];
729*61046927SAndroid Build Coastguard Worker          } else {
730*61046927SAndroid Build Coastguard Worker             unsigned i;
731*61046927SAndroid Build Coastguard Worker             for (i = 0; i < 4; ++i) {
732*61046927SAndroid Build Coastguard Worker                unsigned mask = 1 << i;
733*61046927SAndroid Build Coastguard Worker                if ((writemask & mask)) {
734*61046927SAndroid Build Coastguard Worker                   reg = sx->outputs[operand->index[0].imm].reg[i];
735*61046927SAndroid Build Coastguard Worker                   break;
736*61046927SAndroid Build Coastguard Worker                }
737*61046927SAndroid Build Coastguard Worker             }
738*61046927SAndroid Build Coastguard Worker          }
739*61046927SAndroid Build Coastguard Worker       } else {
740*61046927SAndroid Build Coastguard Worker          struct ureg_src addr =
741*61046927SAndroid Build Coastguard Worker             translate_relative_operand(sx, &operand->index[0].rel);
742*61046927SAndroid Build Coastguard Worker          assert(operand->index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE);
743*61046927SAndroid Build Coastguard Worker          reg = ureg_dst_indirect(sx->outputs[operand->index[0].imm].reg[0], addr);
744*61046927SAndroid Build Coastguard Worker       }
745*61046927SAndroid Build Coastguard Worker       break;
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH:
748*61046927SAndroid Build Coastguard Worker       assert(operand->index_dim == 0);
749*61046927SAndroid Build Coastguard Worker 
750*61046927SAndroid Build Coastguard Worker       reg = sx->output_depth;
751*61046927SAndroid Build Coastguard Worker       break;
752*61046927SAndroid Build Coastguard Worker 
753*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT_PRIMITIVEID:
754*61046927SAndroid Build Coastguard Worker       assert(operand->index_dim == 0);
755*61046927SAndroid Build Coastguard Worker 
756*61046927SAndroid Build Coastguard Worker       reg = ureg_dst(sx->prim_id);
757*61046927SAndroid Build Coastguard Worker       break;
758*61046927SAndroid Build Coastguard Worker 
759*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT:
760*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP:
761*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE32:
762*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE64:
763*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_SAMPLER:
764*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_RESOURCE:
765*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_CONSTANT_BUFFER:
766*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE_CONSTANT_BUFFER:
767*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_LABEL:
768*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_NULL:
769*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_RASTERIZER:
770*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_OUTPUT_COVERAGE_MASK:
771*61046927SAndroid Build Coastguard Worker       /* XXX: Translate more operands types.
772*61046927SAndroid Build Coastguard Worker        */
773*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
774*61046927SAndroid Build Coastguard Worker       reg = ureg_DECL_temporary(sx->ureg);
775*61046927SAndroid Build Coastguard Worker    }
776*61046927SAndroid Build Coastguard Worker 
777*61046927SAndroid Build Coastguard Worker    return reg;
778*61046927SAndroid Build Coastguard Worker }
779*61046927SAndroid Build Coastguard Worker 
780*61046927SAndroid Build Coastguard Worker static struct ureg_src
translate_indexable_temp(struct Shader_xlate * sx,const struct Shader_operand * operand)781*61046927SAndroid Build Coastguard Worker translate_indexable_temp(struct Shader_xlate *sx,
782*61046927SAndroid Build Coastguard Worker                          const struct Shader_operand *operand)
783*61046927SAndroid Build Coastguard Worker {
784*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
785*61046927SAndroid Build Coastguard Worker    switch (operand->index[1].index_rep) {
786*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
787*61046927SAndroid Build Coastguard Worker       reg = ureg_src(
788*61046927SAndroid Build Coastguard Worker          sx->temps[sx->indexable_temp_offsets[operand->index[0].imm] +
789*61046927SAndroid Build Coastguard Worker                    operand->index[1].imm]);
790*61046927SAndroid Build Coastguard Worker       break;
791*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_INDEX_RELATIVE:
792*61046927SAndroid Build Coastguard Worker       reg = ureg_src_indirect(
793*61046927SAndroid Build Coastguard Worker          ureg_src(sx->temps[
794*61046927SAndroid Build Coastguard Worker                      sx->indexable_temp_offsets[operand->index[0].imm]]),
795*61046927SAndroid Build Coastguard Worker          translate_relative_operand(sx,
796*61046927SAndroid Build Coastguard Worker                                     &operand->index[1].rel));
797*61046927SAndroid Build Coastguard Worker       break;
798*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE:
799*61046927SAndroid Build Coastguard Worker       reg = ureg_src_indirect(
800*61046927SAndroid Build Coastguard Worker          ureg_src(sx->temps[
801*61046927SAndroid Build Coastguard Worker                      operand->index[1].imm +
802*61046927SAndroid Build Coastguard Worker                      sx->indexable_temp_offsets[operand->index[0].imm]]),
803*61046927SAndroid Build Coastguard Worker          translate_relative_operand(sx,
804*61046927SAndroid Build Coastguard Worker                                     &operand->index[1].rel));
805*61046927SAndroid Build Coastguard Worker       break;
806*61046927SAndroid Build Coastguard Worker    default:
807*61046927SAndroid Build Coastguard Worker       /* XXX: Other index representations.
808*61046927SAndroid Build Coastguard Worker        */
809*61046927SAndroid Build Coastguard Worker       LOG_UNSUPPORTED(true);
810*61046927SAndroid Build Coastguard Worker       reg = ureg_src(ureg_DECL_temporary(sx->ureg));
811*61046927SAndroid Build Coastguard Worker    }
812*61046927SAndroid Build Coastguard Worker    return reg;
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker 
815*61046927SAndroid Build Coastguard Worker static struct ureg_dst
translate_dst_operand(struct Shader_xlate * sx,const struct Shader_dst_operand * operand,bool saturate)816*61046927SAndroid Build Coastguard Worker translate_dst_operand(struct Shader_xlate *sx,
817*61046927SAndroid Build Coastguard Worker                       const struct Shader_dst_operand *operand,
818*61046927SAndroid Build Coastguard Worker                       bool saturate)
819*61046927SAndroid Build Coastguard Worker {
820*61046927SAndroid Build Coastguard Worker    struct ureg_dst reg;
821*61046927SAndroid Build Coastguard Worker    unsigned writemask =
822*61046927SAndroid Build Coastguard Worker       operand->mask >> D3D10_SB_OPERAND_4_COMPONENT_MASK_SHIFT;
823*61046927SAndroid Build Coastguard Worker 
824*61046927SAndroid Build Coastguard Worker    assert((D3D10_SB_OPERAND_4_COMPONENT_MASK_SHIFT) == 4);
825*61046927SAndroid Build Coastguard Worker    assert((D3D10_SB_OPERAND_4_COMPONENT_MASK_X >> 4) == TGSI_WRITEMASK_X);
826*61046927SAndroid Build Coastguard Worker    assert((D3D10_SB_OPERAND_4_COMPONENT_MASK_Y >> 4) == TGSI_WRITEMASK_Y);
827*61046927SAndroid Build Coastguard Worker    assert((D3D10_SB_OPERAND_4_COMPONENT_MASK_Z >> 4) == TGSI_WRITEMASK_Z);
828*61046927SAndroid Build Coastguard Worker    assert((D3D10_SB_OPERAND_4_COMPONENT_MASK_W >> 4) == TGSI_WRITEMASK_W);
829*61046927SAndroid Build Coastguard Worker 
830*61046927SAndroid Build Coastguard Worker    switch (operand->base.type) {
831*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP:
832*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 2);
833*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
834*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].imm < SHADER_MAX_INDEXABLE_TEMPS);
835*61046927SAndroid Build Coastguard Worker 
836*61046927SAndroid Build Coastguard Worker       reg = ureg_dst(translate_indexable_temp(sx, &operand->base));
837*61046927SAndroid Build Coastguard Worker       break;
838*61046927SAndroid Build Coastguard Worker 
839*61046927SAndroid Build Coastguard Worker    default:
840*61046927SAndroid Build Coastguard Worker       reg = translate_operand(sx, &operand->base, writemask);
841*61046927SAndroid Build Coastguard Worker    }
842*61046927SAndroid Build Coastguard Worker 
843*61046927SAndroid Build Coastguard Worker    /* oDepth often has an empty writemask */
844*61046927SAndroid Build Coastguard Worker    if (operand->base.type != D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH) {
845*61046927SAndroid Build Coastguard Worker       reg = ureg_writemask(reg, writemask);
846*61046927SAndroid Build Coastguard Worker    }
847*61046927SAndroid Build Coastguard Worker 
848*61046927SAndroid Build Coastguard Worker    if (saturate) {
849*61046927SAndroid Build Coastguard Worker       reg = ureg_saturate(reg);
850*61046927SAndroid Build Coastguard Worker    }
851*61046927SAndroid Build Coastguard Worker 
852*61046927SAndroid Build Coastguard Worker    return reg;
853*61046927SAndroid Build Coastguard Worker }
854*61046927SAndroid Build Coastguard Worker 
855*61046927SAndroid Build Coastguard Worker static struct ureg_src
translate_src_operand(struct Shader_xlate * sx,const struct Shader_src_operand * operand,const enum dx10_opcode_format format)856*61046927SAndroid Build Coastguard Worker translate_src_operand(struct Shader_xlate *sx,
857*61046927SAndroid Build Coastguard Worker                       const struct Shader_src_operand *operand,
858*61046927SAndroid Build Coastguard Worker                       const enum dx10_opcode_format format)
859*61046927SAndroid Build Coastguard Worker {
860*61046927SAndroid Build Coastguard Worker    struct ureg_src reg;
861*61046927SAndroid Build Coastguard Worker 
862*61046927SAndroid Build Coastguard Worker    switch (operand->base.type) {
863*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT:
864*61046927SAndroid Build Coastguard Worker       if (operand->base.index_dim == 1) {
865*61046927SAndroid Build Coastguard Worker          switch (operand->base.index[0].index_rep) {
866*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
867*61046927SAndroid Build Coastguard Worker             assert(operand->base.index[0].imm < SHADER_MAX_INPUTS);
868*61046927SAndroid Build Coastguard Worker             reg = sx->inputs[operand->base.index[0].imm].reg;
869*61046927SAndroid Build Coastguard Worker             break;
870*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_RELATIVE: {
871*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
872*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[0].rel);
873*61046927SAndroid Build Coastguard Worker             reg = ureg_src_indirect(sx->inputs[0].reg, tmp);
874*61046927SAndroid Build Coastguard Worker          }
875*61046927SAndroid Build Coastguard Worker             break;
876*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE: {
877*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
878*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[0].rel);
879*61046927SAndroid Build Coastguard Worker             reg = ureg_src_indirect(sx->inputs[operand->base.index[0].imm].reg, tmp);
880*61046927SAndroid Build Coastguard Worker          }
881*61046927SAndroid Build Coastguard Worker             break;
882*61046927SAndroid Build Coastguard Worker          default:
883*61046927SAndroid Build Coastguard Worker             /* XXX: Other index representations.
884*61046927SAndroid Build Coastguard Worker              */
885*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(true);
886*61046927SAndroid Build Coastguard Worker 
887*61046927SAndroid Build Coastguard Worker          }
888*61046927SAndroid Build Coastguard Worker       } else {
889*61046927SAndroid Build Coastguard Worker          assert(operand->base.index_dim == 2);
890*61046927SAndroid Build Coastguard Worker          assert(operand->base.index[1].imm < SHADER_MAX_INPUTS);
891*61046927SAndroid Build Coastguard Worker 
892*61046927SAndroid Build Coastguard Worker          switch (operand->base.index[1].index_rep) {
893*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
894*61046927SAndroid Build Coastguard Worker             reg = sx->inputs[operand->base.index[1].imm].reg;
895*61046927SAndroid Build Coastguard Worker             break;
896*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_RELATIVE: {
897*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
898*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[1].rel);
899*61046927SAndroid Build Coastguard Worker             reg = ureg_src_indirect(sx->inputs[0].reg, tmp);
900*61046927SAndroid Build Coastguard Worker          }
901*61046927SAndroid Build Coastguard Worker             break;
902*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE: {
903*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
904*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[1].rel);
905*61046927SAndroid Build Coastguard Worker             reg = ureg_src_indirect(sx->inputs[operand->base.index[1].imm].reg, tmp);
906*61046927SAndroid Build Coastguard Worker          }
907*61046927SAndroid Build Coastguard Worker             break;
908*61046927SAndroid Build Coastguard Worker          default:
909*61046927SAndroid Build Coastguard Worker             /* XXX: Other index representations.
910*61046927SAndroid Build Coastguard Worker              */
911*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(true);
912*61046927SAndroid Build Coastguard Worker          }
913*61046927SAndroid Build Coastguard Worker 
914*61046927SAndroid Build Coastguard Worker          switch (operand->base.index[0].index_rep) {
915*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
916*61046927SAndroid Build Coastguard Worker             reg = ureg_src_dimension(reg, operand->base.index[0].imm);
917*61046927SAndroid Build Coastguard Worker             break;
918*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_RELATIVE:{
919*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
920*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[0].rel);
921*61046927SAndroid Build Coastguard Worker             reg = ureg_src_dimension_indirect(reg, tmp, 0);
922*61046927SAndroid Build Coastguard Worker          }
923*61046927SAndroid Build Coastguard Worker             break;
924*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE: {
925*61046927SAndroid Build Coastguard Worker             struct ureg_src tmp =
926*61046927SAndroid Build Coastguard Worker                translate_relative_operand(sx, &operand->base.index[0].rel);
927*61046927SAndroid Build Coastguard Worker             reg = ureg_src_dimension_indirect(reg, tmp, operand->base.index[0].imm);
928*61046927SAndroid Build Coastguard Worker          }
929*61046927SAndroid Build Coastguard Worker             break;
930*61046927SAndroid Build Coastguard Worker          default:
931*61046927SAndroid Build Coastguard Worker             /* XXX: Other index representations.
932*61046927SAndroid Build Coastguard Worker              */
933*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(true);
934*61046927SAndroid Build Coastguard Worker          }
935*61046927SAndroid Build Coastguard Worker       }
936*61046927SAndroid Build Coastguard Worker       break;
937*61046927SAndroid Build Coastguard Worker 
938*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP:
939*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 2);
940*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
941*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].imm < SHADER_MAX_INDEXABLE_TEMPS);
942*61046927SAndroid Build Coastguard Worker 
943*61046927SAndroid Build Coastguard Worker       reg = translate_indexable_temp(sx, &operand->base);
944*61046927SAndroid Build Coastguard Worker       break;
945*61046927SAndroid Build Coastguard Worker 
946*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE32:
947*61046927SAndroid Build Coastguard Worker       switch (format) {
948*61046927SAndroid Build Coastguard Worker       case OF_FLOAT:
949*61046927SAndroid Build Coastguard Worker          reg = ureg_imm4f(sx->ureg,
950*61046927SAndroid Build Coastguard Worker                           operand->imm[0].f32,
951*61046927SAndroid Build Coastguard Worker                           operand->imm[1].f32,
952*61046927SAndroid Build Coastguard Worker                           operand->imm[2].f32,
953*61046927SAndroid Build Coastguard Worker                           operand->imm[3].f32);
954*61046927SAndroid Build Coastguard Worker          break;
955*61046927SAndroid Build Coastguard Worker       case OF_INT:
956*61046927SAndroid Build Coastguard Worker          reg = ureg_imm4i(sx->ureg,
957*61046927SAndroid Build Coastguard Worker                           operand->imm[0].i32,
958*61046927SAndroid Build Coastguard Worker                           operand->imm[1].i32,
959*61046927SAndroid Build Coastguard Worker                           operand->imm[2].i32,
960*61046927SAndroid Build Coastguard Worker                           operand->imm[3].i32);
961*61046927SAndroid Build Coastguard Worker          break;
962*61046927SAndroid Build Coastguard Worker       case OF_UINT:
963*61046927SAndroid Build Coastguard Worker          reg = ureg_imm4u(sx->ureg,
964*61046927SAndroid Build Coastguard Worker                           operand->imm[0].u32,
965*61046927SAndroid Build Coastguard Worker                           operand->imm[1].u32,
966*61046927SAndroid Build Coastguard Worker                           operand->imm[2].u32,
967*61046927SAndroid Build Coastguard Worker                           operand->imm[3].u32);
968*61046927SAndroid Build Coastguard Worker          break;
969*61046927SAndroid Build Coastguard Worker       default:
970*61046927SAndroid Build Coastguard Worker          assert(0);
971*61046927SAndroid Build Coastguard Worker          reg = ureg_src(ureg_DECL_temporary(sx->ureg));
972*61046927SAndroid Build Coastguard Worker       }
973*61046927SAndroid Build Coastguard Worker       break;
974*61046927SAndroid Build Coastguard Worker 
975*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_SAMPLER:
976*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 1);
977*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
978*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].imm < SHADER_MAX_SAMPLERS);
979*61046927SAndroid Build Coastguard Worker 
980*61046927SAndroid Build Coastguard Worker       reg = sx->samplers[operand->base.index[0].imm];
981*61046927SAndroid Build Coastguard Worker       break;
982*61046927SAndroid Build Coastguard Worker 
983*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_RESOURCE:
984*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 1);
985*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
986*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].imm < SHADER_MAX_RESOURCES);
987*61046927SAndroid Build Coastguard Worker 
988*61046927SAndroid Build Coastguard Worker       reg = sx->sv[operand->base.index[0].imm];
989*61046927SAndroid Build Coastguard Worker       break;
990*61046927SAndroid Build Coastguard Worker 
991*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_CONSTANT_BUFFER:
992*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 2);
993*61046927SAndroid Build Coastguard Worker 
994*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].index_rep == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
995*61046927SAndroid Build Coastguard Worker       assert(operand->base.index[0].imm < PIPE_MAX_CONSTANT_BUFFERS);
996*61046927SAndroid Build Coastguard Worker 
997*61046927SAndroid Build Coastguard Worker       switch (operand->base.index[1].index_rep) {
998*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
999*61046927SAndroid Build Coastguard Worker          assert(operand->base.index[1].imm < SHADER_MAX_CONSTS);
1000*61046927SAndroid Build Coastguard Worker 
1001*61046927SAndroid Build Coastguard Worker          reg = ureg_src_register(TGSI_FILE_CONSTANT, operand->base.index[1].imm);
1002*61046927SAndroid Build Coastguard Worker          reg = ureg_src_dimension(reg, operand->base.index[0].imm);
1003*61046927SAndroid Build Coastguard Worker          break;
1004*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_RELATIVE:
1005*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE:
1006*61046927SAndroid Build Coastguard Worker          reg = ureg_src_register(TGSI_FILE_CONSTANT, operand->base.index[1].imm);
1007*61046927SAndroid Build Coastguard Worker          reg = ureg_src_indirect(
1008*61046927SAndroid Build Coastguard Worker             reg,
1009*61046927SAndroid Build Coastguard Worker             translate_relative_operand(sx, &operand->base.index[1].rel));
1010*61046927SAndroid Build Coastguard Worker          reg = ureg_src_dimension(reg, operand->base.index[0].imm);
1011*61046927SAndroid Build Coastguard Worker          break;
1012*61046927SAndroid Build Coastguard Worker       default:
1013*61046927SAndroid Build Coastguard Worker          /* XXX: Other index representations.
1014*61046927SAndroid Build Coastguard Worker           */
1015*61046927SAndroid Build Coastguard Worker          LOG_UNSUPPORTED(true);
1016*61046927SAndroid Build Coastguard Worker       }
1017*61046927SAndroid Build Coastguard Worker 
1018*61046927SAndroid Build Coastguard Worker       break;
1019*61046927SAndroid Build Coastguard Worker 
1020*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_IMMEDIATE_CONSTANT_BUFFER:
1021*61046927SAndroid Build Coastguard Worker       assert(operand->base.index_dim == 1);
1022*61046927SAndroid Build Coastguard Worker 
1023*61046927SAndroid Build Coastguard Worker       switch (operand->base.index[0].index_rep) {
1024*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_IMMEDIATE32:
1025*61046927SAndroid Build Coastguard Worker          reg = sx->imms;
1026*61046927SAndroid Build Coastguard Worker          reg.Index += operand->base.index[0].imm;
1027*61046927SAndroid Build Coastguard Worker          break;
1028*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_RELATIVE:
1029*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE:
1030*61046927SAndroid Build Coastguard Worker          reg = sx->imms;
1031*61046927SAndroid Build Coastguard Worker          reg.Index += operand->base.index[0].imm;
1032*61046927SAndroid Build Coastguard Worker          reg = ureg_src_indirect(
1033*61046927SAndroid Build Coastguard Worker             sx->imms,
1034*61046927SAndroid Build Coastguard Worker             translate_relative_operand(sx, &operand->base.index[0].rel));
1035*61046927SAndroid Build Coastguard Worker          break;
1036*61046927SAndroid Build Coastguard Worker       default:
1037*61046927SAndroid Build Coastguard Worker          /* XXX: Other index representations.
1038*61046927SAndroid Build Coastguard Worker           */
1039*61046927SAndroid Build Coastguard Worker          LOG_UNSUPPORTED(true);
1040*61046927SAndroid Build Coastguard Worker       }
1041*61046927SAndroid Build Coastguard Worker       break;
1042*61046927SAndroid Build Coastguard Worker 
1043*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_TYPE_INPUT_PRIMITIVEID:
1044*61046927SAndroid Build Coastguard Worker       reg = sx->prim_id;
1045*61046927SAndroid Build Coastguard Worker       break;
1046*61046927SAndroid Build Coastguard Worker 
1047*61046927SAndroid Build Coastguard Worker    default:
1048*61046927SAndroid Build Coastguard Worker       reg = ureg_src(translate_operand(sx, &operand->base, 0));
1049*61046927SAndroid Build Coastguard Worker    }
1050*61046927SAndroid Build Coastguard Worker 
1051*61046927SAndroid Build Coastguard Worker    reg = ureg_swizzle(reg,
1052*61046927SAndroid Build Coastguard Worker                       operand->swizzle[0],
1053*61046927SAndroid Build Coastguard Worker                       operand->swizzle[1],
1054*61046927SAndroid Build Coastguard Worker                       operand->swizzle[2],
1055*61046927SAndroid Build Coastguard Worker                       operand->swizzle[3]);
1056*61046927SAndroid Build Coastguard Worker 
1057*61046927SAndroid Build Coastguard Worker    switch (operand->modifier) {
1058*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_MODIFIER_NONE:
1059*61046927SAndroid Build Coastguard Worker       break;
1060*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_MODIFIER_NEG:
1061*61046927SAndroid Build Coastguard Worker       reg = ureg_negate(reg);
1062*61046927SAndroid Build Coastguard Worker       break;
1063*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_MODIFIER_ABS:
1064*61046927SAndroid Build Coastguard Worker       reg = ureg_abs(reg);
1065*61046927SAndroid Build Coastguard Worker       break;
1066*61046927SAndroid Build Coastguard Worker    case D3D10_SB_OPERAND_MODIFIER_ABSNEG:
1067*61046927SAndroid Build Coastguard Worker       reg = ureg_negate(ureg_abs(reg));
1068*61046927SAndroid Build Coastguard Worker       break;
1069*61046927SAndroid Build Coastguard Worker    default:
1070*61046927SAndroid Build Coastguard Worker       assert(0);
1071*61046927SAndroid Build Coastguard Worker    }
1072*61046927SAndroid Build Coastguard Worker 
1073*61046927SAndroid Build Coastguard Worker    return reg;
1074*61046927SAndroid Build Coastguard Worker }
1075*61046927SAndroid Build Coastguard Worker 
1076*61046927SAndroid Build Coastguard Worker static uint
translate_resource_dimension(D3D10_SB_RESOURCE_DIMENSION dim)1077*61046927SAndroid Build Coastguard Worker translate_resource_dimension(D3D10_SB_RESOURCE_DIMENSION dim)
1078*61046927SAndroid Build Coastguard Worker {
1079*61046927SAndroid Build Coastguard Worker    switch (dim) {
1080*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_UNKNOWN:
1081*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_UNKNOWN;
1082*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_BUFFER:
1083*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_BUFFER;
1084*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE1D:
1085*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_1D;
1086*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE2D:
1087*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_2D;
1088*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE2DMS:
1089*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_2D_MSAA;
1090*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE3D:
1091*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_3D;
1092*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURECUBE:
1093*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_CUBE;
1094*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE1DARRAY:
1095*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_1D_ARRAY;
1096*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE2DARRAY:
1097*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_2D_ARRAY;
1098*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURE2DMSARRAY:
1099*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_2D_ARRAY_MSAA;
1100*61046927SAndroid Build Coastguard Worker    case D3D10_SB_RESOURCE_DIMENSION_TEXTURECUBEARRAY:
1101*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_CUBE_ARRAY;
1102*61046927SAndroid Build Coastguard Worker    default:
1103*61046927SAndroid Build Coastguard Worker       assert(0);
1104*61046927SAndroid Build Coastguard Worker       return TGSI_TEXTURE_UNKNOWN;
1105*61046927SAndroid Build Coastguard Worker    }
1106*61046927SAndroid Build Coastguard Worker }
1107*61046927SAndroid Build Coastguard Worker 
1108*61046927SAndroid Build Coastguard Worker static uint
texture_dim_from_tgsi_target(unsigned tgsi_target)1109*61046927SAndroid Build Coastguard Worker texture_dim_from_tgsi_target(unsigned tgsi_target)
1110*61046927SAndroid Build Coastguard Worker {
1111*61046927SAndroid Build Coastguard Worker    switch (tgsi_target) {
1112*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_BUFFER:
1113*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_1D:
1114*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_1D_ARRAY:
1115*61046927SAndroid Build Coastguard Worker       return 1;
1116*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_2D:
1117*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_2D_MSAA:
1118*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_CUBE:
1119*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_2D_ARRAY:
1120*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_2D_ARRAY_MSAA:
1121*61046927SAndroid Build Coastguard Worker       return 2;
1122*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_3D:
1123*61046927SAndroid Build Coastguard Worker       return 3;
1124*61046927SAndroid Build Coastguard Worker    case TGSI_TEXTURE_UNKNOWN:
1125*61046927SAndroid Build Coastguard Worker    default:
1126*61046927SAndroid Build Coastguard Worker       assert(0);
1127*61046927SAndroid Build Coastguard Worker       return 1;
1128*61046927SAndroid Build Coastguard Worker    }
1129*61046927SAndroid Build Coastguard Worker }
1130*61046927SAndroid Build Coastguard Worker 
1131*61046927SAndroid Build Coastguard Worker static bool
operand_is_scalar(const struct Shader_src_operand * operand)1132*61046927SAndroid Build Coastguard Worker operand_is_scalar(const struct Shader_src_operand *operand)
1133*61046927SAndroid Build Coastguard Worker {
1134*61046927SAndroid Build Coastguard Worker    return operand->swizzle[0] == operand->swizzle[1] &&
1135*61046927SAndroid Build Coastguard Worker           operand->swizzle[1] == operand->swizzle[2] &&
1136*61046927SAndroid Build Coastguard Worker           operand->swizzle[2] == operand->swizzle[3];
1137*61046927SAndroid Build Coastguard Worker }
1138*61046927SAndroid Build Coastguard Worker 
1139*61046927SAndroid Build Coastguard Worker static void
Shader_add_call(struct Shader_xlate * sx,unsigned d3d_label,unsigned tgsi_label_token)1140*61046927SAndroid Build Coastguard Worker Shader_add_call(struct Shader_xlate *sx,
1141*61046927SAndroid Build Coastguard Worker                 unsigned d3d_label,
1142*61046927SAndroid Build Coastguard Worker                 unsigned tgsi_label_token)
1143*61046927SAndroid Build Coastguard Worker {
1144*61046927SAndroid Build Coastguard Worker    ASSERT(sx->num_calls < sx->max_calls);
1145*61046927SAndroid Build Coastguard Worker 
1146*61046927SAndroid Build Coastguard Worker    sx->calls[sx->num_calls].d3d_label = d3d_label;
1147*61046927SAndroid Build Coastguard Worker    sx->calls[sx->num_calls].tgsi_label_token = tgsi_label_token;
1148*61046927SAndroid Build Coastguard Worker    sx->num_calls++;
1149*61046927SAndroid Build Coastguard Worker }
1150*61046927SAndroid Build Coastguard Worker 
1151*61046927SAndroid Build Coastguard Worker static void
Shader_add_label(struct Shader_xlate * sx,unsigned d3d_label,unsigned tgsi_insn_no)1152*61046927SAndroid Build Coastguard Worker Shader_add_label(struct Shader_xlate *sx,
1153*61046927SAndroid Build Coastguard Worker                  unsigned d3d_label,
1154*61046927SAndroid Build Coastguard Worker                  unsigned tgsi_insn_no)
1155*61046927SAndroid Build Coastguard Worker {
1156*61046927SAndroid Build Coastguard Worker    ASSERT(sx->num_labels < sx->max_labels);
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker    sx->labels[sx->num_labels].d3d_label = d3d_label;
1159*61046927SAndroid Build Coastguard Worker    sx->labels[sx->num_labels].tgsi_insn_no = tgsi_insn_no;
1160*61046927SAndroid Build Coastguard Worker    sx->num_labels++;
1161*61046927SAndroid Build Coastguard Worker }
1162*61046927SAndroid Build Coastguard Worker 
1163*61046927SAndroid Build Coastguard Worker 
1164*61046927SAndroid Build Coastguard Worker static void
sample_ureg_emit(struct ureg_program * ureg,unsigned tgsi_opcode,unsigned num_src,struct Shader_opcode * opcode,struct ureg_dst dst,struct ureg_src * src)1165*61046927SAndroid Build Coastguard Worker sample_ureg_emit(struct ureg_program *ureg,
1166*61046927SAndroid Build Coastguard Worker                  unsigned tgsi_opcode,
1167*61046927SAndroid Build Coastguard Worker                  unsigned num_src,
1168*61046927SAndroid Build Coastguard Worker                  struct Shader_opcode *opcode,
1169*61046927SAndroid Build Coastguard Worker                  struct ureg_dst dst,
1170*61046927SAndroid Build Coastguard Worker                  struct ureg_src *src)
1171*61046927SAndroid Build Coastguard Worker {
1172*61046927SAndroid Build Coastguard Worker    unsigned num_offsets = 0;
1173*61046927SAndroid Build Coastguard Worker    struct tgsi_texture_offset texoffsets;
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker    memset(&texoffsets, 0, sizeof texoffsets);
1176*61046927SAndroid Build Coastguard Worker 
1177*61046927SAndroid Build Coastguard Worker    if (opcode->imm_texel_offset.u ||
1178*61046927SAndroid Build Coastguard Worker        opcode->imm_texel_offset.v ||
1179*61046927SAndroid Build Coastguard Worker        opcode->imm_texel_offset.w) {
1180*61046927SAndroid Build Coastguard Worker       struct ureg_src offsetreg;
1181*61046927SAndroid Build Coastguard Worker       num_offsets = 1;
1182*61046927SAndroid Build Coastguard Worker       /* don't actually always need all 3 values */
1183*61046927SAndroid Build Coastguard Worker       offsetreg = ureg_imm3i(ureg,
1184*61046927SAndroid Build Coastguard Worker                              opcode->imm_texel_offset.u,
1185*61046927SAndroid Build Coastguard Worker                              opcode->imm_texel_offset.v,
1186*61046927SAndroid Build Coastguard Worker                              opcode->imm_texel_offset.w);
1187*61046927SAndroid Build Coastguard Worker       texoffsets.File = offsetreg.File;
1188*61046927SAndroid Build Coastguard Worker       texoffsets.Index = offsetreg.Index;
1189*61046927SAndroid Build Coastguard Worker       texoffsets.SwizzleX = offsetreg.SwizzleX;
1190*61046927SAndroid Build Coastguard Worker       texoffsets.SwizzleY = offsetreg.SwizzleY;
1191*61046927SAndroid Build Coastguard Worker       texoffsets.SwizzleZ = offsetreg.SwizzleZ;
1192*61046927SAndroid Build Coastguard Worker    }
1193*61046927SAndroid Build Coastguard Worker 
1194*61046927SAndroid Build Coastguard Worker    ureg_tex_insn(ureg,
1195*61046927SAndroid Build Coastguard Worker                  tgsi_opcode,
1196*61046927SAndroid Build Coastguard Worker                  &dst, 1,
1197*61046927SAndroid Build Coastguard Worker                  TGSI_TEXTURE_UNKNOWN,
1198*61046927SAndroid Build Coastguard Worker                  TGSI_RETURN_TYPE_UNKNOWN,
1199*61046927SAndroid Build Coastguard Worker                  &texoffsets, num_offsets,
1200*61046927SAndroid Build Coastguard Worker                  src, num_src);
1201*61046927SAndroid Build Coastguard Worker }
1202*61046927SAndroid Build Coastguard Worker 
1203*61046927SAndroid Build Coastguard Worker typedef void (*unary_ureg_func)(struct ureg_program *ureg, struct ureg_dst dst,
1204*61046927SAndroid Build Coastguard Worker                                 struct ureg_src src);
1205*61046927SAndroid Build Coastguard Worker static void
expand_unary_to_scalarf(struct ureg_program * ureg,unary_ureg_func func,struct Shader_xlate * sx,struct Shader_opcode * opcode)1206*61046927SAndroid Build Coastguard Worker expand_unary_to_scalarf(struct ureg_program *ureg, unary_ureg_func func,
1207*61046927SAndroid Build Coastguard Worker                         struct Shader_xlate *sx, struct Shader_opcode *opcode)
1208*61046927SAndroid Build Coastguard Worker {
1209*61046927SAndroid Build Coastguard Worker    struct ureg_dst tmp = ureg_DECL_temporary(ureg);
1210*61046927SAndroid Build Coastguard Worker    struct ureg_dst dst = translate_dst_operand(sx, &opcode->dst[0],
1211*61046927SAndroid Build Coastguard Worker                                                opcode->saturate);
1212*61046927SAndroid Build Coastguard Worker    struct ureg_src src = translate_src_operand(sx, &opcode->src[0], OF_FLOAT);
1213*61046927SAndroid Build Coastguard Worker    struct ureg_dst scalar_dst;
1214*61046927SAndroid Build Coastguard Worker    ureg_MOV(ureg, tmp, src);
1215*61046927SAndroid Build Coastguard Worker    src = ureg_src(tmp);
1216*61046927SAndroid Build Coastguard Worker 
1217*61046927SAndroid Build Coastguard Worker    scalar_dst = ureg_writemask(dst, TGSI_WRITEMASK_X);
1218*61046927SAndroid Build Coastguard Worker    if (scalar_dst.WriteMask != TGSI_WRITEMASK_NONE) {
1219*61046927SAndroid Build Coastguard Worker       func(ureg, scalar_dst,
1220*61046927SAndroid Build Coastguard Worker            ureg_scalar(src, TGSI_SWIZZLE_X));
1221*61046927SAndroid Build Coastguard Worker    }
1222*61046927SAndroid Build Coastguard Worker    scalar_dst = ureg_writemask(dst, TGSI_WRITEMASK_Y);
1223*61046927SAndroid Build Coastguard Worker    if (scalar_dst.WriteMask != TGSI_WRITEMASK_NONE) {
1224*61046927SAndroid Build Coastguard Worker       func(ureg, scalar_dst,
1225*61046927SAndroid Build Coastguard Worker            ureg_scalar(src, TGSI_SWIZZLE_Y));
1226*61046927SAndroid Build Coastguard Worker    }
1227*61046927SAndroid Build Coastguard Worker    scalar_dst = ureg_writemask(dst, TGSI_WRITEMASK_Z);
1228*61046927SAndroid Build Coastguard Worker    if (scalar_dst.WriteMask != TGSI_WRITEMASK_NONE) {
1229*61046927SAndroid Build Coastguard Worker       func(ureg, scalar_dst,
1230*61046927SAndroid Build Coastguard Worker            ureg_scalar(src, TGSI_SWIZZLE_Z));
1231*61046927SAndroid Build Coastguard Worker    }
1232*61046927SAndroid Build Coastguard Worker    scalar_dst = ureg_writemask(dst, TGSI_WRITEMASK_W);
1233*61046927SAndroid Build Coastguard Worker    if (scalar_dst.WriteMask != TGSI_WRITEMASK_NONE) {
1234*61046927SAndroid Build Coastguard Worker       func(ureg, scalar_dst,
1235*61046927SAndroid Build Coastguard Worker            ureg_scalar(src, TGSI_SWIZZLE_W));
1236*61046927SAndroid Build Coastguard Worker    }
1237*61046927SAndroid Build Coastguard Worker    ureg_release_temporary(ureg, tmp);
1238*61046927SAndroid Build Coastguard Worker }
1239*61046927SAndroid Build Coastguard Worker 
1240*61046927SAndroid Build Coastguard Worker const struct tgsi_token *
Shader_tgsi_translate(const unsigned * code,unsigned * output_mapping)1241*61046927SAndroid Build Coastguard Worker Shader_tgsi_translate(const unsigned *code,
1242*61046927SAndroid Build Coastguard Worker                       unsigned *output_mapping)
1243*61046927SAndroid Build Coastguard Worker {
1244*61046927SAndroid Build Coastguard Worker    struct Shader_xlate sx;
1245*61046927SAndroid Build Coastguard Worker    struct Shader_parser parser;
1246*61046927SAndroid Build Coastguard Worker    struct ureg_program *ureg = NULL;
1247*61046927SAndroid Build Coastguard Worker    struct Shader_opcode opcode;
1248*61046927SAndroid Build Coastguard Worker    const struct tgsi_token *tokens = NULL;
1249*61046927SAndroid Build Coastguard Worker    uint nr_tokens;
1250*61046927SAndroid Build Coastguard Worker    bool shader_dumped = false;
1251*61046927SAndroid Build Coastguard Worker    bool inside_sub = false;
1252*61046927SAndroid Build Coastguard Worker    uint i, j;
1253*61046927SAndroid Build Coastguard Worker 
1254*61046927SAndroid Build Coastguard Worker    memset(&sx, 0, sizeof sx);
1255*61046927SAndroid Build Coastguard Worker 
1256*61046927SAndroid Build Coastguard Worker    Shader_parse_init(&parser, code);
1257*61046927SAndroid Build Coastguard Worker 
1258*61046927SAndroid Build Coastguard Worker    if (st_debug & ST_DEBUG_TGSI) {
1259*61046927SAndroid Build Coastguard Worker       dx10_shader_dump_tokens(code);
1260*61046927SAndroid Build Coastguard Worker       shader_dumped = true;
1261*61046927SAndroid Build Coastguard Worker    }
1262*61046927SAndroid Build Coastguard Worker 
1263*61046927SAndroid Build Coastguard Worker    sx.max_calls = 64;
1264*61046927SAndroid Build Coastguard Worker    sx.calls = (struct Shader_call *)MALLOC(sx.max_calls *
1265*61046927SAndroid Build Coastguard Worker                                            sizeof(struct Shader_call));
1266*61046927SAndroid Build Coastguard Worker    sx.num_calls = 0;
1267*61046927SAndroid Build Coastguard Worker 
1268*61046927SAndroid Build Coastguard Worker    sx.max_labels = 64;
1269*61046927SAndroid Build Coastguard Worker    sx.labels = (struct Shader_label *)MALLOC(sx.max_labels *
1270*61046927SAndroid Build Coastguard Worker                                              sizeof(struct Shader_call));
1271*61046927SAndroid Build Coastguard Worker    sx.num_labels = 0;
1272*61046927SAndroid Build Coastguard Worker 
1273*61046927SAndroid Build Coastguard Worker 
1274*61046927SAndroid Build Coastguard Worker 
1275*61046927SAndroid Build Coastguard Worker    /* Header. */
1276*61046927SAndroid Build Coastguard Worker    switch (parser.header.type) {
1277*61046927SAndroid Build Coastguard Worker    case D3D10_SB_PIXEL_SHADER:
1278*61046927SAndroid Build Coastguard Worker       ureg = ureg_create(PIPE_SHADER_FRAGMENT);
1279*61046927SAndroid Build Coastguard Worker       break;
1280*61046927SAndroid Build Coastguard Worker    case D3D10_SB_VERTEX_SHADER:
1281*61046927SAndroid Build Coastguard Worker       ureg = ureg_create(PIPE_SHADER_VERTEX);
1282*61046927SAndroid Build Coastguard Worker       break;
1283*61046927SAndroid Build Coastguard Worker    case D3D10_SB_GEOMETRY_SHADER:
1284*61046927SAndroid Build Coastguard Worker       ureg = ureg_create(PIPE_SHADER_GEOMETRY);
1285*61046927SAndroid Build Coastguard Worker       break;
1286*61046927SAndroid Build Coastguard Worker    }
1287*61046927SAndroid Build Coastguard Worker 
1288*61046927SAndroid Build Coastguard Worker    assert(ureg);
1289*61046927SAndroid Build Coastguard Worker    sx.ureg = ureg;
1290*61046927SAndroid Build Coastguard Worker 
1291*61046927SAndroid Build Coastguard Worker    while (Shader_parse_opcode(&parser, &opcode)) {
1292*61046927SAndroid Build Coastguard Worker       const struct dx10_opcode_xlate *ox;
1293*61046927SAndroid Build Coastguard Worker 
1294*61046927SAndroid Build Coastguard Worker       assert(opcode.type < D3D10_SB_NUM_OPCODES);
1295*61046927SAndroid Build Coastguard Worker       ox = &opcode_xlate[opcode.type];
1296*61046927SAndroid Build Coastguard Worker 
1297*61046927SAndroid Build Coastguard Worker       switch (opcode.type) {
1298*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_EXP:
1299*61046927SAndroid Build Coastguard Worker          expand_unary_to_scalarf(ureg, ureg_EX2, &sx, &opcode);
1300*61046927SAndroid Build Coastguard Worker          break;
1301*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SQRT:
1302*61046927SAndroid Build Coastguard Worker          expand_unary_to_scalarf(ureg, ureg_SQRT, &sx, &opcode);
1303*61046927SAndroid Build Coastguard Worker          break;
1304*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_RSQ:
1305*61046927SAndroid Build Coastguard Worker          expand_unary_to_scalarf(ureg, ureg_RSQ, &sx, &opcode);
1306*61046927SAndroid Build Coastguard Worker          break;
1307*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_LOG:
1308*61046927SAndroid Build Coastguard Worker          expand_unary_to_scalarf(ureg, ureg_LG2, &sx, &opcode);
1309*61046927SAndroid Build Coastguard Worker          break;
1310*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_IMUL:
1311*61046927SAndroid Build Coastguard Worker          if (opcode.dst[0].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1312*61046927SAndroid Build Coastguard Worker             ureg_IMUL_HI(ureg,
1313*61046927SAndroid Build Coastguard Worker                         translate_dst_operand(&sx, &opcode.dst[0], opcode.saturate),
1314*61046927SAndroid Build Coastguard Worker                         translate_src_operand(&sx, &opcode.src[0], OF_INT),
1315*61046927SAndroid Build Coastguard Worker                         translate_src_operand(&sx, &opcode.src[1], OF_INT));
1316*61046927SAndroid Build Coastguard Worker          }
1317*61046927SAndroid Build Coastguard Worker 
1318*61046927SAndroid Build Coastguard Worker          if (opcode.dst[1].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1319*61046927SAndroid Build Coastguard Worker             ureg_UMUL(ureg,
1320*61046927SAndroid Build Coastguard Worker                       translate_dst_operand(&sx, &opcode.dst[1], opcode.saturate),
1321*61046927SAndroid Build Coastguard Worker                       translate_src_operand(&sx, &opcode.src[0], OF_INT),
1322*61046927SAndroid Build Coastguard Worker                       translate_src_operand(&sx, &opcode.src[1], OF_INT));
1323*61046927SAndroid Build Coastguard Worker          }
1324*61046927SAndroid Build Coastguard Worker 
1325*61046927SAndroid Build Coastguard Worker          break;
1326*61046927SAndroid Build Coastguard Worker 
1327*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_FTOI: {
1328*61046927SAndroid Build Coastguard Worker          /* XXX: tgsi (and just about everybody else, c, opencl, glsl) has
1329*61046927SAndroid Build Coastguard Worker           * out-of-range (and NaN) values undefined for f2i/f2u, but d3d10
1330*61046927SAndroid Build Coastguard Worker           * requires clamping to min and max representable value (as well as 0
1331*61046927SAndroid Build Coastguard Worker           * for NaNs) (this applies to both ftoi and ftou). At least the online
1332*61046927SAndroid Build Coastguard Worker           * docs state that - this is consistent with generic d3d10 conversion
1333*61046927SAndroid Build Coastguard Worker           * rules.
1334*61046927SAndroid Build Coastguard Worker           * For FTOI, we cheat a bit here - in particular depending on noone
1335*61046927SAndroid Build Coastguard Worker           * caring about NaNs, and depending on the (undefined!) behavior of
1336*61046927SAndroid Build Coastguard Worker           * F2I returning 0x80000000 for too negative values (which works with
1337*61046927SAndroid Build Coastguard Worker           * x86 sse). Hence only need to clamp too positive values.
1338*61046927SAndroid Build Coastguard Worker           * Note that it is impossible to clamp using a float, since 2^31 - 1
1339*61046927SAndroid Build Coastguard Worker           * is not exactly representable with a float.
1340*61046927SAndroid Build Coastguard Worker           */
1341*61046927SAndroid Build Coastguard Worker          struct ureg_dst too_large = ureg_DECL_temporary(ureg);
1342*61046927SAndroid Build Coastguard Worker          struct ureg_dst tmp = ureg_DECL_temporary(ureg);
1343*61046927SAndroid Build Coastguard Worker          ureg_FSGE(ureg, too_large,
1344*61046927SAndroid Build Coastguard Worker                    translate_src_operand(&sx, &opcode.src[0], OF_FLOAT),
1345*61046927SAndroid Build Coastguard Worker                    ureg_imm1f(ureg, 2147483648.0f));
1346*61046927SAndroid Build Coastguard Worker          ureg_F2I(ureg, tmp,
1347*61046927SAndroid Build Coastguard Worker                   translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1348*61046927SAndroid Build Coastguard Worker          ureg_UCMP(ureg,
1349*61046927SAndroid Build Coastguard Worker                    translate_dst_operand(&sx, &opcode.dst[0], opcode.saturate),
1350*61046927SAndroid Build Coastguard Worker                    ureg_src(too_large),
1351*61046927SAndroid Build Coastguard Worker                    ureg_imm1i(ureg, 0x7fffffff),
1352*61046927SAndroid Build Coastguard Worker                    ureg_src(tmp));
1353*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, too_large);
1354*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, tmp);
1355*61046927SAndroid Build Coastguard Worker       }
1356*61046927SAndroid Build Coastguard Worker          break;
1357*61046927SAndroid Build Coastguard Worker 
1358*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_FTOU: {
1359*61046927SAndroid Build Coastguard Worker          /* For ftou, we need to do both clamps, which as a bonus also
1360*61046927SAndroid Build Coastguard Worker           * gets us correct NaN behavior.
1361*61046927SAndroid Build Coastguard Worker           * Note that it is impossible to clamp using a float against the upper
1362*61046927SAndroid Build Coastguard Worker           * limit, since 2^32 - 1 is not exactly representable with a float,
1363*61046927SAndroid Build Coastguard Worker           * but the clamp against 0.0 certainly works just fine.
1364*61046927SAndroid Build Coastguard Worker           */
1365*61046927SAndroid Build Coastguard Worker          struct ureg_dst too_large = ureg_DECL_temporary(ureg);
1366*61046927SAndroid Build Coastguard Worker          struct ureg_dst tmp = ureg_DECL_temporary(ureg);
1367*61046927SAndroid Build Coastguard Worker          ureg_FSGE(ureg, too_large,
1368*61046927SAndroid Build Coastguard Worker                    translate_src_operand(&sx, &opcode.src[0], OF_FLOAT),
1369*61046927SAndroid Build Coastguard Worker                    ureg_imm1f(ureg, 4294967296.0f));
1370*61046927SAndroid Build Coastguard Worker          /* clamp negative values + NaN to zero.
1371*61046927SAndroid Build Coastguard Worker           * (Could be done slightly more efficient in llvmpipe due to
1372*61046927SAndroid Build Coastguard Worker           * MAX NaN behavior handling.)
1373*61046927SAndroid Build Coastguard Worker           */
1374*61046927SAndroid Build Coastguard Worker          ureg_MAX(ureg, tmp,
1375*61046927SAndroid Build Coastguard Worker                   ureg_imm1f(ureg, 0.0f),
1376*61046927SAndroid Build Coastguard Worker                   translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1377*61046927SAndroid Build Coastguard Worker          ureg_F2U(ureg, tmp,
1378*61046927SAndroid Build Coastguard Worker                   ureg_src(tmp));
1379*61046927SAndroid Build Coastguard Worker          ureg_UCMP(ureg,
1380*61046927SAndroid Build Coastguard Worker                    translate_dst_operand(&sx, &opcode.dst[0], opcode.saturate),
1381*61046927SAndroid Build Coastguard Worker                    ureg_src(too_large),
1382*61046927SAndroid Build Coastguard Worker                    ureg_imm1u(ureg, 0xffffffff),
1383*61046927SAndroid Build Coastguard Worker                    ureg_src(tmp));
1384*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, too_large);
1385*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, tmp);
1386*61046927SAndroid Build Coastguard Worker       }
1387*61046927SAndroid Build Coastguard Worker          break;
1388*61046927SAndroid Build Coastguard Worker 
1389*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_LD_MS:
1390*61046927SAndroid Build Coastguard Worker          /* XXX: We don't support multi-sampling yet, but we need to parse
1391*61046927SAndroid Build Coastguard Worker           * this opcode regardless, so we just ignore sample index operand
1392*61046927SAndroid Build Coastguard Worker           * for now */
1393*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_LD:
1394*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1395*61046927SAndroid Build Coastguard Worker             unsigned resource = opcode.src[1].base.index[0].imm;
1396*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1397*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1398*61046927SAndroid Build Coastguard Worker 
1399*61046927SAndroid Build Coastguard Worker             if (ureg_src_is_undef(sx.samplers[resource])) {
1400*61046927SAndroid Build Coastguard Worker                sx.samplers[resource] =
1401*61046927SAndroid Build Coastguard Worker                   ureg_DECL_sampler(ureg, resource);
1402*61046927SAndroid Build Coastguard Worker             }
1403*61046927SAndroid Build Coastguard Worker 
1404*61046927SAndroid Build Coastguard Worker             ureg_TXF(ureg,
1405*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0], opcode.saturate),
1406*61046927SAndroid Build Coastguard Worker                      sx.resources[resource].target,
1407*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT),
1408*61046927SAndroid Build Coastguard Worker                      sx.samplers[resource]);
1409*61046927SAndroid Build Coastguard Worker          }
1410*61046927SAndroid Build Coastguard Worker          else {
1411*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[2];
1412*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_INT);
1413*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_INT);
1414*61046927SAndroid Build Coastguard Worker 
1415*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_I, 2, &opcode,
1416*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1417*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1418*61046927SAndroid Build Coastguard Worker                              srcreg);
1419*61046927SAndroid Build Coastguard Worker          }
1420*61046927SAndroid Build Coastguard Worker          break;
1421*61046927SAndroid Build Coastguard Worker 
1422*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_CUSTOMDATA:
1423*61046927SAndroid Build Coastguard Worker          if (opcode.customdata._class ==
1424*61046927SAndroid Build Coastguard Worker              D3D10_SB_CUSTOMDATA_DCL_IMMEDIATE_CONSTANT_BUFFER) {
1425*61046927SAndroid Build Coastguard Worker             sx.imms =
1426*61046927SAndroid Build Coastguard Worker                ureg_DECL_immediate_block_uint(ureg,
1427*61046927SAndroid Build Coastguard Worker                                               opcode.customdata.u.constbuf.data,
1428*61046927SAndroid Build Coastguard Worker                                               opcode.customdata.u.constbuf.count);
1429*61046927SAndroid Build Coastguard Worker          } else {
1430*61046927SAndroid Build Coastguard Worker             assert(0);
1431*61046927SAndroid Build Coastguard Worker          }
1432*61046927SAndroid Build Coastguard Worker          break;
1433*61046927SAndroid Build Coastguard Worker 
1434*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_RESINFO:
1435*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1436*61046927SAndroid Build Coastguard Worker             unsigned resource = opcode.src[1].base.index[0].imm;
1437*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1438*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1439*61046927SAndroid Build Coastguard Worker 
1440*61046927SAndroid Build Coastguard Worker             if (ureg_src_is_undef(sx.samplers[resource])) {
1441*61046927SAndroid Build Coastguard Worker                sx.samplers[resource] =
1442*61046927SAndroid Build Coastguard Worker                   ureg_DECL_sampler(ureg, resource);
1443*61046927SAndroid Build Coastguard Worker             }
1444*61046927SAndroid Build Coastguard Worker             /* don't bother with swizzle, ret type etc. */
1445*61046927SAndroid Build Coastguard Worker             ureg_TXQ(ureg,
1446*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1447*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1448*61046927SAndroid Build Coastguard Worker                      sx.resources[resource].target,
1449*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_UINT),
1450*61046927SAndroid Build Coastguard Worker                      sx.samplers[resource]);
1451*61046927SAndroid Build Coastguard Worker          }
1452*61046927SAndroid Build Coastguard Worker          else {
1453*61046927SAndroid Build Coastguard Worker             struct ureg_dst r0 = ureg_DECL_temporary(ureg);
1454*61046927SAndroid Build Coastguard Worker             struct ureg_src tsrc = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1455*61046927SAndroid Build Coastguard Worker             struct ureg_dst dstreg = translate_dst_operand(&sx, &opcode.dst[0],
1456*61046927SAndroid Build Coastguard Worker                                                            opcode.saturate);
1457*61046927SAndroid Build Coastguard Worker 
1458*61046927SAndroid Build Coastguard Worker             /* while specs say swizzle is ignored better safe than sorry */
1459*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleX = TGSI_SWIZZLE_X;
1460*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleY = TGSI_SWIZZLE_Y;
1461*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleZ = TGSI_SWIZZLE_Z;
1462*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleW = TGSI_SWIZZLE_W;
1463*61046927SAndroid Build Coastguard Worker 
1464*61046927SAndroid Build Coastguard Worker             ureg_SVIEWINFO(ureg, r0,
1465*61046927SAndroid Build Coastguard Worker                            translate_src_operand(&sx, &opcode.src[0], OF_UINT),
1466*61046927SAndroid Build Coastguard Worker                            tsrc);
1467*61046927SAndroid Build Coastguard Worker 
1468*61046927SAndroid Build Coastguard Worker             tsrc = ureg_src(r0);
1469*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleX = opcode.src[1].swizzle[0];
1470*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleY = opcode.src[1].swizzle[1];
1471*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleZ = opcode.src[1].swizzle[2];
1472*61046927SAndroid Build Coastguard Worker             tsrc.SwizzleW = opcode.src[1].swizzle[3];
1473*61046927SAndroid Build Coastguard Worker 
1474*61046927SAndroid Build Coastguard Worker             if (opcode.specific.resinfo_ret_type ==
1475*61046927SAndroid Build Coastguard Worker                 D3D10_SB_RESINFO_INSTRUCTION_RETURN_UINT) {
1476*61046927SAndroid Build Coastguard Worker                ureg_MOV(ureg, dstreg, tsrc);
1477*61046927SAndroid Build Coastguard Worker             }
1478*61046927SAndroid Build Coastguard Worker             else if (opcode.specific.resinfo_ret_type ==
1479*61046927SAndroid Build Coastguard Worker                      D3D10_SB_RESINFO_INSTRUCTION_RETURN_FLOAT) {
1480*61046927SAndroid Build Coastguard Worker                 ureg_I2F(ureg, dstreg, tsrc);
1481*61046927SAndroid Build Coastguard Worker             }
1482*61046927SAndroid Build Coastguard Worker             else { /* D3D10_SB_RESINFO_INSTRUCTION_RETURN_RCPFLOAT */
1483*61046927SAndroid Build Coastguard Worker                unsigned i;
1484*61046927SAndroid Build Coastguard Worker                /*
1485*61046927SAndroid Build Coastguard Worker                 * Must apply rcp only to parts determined by dims,
1486*61046927SAndroid Build Coastguard Worker                 * (width/height/depth) but NOT to array size nor mip levels
1487*61046927SAndroid Build Coastguard Worker                 * hence need to figure that out here.
1488*61046927SAndroid Build Coastguard Worker                 * This is one sick modifier if you ask me!
1489*61046927SAndroid Build Coastguard Worker                 */
1490*61046927SAndroid Build Coastguard Worker                unsigned res_index = opcode.src[1].base.index[0].imm;
1491*61046927SAndroid Build Coastguard Worker                unsigned target = sx.resources[res_index].target;
1492*61046927SAndroid Build Coastguard Worker                unsigned dims = texture_dim_from_tgsi_target(target);
1493*61046927SAndroid Build Coastguard Worker 
1494*61046927SAndroid Build Coastguard Worker                ureg_I2F(ureg, r0, ureg_src(r0));
1495*61046927SAndroid Build Coastguard Worker                tsrc = ureg_src(r0);
1496*61046927SAndroid Build Coastguard Worker                for (i = 0; i < 4; i++) {
1497*61046927SAndroid Build Coastguard Worker                   unsigned dst_swizzle = opcode.src[1].swizzle[i];
1498*61046927SAndroid Build Coastguard Worker                   struct ureg_dst dstregmasked = ureg_writemask(dstreg, 1 << i);
1499*61046927SAndroid Build Coastguard Worker                   /*
1500*61046927SAndroid Build Coastguard Worker                    * could do one mov with multiple write mask bits set
1501*61046927SAndroid Build Coastguard Worker                    * but rcp is scalar anyway.
1502*61046927SAndroid Build Coastguard Worker                    */
1503*61046927SAndroid Build Coastguard Worker                   if (dst_swizzle < dims) {
1504*61046927SAndroid Build Coastguard Worker                      ureg_RCP(ureg, dstregmasked, ureg_scalar(tsrc, dst_swizzle));
1505*61046927SAndroid Build Coastguard Worker                   }
1506*61046927SAndroid Build Coastguard Worker                   else {
1507*61046927SAndroid Build Coastguard Worker                      ureg_MOV(ureg, dstregmasked, ureg_scalar(tsrc, dst_swizzle));
1508*61046927SAndroid Build Coastguard Worker                   }
1509*61046927SAndroid Build Coastguard Worker                }
1510*61046927SAndroid Build Coastguard Worker             }
1511*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, r0);
1512*61046927SAndroid Build Coastguard Worker          }
1513*61046927SAndroid Build Coastguard Worker          break;
1514*61046927SAndroid Build Coastguard Worker 
1515*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE:
1516*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1517*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1518*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1519*61046927SAndroid Build Coastguard Worker 
1520*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(opcode.src[1].base.index[0].imm != opcode.src[2].base.index[0].imm);
1521*61046927SAndroid Build Coastguard Worker 
1522*61046927SAndroid Build Coastguard Worker             ureg_TEX(ureg,
1523*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1524*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1525*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1526*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT),
1527*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1528*61046927SAndroid Build Coastguard Worker          }
1529*61046927SAndroid Build Coastguard Worker          else {
1530*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[3];
1531*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1532*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1533*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1534*61046927SAndroid Build Coastguard Worker 
1535*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE, 3, &opcode,
1536*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1537*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1538*61046927SAndroid Build Coastguard Worker                              srcreg);
1539*61046927SAndroid Build Coastguard Worker          }
1540*61046927SAndroid Build Coastguard Worker          break;
1541*61046927SAndroid Build Coastguard Worker 
1542*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE_C:
1543*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1544*61046927SAndroid Build Coastguard Worker             struct ureg_dst r0 = ureg_DECL_temporary(ureg);
1545*61046927SAndroid Build Coastguard Worker 
1546*61046927SAndroid Build Coastguard Worker             /* XXX: Support only 2D texture targets for now.
1547*61046927SAndroid Build Coastguard Worker              *      Need to figure out how to pack the compare value
1548*61046927SAndroid Build Coastguard Worker              *      for other dimensions and if there is enough space
1549*61046927SAndroid Build Coastguard Worker              *      in a single operand for all possible cases.
1550*61046927SAndroid Build Coastguard Worker              */
1551*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(sx.resources[opcode.src[1].base.index[0].imm].target !=
1552*61046927SAndroid Build Coastguard Worker                             TGSI_TEXTURE_2D);
1553*61046927SAndroid Build Coastguard Worker 
1554*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1555*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1556*61046927SAndroid Build Coastguard Worker 
1557*61046927SAndroid Build Coastguard Worker             /* Insert the compare value into .z component.
1558*61046927SAndroid Build Coastguard Worker              */
1559*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1560*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_XYW),
1561*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1562*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1563*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_Z),
1564*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[3], OF_FLOAT));
1565*61046927SAndroid Build Coastguard Worker 
1566*61046927SAndroid Build Coastguard Worker             /* XXX: Pass explicit Lod=0 in D3D10_SB_OPCODE_SAMPLE_C_LZ case.
1567*61046927SAndroid Build Coastguard Worker              */
1568*61046927SAndroid Build Coastguard Worker 
1569*61046927SAndroid Build Coastguard Worker             ureg_TEX(ureg,
1570*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1571*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1572*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1573*61046927SAndroid Build Coastguard Worker                      ureg_src(r0),
1574*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1575*61046927SAndroid Build Coastguard Worker 
1576*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, r0);
1577*61046927SAndroid Build Coastguard Worker          }
1578*61046927SAndroid Build Coastguard Worker          else {
1579*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[4];
1580*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1581*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1582*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1583*61046927SAndroid Build Coastguard Worker             srcreg[3] = translate_src_operand(&sx, &opcode.src[3], OF_FLOAT);
1584*61046927SAndroid Build Coastguard Worker 
1585*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_C, 4, &opcode,
1586*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1587*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1588*61046927SAndroid Build Coastguard Worker                              srcreg);
1589*61046927SAndroid Build Coastguard Worker          }
1590*61046927SAndroid Build Coastguard Worker          break;
1591*61046927SAndroid Build Coastguard Worker 
1592*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE_C_LZ:
1593*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1594*61046927SAndroid Build Coastguard Worker             struct ureg_dst r0 = ureg_DECL_temporary(ureg);
1595*61046927SAndroid Build Coastguard Worker 
1596*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1597*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1598*61046927SAndroid Build Coastguard Worker 
1599*61046927SAndroid Build Coastguard Worker             /* XXX: Support only 2D texture targets for now.
1600*61046927SAndroid Build Coastguard Worker              *      Need to figure out how to pack the compare value
1601*61046927SAndroid Build Coastguard Worker              *      for other dimensions and if there is enough space
1602*61046927SAndroid Build Coastguard Worker              *      in a single operand for all possible cases.
1603*61046927SAndroid Build Coastguard Worker              */
1604*61046927SAndroid Build Coastguard Worker             LOG_UNSUPPORTED(sx.resources[opcode.src[1].base.index[0].imm].target !=
1605*61046927SAndroid Build Coastguard Worker                             TGSI_TEXTURE_2D);
1606*61046927SAndroid Build Coastguard Worker 
1607*61046927SAndroid Build Coastguard Worker             /* Insert the compare value into .z component.
1608*61046927SAndroid Build Coastguard Worker              * Insert 0 into .w component.
1609*61046927SAndroid Build Coastguard Worker              */
1610*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1611*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_XY),
1612*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1613*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1614*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_Z),
1615*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[3], OF_FLOAT));
1616*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1617*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_W),
1618*61046927SAndroid Build Coastguard Worker                      ureg_imm1f(ureg, 0.0f));
1619*61046927SAndroid Build Coastguard Worker 
1620*61046927SAndroid Build Coastguard Worker             ureg_TXL(ureg,
1621*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1622*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1623*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1624*61046927SAndroid Build Coastguard Worker                      ureg_src(r0),
1625*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1626*61046927SAndroid Build Coastguard Worker 
1627*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, r0);
1628*61046927SAndroid Build Coastguard Worker          }
1629*61046927SAndroid Build Coastguard Worker          else {
1630*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[4];
1631*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1632*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1633*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1634*61046927SAndroid Build Coastguard Worker             srcreg[3] = translate_src_operand(&sx, &opcode.src[3], OF_FLOAT);
1635*61046927SAndroid Build Coastguard Worker 
1636*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_C_LZ, 4, &opcode,
1637*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1638*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1639*61046927SAndroid Build Coastguard Worker                              srcreg);
1640*61046927SAndroid Build Coastguard Worker          }
1641*61046927SAndroid Build Coastguard Worker          break;
1642*61046927SAndroid Build Coastguard Worker 
1643*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE_L:
1644*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1645*61046927SAndroid Build Coastguard Worker             struct ureg_dst r0 = ureg_DECL_temporary(ureg);
1646*61046927SAndroid Build Coastguard Worker 
1647*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1648*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1649*61046927SAndroid Build Coastguard Worker 
1650*61046927SAndroid Build Coastguard Worker             /* Insert LOD into .w component.
1651*61046927SAndroid Build Coastguard Worker              */
1652*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1653*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_XYZ),
1654*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1655*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1656*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_W),
1657*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[3], OF_FLOAT));
1658*61046927SAndroid Build Coastguard Worker 
1659*61046927SAndroid Build Coastguard Worker             ureg_TXL(ureg,
1660*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1661*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1662*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1663*61046927SAndroid Build Coastguard Worker                      ureg_src(r0),
1664*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1665*61046927SAndroid Build Coastguard Worker 
1666*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, r0);
1667*61046927SAndroid Build Coastguard Worker          }
1668*61046927SAndroid Build Coastguard Worker          else {
1669*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[4];
1670*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1671*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1672*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1673*61046927SAndroid Build Coastguard Worker             srcreg[3] = translate_src_operand(&sx, &opcode.src[3], OF_FLOAT);
1674*61046927SAndroid Build Coastguard Worker 
1675*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_L, 4, &opcode,
1676*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1677*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1678*61046927SAndroid Build Coastguard Worker                              srcreg);
1679*61046927SAndroid Build Coastguard Worker          }
1680*61046927SAndroid Build Coastguard Worker          break;
1681*61046927SAndroid Build Coastguard Worker 
1682*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE_D:
1683*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1684*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1685*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1686*61046927SAndroid Build Coastguard Worker 
1687*61046927SAndroid Build Coastguard Worker             ureg_TXD(ureg,
1688*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1689*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1690*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1691*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT),
1692*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[3], OF_FLOAT),
1693*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[4], OF_FLOAT),
1694*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1695*61046927SAndroid Build Coastguard Worker          }
1696*61046927SAndroid Build Coastguard Worker          else {
1697*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[5];
1698*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1699*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1700*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1701*61046927SAndroid Build Coastguard Worker             srcreg[3] = translate_src_operand(&sx, &opcode.src[3], OF_FLOAT);
1702*61046927SAndroid Build Coastguard Worker             srcreg[4] = translate_src_operand(&sx, &opcode.src[4], OF_FLOAT);
1703*61046927SAndroid Build Coastguard Worker 
1704*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_D, 5, &opcode,
1705*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1706*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1707*61046927SAndroid Build Coastguard Worker                              srcreg);
1708*61046927SAndroid Build Coastguard Worker          }
1709*61046927SAndroid Build Coastguard Worker          break;
1710*61046927SAndroid Build Coastguard Worker 
1711*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SAMPLE_B:
1712*61046927SAndroid Build Coastguard Worker          if (st_debug & ST_DEBUG_OLD_TEX_OPS) {
1713*61046927SAndroid Build Coastguard Worker             struct ureg_dst r0 = ureg_DECL_temporary(ureg);
1714*61046927SAndroid Build Coastguard Worker 
1715*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index_dim == 1);
1716*61046927SAndroid Build Coastguard Worker             assert(opcode.src[1].base.index[0].imm < SHADER_MAX_RESOURCES);
1717*61046927SAndroid Build Coastguard Worker 
1718*61046927SAndroid Build Coastguard Worker             /* Insert LOD bias into .w component.
1719*61046927SAndroid Build Coastguard Worker              */
1720*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1721*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_XYZ),
1722*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1723*61046927SAndroid Build Coastguard Worker             ureg_MOV(ureg,
1724*61046927SAndroid Build Coastguard Worker                      ureg_writemask(r0, TGSI_WRITEMASK_W),
1725*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[3], OF_FLOAT));
1726*61046927SAndroid Build Coastguard Worker 
1727*61046927SAndroid Build Coastguard Worker             ureg_TXB(ureg,
1728*61046927SAndroid Build Coastguard Worker                      translate_dst_operand(&sx, &opcode.dst[0],
1729*61046927SAndroid Build Coastguard Worker                                            opcode.saturate),
1730*61046927SAndroid Build Coastguard Worker                      sx.resources[opcode.src[1].base.index[0].imm].target,
1731*61046927SAndroid Build Coastguard Worker                      ureg_src(r0),
1732*61046927SAndroid Build Coastguard Worker                      translate_src_operand(&sx, &opcode.src[2], OF_FLOAT));
1733*61046927SAndroid Build Coastguard Worker 
1734*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, r0);
1735*61046927SAndroid Build Coastguard Worker          }
1736*61046927SAndroid Build Coastguard Worker          else {
1737*61046927SAndroid Build Coastguard Worker             struct ureg_src srcreg[4];
1738*61046927SAndroid Build Coastguard Worker             srcreg[0] = translate_src_operand(&sx, &opcode.src[0], OF_FLOAT);
1739*61046927SAndroid Build Coastguard Worker             srcreg[1] = translate_src_operand(&sx, &opcode.src[1], OF_UINT);
1740*61046927SAndroid Build Coastguard Worker             srcreg[2] = translate_src_operand(&sx, &opcode.src[2], OF_UINT);
1741*61046927SAndroid Build Coastguard Worker             srcreg[3] = translate_src_operand(&sx, &opcode.src[3], OF_FLOAT);
1742*61046927SAndroid Build Coastguard Worker 
1743*61046927SAndroid Build Coastguard Worker             sample_ureg_emit(ureg, TGSI_OPCODE_SAMPLE_B, 4, &opcode,
1744*61046927SAndroid Build Coastguard Worker                              translate_dst_operand(&sx, &opcode.dst[0],
1745*61046927SAndroid Build Coastguard Worker                                                    opcode.saturate),
1746*61046927SAndroid Build Coastguard Worker                              srcreg);
1747*61046927SAndroid Build Coastguard Worker          }
1748*61046927SAndroid Build Coastguard Worker          break;
1749*61046927SAndroid Build Coastguard Worker 
1750*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_SINCOS: {
1751*61046927SAndroid Build Coastguard Worker          struct ureg_dst src0 = ureg_DECL_temporary(ureg);
1752*61046927SAndroid Build Coastguard Worker          ureg_MOV(ureg, src0, translate_src_operand(&sx, &opcode.src[0], OF_FLOAT));
1753*61046927SAndroid Build Coastguard Worker          if (opcode.dst[0].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1754*61046927SAndroid Build Coastguard Worker             struct ureg_dst dst = translate_dst_operand(&sx, &opcode.dst[0],
1755*61046927SAndroid Build Coastguard Worker                                                         opcode.saturate);
1756*61046927SAndroid Build Coastguard Worker             struct ureg_src src = ureg_src(src0);
1757*61046927SAndroid Build Coastguard Worker             ureg_SIN(ureg, ureg_writemask(dst, TGSI_WRITEMASK_X),
1758*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_X));
1759*61046927SAndroid Build Coastguard Worker             ureg_SIN(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Y),
1760*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_Y));
1761*61046927SAndroid Build Coastguard Worker             ureg_SIN(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Z),
1762*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_Z));
1763*61046927SAndroid Build Coastguard Worker             ureg_SIN(ureg, ureg_writemask(dst, TGSI_WRITEMASK_W),
1764*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_W));
1765*61046927SAndroid Build Coastguard Worker          }
1766*61046927SAndroid Build Coastguard Worker          if (opcode.dst[1].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1767*61046927SAndroid Build Coastguard Worker             struct ureg_dst dst = translate_dst_operand(&sx, &opcode.dst[1],
1768*61046927SAndroid Build Coastguard Worker                                                         opcode.saturate);
1769*61046927SAndroid Build Coastguard Worker             struct ureg_src src = ureg_src(src0);
1770*61046927SAndroid Build Coastguard Worker             ureg_COS(ureg, ureg_writemask(dst, TGSI_WRITEMASK_X),
1771*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_X));
1772*61046927SAndroid Build Coastguard Worker             ureg_COS(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Y),
1773*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_Y));
1774*61046927SAndroid Build Coastguard Worker             ureg_COS(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Z),
1775*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_Z));
1776*61046927SAndroid Build Coastguard Worker             ureg_COS(ureg, ureg_writemask(dst, TGSI_WRITEMASK_W),
1777*61046927SAndroid Build Coastguard Worker                      ureg_scalar(src, TGSI_SWIZZLE_W));
1778*61046927SAndroid Build Coastguard Worker          }
1779*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, src0);
1780*61046927SAndroid Build Coastguard Worker       }
1781*61046927SAndroid Build Coastguard Worker          break;
1782*61046927SAndroid Build Coastguard Worker 
1783*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_UDIV: {
1784*61046927SAndroid Build Coastguard Worker          struct ureg_dst src0 = ureg_DECL_temporary(ureg);
1785*61046927SAndroid Build Coastguard Worker          struct ureg_dst src1 = ureg_DECL_temporary(ureg);
1786*61046927SAndroid Build Coastguard Worker          ureg_MOV(ureg, src0, translate_src_operand(&sx, &opcode.src[0], OF_UINT));
1787*61046927SAndroid Build Coastguard Worker          ureg_MOV(ureg, src1, translate_src_operand(&sx, &opcode.src[1], OF_UINT));
1788*61046927SAndroid Build Coastguard Worker          if (opcode.dst[0].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1789*61046927SAndroid Build Coastguard Worker             ureg_UDIV(ureg,
1790*61046927SAndroid Build Coastguard Worker                       translate_dst_operand(&sx, &opcode.dst[0],
1791*61046927SAndroid Build Coastguard Worker                                             opcode.saturate),
1792*61046927SAndroid Build Coastguard Worker                       ureg_src(src0), ureg_src(src1));
1793*61046927SAndroid Build Coastguard Worker          }
1794*61046927SAndroid Build Coastguard Worker          if (opcode.dst[1].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1795*61046927SAndroid Build Coastguard Worker             ureg_UMOD(ureg,
1796*61046927SAndroid Build Coastguard Worker                       translate_dst_operand(&sx, &opcode.dst[1],
1797*61046927SAndroid Build Coastguard Worker                                             opcode.saturate),
1798*61046927SAndroid Build Coastguard Worker                       ureg_src(src0), ureg_src(src1));
1799*61046927SAndroid Build Coastguard Worker          }
1800*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, src0);
1801*61046927SAndroid Build Coastguard Worker          ureg_release_temporary(ureg, src1);
1802*61046927SAndroid Build Coastguard Worker       }
1803*61046927SAndroid Build Coastguard Worker          break;
1804*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_UMUL: {
1805*61046927SAndroid Build Coastguard Worker          if (opcode.dst[0].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1806*61046927SAndroid Build Coastguard Worker             ureg_UMUL_HI(ureg,
1807*61046927SAndroid Build Coastguard Worker                          translate_dst_operand(&sx, &opcode.dst[0],
1808*61046927SAndroid Build Coastguard Worker                                                opcode.saturate),
1809*61046927SAndroid Build Coastguard Worker                          translate_src_operand(&sx, &opcode.src[0], OF_UINT),
1810*61046927SAndroid Build Coastguard Worker                          translate_src_operand(&sx, &opcode.src[1], OF_UINT));
1811*61046927SAndroid Build Coastguard Worker          }
1812*61046927SAndroid Build Coastguard Worker          if (opcode.dst[1].base.type != D3D10_SB_OPERAND_TYPE_NULL) {
1813*61046927SAndroid Build Coastguard Worker             ureg_UMUL(ureg,
1814*61046927SAndroid Build Coastguard Worker                       translate_dst_operand(&sx, &opcode.dst[1],
1815*61046927SAndroid Build Coastguard Worker                                             opcode.saturate),
1816*61046927SAndroid Build Coastguard Worker                       translate_src_operand(&sx, &opcode.src[0], OF_UINT),
1817*61046927SAndroid Build Coastguard Worker                       translate_src_operand(&sx, &opcode.src[1], OF_UINT));
1818*61046927SAndroid Build Coastguard Worker          }
1819*61046927SAndroid Build Coastguard Worker       }
1820*61046927SAndroid Build Coastguard Worker          break;
1821*61046927SAndroid Build Coastguard Worker 
1822*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_RESOURCE:
1823*61046927SAndroid Build Coastguard Worker       {
1824*61046927SAndroid Build Coastguard Worker          unsigned target;
1825*61046927SAndroid Build Coastguard Worker          unsigned res_index = opcode.dst[0].base.index[0].imm;
1826*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index_dim == 1);
1827*61046927SAndroid Build Coastguard Worker          assert(res_index < SHADER_MAX_RESOURCES);
1828*61046927SAndroid Build Coastguard Worker 
1829*61046927SAndroid Build Coastguard Worker          target = translate_resource_dimension(opcode.specific.dcl_resource_dimension);
1830*61046927SAndroid Build Coastguard Worker          sx.resources[res_index].target = target;
1831*61046927SAndroid Build Coastguard Worker          if (!(st_debug & ST_DEBUG_OLD_TEX_OPS)) {
1832*61046927SAndroid Build Coastguard Worker             sx.sv[res_index] =
1833*61046927SAndroid Build Coastguard Worker                ureg_DECL_sampler_view(ureg, res_index, target,
1834*61046927SAndroid Build Coastguard Worker                                       trans_dcl_ret_type(opcode.dcl_resource_ret_type[0]),
1835*61046927SAndroid Build Coastguard Worker                                       trans_dcl_ret_type(opcode.dcl_resource_ret_type[1]),
1836*61046927SAndroid Build Coastguard Worker                                       trans_dcl_ret_type(opcode.dcl_resource_ret_type[2]),
1837*61046927SAndroid Build Coastguard Worker                                       trans_dcl_ret_type(opcode.dcl_resource_ret_type[3]));
1838*61046927SAndroid Build Coastguard Worker          }
1839*61046927SAndroid Build Coastguard Worker          break;
1840*61046927SAndroid Build Coastguard Worker       }
1841*61046927SAndroid Build Coastguard Worker 
1842*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_CONSTANT_BUFFER: {
1843*61046927SAndroid Build Coastguard Worker          unsigned num_constants = opcode.src[0].base.index[1].imm;
1844*61046927SAndroid Build Coastguard Worker 
1845*61046927SAndroid Build Coastguard Worker          assert(opcode.src[0].base.index[0].imm < PIPE_MAX_CONSTANT_BUFFERS);
1846*61046927SAndroid Build Coastguard Worker 
1847*61046927SAndroid Build Coastguard Worker          if (num_constants == 0) {
1848*61046927SAndroid Build Coastguard Worker             num_constants = SHADER_MAX_CONSTS;
1849*61046927SAndroid Build Coastguard Worker          } else {
1850*61046927SAndroid Build Coastguard Worker             assert(num_constants <= SHADER_MAX_CONSTS);
1851*61046927SAndroid Build Coastguard Worker          }
1852*61046927SAndroid Build Coastguard Worker 
1853*61046927SAndroid Build Coastguard Worker          ureg_DECL_constant2D(ureg,
1854*61046927SAndroid Build Coastguard Worker                               0,
1855*61046927SAndroid Build Coastguard Worker                               num_constants - 1,
1856*61046927SAndroid Build Coastguard Worker                               opcode.src[0].base.index[0].imm);
1857*61046927SAndroid Build Coastguard Worker          break;
1858*61046927SAndroid Build Coastguard Worker       }
1859*61046927SAndroid Build Coastguard Worker 
1860*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_SAMPLER:
1861*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index_dim == 1);
1862*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index[0].imm < SHADER_MAX_SAMPLERS);
1863*61046927SAndroid Build Coastguard Worker 
1864*61046927SAndroid Build Coastguard Worker          sx.samplers[opcode.dst[0].base.index[0].imm] =
1865*61046927SAndroid Build Coastguard Worker             ureg_DECL_sampler(ureg,
1866*61046927SAndroid Build Coastguard Worker                               opcode.dst[0].base.index[0].imm);
1867*61046927SAndroid Build Coastguard Worker          break;
1868*61046927SAndroid Build Coastguard Worker 
1869*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
1870*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_GEOMETRY_SHADER);
1871*61046927SAndroid Build Coastguard Worker 
1872*61046927SAndroid Build Coastguard Worker          switch (opcode.specific.dcl_gs_output_primitive_topology) {
1873*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_TOPOLOGY_POINTLIST:
1874*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1875*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_OUTPUT_PRIM,
1876*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_POINTS);
1877*61046927SAndroid Build Coastguard Worker             break;
1878*61046927SAndroid Build Coastguard Worker 
1879*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_TOPOLOGY_LINESTRIP:
1880*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1881*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_OUTPUT_PRIM,
1882*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_LINE_STRIP);
1883*61046927SAndroid Build Coastguard Worker             break;
1884*61046927SAndroid Build Coastguard Worker 
1885*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP:
1886*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1887*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_OUTPUT_PRIM,
1888*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_TRIANGLE_STRIP);
1889*61046927SAndroid Build Coastguard Worker             break;
1890*61046927SAndroid Build Coastguard Worker 
1891*61046927SAndroid Build Coastguard Worker          default:
1892*61046927SAndroid Build Coastguard Worker             assert(0);
1893*61046927SAndroid Build Coastguard Worker          }
1894*61046927SAndroid Build Coastguard Worker          break;
1895*61046927SAndroid Build Coastguard Worker 
1896*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_GS_INPUT_PRIMITIVE:
1897*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_GEOMETRY_SHADER);
1898*61046927SAndroid Build Coastguard Worker 
1899*61046927SAndroid Build Coastguard Worker          /* Figure out the second dimension of GS inputs.
1900*61046927SAndroid Build Coastguard Worker           */
1901*61046927SAndroid Build Coastguard Worker          switch (opcode.specific.dcl_gs_input_primitive) {
1902*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_POINT:
1903*61046927SAndroid Build Coastguard Worker             declare_vertices_in(&sx, 1);
1904*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1905*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_INPUT_PRIM,
1906*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_POINTS);
1907*61046927SAndroid Build Coastguard Worker             break;
1908*61046927SAndroid Build Coastguard Worker 
1909*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_LINE:
1910*61046927SAndroid Build Coastguard Worker             declare_vertices_in(&sx, 2);
1911*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1912*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_INPUT_PRIM,
1913*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_LINES);
1914*61046927SAndroid Build Coastguard Worker             break;
1915*61046927SAndroid Build Coastguard Worker 
1916*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_TRIANGLE:
1917*61046927SAndroid Build Coastguard Worker             declare_vertices_in(&sx, 3);
1918*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1919*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_INPUT_PRIM,
1920*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_TRIANGLES);
1921*61046927SAndroid Build Coastguard Worker             break;
1922*61046927SAndroid Build Coastguard Worker 
1923*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_LINE_ADJ:
1924*61046927SAndroid Build Coastguard Worker             declare_vertices_in(&sx, 4);
1925*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1926*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_INPUT_PRIM,
1927*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_LINES_ADJACENCY);
1928*61046927SAndroid Build Coastguard Worker             break;
1929*61046927SAndroid Build Coastguard Worker 
1930*61046927SAndroid Build Coastguard Worker          case D3D10_SB_PRIMITIVE_TRIANGLE_ADJ:
1931*61046927SAndroid Build Coastguard Worker             declare_vertices_in(&sx, 6);
1932*61046927SAndroid Build Coastguard Worker             ureg_property(sx.ureg,
1933*61046927SAndroid Build Coastguard Worker                           TGSI_PROPERTY_GS_INPUT_PRIM,
1934*61046927SAndroid Build Coastguard Worker                           MESA_PRIM_TRIANGLES_ADJACENCY);
1935*61046927SAndroid Build Coastguard Worker             break;
1936*61046927SAndroid Build Coastguard Worker 
1937*61046927SAndroid Build Coastguard Worker          default:
1938*61046927SAndroid Build Coastguard Worker             assert(0);
1939*61046927SAndroid Build Coastguard Worker          }
1940*61046927SAndroid Build Coastguard Worker          break;
1941*61046927SAndroid Build Coastguard Worker 
1942*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT:
1943*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_GEOMETRY_SHADER);
1944*61046927SAndroid Build Coastguard Worker 
1945*61046927SAndroid Build Coastguard Worker          ureg_property(sx.ureg,
1946*61046927SAndroid Build Coastguard Worker                        TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
1947*61046927SAndroid Build Coastguard Worker                        opcode.specific.dcl_max_output_vertex_count);
1948*61046927SAndroid Build Coastguard Worker          break;
1949*61046927SAndroid Build Coastguard Worker 
1950*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT:
1951*61046927SAndroid Build Coastguard Worker          if (parser.header.type == D3D10_SB_VERTEX_SHADER) {
1952*61046927SAndroid Build Coastguard Worker             dcl_vs_input(&sx, ureg, &opcode.dst[0]);
1953*61046927SAndroid Build Coastguard Worker          } else {
1954*61046927SAndroid Build Coastguard Worker             assert(parser.header.type == D3D10_SB_GEOMETRY_SHADER);
1955*61046927SAndroid Build Coastguard Worker             dcl_gs_input(&sx, ureg, &opcode.dst[0]);
1956*61046927SAndroid Build Coastguard Worker          }
1957*61046927SAndroid Build Coastguard Worker          break;
1958*61046927SAndroid Build Coastguard Worker 
1959*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT_SGV:
1960*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_VERTEX_SHADER);
1961*61046927SAndroid Build Coastguard Worker          dcl_sgv_input(&sx, ureg, &opcode.dst[0], opcode.dcl_siv_name);
1962*61046927SAndroid Build Coastguard Worker          break;
1963*61046927SAndroid Build Coastguard Worker 
1964*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT_SIV:
1965*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_GEOMETRY_SHADER);
1966*61046927SAndroid Build Coastguard Worker          dcl_siv_input(&sx, ureg, &opcode.dst[0], opcode.dcl_siv_name);
1967*61046927SAndroid Build Coastguard Worker          break;
1968*61046927SAndroid Build Coastguard Worker 
1969*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT_PS:
1970*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_PIXEL_SHADER);
1971*61046927SAndroid Build Coastguard Worker          dcl_ps_input(&sx, ureg, &opcode.dst[0],
1972*61046927SAndroid Build Coastguard Worker                       opcode.specific.dcl_in_ps_interp);
1973*61046927SAndroid Build Coastguard Worker          break;
1974*61046927SAndroid Build Coastguard Worker 
1975*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT_PS_SGV:
1976*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_PIXEL_SHADER);
1977*61046927SAndroid Build Coastguard Worker          dcl_ps_sgv_input(&sx, ureg, &opcode.dst[0],
1978*61046927SAndroid Build Coastguard Worker                           opcode.dcl_siv_name);
1979*61046927SAndroid Build Coastguard Worker          break;
1980*61046927SAndroid Build Coastguard Worker 
1981*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INPUT_PS_SIV:
1982*61046927SAndroid Build Coastguard Worker          assert(parser.header.type == D3D10_SB_PIXEL_SHADER);
1983*61046927SAndroid Build Coastguard Worker          dcl_ps_siv_input(&sx, ureg, &opcode.dst[0],
1984*61046927SAndroid Build Coastguard Worker                           opcode.dcl_siv_name,
1985*61046927SAndroid Build Coastguard Worker                           opcode.specific.dcl_in_ps_interp);
1986*61046927SAndroid Build Coastguard Worker          break;
1987*61046927SAndroid Build Coastguard Worker 
1988*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_OUTPUT:
1989*61046927SAndroid Build Coastguard Worker          if (parser.header.type == D3D10_SB_PIXEL_SHADER) {
1990*61046927SAndroid Build Coastguard Worker             /* Pixel shader outputs. */
1991*61046927SAndroid Build Coastguard Worker             if (opcode.dst[0].base.type == D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH) {
1992*61046927SAndroid Build Coastguard Worker                /* Depth output. */
1993*61046927SAndroid Build Coastguard Worker                assert(opcode.dst[0].base.index_dim == 0);
1994*61046927SAndroid Build Coastguard Worker 
1995*61046927SAndroid Build Coastguard Worker                sx.output_depth = ureg_DECL_output_masked(ureg, TGSI_SEMANTIC_POSITION, 0, TGSI_WRITEMASK_Z, 0, 1);
1996*61046927SAndroid Build Coastguard Worker                sx.output_depth = ureg_writemask(sx.output_depth, TGSI_WRITEMASK_Z);
1997*61046927SAndroid Build Coastguard Worker             } else {
1998*61046927SAndroid Build Coastguard Worker                /* Color outputs. */
1999*61046927SAndroid Build Coastguard Worker                assert(opcode.dst[0].base.index_dim == 1);
2000*61046927SAndroid Build Coastguard Worker                assert(opcode.dst[0].base.index[0].imm < SHADER_MAX_OUTPUTS);
2001*61046927SAndroid Build Coastguard Worker 
2002*61046927SAndroid Build Coastguard Worker                dcl_base_output(&sx, ureg,
2003*61046927SAndroid Build Coastguard Worker                                ureg_DECL_output(ureg,
2004*61046927SAndroid Build Coastguard Worker                                                 TGSI_SEMANTIC_COLOR,
2005*61046927SAndroid Build Coastguard Worker                                                 opcode.dst[0].base.index[0].imm),
2006*61046927SAndroid Build Coastguard Worker                                &opcode.dst[0]);
2007*61046927SAndroid Build Coastguard Worker             }
2008*61046927SAndroid Build Coastguard Worker          } else {
2009*61046927SAndroid Build Coastguard Worker             assert(opcode.dst[0].base.index_dim == 1);
2010*61046927SAndroid Build Coastguard Worker             assert(opcode.dst[0].base.index[0].imm < SHADER_MAX_OUTPUTS);
2011*61046927SAndroid Build Coastguard Worker 
2012*61046927SAndroid Build Coastguard Worker             if (output_mapping) {
2013*61046927SAndroid Build Coastguard Worker                unsigned nr_outputs = ureg_get_nr_outputs(ureg);
2014*61046927SAndroid Build Coastguard Worker                output_mapping[nr_outputs]
2015*61046927SAndroid Build Coastguard Worker                   = opcode.dst[0].base.index[0].imm;
2016*61046927SAndroid Build Coastguard Worker             }
2017*61046927SAndroid Build Coastguard Worker             dcl_base_output(&sx, ureg,
2018*61046927SAndroid Build Coastguard Worker                             ureg_DECL_output(ureg,
2019*61046927SAndroid Build Coastguard Worker                                              TGSI_SEMANTIC_GENERIC,
2020*61046927SAndroid Build Coastguard Worker                                              opcode.dst[0].base.index[0].imm),
2021*61046927SAndroid Build Coastguard Worker                             &opcode.dst[0]);
2022*61046927SAndroid Build Coastguard Worker          }
2023*61046927SAndroid Build Coastguard Worker          break;
2024*61046927SAndroid Build Coastguard Worker 
2025*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_OUTPUT_SIV:
2026*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index_dim == 1);
2027*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index[0].imm < SHADER_MAX_OUTPUTS);
2028*61046927SAndroid Build Coastguard Worker 
2029*61046927SAndroid Build Coastguard Worker          if (output_mapping) {
2030*61046927SAndroid Build Coastguard Worker             unsigned nr_outputs = ureg_get_nr_outputs(ureg);
2031*61046927SAndroid Build Coastguard Worker             output_mapping[nr_outputs]
2032*61046927SAndroid Build Coastguard Worker                = opcode.dst[0].base.index[0].imm;
2033*61046927SAndroid Build Coastguard Worker          }
2034*61046927SAndroid Build Coastguard Worker          if (opcode.dcl_siv_name == D3D10_SB_NAME_CLIP_DISTANCE ||
2035*61046927SAndroid Build Coastguard Worker              opcode.dcl_siv_name == D3D10_SB_NAME_CULL_DISTANCE) {
2036*61046927SAndroid Build Coastguard Worker             /*
2037*61046927SAndroid Build Coastguard Worker              * FIXME: this is quite broken. gallium no longer has separate
2038*61046927SAndroid Build Coastguard Worker              * clip/cull dists, using (max 2) combined clipdist/culldist regs
2039*61046927SAndroid Build Coastguard Worker              * instead. Unlike d3d10 though, which is clip and which cull is
2040*61046927SAndroid Build Coastguard Worker              * simply determined by by number of clip/cull dists (that is,
2041*61046927SAndroid Build Coastguard Worker              * all clip dists must come first).
2042*61046927SAndroid Build Coastguard Worker              */
2043*61046927SAndroid Build Coastguard Worker             unsigned numcliporcull = sx.num_clip_distances_declared +
2044*61046927SAndroid Build Coastguard Worker                                      sx.num_cull_distances_declared;
2045*61046927SAndroid Build Coastguard Worker             sx.clip_distance_mapping[numcliporcull].d3d =
2046*61046927SAndroid Build Coastguard Worker                opcode.dst[0].base.index[0].imm;
2047*61046927SAndroid Build Coastguard Worker             sx.clip_distance_mapping[numcliporcull].tgsi = numcliporcull;
2048*61046927SAndroid Build Coastguard Worker             if (opcode.dcl_siv_name == D3D10_SB_NAME_CLIP_DISTANCE) {
2049*61046927SAndroid Build Coastguard Worker                ++sx.num_clip_distances_declared;
2050*61046927SAndroid Build Coastguard Worker                /* re-emit should be safe... */
2051*61046927SAndroid Build Coastguard Worker                ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED,
2052*61046927SAndroid Build Coastguard Worker                              sx.num_clip_distances_declared);
2053*61046927SAndroid Build Coastguard Worker             } else {
2054*61046927SAndroid Build Coastguard Worker                ++sx.num_cull_distances_declared;
2055*61046927SAndroid Build Coastguard Worker                ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED,
2056*61046927SAndroid Build Coastguard Worker                              sx.num_cull_distances_declared);
2057*61046927SAndroid Build Coastguard Worker             }
2058*61046927SAndroid Build Coastguard Worker          } else if (0 && opcode.dcl_siv_name == D3D10_SB_NAME_CULL_DISTANCE) {
2059*61046927SAndroid Build Coastguard Worker             sx.cull_distance_mapping[sx.num_cull_distances_declared].d3d =
2060*61046927SAndroid Build Coastguard Worker                opcode.dst[0].base.index[0].imm;
2061*61046927SAndroid Build Coastguard Worker             sx.cull_distance_mapping[sx.num_cull_distances_declared].tgsi =
2062*61046927SAndroid Build Coastguard Worker                sx.num_cull_distances_declared;
2063*61046927SAndroid Build Coastguard Worker             ++sx.num_cull_distances_declared;
2064*61046927SAndroid Build Coastguard Worker             ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED,
2065*61046927SAndroid Build Coastguard Worker                           sx.num_cull_distances_declared);
2066*61046927SAndroid Build Coastguard Worker          }
2067*61046927SAndroid Build Coastguard Worker 
2068*61046927SAndroid Build Coastguard Worker          dcl_base_output(&sx, ureg,
2069*61046927SAndroid Build Coastguard Worker                          ureg_DECL_output_masked(
2070*61046927SAndroid Build Coastguard Worker                             ureg,
2071*61046927SAndroid Build Coastguard Worker                             translate_system_name(opcode.dcl_siv_name),
2072*61046927SAndroid Build Coastguard Worker                             translate_semantic_index(&sx, opcode.dcl_siv_name,
2073*61046927SAndroid Build Coastguard Worker                                                      &opcode.dst[0]),
2074*61046927SAndroid Build Coastguard Worker                             opcode.dst[0].mask >> D3D10_SB_OPERAND_4_COMPONENT_MASK_SHIFT,
2075*61046927SAndroid Build Coastguard Worker                             0, 1),
2076*61046927SAndroid Build Coastguard Worker                          &opcode.dst[0]);
2077*61046927SAndroid Build Coastguard Worker          break;
2078*61046927SAndroid Build Coastguard Worker 
2079*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_OUTPUT_SGV:
2080*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index_dim == 1);
2081*61046927SAndroid Build Coastguard Worker          assert(opcode.dst[0].base.index[0].imm < SHADER_MAX_OUTPUTS);
2082*61046927SAndroid Build Coastguard Worker 
2083*61046927SAndroid Build Coastguard Worker          if (output_mapping) {
2084*61046927SAndroid Build Coastguard Worker             unsigned nr_outputs = ureg_get_nr_outputs(ureg);
2085*61046927SAndroid Build Coastguard Worker             output_mapping[nr_outputs]
2086*61046927SAndroid Build Coastguard Worker                = opcode.dst[0].base.index[0].imm;
2087*61046927SAndroid Build Coastguard Worker          }
2088*61046927SAndroid Build Coastguard Worker          dcl_base_output(&sx, ureg,
2089*61046927SAndroid Build Coastguard Worker                          ureg_DECL_output(ureg,
2090*61046927SAndroid Build Coastguard Worker                                           translate_system_name(opcode.dcl_siv_name),
2091*61046927SAndroid Build Coastguard Worker                                           0),
2092*61046927SAndroid Build Coastguard Worker                          &opcode.dst[0]);
2093*61046927SAndroid Build Coastguard Worker          break;
2094*61046927SAndroid Build Coastguard Worker 
2095*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_TEMPS:
2096*61046927SAndroid Build Coastguard Worker          {
2097*61046927SAndroid Build Coastguard Worker             uint i;
2098*61046927SAndroid Build Coastguard Worker 
2099*61046927SAndroid Build Coastguard Worker             assert(opcode.specific.dcl_num_temps + sx.declared_temps <=
2100*61046927SAndroid Build Coastguard Worker                    SHADER_MAX_TEMPS);
2101*61046927SAndroid Build Coastguard Worker 
2102*61046927SAndroid Build Coastguard Worker             sx.temp_offset = sx.declared_temps;
2103*61046927SAndroid Build Coastguard Worker 
2104*61046927SAndroid Build Coastguard Worker             for (i = 0; i < opcode.specific.dcl_num_temps; i++) {
2105*61046927SAndroid Build Coastguard Worker                sx.temps[sx.declared_temps + i] = ureg_DECL_temporary(ureg);
2106*61046927SAndroid Build Coastguard Worker             }
2107*61046927SAndroid Build Coastguard Worker             sx.declared_temps += opcode.specific.dcl_num_temps;
2108*61046927SAndroid Build Coastguard Worker          }
2109*61046927SAndroid Build Coastguard Worker          break;
2110*61046927SAndroid Build Coastguard Worker 
2111*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INDEXABLE_TEMP:
2112*61046927SAndroid Build Coastguard Worker          {
2113*61046927SAndroid Build Coastguard Worker             uint i;
2114*61046927SAndroid Build Coastguard Worker 
2115*61046927SAndroid Build Coastguard Worker             /* XXX: Add true indexable temps to gallium.
2116*61046927SAndroid Build Coastguard Worker              */
2117*61046927SAndroid Build Coastguard Worker 
2118*61046927SAndroid Build Coastguard Worker             assert(opcode.specific.dcl_indexable_temp.index <
2119*61046927SAndroid Build Coastguard Worker                    SHADER_MAX_INDEXABLE_TEMPS);
2120*61046927SAndroid Build Coastguard Worker             assert(opcode.specific.dcl_indexable_temp.count + sx.declared_temps <=
2121*61046927SAndroid Build Coastguard Worker                    SHADER_MAX_TEMPS);
2122*61046927SAndroid Build Coastguard Worker 
2123*61046927SAndroid Build Coastguard Worker             sx.indexable_temp_offsets[opcode.specific.dcl_indexable_temp.index] =
2124*61046927SAndroid Build Coastguard Worker                sx.declared_temps;
2125*61046927SAndroid Build Coastguard Worker 
2126*61046927SAndroid Build Coastguard Worker             for (i = 0; i < opcode.specific.dcl_indexable_temp.count; i++) {
2127*61046927SAndroid Build Coastguard Worker                sx.temps[sx.declared_temps + i] = ureg_DECL_temporary(ureg);
2128*61046927SAndroid Build Coastguard Worker             }
2129*61046927SAndroid Build Coastguard Worker             sx.declared_temps += opcode.specific.dcl_indexable_temp.count;
2130*61046927SAndroid Build Coastguard Worker          }
2131*61046927SAndroid Build Coastguard Worker          break;
2132*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_IF: {
2133*61046927SAndroid Build Coastguard Worker          unsigned label = 0;
2134*61046927SAndroid Build Coastguard Worker          if (opcode.specific.test_boolean == D3D10_SB_INSTRUCTION_TEST_ZERO) {
2135*61046927SAndroid Build Coastguard Worker             struct ureg_src src =
2136*61046927SAndroid Build Coastguard Worker                translate_src_operand(&sx, &opcode.src[0], OF_INT);
2137*61046927SAndroid Build Coastguard Worker             struct ureg_dst src_nz = ureg_DECL_temporary(ureg);
2138*61046927SAndroid Build Coastguard Worker             ureg_USEQ(ureg, src_nz, src, ureg_imm1u(ureg, 0));
2139*61046927SAndroid Build Coastguard Worker             ureg_UIF(ureg, ureg_src(src_nz), &label);
2140*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, src_nz);;
2141*61046927SAndroid Build Coastguard Worker          } else {
2142*61046927SAndroid Build Coastguard Worker             ureg_UIF(ureg, translate_src_operand(&sx, &opcode.src[0], OF_INT), &label);
2143*61046927SAndroid Build Coastguard Worker          }
2144*61046927SAndroid Build Coastguard Worker       }
2145*61046927SAndroid Build Coastguard Worker          break;
2146*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_RETC:
2147*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_CONTINUEC:
2148*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_CALLC:
2149*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DISCARD:
2150*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_BREAKC:
2151*61046927SAndroid Build Coastguard Worker       {
2152*61046927SAndroid Build Coastguard Worker          unsigned label = 0;
2153*61046927SAndroid Build Coastguard Worker          assert(operand_is_scalar(&opcode.src[0]));
2154*61046927SAndroid Build Coastguard Worker          if (opcode.specific.test_boolean == D3D10_SB_INSTRUCTION_TEST_ZERO) {
2155*61046927SAndroid Build Coastguard Worker             struct ureg_src src =
2156*61046927SAndroid Build Coastguard Worker                translate_src_operand(&sx, &opcode.src[0], OF_INT);
2157*61046927SAndroid Build Coastguard Worker             struct ureg_dst src_nz = ureg_DECL_temporary(ureg);
2158*61046927SAndroid Build Coastguard Worker             ureg_USEQ(ureg, src_nz, src, ureg_imm1u(ureg, 0));
2159*61046927SAndroid Build Coastguard Worker             ureg_UIF(ureg, ureg_src(src_nz), &label);
2160*61046927SAndroid Build Coastguard Worker             ureg_release_temporary(ureg, src_nz);
2161*61046927SAndroid Build Coastguard Worker          }
2162*61046927SAndroid Build Coastguard Worker          else {
2163*61046927SAndroid Build Coastguard Worker             ureg_UIF(ureg, translate_src_operand(&sx, &opcode.src[0], OF_INT), &label);
2164*61046927SAndroid Build Coastguard Worker          }
2165*61046927SAndroid Build Coastguard Worker          switch (opcode.type) {
2166*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPCODE_RETC:
2167*61046927SAndroid Build Coastguard Worker             ureg_RET(ureg);
2168*61046927SAndroid Build Coastguard Worker             break;
2169*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPCODE_CONTINUEC:
2170*61046927SAndroid Build Coastguard Worker             ureg_CONT(ureg);
2171*61046927SAndroid Build Coastguard Worker             break;
2172*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPCODE_CALLC: {
2173*61046927SAndroid Build Coastguard Worker             unsigned label = opcode.src[1].base.index[0].imm;
2174*61046927SAndroid Build Coastguard Worker             unsigned tgsi_token_label = 0;
2175*61046927SAndroid Build Coastguard Worker             ureg_CAL(ureg, &tgsi_token_label);
2176*61046927SAndroid Build Coastguard Worker             Shader_add_call(&sx, label, tgsi_token_label);
2177*61046927SAndroid Build Coastguard Worker          }
2178*61046927SAndroid Build Coastguard Worker             break;
2179*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPCODE_DISCARD:
2180*61046927SAndroid Build Coastguard Worker             ureg_KILL(ureg);
2181*61046927SAndroid Build Coastguard Worker             break;
2182*61046927SAndroid Build Coastguard Worker          case D3D10_SB_OPCODE_BREAKC:
2183*61046927SAndroid Build Coastguard Worker             ureg_BRK(ureg);
2184*61046927SAndroid Build Coastguard Worker             break;
2185*61046927SAndroid Build Coastguard Worker          default:
2186*61046927SAndroid Build Coastguard Worker             assert(0);
2187*61046927SAndroid Build Coastguard Worker             break;
2188*61046927SAndroid Build Coastguard Worker          }
2189*61046927SAndroid Build Coastguard Worker          ureg_ENDIF(ureg);
2190*61046927SAndroid Build Coastguard Worker       }
2191*61046927SAndroid Build Coastguard Worker          break;
2192*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_LABEL: {
2193*61046927SAndroid Build Coastguard Worker          unsigned label = opcode.src[0].base.index[0].imm;
2194*61046927SAndroid Build Coastguard Worker          unsigned tgsi_inst_no = 0;
2195*61046927SAndroid Build Coastguard Worker          if (inside_sub) {
2196*61046927SAndroid Build Coastguard Worker             ureg_ENDSUB(ureg);
2197*61046927SAndroid Build Coastguard Worker          }
2198*61046927SAndroid Build Coastguard Worker          tgsi_inst_no = ureg_get_instruction_number(ureg);
2199*61046927SAndroid Build Coastguard Worker          ureg_BGNSUB(ureg);
2200*61046927SAndroid Build Coastguard Worker          inside_sub = true;
2201*61046927SAndroid Build Coastguard Worker          Shader_add_label(&sx, label, tgsi_inst_no);
2202*61046927SAndroid Build Coastguard Worker       }
2203*61046927SAndroid Build Coastguard Worker          break;
2204*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_CALL: {
2205*61046927SAndroid Build Coastguard Worker          unsigned label = opcode.src[0].base.index[0].imm;
2206*61046927SAndroid Build Coastguard Worker          unsigned tgsi_token_label = 0;
2207*61046927SAndroid Build Coastguard Worker          ureg_CAL(ureg, &tgsi_token_label);
2208*61046927SAndroid Build Coastguard Worker          Shader_add_call(&sx, label, tgsi_token_label);
2209*61046927SAndroid Build Coastguard Worker       }
2210*61046927SAndroid Build Coastguard Worker          break;
2211*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_EMIT:
2212*61046927SAndroid Build Coastguard Worker          ureg_EMIT(ureg, ureg_imm1u(ureg, 0));
2213*61046927SAndroid Build Coastguard Worker          break;
2214*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_CUT:
2215*61046927SAndroid Build Coastguard Worker          ureg_ENDPRIM(ureg, ureg_imm1u(ureg, 0));
2216*61046927SAndroid Build Coastguard Worker          break;
2217*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_EMITTHENCUT:
2218*61046927SAndroid Build Coastguard Worker          ureg_EMIT(ureg, ureg_imm1u(ureg, 0));
2219*61046927SAndroid Build Coastguard Worker          ureg_ENDPRIM(ureg, ureg_imm1u(ureg, 0));
2220*61046927SAndroid Build Coastguard Worker          break;
2221*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_INDEX_RANGE:
2222*61046927SAndroid Build Coastguard Worker       case D3D10_SB_OPCODE_DCL_GLOBAL_FLAGS:
2223*61046927SAndroid Build Coastguard Worker          /* Ignore */
2224*61046927SAndroid Build Coastguard Worker          break;
2225*61046927SAndroid Build Coastguard Worker       default:
2226*61046927SAndroid Build Coastguard Worker          {
2227*61046927SAndroid Build Coastguard Worker             uint i;
2228*61046927SAndroid Build Coastguard Worker             struct ureg_dst dst[SHADER_MAX_DST_OPERANDS];
2229*61046927SAndroid Build Coastguard Worker             struct ureg_src src[SHADER_MAX_SRC_OPERANDS];
2230*61046927SAndroid Build Coastguard Worker 
2231*61046927SAndroid Build Coastguard Worker             assert(ox->tgsi_opcode != TGSI_EXPAND);
2232*61046927SAndroid Build Coastguard Worker 
2233*61046927SAndroid Build Coastguard Worker             if (ox->tgsi_opcode == TGSI_LOG_UNSUPPORTED) {
2234*61046927SAndroid Build Coastguard Worker                if (!shader_dumped) {
2235*61046927SAndroid Build Coastguard Worker                   dx10_shader_dump_tokens(code);
2236*61046927SAndroid Build Coastguard Worker                   shader_dumped = true;
2237*61046927SAndroid Build Coastguard Worker                }
2238*61046927SAndroid Build Coastguard Worker                debug_printf("%s: unsupported opcode %i\n",
2239*61046927SAndroid Build Coastguard Worker                             __func__, ox->type);
2240*61046927SAndroid Build Coastguard Worker                assert(ox->tgsi_opcode != TGSI_LOG_UNSUPPORTED);
2241*61046927SAndroid Build Coastguard Worker             }
2242*61046927SAndroid Build Coastguard Worker 
2243*61046927SAndroid Build Coastguard Worker             /* Destination operands. */
2244*61046927SAndroid Build Coastguard Worker             for (i = 0; i < opcode.num_dst; i++) {
2245*61046927SAndroid Build Coastguard Worker                dst[i] = translate_dst_operand(&sx, &opcode.dst[i],
2246*61046927SAndroid Build Coastguard Worker                                               opcode.saturate);
2247*61046927SAndroid Build Coastguard Worker             }
2248*61046927SAndroid Build Coastguard Worker 
2249*61046927SAndroid Build Coastguard Worker             /* Source operands. */
2250*61046927SAndroid Build Coastguard Worker             for (i = 0; i < opcode.num_src; i++) {
2251*61046927SAndroid Build Coastguard Worker                src[i] = translate_src_operand(&sx, &opcode.src[i], ox->format);
2252*61046927SAndroid Build Coastguard Worker             }
2253*61046927SAndroid Build Coastguard Worker 
2254*61046927SAndroid Build Coastguard Worker             /* Try to re-route output depth to Z channel. */
2255*61046927SAndroid Build Coastguard Worker             if (opcode.dst[0].base.type == D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH) {
2256*61046927SAndroid Build Coastguard Worker                LOG_UNSUPPORTED(opcode.type != D3D10_SB_OPCODE_MOV);
2257*61046927SAndroid Build Coastguard Worker                dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_Z);
2258*61046927SAndroid Build Coastguard Worker                src[0] = ureg_scalar(src[0], TGSI_SWIZZLE_X);
2259*61046927SAndroid Build Coastguard Worker             }
2260*61046927SAndroid Build Coastguard Worker 
2261*61046927SAndroid Build Coastguard Worker             ureg_insn(ureg,
2262*61046927SAndroid Build Coastguard Worker                       ox->tgsi_opcode,
2263*61046927SAndroid Build Coastguard Worker                       dst,
2264*61046927SAndroid Build Coastguard Worker                       opcode.num_dst,
2265*61046927SAndroid Build Coastguard Worker                       src,
2266*61046927SAndroid Build Coastguard Worker                       opcode.num_src, 0);
2267*61046927SAndroid Build Coastguard Worker          }
2268*61046927SAndroid Build Coastguard Worker       }
2269*61046927SAndroid Build Coastguard Worker 
2270*61046927SAndroid Build Coastguard Worker       Shader_opcode_free(&opcode);
2271*61046927SAndroid Build Coastguard Worker    }
2272*61046927SAndroid Build Coastguard Worker 
2273*61046927SAndroid Build Coastguard Worker    if (inside_sub) {
2274*61046927SAndroid Build Coastguard Worker       ureg_ENDSUB(ureg);
2275*61046927SAndroid Build Coastguard Worker    }
2276*61046927SAndroid Build Coastguard Worker 
2277*61046927SAndroid Build Coastguard Worker    ureg_END(ureg);
2278*61046927SAndroid Build Coastguard Worker 
2279*61046927SAndroid Build Coastguard Worker    for (i = 0; i < sx.num_calls; ++i) {
2280*61046927SAndroid Build Coastguard Worker       for (j = 0; j < sx.num_labels; ++j) {
2281*61046927SAndroid Build Coastguard Worker          if (sx.calls[i].d3d_label == sx.labels[j].d3d_label) {
2282*61046927SAndroid Build Coastguard Worker             ureg_fixup_label(sx.ureg,
2283*61046927SAndroid Build Coastguard Worker                              sx.calls[i].tgsi_label_token,
2284*61046927SAndroid Build Coastguard Worker                              sx.labels[j].tgsi_insn_no);
2285*61046927SAndroid Build Coastguard Worker             break;
2286*61046927SAndroid Build Coastguard Worker          }
2287*61046927SAndroid Build Coastguard Worker       }
2288*61046927SAndroid Build Coastguard Worker       ASSERT(j < sx.num_labels);
2289*61046927SAndroid Build Coastguard Worker    }
2290*61046927SAndroid Build Coastguard Worker    FREE(sx.labels);
2291*61046927SAndroid Build Coastguard Worker    FREE(sx.calls);
2292*61046927SAndroid Build Coastguard Worker 
2293*61046927SAndroid Build Coastguard Worker    tokens = ureg_get_tokens(ureg, &nr_tokens);
2294*61046927SAndroid Build Coastguard Worker    assert(tokens);
2295*61046927SAndroid Build Coastguard Worker    ureg_destroy(ureg);
2296*61046927SAndroid Build Coastguard Worker 
2297*61046927SAndroid Build Coastguard Worker    if (st_debug & ST_DEBUG_TGSI) {
2298*61046927SAndroid Build Coastguard Worker       tgsi_dump(tokens, 0);
2299*61046927SAndroid Build Coastguard Worker    }
2300*61046927SAndroid Build Coastguard Worker 
2301*61046927SAndroid Build Coastguard Worker    return tokens;
2302*61046927SAndroid Build Coastguard Worker }
2303