1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright 2007-2008 VMware, Inc.
4848b8605Smrg * All Rights Reserved.
5848b8605Smrg * Copyright 2009-2010 VMware, Inc.  All rights Reserved.
6848b8605Smrg *
7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
8848b8605Smrg * copy of this software and associated documentation files (the
9848b8605Smrg * "Software"), to deal in the Software without restriction, including
10848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish,
11848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to
12848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to
13848b8605Smrg * the following conditions:
14848b8605Smrg *
15848b8605Smrg * The above copyright notice and this permission notice (including the
16848b8605Smrg * next paragraph) shall be included in all copies or substantial portions
17848b8605Smrg * of the Software.
18848b8605Smrg *
19848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22848b8605Smrg * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
23848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26848b8605Smrg *
27848b8605Smrg **************************************************************************/
28848b8605Smrg
29848b8605Smrg#ifndef TGSI_EXEC_H
30848b8605Smrg#define TGSI_EXEC_H
31848b8605Smrg
32848b8605Smrg#include "pipe/p_compiler.h"
33848b8605Smrg#include "pipe/p_state.h"
34848b8605Smrg#include "pipe/p_shader_tokens.h"
35848b8605Smrg
36848b8605Smrg#if defined __cplusplus
37848b8605Smrgextern "C" {
38848b8605Smrg#endif
39848b8605Smrg
40848b8605Smrg#define TGSI_CHAN_X 0
41848b8605Smrg#define TGSI_CHAN_Y 1
42848b8605Smrg#define TGSI_CHAN_Z 2
43848b8605Smrg#define TGSI_CHAN_W 3
44848b8605Smrg
45848b8605Smrg#define TGSI_NUM_CHANNELS 4  /* R,G,B,A */
46848b8605Smrg#define TGSI_QUAD_SIZE    4  /* 4 pixel/quad */
47848b8605Smrg
48848b8605Smrg#define TGSI_FOR_EACH_CHANNEL( CHAN )\
49848b8605Smrg   for (CHAN = 0; CHAN < TGSI_NUM_CHANNELS; CHAN++)
50848b8605Smrg
51848b8605Smrg#define TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
52848b8605Smrg   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
53848b8605Smrg
54848b8605Smrg#define TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
55848b8605Smrg   if (TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
56848b8605Smrg
57848b8605Smrg#define TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
58848b8605Smrg   TGSI_FOR_EACH_CHANNEL( CHAN )\
59848b8605Smrg      TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
60848b8605Smrg
61b8e80941Smrg#define TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\
62b8e80941Smrg   ((INST)->Dst[1].Register.WriteMask & (1 << (CHAN)))
63b8e80941Smrg
64b8e80941Smrg#define TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN )\
65b8e80941Smrg   if (TGSI_IS_DST1_CHANNEL_ENABLED( INST, CHAN ))
66b8e80941Smrg
67b8e80941Smrg#define TGSI_FOR_EACH_DST1_ENABLED_CHANNEL( INST, CHAN )\
68b8e80941Smrg   TGSI_FOR_EACH_CHANNEL( CHAN )\
69b8e80941Smrg      TGSI_IF_IS_DST1_CHANNEL_ENABLED( INST, CHAN )
70848b8605Smrg
71848b8605Smrg/**
72848b8605Smrg  * Registers may be treated as float, signed int or unsigned int.
73848b8605Smrg  */
74848b8605Smrgunion tgsi_exec_channel
75848b8605Smrg{
76848b8605Smrg   float    f[TGSI_QUAD_SIZE];
77848b8605Smrg   int      i[TGSI_QUAD_SIZE];
78848b8605Smrg   unsigned u[TGSI_QUAD_SIZE];
79848b8605Smrg};
80848b8605Smrg
81848b8605Smrg/**
82848b8605Smrg  * A vector[RGBA] of channels[4 pixels]
83848b8605Smrg  */
84848b8605Smrgstruct tgsi_exec_vector
85848b8605Smrg{
86848b8605Smrg   union tgsi_exec_channel xyzw[TGSI_NUM_CHANNELS];
87848b8605Smrg};
88848b8605Smrg
89848b8605Smrg/**
90848b8605Smrg * For fragment programs, information for computing fragment input
91848b8605Smrg * values from plane equation of the triangle/line.
92848b8605Smrg */
93848b8605Smrgstruct tgsi_interp_coef
94848b8605Smrg{
95848b8605Smrg   float a0[TGSI_NUM_CHANNELS];	/* in an xyzw layout */
96848b8605Smrg   float dadx[TGSI_NUM_CHANNELS];
97848b8605Smrg   float dady[TGSI_NUM_CHANNELS];
98848b8605Smrg};
99848b8605Smrg
100b8e80941Smrgenum tgsi_sampler_control
101b8e80941Smrg{
102b8e80941Smrg   TGSI_SAMPLER_LOD_NONE,
103b8e80941Smrg   TGSI_SAMPLER_LOD_BIAS,
104b8e80941Smrg   TGSI_SAMPLER_LOD_EXPLICIT,
105b8e80941Smrg   TGSI_SAMPLER_LOD_ZERO,
106b8e80941Smrg   TGSI_SAMPLER_DERIVS_EXPLICIT,
107b8e80941Smrg   TGSI_SAMPLER_GATHER,
108b8e80941Smrg};
109b8e80941Smrg
110b8e80941Smrgstruct tgsi_image_params {
111b8e80941Smrg   unsigned unit;
112b8e80941Smrg   unsigned tgsi_tex_instr;
113b8e80941Smrg   enum pipe_format format;
114b8e80941Smrg   unsigned execmask;
115b8e80941Smrg};
116b8e80941Smrg
117b8e80941Smrgstruct tgsi_image {
118b8e80941Smrg   /* image interfaces */
119b8e80941Smrg   void (*load)(const struct tgsi_image *image,
120b8e80941Smrg                const struct tgsi_image_params *params,
121b8e80941Smrg                const int s[TGSI_QUAD_SIZE],
122b8e80941Smrg                const int t[TGSI_QUAD_SIZE],
123b8e80941Smrg                const int r[TGSI_QUAD_SIZE],
124b8e80941Smrg                const int sample[TGSI_QUAD_SIZE],
125b8e80941Smrg                float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
126b8e80941Smrg
127b8e80941Smrg   void (*store)(const struct tgsi_image *image,
128b8e80941Smrg                 const struct tgsi_image_params *params,
129b8e80941Smrg                 const int s[TGSI_QUAD_SIZE],
130b8e80941Smrg                 const int t[TGSI_QUAD_SIZE],
131b8e80941Smrg                 const int r[TGSI_QUAD_SIZE],
132b8e80941Smrg                 const int sample[TGSI_QUAD_SIZE],
133b8e80941Smrg                 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
134b8e80941Smrg
135b8e80941Smrg   void (*op)(const struct tgsi_image *image,
136b8e80941Smrg              const struct tgsi_image_params *params,
137b8e80941Smrg              enum tgsi_opcode opcode,
138b8e80941Smrg              const int s[TGSI_QUAD_SIZE],
139b8e80941Smrg              const int t[TGSI_QUAD_SIZE],
140b8e80941Smrg              const int r[TGSI_QUAD_SIZE],
141b8e80941Smrg              const int sample[TGSI_QUAD_SIZE],
142b8e80941Smrg              float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
143b8e80941Smrg              float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
144b8e80941Smrg
145b8e80941Smrg   void (*get_dims)(const struct tgsi_image *image,
146b8e80941Smrg                    const struct tgsi_image_params *params,
147b8e80941Smrg                    int dims[4]);
148b8e80941Smrg};
149b8e80941Smrg
150b8e80941Smrgstruct tgsi_buffer_params {
151b8e80941Smrg   unsigned unit;
152b8e80941Smrg   unsigned execmask;
153b8e80941Smrg   unsigned writemask;
154b8e80941Smrg};
155b8e80941Smrg
156b8e80941Smrgstruct tgsi_buffer {
157b8e80941Smrg   /* buffer interfaces */
158b8e80941Smrg   void (*load)(const struct tgsi_buffer *buffer,
159b8e80941Smrg                const struct tgsi_buffer_params *params,
160b8e80941Smrg                const int s[TGSI_QUAD_SIZE],
161b8e80941Smrg                float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
162b8e80941Smrg
163b8e80941Smrg   void (*store)(const struct tgsi_buffer *buffer,
164b8e80941Smrg                 const struct tgsi_buffer_params *params,
165b8e80941Smrg                 const int s[TGSI_QUAD_SIZE],
166b8e80941Smrg                 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
167b8e80941Smrg
168b8e80941Smrg   void (*op)(const struct tgsi_buffer *buffer,
169b8e80941Smrg              const struct tgsi_buffer_params *params,
170b8e80941Smrg              enum tgsi_opcode opcode,
171b8e80941Smrg              const int s[TGSI_QUAD_SIZE],
172b8e80941Smrg              float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
173b8e80941Smrg              float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
174b8e80941Smrg
175b8e80941Smrg   void (*get_dims)(const struct tgsi_buffer *buffer,
176b8e80941Smrg                    const struct tgsi_buffer_params *params,
177b8e80941Smrg                    int *dim);
178848b8605Smrg};
179848b8605Smrg
180848b8605Smrg/**
181848b8605Smrg * Information for sampling textures, which must be implemented
182848b8605Smrg * by code outside the TGSI executor.
183848b8605Smrg */
184848b8605Smrgstruct tgsi_sampler
185848b8605Smrg{
186848b8605Smrg   /** Get samples for four fragments in a quad */
187848b8605Smrg   /* this interface contains 5 sets of channels that vary
188848b8605Smrg    * depending on the sampler.
189848b8605Smrg    * s - the first texture coordinate for sampling.
190848b8605Smrg    * t - the second texture coordinate for sampling - unused for 1D,
191848b8605Smrg          layer for 1D arrays.
192848b8605Smrg    * r - the third coordinate for sampling for 3D, cube, cube arrays,
193848b8605Smrg    *     layer for 2D arrays. Compare value for 1D/2D shadows.
194848b8605Smrg    * c0 - Compare value for shadow cube and shadow 2d arrays,
195848b8605Smrg    *      layer for cube arrays.
196848b8605Smrg    * derivs - explicit derivatives.
197848b8605Smrg    * offset - texel offsets
198848b8605Smrg    * lod - lod value, except for shadow cube arrays (compare value there).
199848b8605Smrg    */
200848b8605Smrg   void (*get_samples)(struct tgsi_sampler *sampler,
201848b8605Smrg                       const unsigned sview_index,
202848b8605Smrg                       const unsigned sampler_index,
203848b8605Smrg                       const float s[TGSI_QUAD_SIZE],
204848b8605Smrg                       const float t[TGSI_QUAD_SIZE],
205848b8605Smrg                       const float r[TGSI_QUAD_SIZE],
206848b8605Smrg                       const float c0[TGSI_QUAD_SIZE],
207848b8605Smrg                       const float c1[TGSI_QUAD_SIZE],
208848b8605Smrg                       float derivs[3][2][TGSI_QUAD_SIZE],
209848b8605Smrg                       const int8_t offset[3],
210848b8605Smrg                       enum tgsi_sampler_control control,
211848b8605Smrg                       float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
212848b8605Smrg   void (*get_dims)(struct tgsi_sampler *sampler,
213848b8605Smrg                    const unsigned sview_index,
214848b8605Smrg                    int level, int dims[4]);
215848b8605Smrg   void (*get_texel)(struct tgsi_sampler *sampler,
216848b8605Smrg                     const unsigned sview_index,
217848b8605Smrg                     const int i[TGSI_QUAD_SIZE],
218848b8605Smrg                     const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE],
219848b8605Smrg                     const int lod[TGSI_QUAD_SIZE], const int8_t offset[3],
220848b8605Smrg                     float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
221b8e80941Smrg   void (*query_lod)(const struct tgsi_sampler *tgsi_sampler,
222b8e80941Smrg                     const unsigned sview_index,
223b8e80941Smrg                     const unsigned sampler_index,
224b8e80941Smrg                     const float s[TGSI_QUAD_SIZE],
225b8e80941Smrg                     const float t[TGSI_QUAD_SIZE],
226b8e80941Smrg                     const float p[TGSI_QUAD_SIZE],
227b8e80941Smrg                     const float c0[TGSI_QUAD_SIZE],
228b8e80941Smrg                     const enum tgsi_sampler_control control,
229b8e80941Smrg                     float mipmap[TGSI_QUAD_SIZE],
230b8e80941Smrg                     float lod[TGSI_QUAD_SIZE]);
231848b8605Smrg};
232848b8605Smrg
233848b8605Smrg#define TGSI_EXEC_NUM_TEMPS       4096
234848b8605Smrg
235848b8605Smrg/*
236848b8605Smrg * Locations of various utility registers (_I = Index, _C = Channel)
237848b8605Smrg */
238848b8605Smrg#define TGSI_EXEC_TEMP_00000000_I   (TGSI_EXEC_NUM_TEMPS + 0)
239848b8605Smrg#define TGSI_EXEC_TEMP_00000000_C   0
240848b8605Smrg
241848b8605Smrg#define TGSI_EXEC_TEMP_7FFFFFFF_I   (TGSI_EXEC_NUM_TEMPS + 0)
242848b8605Smrg#define TGSI_EXEC_TEMP_7FFFFFFF_C   1
243848b8605Smrg
244848b8605Smrg#define TGSI_EXEC_TEMP_80000000_I   (TGSI_EXEC_NUM_TEMPS + 0)
245848b8605Smrg#define TGSI_EXEC_TEMP_80000000_C   2
246848b8605Smrg
247848b8605Smrg#define TGSI_EXEC_TEMP_FFFFFFFF_I   (TGSI_EXEC_NUM_TEMPS + 0)
248848b8605Smrg#define TGSI_EXEC_TEMP_FFFFFFFF_C   3
249848b8605Smrg
250848b8605Smrg#define TGSI_EXEC_TEMP_ONE_I        (TGSI_EXEC_NUM_TEMPS + 1)
251848b8605Smrg#define TGSI_EXEC_TEMP_ONE_C        0
252848b8605Smrg
253848b8605Smrg#define TGSI_EXEC_TEMP_TWO_I        (TGSI_EXEC_NUM_TEMPS + 1)
254848b8605Smrg#define TGSI_EXEC_TEMP_TWO_C        1
255848b8605Smrg
256848b8605Smrg#define TGSI_EXEC_TEMP_128_I        (TGSI_EXEC_NUM_TEMPS + 1)
257848b8605Smrg#define TGSI_EXEC_TEMP_128_C        2
258848b8605Smrg
259848b8605Smrg#define TGSI_EXEC_TEMP_MINUS_128_I  (TGSI_EXEC_NUM_TEMPS + 1)
260848b8605Smrg#define TGSI_EXEC_TEMP_MINUS_128_C  3
261848b8605Smrg
262848b8605Smrg#define TGSI_EXEC_TEMP_KILMASK_I    (TGSI_EXEC_NUM_TEMPS + 2)
263848b8605Smrg#define TGSI_EXEC_TEMP_KILMASK_C    0
264848b8605Smrg
265848b8605Smrg#define TGSI_EXEC_TEMP_OUTPUT_I     (TGSI_EXEC_NUM_TEMPS + 2)
266848b8605Smrg#define TGSI_EXEC_TEMP_OUTPUT_C     1
267848b8605Smrg
268848b8605Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_I  (TGSI_EXEC_NUM_TEMPS + 2)
269848b8605Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_C  2
270848b8605Smrg
271848b8605Smrg#define TGSI_EXEC_TEMP_THREE_I      (TGSI_EXEC_NUM_TEMPS + 2)
272848b8605Smrg#define TGSI_EXEC_TEMP_THREE_C      3
273848b8605Smrg
274848b8605Smrg#define TGSI_EXEC_TEMP_HALF_I       (TGSI_EXEC_NUM_TEMPS + 3)
275848b8605Smrg#define TGSI_EXEC_TEMP_HALF_C       0
276848b8605Smrg
277848b8605Smrg/* 4 register buffer for various purposes */
278848b8605Smrg#define TGSI_EXEC_TEMP_R0           (TGSI_EXEC_NUM_TEMPS + 4)
279848b8605Smrg#define TGSI_EXEC_NUM_TEMP_R        4
280848b8605Smrg
281848b8605Smrg#define TGSI_EXEC_TEMP_ADDR         (TGSI_EXEC_NUM_TEMPS + 8)
282b8e80941Smrg#define TGSI_EXEC_NUM_ADDRS         3
283848b8605Smrg
284b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S1_I  (TGSI_EXEC_NUM_TEMPS + 11)
285b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S1_C  0
286b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S2_I  (TGSI_EXEC_NUM_TEMPS + 12)
287b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S2_C  1
288b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S3_I  (TGSI_EXEC_NUM_TEMPS + 13)
289b8e80941Smrg#define TGSI_EXEC_TEMP_PRIMITIVE_S3_C  2
290848b8605Smrg
291b8e80941Smrg#define TGSI_EXEC_NUM_TEMP_EXTRAS   14
292848b8605Smrg
293848b8605Smrg
294848b8605Smrg
295848b8605Smrg#define TGSI_EXEC_MAX_NESTING  32
296848b8605Smrg#define TGSI_EXEC_MAX_COND_NESTING  TGSI_EXEC_MAX_NESTING
297848b8605Smrg#define TGSI_EXEC_MAX_LOOP_NESTING  TGSI_EXEC_MAX_NESTING
298848b8605Smrg#define TGSI_EXEC_MAX_SWITCH_NESTING TGSI_EXEC_MAX_NESTING
299848b8605Smrg#define TGSI_EXEC_MAX_CALL_NESTING  TGSI_EXEC_MAX_NESTING
300848b8605Smrg
301848b8605Smrg/* The maximum number of input attributes per vertex. For 2D
302848b8605Smrg * input register files, this is the stride between two 1D
303848b8605Smrg * arrays.
304848b8605Smrg */
305b8e80941Smrg#define TGSI_EXEC_MAX_INPUT_ATTRIBS 32
306848b8605Smrg
307848b8605Smrg/* The maximum number of bytes per constant buffer.
308848b8605Smrg */
309848b8605Smrg#define TGSI_EXEC_MAX_CONST_BUFFER_SIZE  (4096 * sizeof(float[4]))
310848b8605Smrg
311848b8605Smrg/* The maximum number of vertices per primitive */
312848b8605Smrg#define TGSI_MAX_PRIM_VERTICES 6
313848b8605Smrg
314848b8605Smrg/* The maximum number of primitives to be generated */
315848b8605Smrg#define TGSI_MAX_PRIMITIVES 64
316848b8605Smrg
317848b8605Smrg/* The maximum total number of vertices */
318848b8605Smrg#define TGSI_MAX_TOTAL_VERTICES (TGSI_MAX_PRIM_VERTICES * TGSI_MAX_PRIMITIVES * PIPE_MAX_ATTRIBS)
319848b8605Smrg
320848b8605Smrg#define TGSI_MAX_MISC_INPUTS 8
321848b8605Smrg
322b8e80941Smrg#define TGSI_MAX_VERTEX_STREAMS 4
323b8e80941Smrg
324848b8605Smrg/** function call/activation record */
325848b8605Smrgstruct tgsi_call_record
326848b8605Smrg{
327848b8605Smrg   uint CondStackTop;
328848b8605Smrg   uint LoopStackTop;
329848b8605Smrg   uint ContStackTop;
330848b8605Smrg   int SwitchStackTop;
331848b8605Smrg   int BreakStackTop;
332848b8605Smrg   uint ReturnAddr;
333848b8605Smrg};
334848b8605Smrg
335848b8605Smrg
336848b8605Smrg/* Switch-case block state. */
337848b8605Smrgstruct tgsi_switch_record {
338848b8605Smrg   uint mask;                          /**< execution mask */
339848b8605Smrg   union tgsi_exec_channel selector;   /**< a value case statements are compared to */
340848b8605Smrg   uint defaultMask;                   /**< non-execute mask for default case */
341848b8605Smrg};
342848b8605Smrg
343848b8605Smrg
344848b8605Smrgenum tgsi_break_type {
345848b8605Smrg   TGSI_EXEC_BREAK_INSIDE_LOOP,
346848b8605Smrg   TGSI_EXEC_BREAK_INSIDE_SWITCH
347848b8605Smrg};
348848b8605Smrg
349848b8605Smrg
350848b8605Smrg#define TGSI_EXEC_MAX_BREAK_STACK (TGSI_EXEC_MAX_LOOP_NESTING + TGSI_EXEC_MAX_SWITCH_NESTING)
351848b8605Smrg
352b8e80941Smrgtypedef float float4[4];
353b8e80941Smrg
354b8e80941Smrgstruct tgsi_exec_machine;
355b8e80941Smrg
356b8e80941Smrgtypedef void (* apply_sample_offset_func)(
357b8e80941Smrg   const struct tgsi_exec_machine *mach,
358b8e80941Smrg   unsigned attrib,
359b8e80941Smrg   unsigned chan,
360b8e80941Smrg   float ofs_x,
361b8e80941Smrg   float ofs_y,
362b8e80941Smrg   union tgsi_exec_channel *out_chan);
363848b8605Smrg
364848b8605Smrg/**
365848b8605Smrg * Run-time virtual machine state for executing TGSI shader.
366848b8605Smrg */
367848b8605Smrgstruct tgsi_exec_machine
368848b8605Smrg{
369848b8605Smrg   /* Total = program temporaries + internal temporaries
370848b8605Smrg    */
371848b8605Smrg   struct tgsi_exec_vector       Temps[TGSI_EXEC_NUM_TEMPS +
372848b8605Smrg                                       TGSI_EXEC_NUM_TEMP_EXTRAS];
373848b8605Smrg
374b8e80941Smrg   unsigned                       ImmsReserved;
375b8e80941Smrg   float4                         *Imms;
376848b8605Smrg
377848b8605Smrg   struct tgsi_exec_vector       *Inputs;
378848b8605Smrg   struct tgsi_exec_vector       *Outputs;
379b8e80941Smrg   apply_sample_offset_func           *InputSampleOffsetApply;
380848b8605Smrg
381848b8605Smrg   /* System values */
382848b8605Smrg   unsigned                      SysSemanticToIndex[TGSI_SEMANTIC_COUNT];
383b8e80941Smrg   struct tgsi_exec_vector       SystemValue[TGSI_MAX_MISC_INPUTS];
384848b8605Smrg
385848b8605Smrg   struct tgsi_exec_vector       *Addrs;
386848b8605Smrg
387848b8605Smrg   struct tgsi_sampler           *Sampler;
388848b8605Smrg
389b8e80941Smrg   struct tgsi_image             *Image;
390b8e80941Smrg   struct tgsi_buffer            *Buffer;
391848b8605Smrg   unsigned                      ImmLimit;
392848b8605Smrg
393848b8605Smrg   const void *Consts[PIPE_MAX_CONSTANT_BUFFERS];
394848b8605Smrg   unsigned ConstsSize[PIPE_MAX_CONSTANT_BUFFERS];
395848b8605Smrg
396848b8605Smrg   const struct tgsi_token       *Tokens;   /**< Declarations, instructions */
397b8e80941Smrg   enum pipe_shader_type         ShaderType; /**< PIPE_SHADER_x */
398848b8605Smrg
399848b8605Smrg   /* GEOMETRY processor only. */
400b8e80941Smrg   unsigned                      *Primitives[TGSI_MAX_VERTEX_STREAMS];
401b8e80941Smrg   unsigned                      *PrimitiveOffsets[TGSI_MAX_VERTEX_STREAMS];
402848b8605Smrg   unsigned                       NumOutputs;
403848b8605Smrg   unsigned                       MaxGeometryShaderOutputs;
404848b8605Smrg   unsigned                       MaxOutputVertices;
405848b8605Smrg
406848b8605Smrg   /* FRAGMENT processor only. */
407848b8605Smrg   const struct tgsi_interp_coef *InterpCoefs;
408848b8605Smrg   struct tgsi_exec_vector       QuadPos;
409848b8605Smrg   float                         Face;    /**< +1 if front facing, -1 if back facing */
410848b8605Smrg   bool                          flatshade_color;
411b8e80941Smrg
412b8e80941Smrg   /* Compute Only */
413b8e80941Smrg   void                          *LocalMem;
414b8e80941Smrg   unsigned                      LocalMemSize;
415b8e80941Smrg
416b8e80941Smrg   /* See GLSL 4.50 specification for definition of helper invocations */
417b8e80941Smrg   uint NonHelperMask;  /**< non-helpers */
418848b8605Smrg   /* Conditional execution masks */
419848b8605Smrg   uint CondMask;  /**< For IF/ELSE/ENDIF */
420848b8605Smrg   uint LoopMask;  /**< For BGNLOOP/ENDLOOP */
421848b8605Smrg   uint ContMask;  /**< For loop CONT statements */
422848b8605Smrg   uint FuncMask;  /**< For function calls */
423848b8605Smrg   uint ExecMask;  /**< = CondMask & LoopMask */
424848b8605Smrg
425848b8605Smrg   /* Current switch-case state. */
426848b8605Smrg   struct tgsi_switch_record Switch;
427848b8605Smrg
428848b8605Smrg   /* Current break type. */
429848b8605Smrg   enum tgsi_break_type BreakType;
430848b8605Smrg
431848b8605Smrg   /** Condition mask stack (for nested conditionals) */
432848b8605Smrg   uint CondStack[TGSI_EXEC_MAX_COND_NESTING];
433848b8605Smrg   int CondStackTop;
434848b8605Smrg
435848b8605Smrg   /** Loop mask stack (for nested loops) */
436848b8605Smrg   uint LoopStack[TGSI_EXEC_MAX_LOOP_NESTING];
437848b8605Smrg   int LoopStackTop;
438848b8605Smrg
439848b8605Smrg   /** Loop label stack */
440848b8605Smrg   uint LoopLabelStack[TGSI_EXEC_MAX_LOOP_NESTING];
441848b8605Smrg   int LoopLabelStackTop;
442848b8605Smrg
443848b8605Smrg   /** Loop continue mask stack (see comments in tgsi_exec.c) */
444848b8605Smrg   uint ContStack[TGSI_EXEC_MAX_LOOP_NESTING];
445848b8605Smrg   int ContStackTop;
446848b8605Smrg
447848b8605Smrg   /** Switch case stack */
448848b8605Smrg   struct tgsi_switch_record SwitchStack[TGSI_EXEC_MAX_SWITCH_NESTING];
449848b8605Smrg   int SwitchStackTop;
450848b8605Smrg
451848b8605Smrg   enum tgsi_break_type BreakStack[TGSI_EXEC_MAX_BREAK_STACK];
452848b8605Smrg   int BreakStackTop;
453848b8605Smrg
454848b8605Smrg   /** Function execution mask stack (for executing subroutine code) */
455848b8605Smrg   uint FuncStack[TGSI_EXEC_MAX_CALL_NESTING];
456848b8605Smrg   int FuncStackTop;
457848b8605Smrg
458848b8605Smrg   /** Function call stack for saving/restoring the program counter */
459848b8605Smrg   struct tgsi_call_record CallStack[TGSI_EXEC_MAX_CALL_NESTING];
460848b8605Smrg   int CallStackTop;
461848b8605Smrg
462848b8605Smrg   struct tgsi_full_instruction *Instructions;
463848b8605Smrg   uint NumInstructions;
464848b8605Smrg
465848b8605Smrg   struct tgsi_full_declaration *Declarations;
466848b8605Smrg   uint NumDeclarations;
467848b8605Smrg
468848b8605Smrg   struct tgsi_declaration_sampler_view
469848b8605Smrg      SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS];
470848b8605Smrg
471848b8605Smrg   boolean UsedGeometryShader;
472b8e80941Smrg
473b8e80941Smrg   int pc;
474848b8605Smrg};
475848b8605Smrg
476848b8605Smrgstruct tgsi_exec_machine *
477b8e80941Smrgtgsi_exec_machine_create(enum pipe_shader_type shader_type);
478848b8605Smrg
479848b8605Smrgvoid
480848b8605Smrgtgsi_exec_machine_destroy(struct tgsi_exec_machine *mach);
481848b8605Smrg
482848b8605Smrg
483848b8605Smrgvoid
484848b8605Smrgtgsi_exec_machine_bind_shader(
485848b8605Smrg   struct tgsi_exec_machine *mach,
486848b8605Smrg   const struct tgsi_token *tokens,
487b8e80941Smrg   struct tgsi_sampler *sampler,
488b8e80941Smrg   struct tgsi_image *image,
489b8e80941Smrg   struct tgsi_buffer *buffer);
490848b8605Smrg
491848b8605Smrguint
492848b8605Smrgtgsi_exec_machine_run(
493b8e80941Smrg   struct tgsi_exec_machine *mach, int start_pc );
494848b8605Smrg
495848b8605Smrg
496848b8605Smrgvoid
497848b8605Smrgtgsi_exec_machine_free_data(struct tgsi_exec_machine *mach);
498848b8605Smrg
499848b8605Smrg
500848b8605Smrgboolean
501848b8605Smrgtgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst);
502848b8605Smrg
503848b8605Smrg
504848b8605Smrgextern void
505848b8605Smrgtgsi_exec_set_constant_buffers(struct tgsi_exec_machine *mach,
506848b8605Smrg                               unsigned num_bufs,
507848b8605Smrg                               const void **bufs,
508848b8605Smrg                               const unsigned *buf_sizes);
509848b8605Smrg
510848b8605Smrg
511b8e80941Smrgstatic inline int
512848b8605Smrgtgsi_exec_get_shader_param(enum pipe_shader_cap param)
513848b8605Smrg{
514848b8605Smrg   switch(param) {
515848b8605Smrg   case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
516848b8605Smrg   case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
517848b8605Smrg   case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
518848b8605Smrg   case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
519848b8605Smrg      return INT_MAX;
520848b8605Smrg   case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
521848b8605Smrg      return TGSI_EXEC_MAX_NESTING;
522848b8605Smrg   case PIPE_SHADER_CAP_MAX_INPUTS:
523848b8605Smrg      return TGSI_EXEC_MAX_INPUT_ATTRIBS;
524b8e80941Smrg   case PIPE_SHADER_CAP_MAX_OUTPUTS:
525b8e80941Smrg      return 32;
526848b8605Smrg   case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
527848b8605Smrg      return TGSI_EXEC_MAX_CONST_BUFFER_SIZE;
528848b8605Smrg   case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
529848b8605Smrg      return PIPE_MAX_CONSTANT_BUFFERS;
530848b8605Smrg   case PIPE_SHADER_CAP_MAX_TEMPS:
531848b8605Smrg      return TGSI_EXEC_NUM_TEMPS;
532848b8605Smrg   case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
533848b8605Smrg      return 1;
534848b8605Smrg   case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
535848b8605Smrg   case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
536848b8605Smrg   case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
537848b8605Smrg   case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
538848b8605Smrg      return 1;
539848b8605Smrg   case PIPE_SHADER_CAP_SUBROUTINES:
540848b8605Smrg      return 1;
541848b8605Smrg   case PIPE_SHADER_CAP_INTEGERS:
542848b8605Smrg      return 1;
543b8e80941Smrg   case PIPE_SHADER_CAP_INT64_ATOMICS:
544b8e80941Smrg   case PIPE_SHADER_CAP_FP16:
545b8e80941Smrg      return 0;
546848b8605Smrg   case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
547848b8605Smrg      return PIPE_MAX_SAMPLERS;
548848b8605Smrg   case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
549848b8605Smrg      return PIPE_MAX_SHADER_SAMPLER_VIEWS;
550848b8605Smrg   case PIPE_SHADER_CAP_PREFERRED_IR:
551848b8605Smrg      return PIPE_SHADER_IR_TGSI;
552b8e80941Smrg   case PIPE_SHADER_CAP_SUPPORTED_IRS:
553b8e80941Smrg      return 1 << PIPE_SHADER_IR_TGSI;
554848b8605Smrg   case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
555848b8605Smrg      return 1;
556b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
557b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
558b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
559b8e80941Smrg      return 1;
560b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
561b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
562b8e80941Smrg   case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
563b8e80941Smrg   case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
564b8e80941Smrg   case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
565b8e80941Smrg   case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
566848b8605Smrg      return 0;
567b8e80941Smrg   case PIPE_SHADER_CAP_SCALAR_ISA:
568b8e80941Smrg      return 1;
569b8e80941Smrg   case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
570b8e80941Smrg      return PIPE_MAX_SHADER_BUFFERS;
571b8e80941Smrg   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
572b8e80941Smrg      return PIPE_MAX_SHADER_IMAGES;
573b8e80941Smrg
574b8e80941Smrg   case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
575b8e80941Smrg      return 32;
576848b8605Smrg   }
577848b8605Smrg   /* if we get here, we missed a shader cap above (and should have seen
578848b8605Smrg    * a compiler warning.)
579848b8605Smrg    */
580848b8605Smrg   return 0;
581848b8605Smrg}
582848b8605Smrg
583848b8605Smrg#if defined __cplusplus
584848b8605Smrg} /* extern "C" */
585848b8605Smrg#endif
586848b8605Smrg
587848b8605Smrg#endif /* TGSI_EXEC_H */
588